| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.2 : 윈 토토 | 위로 | 제8장. 데이터 유형 | PostgreSQL : 문서 : 9.2 : 범위 토토 사이트 순위 | |
A 토토 사이트 유형는 다음을 나타냅니다. 행 또는 레코드의 구조; 그것은 본질적으로 단지 다음의 목록일 뿐입니다. 필드 이름 및 해당 데이터 유형입니다.포스트그레SQL토토 사이트 유형을 사용할 수 있습니다. 단순 유형을 사용할 수 있는 것과 동일한 방식으로 사용됩니다. 에 대한 예를 들어, 테이블의 열은 복합 열로 선언될 수 있습니다. 유형.
다음은 복합 정의에 대한 두 가지 간단한 예입니다. 유형:
CREATE TYPE 토토 사이트 AS(
r 배정밀도,
나는 이중 정밀도
);
CREATE TYPE Inventory_item AS(
이름 텍스트,
공급자_ID 정수,
가격 숫자
);
구문은 다음과 비슷합니다.만들기 표, 단, 필드 이름과 유형만 가능함 지정됨; 제약 없음(예:아님 NULL)은 현재 포함될 수 있습니다. 참고하세요AS키워드는 필수입니다. 그것 없이는 시스템 다른 종류의 생각을 할 것이다만들기 유형명령을 의미하며 이상한 구문을 얻게 됩니다. 오류.
유형을 정의한 후 이를 사용하여 다음을 생성할 수 있습니다. 테이블:
직접 테이블 생성(
품목 Inventory_item,
정수 카운트
);
INSERT INTO on_hand VALUES (ROW('퍼지 주사위', 42, 1.99), 1000);
또는 함수:
CREATE FUNCTION 가격_확장(inventory_item, 정수) RETURNS 숫자 AS 'SELECT $1.price * $2' LANGUAGE SQL; 현재 보유 중인 가격 확장(항목, 10) 선택;
테이블을 생성할 때마다 토토 사이트 유형도 테이블과 동일한 이름으로 자동 생성됩니다. 테이블의 행 유형을 나타냅니다. 예를 들어, 다음과 같이 말했습니다.
CREATE TABLE Inventory_item(
이름 텍스트,
공급자_ID 정수 REFERENCES 공급업체,
가격 숫자 확인(가격 0)
);
그러면 똑같습니다inventory_item위에 표시된 토토 사이트 유형은 부산물이며 위와 같이 사용할 수 있습니다. 그러나 참고 현재 구현의 중요한 제한 사항: 아니오 제약 조건은 토토 사이트 유형과 연관되어 있습니다. 테이블 정의에 표시된 제약 조건적용하지 않음값에 테이블 외부의 토토 사이트 유형. (부분적인 해결 방법은 다음과 같습니다. 토토 사이트 유형의 멤버로 도메인 유형을 사용합니다.)
복합 값을 리터럴 상수로 쓰려면 다음을 포함하십시오. 괄호 안에 필드 값을 입력하고 다음으로 구분합니다. 쉼표. 필드 값 앞뒤에 큰따옴표를 넣을 수 있습니다. 쉼표나 괄호가 포함된 경우에는 그렇게 해야 합니다. (자세한 내용은 나타나다아래.) 따라서 합성 상수의 일반적인 형식은 다음과 같습니다. 다음:
'( 발1 , 발2 , ... )'
예는 다음과 같습니다:
'("퍼지 주사위",42,1.99)'
이것은 유효한 값이 될 것입니다.inventory_item위에 정의된 유형입니다. 만들려면 필드가 NULL이면 해당 위치에 문자를 전혀 쓰지 않습니다. 목록. 예를 들어, 이 상수는 NULL 3분의 1을 지정합니다. 필드:
'("퍼지 주사위",42,)'
NULL이 아닌 빈 문자열을 원하면 double을 쓰세요 인용문:
'("",42,)'
여기서 첫 번째 필드는 NULL이 아닌 빈 문자열이고, 세 번째 필드는 NULL입니다.
(이 상수는 실제로는 특수한 경우일 뿐입니다. 에서 논의된 일반 유형 상수섹션 4.1.2.7. 상수는 처음에는 문자열로 처리되며 토토 사이트형 입력 변환 루틴으로 전달됩니다. 안 명시적인 유형 지정이 필요할 수 있습니다. 상수를 변환할 유형을 입력하세요.)
그ROW표현식 구문도 가능 토토 사이트 값을 구성하는 데 사용됩니다. 대부분의 경우 이는 문자열 리터럴 구문보다 사용하기가 훨씬 간단합니다. 여러 레이어의 인용에 대해 걱정할 필요가 없기 때문입니다. 위에서 이미 이 방법을 사용했습니다.
ROW('퍼지 주사위', 42, 1.99)
ROW('', 42, NULL)
ROW 키워드는 실제로 선택 사항입니다. 표현식에 둘 이상의 필드가 있으므로 다음이 가능합니다. 다음과 같이 단순화되었습니다:
('퍼지 주사위', 42, 1.99)
('', 42, NULL)
그ROW표현식 구문은 다음과 같습니다. 더 자세히 논의됨섹션 4.2.13.
토토 사이트 열의 필드에 액세스하려면 점을 씁니다. 테이블에서 필드를 선택하는 것과 마찬가지로 필드 이름 이름. 실제로 이는 테이블 이름에서 선택하는 것과 매우 유사합니다. 혼동을 피하기 위해 종종 괄호를 사용해야 하는 경우가 있습니다. 파서. 예를 들어 일부 하위 필드를 선택하려고 할 수 있습니다. 우리의현재예제 테이블 다음과 같은 것:
현재 보유하고 있는 WHERE item.price 9.99에서 item.name을 선택하세요.
이름 이후로는 작동하지 않습니다.항목열이 아닌 테이블 이름으로 간주됩니다. 이름현재, SQL 구문 규칙에 따라. 다음과 같이 작성해야 합니다.
선택 (항목).이름 FROM 현재 WHERE (항목).가격 9.99;
또는 테이블 이름도 사용해야 하는 경우(예: 다중 테이블 쿼리에서) 다음과 같습니다:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price 9.99;
이제 괄호 안에 있는 개체는 다음과 같이 올바르게 해석됩니다. 에 대한 참조항목열, 그리고 하위 필드를 선택할 수 있습니다.
필드를 선택할 때마다 유사한 구문 문제가 적용됩니다. 복합 값에서. 예를 들어 필드 하나만 선택하려면 복합 값을 반환하는 함수의 결과에서 다음과 같이 작성해야 합니다.
SELECT (my_func(...)).field FROM ...
추가 괄호가 없으면 구문이 생성됩니다. 오류.
특수 필드 이름*의미"모든 필드", 추가 설명 에서섹션 8.16.5.
다음은 삽입을 위한 올바른 구문의 몇 가지 예입니다. 복합 열을 업데이트합니다. 먼저, 전체 열:
INSERT INTO mytab(complex_col) VALUES((1.1,2.2)); 업데이트 mytab SET complex_col = ROW(1.1,2.2) WHERE ...;
첫 번째 예에서는 생략ROW, 두 번째는 그것을 사용합니다. 어느 쪽이든 할 수 있었을 텐데.
토토 사이트의 개별 하위 필드를 업데이트할 수 있습니다 열:
mytab 설정 업데이트 complex_col.r = (complex_col).r + 1 WHERE ...;
여기에 우리가 넣을 필요가 없다는 점에 주목하세요. 바로 뒤에 나타나는 열 이름 주위에 괄호세트, 하지만 다음 경우에는 괄호가 필요합니다. 오른쪽에 있는 표현식에서 동일한 열을 참조하는 경우 등호.
그리고 하위 필드를 대상으로 지정할 수 있습니다.삽입도:
mytab에 삽입(complex_col.r, complex_col.i) VALUES(1.1, 2.2);
우리가 모든 하위 필드에 값을 제공하지 않았습니까? 열의 나머지 하위 필드는 다음으로 채워졌을 것입니다. null 값입니다.
다양한 특수 구문 규칙 및 동작이 있습니다. 쿼리의 토토 사이트 유형과 연결됩니다. 이 규칙은 다음을 제공합니다. 유용한 단축키지만 모르면 혼란스러울 수 있습니다. 그 뒤에 논리가 있습니다.
에포스트그레SQL, 참조 쿼리에서 테이블 이름(또는 별칭)을 변경하는 것은 사실상 테이블의 현재 행의 복합 값에 대한 참조입니다. 예를 들어 테이블이 있다고 가정해 보겠습니다.inventory_item표시된 바와 같이위, 우리는 할 수 있어요 쓰다:
inventory_item c에서 c 선택;
이 쿼리는 단일 복합 값 열을 생성하므로 다음과 같은 출력이 나올 수 있습니다:
c
-----------
("퍼지 주사위",42,1.99)
(1행)
그러나 단순 이름은 열 이름과 일치한다는 점에 유의하십시오. 테이블 이름 앞에 있으므로 이 예는 다음과 같은 경우에만 작동합니다. 이름이 지정된 열이 없습니다.c쿼리의 테이블.
일반적인 정규화된 열 이름 구문테이블_이름.열_이름할 수 있어요 신청하는 것으로 이해됩니다.필드 선택에 테이블의 현재 행의 합성 값입니다. (효율성을 위해 이유 때문에 실제로는 그런 식으로 구현되지 않았습니다.)
우리가 쓸 때
SELECT c.* FROM Inventory_item c;
그러면 SQL 표준에 따라 우리는 별도의 열로 확장된 테이블 내용:
이름 | 공급자_ID | 가격 ----------+-------------+------- 퍼지 주사위 | 42 | 1.99 (1행)
마치 쿼리가 다음과 같은
SELECT c.name, c.supplier_id, c.price FROM Inventory_item c;
포스트그레SQL이것을 적용하겠습니다
토토 사이트 값 표현식으로의 확장 동작
표시된 대로위,
해당 값 주위에 괄호를 써야 합니다..*간단하지 않은 경우에 적용됩니다.
테이블 이름. 예를 들어, 만약myfunc()는 합성을 반환하는 함수입니다.
열로 입력하세요.a, b및c그러면
이 두 쿼리의 결과는 동일합니다.
SELECT (myfunc(x)).* FROM some_table; SELECT (myfunc(x)).a, (myfunc(x)).b, (myfunc(x)).c FROM some_table;
팁: 포스트그레SQL실제로 첫 번째 열을 변환하여 열 확장을 처리합니다. 두 번째로 형성됩니다. 따라서 이 예에서는,
myfunc()세 번 호출됩니다. 두 구문 중 하나를 사용하여 행당. 고가의 기능이라면 이를 피하고 싶을 수도 있습니다. 쿼리를 사용하면 됩니다. 좋아요:SELECT (m).* FROM (SELECT myfunc(x) AS m FROM some_table OFFSET 0) ss;그오프셋 0절은 다음을 유지합니다. 옵티마이저 from"평탄화"여러 호출이 포함된 양식에 도달하려면 하위 선택
myfunc().
그토토 사이트_값.*구문이 나타날 때 이런 종류의 열 확장이 발생합니다.
a의 최상위 수준에서선택출력 목록, 아돌아오는 중목록in삽입/업데이트/삭제, 아값절또는 a행
생성자. 다른 모든 컨텍스트(중첩된 경우 포함)
해당 구성 중 하나 내부), 첨부.*복합 값으로 변경되지 않음
가치, 그 의미는 다음과 같습니다."모든 열"그래서 동일한 토토 사이트 값이 다시 생성됩니다. 예를 들어,
만일somefunc()수락
토토 사이트 값 인수, 이러한 쿼리는 동일합니다.
select somefunc(c.*) FROM Inventory_item c; Inventory_item c에서 somefunc(c)를 선택하세요.
두 경우 모두, 현재 행inventory_item는 함수에 다음과 같이 전달됩니다. 단일 복합 값 인수. 그래도.*이런 경우에는 아무것도 하지 않습니다. 사용하는 것이 좋습니다 스타일을 사용하면 복합 값이 의도된 것이 분명해지기 때문입니다. 특히 파서는 다음을 고려할 것입니다.c에c.*을 참조하다 열 이름이 아닌 테이블 이름이나 별칭을 사용하므로 모호함; 반면 없이.*그렇습니다 여부는 확실하지 않음c테이블 이름을 의미합니다. 또는 열 이름, 그리고 실제로 열 이름 해석 이름이 지정된 열이 있으면 선호됩니다.c.
이러한 개념을 보여주는 또 다른 예는 모든 이 쿼리는 같은 의미입니다.
SELECT * FROM Inventory_item c ORDER BY c; SELECT * FROM Inventory_item c ORDER BY c.*; SELECT * FROM Inventory_item c ORDER BY ROW(c.*);
이 모든 것주문 기준절 행의 토토 사이트 값을 지정합니다. 그러나 만일inventory_item이름이 지정된 열이 포함되어 있습니다.c, 첫 번째 경우는 다음과 같습니다. 다른 것과는 다르기 때문에 이를 기준으로 정렬해야 합니다. 열만. 이전에 표시된 열 이름을 고려하면 다음과 같습니다. 쿼리도 위의 쿼리와 동일합니다.
SELECT * FROM Inventory_item c ORDER BY ROW(c.name, c.supplier_id, c.price); SELECT * FROM Inventory_item c ORDER BY (c.name, c.supplier_id, c.price);
(마지막 사례는 키워드가 있는 행 생성자를 사용합니다.ROW생략되었습니다.)
다음과 관련된 또 다른 특수 구문 동작 복합 값은 우리가 사용할 수 있다는 것입니다.함수 표기법필드 추출용 복합 가치. 이를 설명하는 간단한 방법은 다음과 같습니다. 표기법필드(테이블)그리고테이블.필드교환 가능합니다. 에 대한 예를 들어 다음 쿼리는 동일합니다.
SELECT c.name FROM Inventory_item c WHERE c.price 1000; SELECT 이름(c) FROM Inventory_item c WHERE 가격(c) 1000;
게다가, 단일을 허용하는 함수가 있다면 토토 사이트 유형의 인수인 경우 다음 중 하나로 호출할 수 있습니다. 표기법. 다음 쿼리는 모두 동일합니다.
inventory_item c에서 somefunc(c)를 선택하세요. SELECT somefunc(c.*) FROM Inventory_item c; Inventory_item c에서 c.somefunc를 선택하세요.
함수 표기법과 필드 간의 동등성 표기법을 사용하면 토토 사이트 유형에서 함수를 사용할 수 있습니다. 구현하다"계산된 필드". 안 위의 마지막 쿼리를 사용하는 애플리케이션은 그럴 필요가 없습니다. 그것을 직접적으로 인식함somefunc아닙니다 테이블의 실제 열입니다.
팁:이런 행동 때문에 단일 토토 사이트 유형 인수를 취하는 함수 제공 해당 토토 사이트 유형의 필드와 동일한 이름입니다. 모호한 경우 필드 이름 해석은 그러한 함수를 호출할 수 없도록 선호됩니다. 트릭없이. 함수를 강제로 실행하는 한 가지 방법 해석은 함수 이름을 스키마로 한정하는 것입니다. 이다, 쓰다스키마.펑크(토토 사이트값).
복합 값의 외부 텍스트 표현 I/O에 따라 해석되는 항목으로 구성됩니다. 개별 필드 유형에 대한 변환 규칙 및 복합구조를 나타내는 장식. 는 장식은 괄호()로 구성됩니다.(그리고)) 전체 값 주위에 더하기 쉼표(,)를 인접한 항목 사이에 배치합니다. 괄호 밖의 공백은 무시되지만 괄호는 필드 값의 일부로 간주되며 또는 입력 변환에 따라 중요하지 않을 수도 있습니다. 필드 데이터 유형에 대한 규칙입니다. 예를 들어, 다음과 같습니다:
'( 42)'
필드 유형이 정수인 경우 공백은 무시됩니다. 하지만 텍스트인 경우에는 그렇지 않습니다.
이전에 표시된 것처럼 복합 값을 쓸 때 다음을 수행할 수 있습니다. 개별 필드 값 주위에 큰따옴표를 씁니다. 당신은반드시그러면 그렇게 하세요 그렇지 않으면 필드 값이 복합 값 구문 분석기를 혼동하게 됩니다. 특히 괄호, 쉼표, 이중 문자가 포함된 필드 따옴표 또는 백슬래시는 큰따옴표로 묶어야 합니다. 더블을 넣으려면 따옴표로 묶인 복합 필드 값에 따옴표 또는 백슬래시가 앞에 있어야 합니다. 백슬래시를 사용합니다. (또한 한 쌍의 큰따옴표는 큰따옴표로 묶인 필드 값은 큰따옴표를 나타내는 데 사용됩니다. 문자(SQL의 작은따옴표 규칙과 유사) 리터럴 문자열.) 또는 인용을 피하고 사용할 수 있습니다. 백슬래시를 사용하여 모든 데이터 문자를 보호합니다. 그렇지 않으면 복합 구문으로 간주됩니다.
완전히 비어 있는 필드 값(사이에 문자가 전혀 없음) 쉼표 또는 괄호)는 NULL을 나타냅니다. 값을 쓰려면 NULL이 아닌 빈 문자열이면 다음과 같이 작성하세요."".
복합 출력 루틴은 주위에 큰따옴표를 넣습니다. 필드 값이 빈 문자열이거나 괄호를 포함하는 경우 쉼표, 큰따옴표, 백슬래시 또는 공백. (그러면서 공백은 필수는 아니지만 가독성을 높이는 데 도움이 됩니다.) 필드 값에 포함된 따옴표와 백슬래시는 두 배로 늘었습니다.
참고:당신이 SQL에 작성한 내용을 기억하십시오 명령은 먼저 문자열 리터럴로 해석됩니다. 그럼 합성으로. 백슬래시 수가 두 배로 늘어납니다. 필요합니다(이스케이프 문자열 구문이 사용된다고 가정). 에 대한 예를 들어, a를 삽입하려면텍스트필드 합성물에 큰따옴표와 백슬래시가 포함되어 있음 값을 입력하려면 다음을 작성해야 합니다.
삽입 ... 값 (E'("\\"\\\\")');문자열 리터럴 프로세서는 다음 수준 중 하나를 제거합니다. 백슬래시를 사용하여 합성 값에 도달하는 내용 파서는 다음과 같습니다("\"\\"). 에서 차례, 문자열은텍스트데이터 유형의 입력 루틴은 다음과 같습니다."\. (입력 루틴이 있는 데이터 유형으로 작업하는 경우 백슬래시도 특별히 처리했습니다.바이테아예를 들어, 우리는 백슬래시 하나를 가져오려면 명령에 백슬래시 8개를 입력하세요. 저장된 복합 필드입니다.) 달러 인용(참조섹션 4.1.2.4)를 사용하면 두 배로 늘릴 필요가 없습니다. 백슬래시.
팁:그ROW생성자 구문은 일반적으로 다음보다 작업하기가 더 쉽습니다. 복합 값을 작성할 때 복합 리터럴 구문 SQL 명령. 에서ROW, 개인 필드 값은 작성되는 방식과 동일하게 작성됩니다. 복합의 구성원이 아닌 경우.