PostgreSQL 9.3.25 Tài liệu | ||||
---|---|---|---|---|
prev | UP | Chương 8. Dữ liệu kèo bóng đá pháp | NEXT |
Aloại kèo bóng đá pháp9755_9870PostgreSQLcho phép sử dụng các loại kèo bóng đá pháp Trong nhiều cách tương tự mà các loại đơn giản có thể được sử dụng. Vì Ví dụ, một cột của bảng có thể được khai báo là một kèo bóng đá pháp kiểu.
Đây là hai ví dụ đơn giản về việc xác định các loại kèo bóng đá pháp:
Tạo kèo bóng đá pháp phức tạp như ( r chính xác gấp đôi, Tôi gấp đôi độ chính xác ); Tạo kèo bóng đá pháp hàng tồn kho_item là ( tên văn bản, Nhà cung cấp_id Số nguyên, Giá số );
Cú pháp có thể so sánh vớiTạo BÀN, ngoại trừ chỉ những tên và kèo bóng đá pháp trường mới có thể là quy định; Không có ràng buộc (chẳng hạn nhưKhông VÔ GIÁ TRỊ) hiện có thể được bao gồm. Lưu ý rằngASTừ khóa là điều cần thiết; Không có nó, hệ thống sẽ nghĩ một kèo bóng đá pháp khác củaTạo kèo bóng đá phápLệnh có nghĩa là và bạn sẽ nhận được lỗi cú pháp lẻ.
Đã xác định kèo bóng đá pháp, chúng ta có thể sử dụng chúng để tạo bảng:
Tạo bảng on_hand ( hàng tồn kho_item, Đếm số nguyên ); Chèn vào kèo bóng đá pháp giá trị on_hand (hàng ('Dice mờ', 42, 1.99), 1000);
hoặc kèo bóng đá pháp chức năng:
Tạo chức năng price_extension (incent c Như 'Chọn $ 1.price * $ 2' SQL ngôn ngữ; Chọn Price_Extension (Mục, 10) từ on_hand;
Bất cứ khi nào bạn tạo một bảng, một loại kèo bóng đá pháp cũng tự động tạo, với cùng tên với bảng, để đại diện cho loại hàng của bảng. Ví dụ, chúng tôi đã nói:
11622_11781
Sau đó, giống nhauInventory_Itemkèo bóng đá pháp Loại hiển thị ở trên sẽ ra đời như một sản phẩm phụ, và có thể là được sử dụng như trên. Tuy nhiên, lưu ý một hạn chế quan trọng của Thực hiện hiện tại: vì không có ràng buộc nào được liên kết với Loại kèo bóng đá pháp, các ràng buộc được hiển thị trong định nghĩa bảngKhông áp dụng12169_12299
Để viết giá trị kèo bóng đá pháp dưới dạng hằng số theo nghĩa đen, hãy gửi Giá trị trường trong ngoặc đơn và tách chúng bằng dấu phẩy. Bạn có thể đặt dấu ngoặc kép xung quanh bất kỳ giá trị trường nào và phải làm như vậy nếu nó chứa dấu phẩy hoặc dấu ngoặc đơn. (Thông tin chi tiết xuất hiệnbên dưới.) Vì vậy, chung Định dạng của một hằng số kèo bóng đá pháp là như sau:
'(Val1 , Val2, ...) '
Một ví dụ là:
'("Xúc xắc mờ", 42,1,99)'
đó sẽ là giá trị kèo bóng đá pháp lệ củaInventory_Itemkèo bóng đá pháp được xác định ở trên. Để tạo ra một lĩnh vực là null, không có ký tự nào ở vị trí của nó trong danh sách. Ví dụ: hằng số này chỉ định trường thứ ba null:
'("Xúc xắc mờ", 42,)'
Nếu bạn muốn một chuỗi trống chứ không phải null, hãy viết Double Báo giá:
'("", 42,)'
Ở đây trường đầu tiên là chuỗi trống không null, thứ ba là VÔ GIÁ TRỊ.
(Những hằng số này thực sự chỉ là một trường hợp đặc biệt của chung chung Nhập kèo bóng đá pháp hằng số được thảo luận trongPhần 4.1.2.7. Hằng số ban đầu được coi là một chuỗi và được chuyển sang thói quen chuyển đổi đầu vào loại kèo bóng đá pháp. Một rõ ràng Loại thông số kỹ thuật có thể cần thiết để cho biết loại nào cần chuyển đổi hằng số.)
ThehàngBiểu thức cú pháp cũng có thể Được sử dụng để xây dựng các giá trị kèo bóng đá pháp. Trong hầu hết các trường hợp, đây là đơn giản hơn đáng kể để sử dụng so với cú pháp theo yêu cầu chuỗi kể từ khi Bạn không cần phải lo lắng về nhiều lớp trích dẫn. Chúng tôi đã sử dụng phương thức này ở trên:
hàng ('Dice mờ', 42, 1.99) Hàng ('', 42, null)
Từ khóa hàng thực sự là tùy chọn miễn là bạn có nhiều hơn hơn một trường trong biểu thức, vì vậy chúng có thể được đơn giản hóa ĐẾN:
('Xúc xắc mờ', 42, 1.99) ('', 42, null)
ThehàngBiểu thức cú pháp được thảo luận chi tiết hơn trongPhần 4.2.13.
14768_15085on_handBảng ví dụ với một cái gì đó như:
15184_15244
Điều này sẽ không hoạt động vì tênMụcđược coi là tên bảng, không phải tên cột củaon_hand, theo quy tắc cú pháp SQL. Bạn phải viết nó Như thế này:
Chọn (mục) .Name từ on_hand WHERE (Mục) .Price 9,99;
Hoặc nếu bạn cũng cần sử dụng tên bảng (ví dụ Truy vấn đa thể), như thế này:
Chọn (on_hand.item) .Name từ on_hand ở đâu (on_hand.item).
Bây giờ đối tượng được giải thích chính xác là một tham chiếu đếnMụcCột, và sau đó là Trường con có thể được chọn từ nó.
Các vấn đề cú pháp tương tự áp dụng bất cứ khi nào bạn chọn một trường từ một giá trị kèo bóng đá pháp. Ví dụ, để chọn chỉ một trường từ kết quả của một hàm trả về giá trị kèo bóng đá pháp, bạn cần phải Viết một cái gì đó như:
Chọn (my_func (...)). Trường từ ...
Không có dấu ngoặc đơn, điều này sẽ tạo ra cú pháp lỗi.
Tên trường đặc biệt*có nghĩa là"Tất cả kèo bóng đá pháp trường", như được giải thích thêm trongPhần 8.16.5.
Đây là một số ví dụ về cú pháp thích hợp để chèn và Cập nhật các cột kèo bóng đá pháp. Đầu tiên, chèn hoặc cập nhật toàn bộ Cột:
Chèn vào kèo bóng đá pháp giá trị MyTab (Complex_col) ((1.1,2.2)); Cập nhật MyTab Set Complex_col = Row (1.1,2.2) trong đó ...;
Ví dụ đầu tiên bỏ quahàng, thứ hai sử dụng nó; chúng ta có thể đã làm điều đó theo bất kỳ cách nào.
Chúng ta có thể cập nhật một trường con riêng lẻ của cột kèo bóng đá pháp:
Cập nhật MyTab Set Complex_col.r = (Complex_col) .R + 1 trong đó ...;
Lưu ý ở đây rằng chúng ta không cần (và thực sự không thể) dấu ngoặc đơn xung quanh tên cột xuất hiện ngay sauset, nhưng chúng ta cần dấu ngoặc đơn khi tham khảo cùng một cột trong biểu thức ở bên phải của dấu bằng.
Và chúng ta có thể chỉ định kèo bóng đá pháp trường con là mục tiêu choChèn, quá:
Chèn vào kèo bóng đá pháp giá trị MyTab (Complex_col.r, Complex_col.i) (1.1, 2.2);
Chúng tôi đã không cung cấp kèo bóng đá pháp giá trị cho tất cả kèo bóng đá pháp trường con của cột, kèo bóng đá pháp trường con còn lại sẽ được lấp đầy bởi null giá trị.
Có nhiều quy tắc và hành vi cú pháp đặc biệt khác nhau được liên kết với các loại kèo bóng đá pháp trong truy vấn. Những quy tắc này cung cấp hữu ích phím tắt, nhưng có thể khó hiểu nếu bạn không biết logic phía sau họ.
inPostgreSQL, tham chiếu đến a Tên bảng (hoặc bí danh) trong một truy vấn thực sự là một tham chiếu đến Giá trị kèo bóng đá pháp của hàng hiện tại của bảng. Ví dụ, nếu chúng ta có một bảngInventory_Itemnhư được hiển thịở trên, chúng ta có thể viết:
Chọn C từ Inventory_Item C;
Truy vấn này tạo ra một cột có giá trị kèo bóng đá pháp duy nhất, vì vậy chúng tôi có thể nhận được đầu ra như:
c ------------------------ ("Xúc xắc mờ", 42,1,99) (1 hàng)
Lưu ý Tuy nhiên, kèo bóng đá pháp tên đơn giản được khớp với tên cột Trước kèo bóng đá pháp tên bảng, vì vậy ví dụ này chỉ hoạt động vì không có Cột có tênCTrong truy vấn bảng.
Cú pháp tên tiêu chuẩn thông thườngTable_Name.Cột_namecó thể được hiểu là áp dụngLựa chọn trường19165_19284
Khi chúng ta viết
Chọn c.* Từ Inventory_Item C;
Sau đó, theo tiêu chuẩn SQL, chúng ta nên lấy nội dung của bảng được mở rộng thành kèo bóng đá pháp cột riêng biệt:
19520_19632
Như thể truy vấn là
19693_19756
PostgreSQLsẽ áp dụng điều này
hành vi mở rộng đến bất kỳ biểu thức có giá trị kèo bóng đá pháp nào, mặc dù là
Hiển thịở trên, Bạn
cần viết dấu ngoặc đơn xung quanh giá trị.*được áp dụng cho bất cứ khi nào nó không phải là một bảng đơn giản
tên. Ví dụ: nếumyfunc ()
là a
chức năng trả về một loại kèo bóng đá pháp với các cộtA, BvàC, sau đó hai truy vấn này có
Kết quả tương tự:
Chọn (myfunc (x)).* Từ một số_table; Chọn (myfunc (x)). A, (myfunc (x)). B, (myfunc (x)).
Tip: PostgreSQLXử lý Mở rộng cột bằng cách thực sự chuyển đổi biểu mẫu đầu tiên thành thứ hai. Vì vậy, trong ví dụ này,
myfunc ()
Sẽ được gọi ba lần mỗi hàng với cú pháp. Nếu nó là một chức năng đắt tiền mà bạn có thể muốn tránh điều đó, điều mà bạn có thể làm với một truy vấn như:Chọn (m).TheOffset 0mệnh đề giữ trình tối ưu hóa từ"Flattening"Sub-chọn Đến biểu mẫu với nhiều cuộc gọi của
myfunc ()
.
Thecomposite_value.*cú pháp kết quả trong việc mở rộng cột của kèo bóng đá pháp này
Khi nó xuất hiện ở cấp cao nhất củaChọnđầu ra
danh sách, ATrở vềDanh sáchinChèn/Cập nhật/Xóa, AGiá trịmệnh đềhoặc AHàng
người xây dựng. Trong tất cả kèo bóng đá pháp bối cảnh khác (bao gồm cả khi lồng nhau
bên trong một trong kèo bóng đá pháp cấu trúc đó), đính kèm.*thành giá trị kèo bóng đá pháp không thay đổi giá trị,
Vì nó có nghĩa là"Tất cả kèo bóng đá pháp cột"Và vì vậy
Cùng một giá trị kèo bóng đá pháp được tạo lại. Ví dụ: nếuSOMEFUNC ()
Chấp nhận giá trị kèo bóng đá pháp
Đối số, các truy vấn này giống nhau:
Chọn một sốFunc (c.*) Từ incent_item c; Chọn một sốFunc (c) từ incentory_item c;
Trong cả hai trường kèo bóng đá pháp, hàng hiện tại củaInventory_Itemđược truyền cho chức năng như một Đối số có giá trị kèo bóng đá pháp đơn. Mặc dù.*Không có gì trong những trường hợp như vậy, sử dụng nó là tốt Phong cách, vì nó làm rõ rằng một giá trị kèo bóng đá pháp được dự định. TRONG đặc biệt, trình phân tích cú pháp sẽ xem xétCinc.*để chỉ tên bảng hoặc bí danh, không đến một tên cột, để không có sự mơ hồ; vì không có.*, không rõ liệu liệuCCó nghĩa là tên bảng hoặc tên cột, và trên thực tế Giải thích tên cột sẽ được ưu tiên nếu có Cột có tênC.
Một ví dụ khác chứng minh kèo bóng đá pháp khái niệm này là tất cả những điều này Truy vấn có nghĩa tương tự:
Chọn * từ Inventory_Item C Order của C; Chọn * từ Inventory_Item C đặt hàng theo c. *; Chọn * từ incentory_item c đơn hàng theo hàng (c. *);
Tất cả những điều nàyĐặt hàng bởimệnh đề chỉ định giá trị kèo bóng đá pháp của hàng. Tuy nhiên, nếuInventory_Itemchứa một cột có tênC, trường hợp đầu tiên sẽ khác Từ những người khác, vì nó chỉ có nghĩa là sắp xếp theo cột đó. Đưa ra kèo bóng đá pháp tên cột được hiển thị trước đó, kèo bóng đá pháp truy vấn này cũng là tương đương với những người trên:
Chọn * từ Inventory_Item C đặt hàng theo hàng (c.name, c.supplier_id, c.price); Chọn * Từ Inventory_Item C Order theo (C.Name, C.Supplier_id, C.Price);
(Trường kèo bóng đá pháp cuối cùng sử dụng hàm tạo hàng với từ khóahàngbỏ qua.)
Một hành vi cú pháp đặc biệt khác liên quan đến kèo bóng đá pháp các giá trị là chúng ta có thể sử dụngchức năng ký hiệuĐể trích xuất một trường có giá trị kèo bóng đá pháp. Các Cách đơn giản để giải thích điều này là các ký hiệutrường(Bảng)vàBảng.trườngcó thể hoán đổi cho nhau. Ví dụ, kèo bóng đá pháp truy vấn này tương đương:
Chọn C.Name từ Inventory_Item C trong đó c.price 1000; Chọn Tên (C) từ Inventory_Item C WHERE Giá (C) 1000;
Hơn nữa, nếu chúng ta có chức năng chấp nhận một đối số duy nhất thuộc loại kèo bóng đá pháp, chúng ta có thể gọi nó với ký hiệu. Những cái này Truy vấn đều tương đương:
24902_25031
Sự tương đương này giữa ký hiệu chức năng và ký hiệu trường Làm cho nó có thể sử dụng các chức năng trên các loại kèo bóng đá pháp để triển khai"kèo bóng đá pháp trường được tính toán". Một ứng dụng sử dụng Truy vấn cuối cùng ở trên sẽ không cần phải biết trực tiếp rằngSOMEFUNCkhông phải là một cột thực của bàn.
Tip:Vì hành vi này, việc đưa ra một hàm có một đối số loại kèo bóng đá pháp duy nhất cùng tên như bất kỳ trường nào của loại kèo bóng đá pháp đó. Nếu có sự mơ hồ, Giải thích tên hiện trường sẽ được ưa thích, do đó một Chức năng không thể được gọi mà không có thủ thuật. Một cách để buộc Giải thích chức năng là để điều kiện học đồ tên chức năng, đó là, viếtlược đồ.func(compositeValue).
Biểu diễn văn bản bên ngoài của giá trị kèo bóng đá pháp bao gồm của các mục được giải thích theo quy tắc chuyển đổi I/O Đối với các loại trường riêng lẻ, cộng với trang trí cho biết Cấu trúc kèo bóng đá pháp. Trang trí bao gồm dấu ngoặc đơn ((và)) xung quanh toàn bộ giá trị, cộng với dấu phẩy (,) giữa kèo bóng đá pháp mặt hàng liền kề. Khoảng trắng bên ngoài dấu ngoặc bị bỏ qua, nhưng Trong ngoặc đơn, nó được coi là một phần của giá trị trường, và có thể hoặc không đáng kể tùy thuộc vào đầu vào Quy tắc chuyển đổi cho kiểu dữ liệu trường. Ví dụ: trong:
'(42)'
khoảng trắng sẽ bị bỏ qua nếu kèo bóng đá pháp trường là số nguyên, nhưng không nếu đó là văn bản.
Như được hiển thị trước đó, khi viết một giá trị kèo bóng đá pháp, bạn có thể Viết trích dẫn kép xung quanh bất kỳ giá trị trường cá nhân. BạnphảiLàm như vậy nếu trường Giá trị nếu không sẽ nhầm lẫn trình phân tích cú pháp giá trị kèo bóng đá pháp. TRONG Đặc biệt, các trường chứa dấu ngoặc đơn, dấu phẩy, trích dẫn kép, hoặc dấu gạch chéo ngược phải được trích dẫn kép. Để đặt một báo giá kép hoặc Backslash trong một giá trị trường kèo bóng đá pháp được trích dẫn, trước nó với một đánh dấu dấu vết chéo ngược. (Ngoài ra, một cặp trích dẫn kép trong một trích dẫn kép Giá trị trường được thực hiện để đại diện cho một ký tự báo giá kép, Tương tự như các quy tắc cho các trích dẫn đơn trong chuỗi theo nghĩa đen của SQL.) Ngoài ra, bạn có thể tránh trích dẫn và sử dụng lùi lại bảo vệ tất cả các ký tự dữ liệu nếu không sẽ được coi là Cú pháp kèo bóng đá pháp.
Giá trị trường hoàn toàn trống (không có ký tự nào giữa dấu phẩy hoặc dấu ngoặc đơn) đại diện cho một null. Để viết một giá trị đó là một chuỗi trống chứ không phải null, viết"".
27933_28246
Lưu ý:28309_28545Texttrường chứa báo giá kép và dấu gạch chéo ngược trong Một giá trị kèo bóng đá pháp, bạn cần phải viết:
Chèn ... Giá trị ('("\" \\ ")');Bộ xử lý theo yêu cầu chuỗi loại bỏ một cấp độ ngược, để những gì đến trình phân tích cú pháp giá trị kèo bóng đá pháp trông giống như("\" \ "). Lần lượt, chuỗi được đưa vàoTextthói quen đầu vào của kèo bóng đá pháp dữ liệu trở thành"\. (Nếu chúng tôi làm việc với một loại dữ liệu có thói quen đầu vào cũng được xử lý kèo bóng đá pháp dấu gạch chéo đặc biệt,byteaVí dụ, chúng ta có thể cần tới tám dấu gạch chéo ngược trong lệnh để đưa một dấu gạch chéo ngược vào dự trữ Trường kèo bóng đá pháp.) Trích dẫn đô la (xemPhần 4.1.2.4) có thể được sử dụng để tránh sự cần thiết phải tăng gấp đôi Backslashes.
Tip:ThehàngCú pháp Constructor thường dễ làm việc hơn so với cú pháp-liêm-trái nghĩa Khi viết các giá trị kèo bóng đá pháp trong các lệnh SQL. TRONGhàng, Các giá trị trường riêng lẻ được viết giống nhau cách họ sẽ được viết khi không phải là thành viên của kèo bóng đá pháp.