| 윈 토토 : 문서 : 9.4 : 윈 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.4 : 윈 토토 | PostgreSQL : 문서 : 9.4 : 데이터 메이저 토토 사이트 | 8장. 데이터 유형 | PostgreSQL : 문서 : 9.4 : 토토 꽁 머니 유형 | 
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) 선택;
테이블을 생성할 때마다 테이블의 행 유형을 나타내기 위해 테이블과 동일한 이름을 가진 와이즈 토토 유형도 자동으로 생성됩니다. 예를 들어, 다음과 같이 말했습니다.
테이블 생성 Inventory_item(
    이름 텍스트,
    공급자_ID 정수 REFERENCES 공급업체,
    가격 숫자 확인(가격  0)
);
그럼 마찬가지inventory_item위에 표시된 와이즈 토토 유형은 부산물로 생성되며 위와 같이 사용할 수 있습니다. 그러나 현재 구현의 중요한 제한 사항에 유의하세요. 와이즈 토토 유형과 관련된 제약 조건이 없으므로 테이블 정의에 표시된 제약 조건이 있습니다.적용하지 않음테이블 외부의 와이즈 토토 유형 값에 적용됩니다. (부분적인 해결 방법은 도메인 유형을 와이즈 토토 유형의 멤버로 사용하는 것입니다.)
와이즈 토토 값을 리터럴 상수로 쓰려면 필드 값을 괄호로 묶고 쉼표로 구분하십시오. 필드 값 앞뒤에 큰따옴표를 넣을 수 있으며, 쉼표나 괄호가 포함된 경우에는 그렇게 해야 합니다. (자세한 내용이 나타납니다.아래.) 따라서 복합 상수의 일반적인 형식은 다음과 같습니다.
'( val1 , 발2 , ... )'
예는 다음과 같습니다:
'("퍼지 주사위",42,1.99)'
이것은 유효한 값이 될 것입니다.inventory_item위에 정의된 유형입니다. 필드를 NULL로 만들려면 목록의 해당 위치에 문자를 전혀 쓰지 마십시오. 예를 들어, 이 상수는 NULL 세 번째 필드를 지정합니다.
'("퍼지 주사위",42,)'
NULL이 아닌 빈 문자열을 원하면 큰따옴표를 쓰십시오:
'("",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 ...;
여기서 바로 뒤에 나타나는 열 이름 주위에 괄호를 넣을 필요가 없으며 실제로 넣을 수 없다는 점에 유의하세요.SET, 그러나 등호 오른쪽에 있는 표현식에서 동일한 열을 참조할 때는 괄호가 필요합니다.
그리고 하위 필드를 대상으로 지정할 수 있습니다.삽입도:
mytab에 삽입(complex_col.r, complex_col.i) VALUES(1.1, 2.2);
열의 모든 하위 필드에 값을 제공하지 않았다면 나머지 하위 필드는 null 값으로 채워졌을 것입니다.
쿼리의 와이즈 토토 유형과 관련된 다양한 특수 구문 규칙 및 동작이 있습니다. 이러한 규칙은 유용한 단축키를 제공하지만, 그 뒤에 있는 논리를 모르면 혼란스러울 수 있습니다.
에PostgreSQL, 쿼리의 테이블 이름(또는 별칭)에 대한 참조는 사실상 테이블의 현재 행의 복합 값에 대한 참조입니다. 예를 들어 테이블이 있다고 가정해 보겠습니다.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;
PostgreSQL표시된 것처럼 이 확장 동작을 모든 와이즈 토토 값 표현식에 적용합니다.위, 해당 값 주위에 괄호를 써야 합니다..*간단한 테이블 이름이 아닐 때마다 적용됩니다. 예를 들어, 만약myfunc()열이 있는 와이즈 토토 유형을 반환하는 함수입니다.a, b및c, 그러면 이 두 쿼리의 결과는 동일합니다.
SELECT (myfunc(x)).* FROM some_table; SELECT (myfunc(x)).a, (myfunc(x)).b, (myfunc(x)).c FROM some_table;
팁: PostgreSQL실제로 첫 번째 형식을 두 번째 형식으로 변환하여 열 확장을 처리합니다. 따라서 이 예에서는,
myfunc()두 구문 중 하나를 사용하면 행당 세 번 호출됩니다. 비용이 많이 드는 함수라면 이를 피하고 싶을 수도 있습니다. 다음과 같은 쿼리를 사용하면 됩니다.SELECT (m).* FROM (SELECT myfunc(x) AS m FROM some_table OFFSET 0) ss;그오프셋 0절은 최적화 프로그램을 다음에서 유지합니다"평탄화"다음을 여러 번 호출하여 양식에 도달하는 하위 선택
myfunc().
그와이즈 토토_값.*구문은 a의 최상위 수준에 나타날 때 이러한 종류의 열 확장을 초래합니다.선택출력 목록, 아돌아오는 중목록in삽입/업데이트/삭제, 아값절또는 a행 생성자. 다른 모든 컨텍스트(해당 구문 중 하나에 중첩된 경우 포함)에서는 첨부.*복합 값으로 변경하면 값이 변경되지 않습니다. 이는 다음을 의미하기 때문입니다."모든 열"그래서 동일한 와이즈 토토 값이 다시 생성됩니다. 예를 들어, 만약somefunc()복합 값 인수를 허용합니다. 다음 쿼리는 동일합니다.
select somefunc(c.*) FROM Inventory_item c; Inventory_item c에서 somefunc(c)를 선택하세요.
두 경우 모두, 현재 행inventory_item은 단일 와이즈 토토 값 인수로 함수에 전달됩니다. 그래도.*이러한 경우에는 아무 것도 수행하지 않습니다. 복합 값이 의도된 것임을 분명히 하기 때문에 이를 사용하는 것이 좋은 스타일입니다. 특히 파서는 다음을 고려할 것입니다.cinc.*열 이름이 아닌 테이블 이름이나 별칭을 참조하여 모호함이 없도록 합니다. 반면 없이.*, 여부는 확실하지 않습니다.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.*);
이 모든 것주문 기준절은 행의 복합 값을 지정하여 다음에 설명된 규칙에 따라 행을 정렬합니다.섹션 9.23.6. 그러나 만일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테이블의 실제 열이 아닙니다.
팁:이러한 행동 때문에 단일 와이즈 토토 유형 인수를 취하는 함수에 해당 와이즈 토토 유형의 필드와 동일한 이름을 부여하는 것은 현명하지 않습니다. 모호한 경우 필드 이름 해석이 선호되므로 트릭 없이는 해당 함수를 호출할 수 없습니다. 함수 해석을 강제하는 한 가지 방법은 함수 이름을 스키마로 한정하는 것입니다. 즉, 다음과 같이 작성합니다.스키마.func(와이즈 토토값).
복합 값의 외부 텍스트 표현은 개별 필드 유형에 대한 I/O 변환 규칙에 따라 해석되는 항목과 복합 구조를 나타내는 장식으로 구성됩니다. 장식은 괄호()로 구성됩니다.(그리고)) 전체 값 주위에 쉼표(,)을 인접한 항목 사이에 배치합니다. 괄호 밖의 공백은 무시되지만 괄호 안의 공백은 필드 값의 일부로 간주되며 필드 데이터 유형에 대한 입력 변환 규칙에 따라 중요할 수도 있고 그렇지 않을 수도 있습니다. 예를 들어, 다음과 같습니다:
'( 42)'
필드 유형이 정수인 경우 공백은 무시되지만 텍스트인 경우에는 무시되지 않습니다.
이전에 표시된 것처럼 복합 값을 작성할 때 개별 필드 값 주위에 큰따옴표를 쓸 수 있습니다. 당신은반드시필드 값이 복합 값 파서를 혼란스럽게 한다면 그렇게 하십시오. 특히 괄호, 쉼표, 큰따옴표 또는 백슬래시가 포함된 필드는 큰따옴표로 묶어야 합니다. 따옴표로 묶인 복합 필드 값에 큰따옴표나 백슬래시를 넣으려면 그 앞에 백슬래시를 넣으세요. (또한 큰 따옴표로 묶인 필드 값 내의 큰 따옴표 쌍은 SQL 리터럴 문자열의 작은 따옴표 규칙과 유사하게 큰 따옴표 문자를 나타내는 데 사용됩니다.) 또는 따옴표를 피하고 백슬래시 이스케이프를 사용하여 복합 구문으로 간주되는 모든 데이터 문자를 보호할 수 있습니다.
완전히 비어 있는 필드 값(쉼표나 괄호 사이에 문자가 전혀 없음)은 NULL을 나타냅니다. NULL이 아닌 빈 문자열인 값을 쓰려면 다음과 같이 작성하세요."".
복합 출력 루틴은 필드 값이 빈 문자열이거나 괄호, 쉼표, 큰따옴표, 백슬래시 또는 공백을 포함하는 경우 필드 값 주위에 큰따옴표를 넣습니다. (공백을 위해 그렇게 하는 것이 필수는 아니지만 가독성에 도움이 됩니다.) 필드 값에 포함된 큰따옴표와 백슬래시는 두 배가 됩니다.
참고:SQL 명령에 작성한 내용은 먼저 문자열 리터럴로 해석된 다음 복합 문자로 해석된다는 점을 기억하십시오. 이렇게 하면 필요한 백슬래시 수가 두 배로 늘어납니다(이스케이프 문자열 구문이 사용된다고 가정). 예를 들어,텍스트복합 값에 큰따옴표와 백슬래시가 포함된 필드의 경우 다음과 같이 작성해야 합니다.
삽입 ... 값 ('("\"\\")');문자열 리터럴 프로세서는 한 수준의 백슬래시를 제거하여 복합 값 파서에 도달하는 내용은 다음과 같습니다.("\"\\"). 차례로, 문자열은텍스트데이터 유형의 입력 루틴은 다음과 같습니다"\. (입력 루틴이 백슬래시를 특별히 처리하는 데이터 유형으로 작업하는 경우,바이테아예를 들어, 저장된 복합 필드에 백슬래시 하나를 가져오려면 명령에 최대 8개의 백슬래시가 필요할 수 있습니다.) 달러 인용(참조섹션 4.1.2.4)를 사용하면 백슬래시를 이중으로 입력할 필요가 없습니다.
팁:그ROW생성자 구문은 일반적으로 SQL 명령에서 와이즈 토토 값을 작성할 때 와이즈 토토 리터럴 구문보다 작업하기가 더 쉽습니다. 에서ROW, 개별 필드 값은 복합의 구성원이 아닐 때 작성되는 것과 동일한 방식으로 작성됩니다.