Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.2 : 윈 토토 | up | 8 장. 데이터 유형 | PostgreSQL : 문서 : 9.2 : 범위 토토 사이트 순위 |
a토토 사이트 유형행 또는 레코드의 구조; 본질적으로 목록 일뿐입니다 필드 이름과 데이터 유형.PostgreSQL토토 사이트 유형을 사용할 수 있습니다 간단한 유형을 사용할 수있는 것과 같은 많은 방법으로. 을 위한 예, 테이블 열은 복합재로 선언 될 수 있습니다. 유형.
다음은 복합재 정의의 두 가지 간단한 예입니다 유형 :
유형 complex as ( r 이중 정밀도, 나는 두 배의 정밀도 ); inventory_item 유형 생성 ( 이름 텍스트, Supplier_id 정수, 가격 숫자 );
구문은와 비슷합니다.생성 테이블, 필드 이름과 유형 만 지정; 제약 조건 없음 (예 :널) 현재 포함될 수 있습니다.as키워드가 필수적입니다. 그것 없이는 시스템입니다 다른 종류의 생각생성 유형명령이 의미하며 홀수 구문이 나타납니다 오류.
유형을 정의한 후, 우리는 그것들을 사용할 수 있습니다. 테이블 :
테이블 만들기 on_hand ( 항목 inventory_item, 정수를 계산하십시오 ); on_hand 값에 삽입 (행 ( '퍼지 주사위', 42, 1.99), 1000);
또는 기능 :
함수 생성 price_extension (Inventory_item, Integer)은 숫자를 반환합니다 AS 'SELECT $ 1. PRICE * $ 2'언어 SQL; on_hand에서 price_extension (항목, 10)을 선택하십시오.
테이블을 만들 때마다 토토 사이트 유형도 테이블과 동일한 이름으로 자동 생성 테이블의 행 유형을 나타냅니다. 예를 들어, 우리는 다음과 같이 말했습니다.
테이블 생성 inventory_item ( 이름 텍스트, Supplier_ID 정수 참조 공급 업체, 가격 숫자 점검 (가격 0) );
그런 다음inventory_item위에 표시된 토토 사이트 유형은 부산물, 위와 같이 사용할 수 있습니다. 그러나 참고 현재 구현의 중요한 제한 : 아니요 제약 조건은 토토 사이트 유형과 관련이 있습니다 테이블 정의에 표시된 제약 조건적용하지 마십시오의 값에 테이블 외부의 토토 사이트 유형. (부분적인 해결 방법은 다음과 같습니다 토토 사이트 유형의 구성원으로 도메인 유형을 사용하십시오.)
문자 그대로 상수로 토토 사이트 값을 작성하려면 Enclose 필드 값은 괄호 안에 값을 값으로 분리합니다 쉼표. 필드 값에 대해 이중 인용문을 넣을 수 있으며 쉼표 또는 괄호가 포함 된 경우 그렇게해야합니다. (자세한 내용 나타나다아래.) 따라서 복합 상수의 일반적인 형식은 다음과 같습니다. 수행원:
'(val1 , Val2, ...) '
예는 다음과 같습니다.
'( "퍼지 주사위", 42,1.99)'
|inventory_item위에 정의 된 유형. 만들기 위해 필드는 null이고, 그 위치에 전혀 캐릭터를 쓰지 않습니다. 목록. 예를 들어,이 상수는 널 3을 지정합니다 필드:
'( "퍼지 주사위", 42,)'
null이 아닌 빈 줄을 원한다면 더블을 쓰십시오. 인용 부호:
'( "", 42,)'
여기서 첫 번째 필드는 널 비 빈 문자열, 세 번째 필드입니다. NULL입니다.
(이 상수는 실제로 특별한 경우 일뿐입니다. 논의 된 일반 유형 상수에서섹션 4.1.2.7. 상수는 처음에 문자열로 취급됩니다 토토 사이트 유형 입력 변환 루틴에 전달되었습니다. an 명시 적 유형 사양이 어느 쪽을 알리기 위해 필요할 수 있습니다 상수를 변환하려면 입력하십시오.)
theRow표현 구문도 할 수 있습니다 토토 사이트 값을 구성하는 데 사용됩니다. 대부분의 경우 이것은입니다 문자열-문자 구문보다 사용하기가 상당히 간단합니다 여러 층의 인용문에 대해 걱정할 필요가 없기 때문입니다. 우리는 이미 위 의이 방법을 사용했습니다.
행 ( '퍼지 주사위', 42, 1.99) 행 ( '', 42, null)
행 키워드는 실제로 선택 사항입니다. 표현의 한 필드 이상이므로 단순화 :
( '퍼지 주사위', 42, 1.99) ( '', 42, null)
theRowExpression Syntax IS 에서 더 자세히 논의섹션 4.2.13.
토토 사이트 열의 필드에 액세스하려면 DOT를 씁니다. 테이블에서 필드를 선택하는 것과 매우 유사한 필드 이름 이름. 사실, 그것은 테이블 이름에서 선택하는 것과 매우 흡사합니다. 혼란을 피하기 위해 괄호를 사용해야하는 경우가 많습니다. 파서. 예를 들어, 일부 서브 필드를 선택하려고 할 수 있습니다 우리에게서on_hand예제 테이블이 있습니다 다음과 같은 것 :
item.name.name on_hand where.price 9.99; 이름을 선택하십시오.
이름 이후로 작동하지 않습니다항목열이 아닌 테이블 이름으로 간주됩니다. 이름on_hand, SQL 구문 규칙 별. 당신은 이것처럼 그것을 써야합니다 :
select (item) .name from on_hand where (item) .price 9.99;
또는 테이블 이름을 사용해야하는 경우 (예 : 다기체 쿼리에서) : :
select (on_hand.item) .name on_hand where (on_hand.item) .Price 9.99;
이제 괄호 화 된 객체는 올바르게 해석됩니다 에 대한 참조항목열, 그런 다음 서브 필드는 그것에서 선택할 수 있습니다.
필드를 선택할 때마다 유사한 구문 문제가 적용됩니다 복합 값에서. 예를 들어, 하나의 필드 만 선택합니다 복합 값을 반환하는 함수의 결과에서 당신은 다음과 같은 것을 써야합니다 :
select (my_func (...)). 필드에서 ...
추가 괄호가 없으면 구문이 생성됩니다 오류.
특별 필드 이름*평균"모든 필드", 추가 설명대로 안에섹션 8.16.5.
삽입을위한 적절한 구문의 몇 가지 예는 다음과 같습니다. 복합 열 업데이트. 먼저 삽입 또는 업데이트 a 전체 열 :
mytab (complex_col) 값 ((1.1,2.2))에 삽입; myTab set complex_col = row (1.1,2.2) 여기서 ...;
첫 번째 예는 생략row, 두 번째는 그것을 사용합니다. 우리는 어느 쪽이든 그것을 할 수있었습니다.
토토 사이트재의 개별 하위 필드를 업데이트 할 수 있습니다 열:
MyTab Set Complex_Col.r = (Complex_Col) .r + 1 Where ...; 업데이트
여기서 우리가 필요하지 않은 (그리고 실제로는 할 수없는) 열 이름 주위의 괄호 안에 나타납니다SET, 그러나 우리는 언제 괄호가 필요합니다 오른쪽 표현식에서 동일한 열을 참조 동등한 부호.
그리고 우리는 서브 필드를 대상으로 지정할 수 있습니다삽입, 또한 :
mytab에 삽입 (complex_col.r, complex_col.i) 값 (1.1, 2.2);
우리는 열, 나머지 서브 필드는 채워 졌을 것입니다 널 값.
다양한 특별 구문 규칙과 행동이 있습니다 쿼리의 토토 사이트 유형과 관련이 있습니다. 이 규칙은 제공합니다 유용한 바로 가기이지만 모르는 경우 혼란 스러울 수 있습니다. 그들 뒤에있는 논리.
inPostgreSQL, 참조 쿼리의 테이블 이름 (또는 별칭)에 효과적으로 테이블의 현재 행의 복합 값에 대한 참조. 예를 들어, 테이블이 있다면inventory_item표시된대로위, 우리는 할 수 있습니다 쓰다:
inventory_item c;에서 c를 선택하십시오.
이 쿼리는 단일 복합 값 열을 생성하므로 우리는 우리입니다 다음과 같은 출력이있을 수 있습니다.
c ------------------------- ( "퍼지 주사위", 42,1.99) (1 행)
간단한 이름은 열 이름과 일치합니다. 테이블 이름 이전 에이 예제는 열이없는 열 없음CQuery 's 테이블.
평범한 자격을 갖춘 컬럼-이름 구문table_name.column_namecan 적용되는 것으로 이해됩니다필드 선택TO 테이블의 현재 행의 복합 값. (효율성을 위해 이유, 그것은 실제로 그런 식으로 구현되지 않았습니다.)
우리가 쓸 때
select c.* inventory_item c;
그런 다음 SQL 표준에 따라 우리는 표의 내용은 별도의 열로 확장되었습니다.
이름 | Supplier_id | 가격 ------------+------------+------- 퍼지 주사위 | 42 | 1.99 (1 행)
쿼리가있는 것처럼
inventory_item c;에서 c.name, c.supplier_id, c.price 선택
PostgreSQL이것을 적용합니다
토토 사이트 값 표현식에 대한 확장 동작
그림과 같이위,
당신은 그 가치에 대한 괄호를 작성해야합니다..*단순하지 않을 때마다 적용됩니다
테이블 이름. 예를 들어, ifmyfunc ()
는 토토 사이트재를 반환하는 함수입니다
열로 입력a, B및C이 두 쿼리는 같은 결과를 가져옵니다.
select (myfunc (x)).* some_table에서; 선택 (myfunc (x)). a, (myfunc (x)). b, (myfunc (x)).
팁 : PostgreSQL실제로 첫 번째를 변환하여 열 확장을 처리합니다 두 번째로 형성됩니다. 그래서이 예에서
myfunc ()
3 번 호출됩니다 구문이있는 행당. 비싼 기능이라면 쿼리로 할 수있는 것을 피하고 싶을 수도 있습니다. 좋다:select (m).the오프셋 0절을 유지합니다 에서 Optimizer"평평한"여러 호출로 양식에 도달하려면 하위 선택어
myfunc ()
.
thecomposite_value.*구문이 나타날 때 이런 종류의 열 확장을 초래합니다.
A의 최상위 수준에서select출력 목록, a반환Listin삽입/업데이트/삭제, a값절또는 a행
건설자. 다른 모든 맥락에서 (중첩 될 때 포함
해당 구성 중 하나 내부에서) 첨부.*토토 사이트 값으로는 변경되지 않습니다
가치가 있기 때문에"모든 열"따라서 동일한 토토 사이트 값이 다시 생성됩니다. 예를 들어,
만약에somefunc ()
수락 a
토토 사이트 값 인수,이 쿼리는 동일합니다.
inventory_item c에서 몇 가지 핀 (c.*)을 선택하십시오. inventory_item c;에서 몇 가지 핀 (c)을 선택하십시오.
두 경우 모두 현재 행inventory_item함수로 전달됩니다 단일 토토 사이트 값 인수. 일지라도.*그러한 경우에는 아무것도 사용하지 않습니다 합성 가치가 의도된다는 것이 분명하기 때문에 스타일. 특히 파서는 고려할 것입니다Cinc.*참조 열 이름 또는 별칭, 열 이름이 아닌 모호; 반면.*확실하지 않습니다C테이블 이름을 의미합니다 또는 열 이름 및 실제로 열 이름 해석 라는 열이 있으면 선호됩니다.C.
이러한 개념을 보여주는 또 다른 예는 그 모든 것입니다 이 쿼리는 같은 것을 의미합니다.
선택 * inventory_item c order by c; c. *; inventory_item c order by row (c. *);에서 *를 선택하십시오.
이 모든 것주문 by조항 행의 토토 사이트 값을 지정하십시오. 그러나 ifinventory_itemC, 첫 번째 사례는입니다 다른 사람과는 다르므로 정렬하는 의미가 있습니다. 열만. 이전에 표시된 열 이름이 주어지면 이것들 쿼리는 위의 쿼리와 동일합니다.
select * from inventory_item c order by row (c.name, c.supplier_id, c.price); 선택 * inventory_item c order by (c.name, c.supplier_id, c.price);
(마지막 경우는 키워드가있는 행 생성자를 사용합니다Row생략.)
관련된 또 다른 특별한 구문 행동 토토 사이트 값은 우리가 사용할 수 있다는 것입니다기능 표기a의 필드 추출 토토 사이트 가치. 이것을 설명하는 간단한 방법은 표기법필드(테이블)and테이블.필드상호 교환 가능합니다. 을 위한 예를 들어이 쿼리는 동일합니다 :
inventory_item C에서 c.name을 선택하십시오. 여기서 c.price 1000; inventory_item c에서 이름 (c)에서 이름 (c)을 선택하십시오. 여기서 가격 (c) 1000;
또한, 우리가 단일을 수락하는 함수가 있다면 토토 사이트 유형의 인수는 표기법. 이 쿼리는 모두 동일합니다 :
Inventory_item C에서 몇 가지 푸치 (c)를 선택하십시오. inventory_item c에서 몇 가지 핀 (c.*)을 선택하십시오. inventory_item c;에서 c.somefunc을 선택하십시오.
기능적 표기법과 필드 간의이 동등성 표기법은 토토 사이트 유형에서 기능을 사용할 수 있도록합니다. 구현하려면"컴퓨터 필드". an 위의 마지막 쿼리를 사용한 응용 프로그램은 직접 알고somefunc테이블의 실제 열.
팁 :이 동작으로 인해 현명하지 않습니다 단일 토토 사이트 유형 인수를 취하는 함수를 제공하십시오 해당 토토 사이트 유형의 필드와 동일한 이름입니다. 모호성이 있으면 필드 이름 해석이됩니다 그러한 함수를 호출 할 수 없도록 선호됩니다. 트릭없이. 기능을 강요하는 한 가지 방법 해석은 기능 이름을 스키마 자격으로 평가하는 것입니다 is, write스키마.func(CompositeValue).
복합 값의 외부 텍스트 표현 I/O에 따라 해석되는 항목으로 구성됩니다. 개별 필드 유형에 대한 전환 규칙, 플러스 복합 구조를 나타내는 장식. 그만큼 장식은 괄호로 구성됩니다 ((및)) 전체 값 주위에 쉼표 (,) 인접 항목 사이. 괄호 안에있는 공백은 무시되지만 괄호는 필드 값의 일부로 간주되며 또는 입력 변환에 따라 중요하지 않을 수 있습니다. 필드 데이터 유형에 대한 규칙. 예를 들어 :
'(42)'
필드 유형이 정수 인 경우 공백은 무시됩니다. 그러나 텍스트라면 아닙니다.
앞에서 볼 수 있듯이 복합 값을 작성할 때 개별 필드 값에 이중 인용문을 작성하십시오. 너필수그렇다면 그렇게하십시오 그렇지 않으면 필드 값은 복합 값 파서를 혼동합니다. 특히, 괄호, 쉼표, 이중을 포함하는 필드 따옴표 또는 백 슬래시는 두 번 인용해야합니다. 더블을 넣으려면 인용 된 복합 필드 값의 견적 또는 백 슬래시, 백 슬래시가 있습니다. (또한, a 이중 인용문을 나타내는 데 두 배의 필드 값이 가져옵니다. 캐릭터, SQL의 단일 따옴표 규칙과 유사하게 문자 문자열.) 또는 인용 및 사용을 피할 수 있습니다 모든 데이터 문자를 보호하기위한 백 슬래시 에스케이프 그렇지 않으면 복합 구문으로 간주됩니다.
완전히 빈 필드 값 (그 사이의 문자가 전혀 없음 쉼표 또는 괄호)는 널을 나타냅니다. 값을 작성합니다 그것은 null이 아닌 빈 줄입니다. 쓰기"".
복합 출력 루틴에는 이중 인용문이 있습니다 필드 값이 빈 줄이거나 괄호를 포함하는 경우. 쉼표, 이중 따옴표, 백 슬래시 또는 공백. (그렇게합니다 공백의 경우 필수는 아니지만 가독성을 도와줍니다.) Double 필드 값에 포함 된 인용문 및 백 슬래시가 있습니다 두 배
참고 :SQL에 쓰는 내용을 기억하십시오 명령은 먼저 문자열 문자로 해석되며 그런 다음 복합재로. 이것은 백 슬래시 수를 두 배로 늘립니다 (Escape String 구문이 사용되었다고 가정)가 필요합니다. 을 위한 예, a텍스트필드 복합재에 이중 견적과 백 슬래시를 포함 가치, 당신은 다음을 쓸 필요가 있습니다 :
삽입 ... 값 (e '( "\\"\\\ ");String-Literal 프로세서는 한 레벨을 제거합니다 백 슬래시, 따라서 복합 값에 도착하는 것이 파서는( "\"\\ "). ~ 안에 회전, 끈으로 공급되는 문자열텍스트데이터 유형의 입력 루틴이됩니다"\. (입력 루틴이있는 데이터 유형으로 작업하는 경우 또한 뒷가로를 특별히 처리했는데,BYTEA예를 들어, 우리는 많은 것만큼 필요할 수 있습니다 명령에 8 개의 백 슬래시가 하나의 백 슬래시를 얻습니다. 저장된 복합 필드.) 달러 인용 (참조섹션 4.1.2.4)는 두 배를 피하기 위해 사용될 수 있습니다. 백 슬래시.
팁 :theRow생성자 구문은 일반적으로 작업보다 작업하기가 더 쉽습니다 토토 사이트 값을 작성할 때 토토 사이트 지표 구문 SQL 명령. 안에Row, 개인 필드 값은 작성되는 것과 같은 방식으로 작성됩니다. 복합 회원이 아닌 경우.