Các truy vấn con lồng nhau và liên kết trong SQL, vị từ EXISTS. Truy vấn SQL phức tạp

SQL cho phép bạn lồng các truy vấn vào nhau. Thông thường, một truy vấn con trả về một giá trị duy nhất, được kiểm tra xem vị từ có đúng hay không.

Các loại từ tìm kiếm:
. So sánh với kết quả của truy vấn con (=, >=)
. Kiểm tra thuộc về kết quả của truy vấn con (IN)
. Kiểm tra sự tồn tại (EXISTS)
. So sánh nhiều (định lượng) (BẤT KỲ, TẤT CẢ)

Lưu ý về truy vấn lồng nhau:
. Truy vấn con chỉ được chọn một cột (ngoại trừ truy vấn con có vị từ EXISTS) và kiểu dữ liệu kết quả của nó phải khớp với kiểu dữ liệu của giá trị được chỉ định trong vị từ.
. Trong một số trường hợp, bạn có thể sử dụng từ khóa DISTINCT để đảm bảo rằng một giá trị được trả về.
. Bạn không thể bao gồm mệnh đề ORDER BY hoặc UNION trong truy vấn phụ.
. Truy vấn con có thể được đặt ở bên trái hoặc bên phải của điều kiện tìm kiếm.
. Truy vấn con có thể sử dụng các hàm tổng hợp mà không cần mệnh đề GROUP BY, mệnh đề này sẽ tự động trả về một giá trị đặc biệt cho bất kỳ số hàng nào, một vị từ IN đặc biệt và các biểu thức dựa trên cột.
. Bất cứ khi nào có thể, bạn nên sử dụng phép nối bảng THAM GIA thay vì truy vấn phụ.

Ví dụ về truy vấn lồng nhau:

CHỌN * TỪ Đơn hàng WHERE SNum=(CHỌN SNum TỪ Nhân viên bán hàng WHERE SName=’Motika’)
CHỌN * TỪ Đơn hàng WHERE SNum IN (CHỌN SNum TỪ Nhân viên bán hàng WHERE City='London')
CHỌN * TỪ Đơn hàng WHERE SNum=(CHỌN SNum KHÁC BIỆT TỪ Đơn hàng WHERE CNum=2001)
CHỌN * TỪ Đơn hàng WHERE Amt>(CHỌN AVG(Amt) TỪ Đơn hàng WHERE Odate=10/04/1990)
CHỌN * TỪ Khách hàng WHERE CNum=(CHỌN SNum+1000 TỪ Nhân viên bán hàng WHERE SName='Serres')

2) Truy vấn phụ liên quan

Trong SQL, bạn có thể tạo các truy vấn con tham chiếu một bảng từ truy vấn bên ngoài. Trong trường hợp này, truy vấn con được thực hiện nhiều lần, một lần cho mỗi hàng trong bảng từ truy vấn bên ngoài. Vì vậy, điều quan trọng là truy vấn con sử dụng chỉ mục. Một truy vấn con có thể truy cập vào cùng một bảng với bảng bên ngoài. Nếu truy vấn bên ngoài trả về số lượng hàng tương đối nhỏ thì truy vấn con được liên kết sẽ nhanh hơn truy vấn không được liên kết. Nếu truy vấn con trả về số lượng hàng nhỏ thì truy vấn có liên quan sẽ chậm hơn truy vấn không liên quan.

Ví dụ cho các truy vấn phụ có liên quan:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM Order O2 WHERE O2.CNum=O1.CNum) //trả về tất cả các đơn hàng có giá trị vượt quá giá trị đơn hàng trung bình của một khách hàng nhất định

3) Vị ngữ Tồn tại

Dạng cú pháp: Tồn tại ()

Vị từ lấy truy vấn con làm đối số và đánh giá là đúng nếu truy vấn con có đầu ra và ngược lại là sai. Truy vấn con được thực hiện một lần và có thể chứa một số cột, vì giá trị của chúng không được kiểm tra, nhưng kết quả của sự hiện diện của các hàng chỉ được ghi lại.

Lưu ý về vị từ EXISTS:
. EXISTS là một vị từ trả về TRUE hoặc FALSE và có thể được sử dụng một mình hoặc với các biểu thức Boolean khác.
. EXISTS không thể sử dụng các hàm tổng hợp trong truy vấn con của nó.
. Trong các truy vấn con tương quan, vị từ EXISTS được thực thi cho mỗi hàng của bảng bên ngoài.
. Bạn có thể kết hợp vị từ EXISTS với các phép nối bảng.

Ví dụ về vị từ EXISTS:

CHỌN * TỪ Khách hàng WHERE EXISTS(CHỌN * TỪ Khách hàng WHERE City='San Jose') - trả về tất cả khách hàng nếu có bất kỳ khách hàng nào sống ở San Jose.
SELECT DISTINCT SNum FROM Customer First WHERE NOT EXISTS (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) – trả về số lượng người bán chỉ phục vụ một khách hàng.
CHỌN DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Customer S WHERE EXISTS (CHỌN * TỪ Khách hàng T WHERE S.SNum=T.SNum VÀ S.CNumT.CNum VÀ F.SNum=S.SNum) – trả về số điện thoại, tên và thành phố cư trú của tất cả những người bán hàng đã phục vụ nhiều khách hàng.
CHỌN * TỪ Nhân viên bán hàng Đầu tiên WHERE EXISTS (CHỌN * TỪ Khách hàng Gửi WHERE Frst.SNum=Send.SNum AND 1

4) Vị từ so sánh định lượng

Dạng cú pháp: (=|>|=|) BẤT KỲ|TẤT CẢ ()

Các vị từ này sử dụng truy vấn con làm đối số, tuy nhiên, so với vị từ EXISTS, chúng được sử dụng cùng với các vị từ quan hệ (=,>=). Theo nghĩa này, chúng tương tự như vị từ IN, nhưng chỉ được sử dụng với các truy vấn phụ. Tiêu chuẩn này cho phép bạn sử dụng từ khóa SOME thay vì ANY, nhưng không phải tất cả các DBMS đều hỗ trợ nó.

Lưu ý về vị ngữ so sánh:
. Vị từ TẤT CẢ đánh giá là TRUE nếu mỗi giá trị được chọn trong quá trình thực thi truy vấn con thỏa mãn điều kiện được chỉ định trong vị từ truy vấn bên ngoài. Nó thường được sử dụng với bất đẳng thức.
. Vị từ BẤT KỲ đánh giá là TRUE nếu ít nhất một giá trị được chọn trong quá trình thực thi truy vấn con thỏa mãn điều kiện được chỉ định trong vị từ truy vấn bên ngoài. Nó thường được sử dụng với bất đẳng thức.
. Nếu truy vấn con không trả về bất kỳ hàng nào thì ALL sẽ tự động nhận giá trị TRUE (được coi là điều kiện so sánh được thỏa mãn) và đối với ANY nó nhận giá trị FALSE.
. Nếu sự so sánh không có giá trị TRUE không có hàng nào và có một hoặc nhiều hàng có giá trị NULL thì BẤT KỲ hàng nào trả về KHÔNG XÁC ĐỊNH.
. Nếu so sánh là FALSE không có hàng nào và có một hoặc nhiều hàng có giá trị NULL thì ALL trả về UNKNOWN.

Ví dụ về vị ngữ so sánh định lượng:

CHỌN * TỪ Nhân viên bán hàng WHERE Thành phố=ANY(CHỌN Thành phố TỪ Khách hàng)
CHỌN * TỪ Đơn hàng WHERE Amt ALL(CHỌN Xếp hạng TỪ Khách hàng WHERE City='Rome')

5) Vị từ duy nhất

ĐỘC ĐÁO| KHÁC BIỆT ()

Vị từ được sử dụng để kiểm tra tính duy nhất (không có bản sao) trong dữ liệu đầu ra của truy vấn con. Hơn nữa, trong vị từ UNIQUT các dòng có Giá trị NULLđược coi là duy nhất và trong vị từ DISTINCT, hai giá trị không xác định được coi là bằng nhau.

6) So khớp vị ngữ

CUỘC THI ĐẤU ()

Vị từ MATCH kiểm tra xem giá trị của chuỗi truy vấn có khớp với giá trị của bất kỳ chuỗi nào phát sinh từ truy vấn con hay không. Truy vấn con này khác với các biến vị ngữ IN AND ANY ở chỗ nó cho phép xử lý các kết quả khớp “một phần” (PARTIAL) có thể xảy ra giữa các hàng có một số giá trị NULL.

7) Truy vấn trong phần FROM

Trên thực tế, việc sử dụng truy vấn con ở bất kỳ nơi nào được phép tham chiếu bảng là hợp pháp.

CHỌN CName, Tot_Amt TỪ Khách hàng, (CHỌN CNum, SUM(Amt) NHƯ Tot_Amt TỪ Đơn hàng NHÓM THEO CNum) WHERE City=’London’ AND Customer.CNum=Orders.CNum
//truy vấn con trả về tổng số lượng đơn hàng được đặt bởi mỗi khách hàng từ London.

8) Truy vấn đệ quy

VỚI đệ quy
Q1 NHƯ CHỌN … TỪ … Ở ĐÂU …
Q2 NHƯ CHỌN … TỪ … Ở ĐÂU …

  • Dịch
  • Hướng dẫn
Bạn có cần “SELECT * WHERE a=b FROM c” hay “SELECT WHERE a=b FROM c ON *” không?

Nếu bạn giống tôi, bạn sẽ đồng ý: SQL là một trong những thứ lúc đầu có vẻ dễ dàng (đọc như tiếng Anh!), nhưng bằng cách nào đó bạn phải tra Google mọi truy vấn đơn giản để tìm ra cú pháp chính xác.


Và sau đó tham gia, tổng hợp, truy vấn phụ bắt đầu và hóa ra nó hoàn toàn là rác rưởi. Một cái gì đó như thế này:


CHỌN thành viên.firstname || " " || thành viên.lastname NHƯ "Tên đầy đủ" TỪ mượn INNER THAM GIA thành viên TRÊN thành viên.memberid=borrowings.memberid INNER THAM GIA sách TRÊN books.bookid=borrowings.bookid WHERE loans.bookid IN (CHỌN bookid TỪ sách WHERE stock>(SELECT avg(stock ) TỪ sách)) NHÓM THEO thành viên.firstname, thành viên.lastname;

Bue! Điều này sẽ khiến bất kỳ người mới hoặc thậm chí là nhà phát triển trình độ trung cấp nào sợ hãi nếu lần đầu tiên nhìn thấy SQL. Nhưng nó không phải là tất cả xấu.


Thật dễ dàng để nhớ những gì trực quan và với hướng dẫn này, tôi hy vọng sẽ giảm bớt rào cản tiếp cận SQL cho người mới và cung cấp cho những người đã có kinh nghiệm một cách mới để xem xét SQL.


Mặc dù cú pháp SQL gần như giống nhau giữa các cơ sở dữ liệu khác nhau nhưng bài viết này sử dụng PostgreSQL cho các truy vấn. Một số ví dụ sẽ hoạt động trong MySQL và các cơ sở dữ liệu khác.

1. Ba từ kỳ diệu

Có nhiều từ khóa trong SQL, nhưng SELECT, FROM và WHERE có mặt trong hầu hết mọi truy vấn. Một lát sau, bạn sẽ hiểu rằng ba từ này thể hiện các khía cạnh cơ bản nhất của việc xây dựng các truy vấn tới cơ sở dữ liệu và những từ khác còn hơn thế nữa. truy vấn phức tạp, chỉ là những tiện ích bổ sung bên trên chúng.

2. Cơ sở của chúng tôi

Chúng ta hãy xem cơ sở dữ liệu mà chúng tôi sẽ sử dụng làm ví dụ trong bài viết này:







Chúng ta có thư viện sách và mọi người. Ngoài ra còn có một bảng đặc biệt để ghi lại những cuốn sách đã phát hành.

  • Bảng "sách" lưu trữ thông tin về tên sách, tác giả, ngày xuất bản và tính sẵn có của sách. Nó đơn giản.
  • Trong bảng “thành viên” - họ và tên của tất cả những người đã đăng ký thư viện.
  • Bảng “mượn” lưu trữ thông tin về sách lấy từ thư viện. Cột bookid đề cập đến ID của cuốn sách được lấy trong bảng “books” và cột memberid đề cập đến người tương ứng trong bảng “thành viên”. Chúng tôi cũng có ngày phát hành và ngày phải trả lại cuốn sách.

3. Yêu cầu đơn giản

Hãy bắt đầu với một yêu cầu đơn giản: chúng tôi cần tênsố nhận dạng(id) của tất cả các cuốn sách được viết bởi tác giả “Dan Brown”


Yêu cầu sẽ như thế này:


CHỌN bookid NHƯ "id", tiêu đề TỪ sách Ở ĐÂU tác giả="Dan Brown";

Và kết quả là như thế này:


nhận dạng tiêu đề
2 Biểu tượng bị mất
4 địa ngục

Khá đơn giản. Chúng ta hãy nhìn vào yêu cầu để hiểu những gì đang xảy ra.

3.1 TỪ - nơi chúng tôi lấy dữ liệu từ đó

Điều này bây giờ có vẻ hiển nhiên, nhưng FROM sẽ rất quan trọng sau này khi chúng ta tham gia và truy vấn phụ.


TỪ điểm tới bảng để truy vấn. Đây có thể là một bảng hiện có (như trong ví dụ trên) hoặc một bảng được tạo nhanh chóng thông qua các phép nối hoặc truy vấn con.

3.2 Ở ĐÂU - dữ liệu nào chúng tôi hiển thị

WHERE đơn giản hoạt động như một bộ lọc dòng, mà chúng tôi muốn xuất ra. Trong trường hợp của chúng tôi, chúng tôi chỉ muốn xem các hàng có giá trị trong cột tác giả là “Dan Brown”.

3.3 SELECT – cách hiển thị dữ liệu

Bây giờ chúng ta đã có tất cả các cột cần thiết từ bảng mà chúng ta cần, chúng ta cần quyết định cách hiển thị dữ liệu này một cách chính xác. Trong trường hợp của chúng tôi, chúng tôi chỉ cần tên sách và ID, vì vậy đó là những gì chúng tôi đang làm. Cùng lựa chọn nào Với sử dụng CHỌN. Đồng thời, bạn có thể đổi tên cột bằng AS.


Toàn bộ truy vấn có thể được hình dung bằng sơ đồ đơn giản:


4. Kết nối (tham gia)

Bây giờ chúng tôi muốn xem tên sách (không nhất thiết phải là duy nhất) của tất cả các cuốn sách của Dan Brown đã được mượn từ thư viện và khi nào những cuốn sách đó cần được trả lại:


CHỌN sách.title NHƯ "Tiêu đề", các khoản vay.returndate NHƯ "Ngày trả lại" TỪ các khoản vay THAM GIA sách TRÊN các khoản vay.bookid=books.bookid WHERE books.author="Dan Brown";

Kết quả:


Tiêu đề Ngày trở lại
Biểu tượng bị mất 2016-03-23 00:00:00
địa ngục 2016-04-13 00:00:00
Biểu tượng bị mất 2016-04-19 00:00:00

Phần lớn yêu cầu này tương tự như yêu cầu trước đó ngoại trừ TỪ các phần. Nó có nghĩa là chúng tôi đang truy vấn dữ liệu từ một bảng khác. Chúng tôi không truy cập vào bảng “sách” hoặc bảng “khoản vay”. Thay vào đó chúng tôi chuyển sang bảng mới, được tạo bằng cách nối hai bảng này.


các khoản vay THAM GIA sách TRÊN các khoản vay.bookid=books.bookid - đây là, hãy xem xét, bảng mới, được hình thành bằng cách kết hợp tất cả các bản ghi từ bảng "sách" và "mượn" trong đó các giá trị bookid khớp với nhau. Kết quả của việc sáp nhập như vậy sẽ là:



Và sau đó chúng ta truy vấn bảng này theo cách tương tự như trong ví dụ trên. Điều này có nghĩa là khi nối các bảng, bạn chỉ cần lo lắng về việc nối các bảng như thế nào. Và sau đó yêu cầu trở nên rõ ràng như trong trường hợp “ yêu cầu đơn giản» từ điểm 3.


Hãy thử phép nối phức tạp hơn một chút với hai bảng.


Bây giờ chúng tôi muốn biết họ và tên của những người đã lấy sách từ thư viện của tác giả “Dan Brown”.


Lần này chúng ta hãy đi từ dưới lên trên:


Bước Bước 1- chúng ta lấy dữ liệu ở đâu? Để có được kết quả cần thiết, chúng ta cần nối bảng “thành viên” và “sách” với bảng “khoản vay”. Phần THAM GIA sẽ trông như thế này:


vay THAM GIA sách TRÊN loan.bookid=books.bookid THAM GIA thành viên TRÊN member.memberid=borrowings.memberid

Kết quả của kết nối có thể được nhìn thấy tại liên kết.


Bước 2- chúng tôi hiển thị dữ liệu gì? Chúng tôi chỉ quan tâm đến dữ liệu trong đó tác giả của cuốn sách là “Dan Brown”


WHERE books.author="Dan Brown"

Bước 3- làm thế nào để chúng tôi hiển thị dữ liệu? Bây giờ dữ liệu đã được nhận, bạn chỉ cần hiển thị họ và tên những người đã lấy sách:


CHỌN thành viên.firstname NHƯ "Tên", thành viên.lastname NHƯ "Họ"

Siêu! Tất cả những gì còn lại là kết hợp ba thành phần và đưa ra yêu cầu mà chúng tôi cần:


CHỌN thành viên.firstname NHƯ "Tên", thành viên.lastname NHƯ "Họ" TỪ các khoản vay THAM GIA sách TRÊN các khoản vay.bookid=books.bookid THAM GIA các thành viên TRÊN các thành viên.memberid=borrowings.memberid WHERE books.author="Dan Brown";

Điều gì sẽ cho chúng ta:


Tên đầu tiên Họ
Mike Willis
Ellen Horton
Ellen Horton

Tuyệt vời! Nhưng những cái tên được lặp lại (chúng không phải là duy nhất). Chúng tôi sẽ sớm khắc phục điều này.

5. Tổng hợp

Nói đại khái, Cần có các tập hợp để chuyển đổi nhiều hàng thành một. Đồng thời, trong quá trình tổng hợp, logic khác nhau được sử dụng cho các cột khác nhau.


Hãy tiếp tục với ví dụ của chúng tôi về nơi xuất hiện tên trùng lặp. Rõ ràng là Ellen Horton đã đọc nhiều hơn một cuốn sách, nhưng đây không phải là cuốn sách hay nhất. Cách tốt nhất hiển thị thông tin này. Bạn có thể thực hiện một yêu cầu khác:


CHỌN thành viên.firstname NHƯ "Tên", thành viên.họ NHƯ "Họ", đếm(*) NHƯ "Số lượng sách đã mượn" TỪ mượn THAM GIA sách TRÊN loan.bookid=books.bookid THAM GIA thành viên TRÊN thành viên.memberid=borrowings .memberid WHERE books.author="Dan Brown" NHÓM THEO thành viên.firstname, thành viên.lastname;

Điều này sẽ cho chúng ta kết quả mong muốn:


Tên đầu tiên Họ Số sách mượn
Mike Willis 1
Ellen Horton 2

Hầu hết tất cả các tập hợp đều có mệnh đề GROUP BY. Điều này biến một bảng có thể được truy xuất bằng một truy vấn thành các nhóm bảng. Mỗi nhóm tương ứng với một giá trị (hoặc nhóm giá trị) duy nhất của cột mà chúng ta đã chỉ định trong GROUP BY. Trong ví dụ của chúng tôi, chúng tôi chuyển đổi kết quả từ bài tập trước thành một nhóm các hàng. Chúng tôi cũng thực hiện tổng hợp bằng count , chuyển đổi nhiều hàng thành một giá trị nguyên (trong trường hợp của chúng tôi là số lượng hàng). Ý nghĩa này sau đó được gán cho mỗi nhóm.


Mỗi hàng trong kết quả đại diện cho kết quả tổng hợp của mỗi nhóm.



Người ta có thể đi đến kết luận hợp lý rằng tất cả các trường trong kết quả phải được chỉ định trong GROUP BY hoặc việc tổng hợp phải được thực hiện trên chúng. Bởi vì tất cả các lĩnh vực khác có thể khác nhau về dòng khác nhau và nếu bạn chọn chúng CHỌN ", thì không rõ giá trị nào có thể được lấy.


Trong ví dụ trên chức năng đếmđã xử lý tất cả các hàng (vì chúng tôi đã đếm số lượng hàng). Các hàm khác như chỉ xử lý tổng hoặc tối đa dòng quy định. Ví dụ: nếu muốn tìm số lượng sách được viết bởi mỗi tác giả thì chúng ta cần truy vấn sau:


CHỌN tác giả, tổng (kho) TỪ sách NHÓM THEO tác giả;

Kết quả:


tác giả Tổng
Robin Sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Đây hàm tổng hợp chỉ xử lý cột chứng khoán và tính tổng của tất cả các giá trị trong mỗi nhóm.

6. Truy vấn phụ


Truy vấn con là các truy vấn SQL thông thường được nhúng trong các truy vấn lớn hơn. Chúng được chia thành ba loại dựa trên loại kết quả trả về.

6.1 Bảng hai chiều

Có những truy vấn trả về nhiều cột. Ví dụ tốtĐây là một truy vấn từ bài tập tổng hợp trước đó. Là một truy vấn con, nó sẽ chỉ trả về một bảng khác để có thể thực hiện các truy vấn mới. Tiếp tục bài tập trước, nếu chúng ta muốn biết số lượng cuốn sách được viết bởi tác giả “Robin Sharma”, thì một trong những cách có thể- sử dụng truy vấn phụ:


CHỌN * TỪ (CHỌN tác giả, tổng (kho) TỪ sách NHÓM THEO tác giả) NHƯ kết quả WHERE tác giả="Robin Sharma";

Kết quả:



Có thể viết là: ["Robin Sharma", "Dan Brown"]


2. Bây giờ chúng tôi sử dụng kết quả này trong một truy vấn mới:


CHỌN tiêu đề, tên sách TỪ sách WHERE tác giả IN (CHỌN tác giả TỪ (CHỌN tác giả, tổng (kho) TỪ sách NHÓM THEO tác giả) NHƯ kết quả WHERE tổng > 3);

Kết quả:


tiêu đề giá sách
Biểu tượng bị mất 2
Ai sẽ khóc khi bạn chết? 3
địa ngục 4

Điều này cũng giống như:


CHỌN tiêu đề, tên sách TỪ sách Ở ĐÂU tác giả TRONG ("Robin Sharma", "Dan Brown");

6.3 Giá trị riêng lẻ

Có những truy vấn chỉ dẫn đến một hàng và một cột. Chúng có thể được coi là giá trị không đổi và có thể được sử dụng ở bất kỳ nơi nào sử dụng giá trị, chẳng hạn như trong toán tử so sánh. Chúng cũng có thể được sử dụng như bảng hai chiều hoặc mảng một phần tử.


Ví dụ: hãy lấy thông tin về tất cả các cuốn sách có số lượng trong thư viện vượt quá mức trung bình hiện tại.


Trung bình có thể đạt được theo cách này:


chọn avg(stock) từ sách;

Điều gì mang lại cho chúng tôi:


7. Thao tác ghi

Hầu hết các thao tác ghi cơ sở dữ liệu khá đơn giản so với các thao tác đọc phức tạp hơn.

Cập nhật 7.1

Cú pháp của yêu cầu UPDATE về mặt ngữ nghĩa giống như yêu cầu đọc. Điểm khác biệt duy nhất là thay vì chọn các cột bằng SELECT, chúng ta thiết lập kiến ​​thức bằng SET.


Nếu toàn bộ sách của Dan Brown bị mất thì bạn cần đặt lại giá trị số lượng. Truy vấn cho điều này sẽ là:


CẬP NHẬT sách SET stock=0 WHERE tác giả="Dan Brown";

WHERE thực hiện tương tự như trước: chọn hàng. Thay vì SELECT mà chúng ta đã sử dụng khi đọc, giờ đây chúng ta sử dụng SET. Tuy nhiên, bây giờ bạn cần chỉ định không chỉ tên cột mà còn cả giá trị mới cho cột này trong các hàng đã chọn.


7.2 Xóa

Truy vấn DELETE chỉ đơn giản là truy vấn CHỌN hoặc CẬP NHẬT không có tên cột. Nghiêm túc. Giống như SELECT và UPDATE, khối WHERE vẫn giữ nguyên: nó chọn các hàng cần xóa. Thao tác xóa sẽ phá hủy toàn bộ hàng, do đó việc chỉ định các cột riêng lẻ là vô nghĩa. Vì vậy, nếu chúng tôi quyết định không đặt lại số lượng sách của Dan Brown mà xóa hoàn toàn tất cả các bản ghi, thì chúng tôi có thể đưa ra yêu cầu sau:


XÓA TỪ sách Ở ĐÂU tác giả="Dan Brown";

7.3 Chèn

Có lẽ điều duy nhất khác với các loại truy vấn khác là INSERT. Định dạng là:


CHÈN VÀO x (a,b,c) GIÁ TRỊ (x, y, z);

Trong đó a , b , c là tên cột và x , y và z là các giá trị được chèn vào các cột đó, theo cùng một thứ tự. Về cơ bản là vậy.


Chúng ta hãy nhìn vào ví dụ cụ thể. Đây là truy vấn INSERT điền vào toàn bộ bảng "sách":


CHÈN VÀO sách (bookid,title,author,published,stock) GIÁ TRỊ (1,"Scion of Ikshvaku","Amish Tripathi","06-22-2015",2), (2,"The Lost Symbol"," Dan Brown","07-22-2010",3), (3,"Ai Sẽ Khóc Khi Bạn Chết?","Robin Sharma","06-15-2006",4), (4,"Inferno" ,"Dan Brown","05-05-2014",3), (5,"The Fault in our Stars","John Green","01-03-2015",3);

8. Kiểm tra

Chúng ta đã đi đến cuối cùng, tôi đề xuất một bài kiểm tra nhỏ. Hãy nhìn vào yêu cầu đó ở đầu bài viết. Bạn có thể hình dung về nó? Hãy thử chia nó thành các phần SELECT , FROM , WHERE , GROUP BY và xem xét các thành phần riêng lẻ truy vấn phụ.


Đây là một dạng dễ đọc hơn:


CHỌN thành viên.firstname || " " || thành viên.lastname NHƯ "Tên đầy đủ" TỪ mượn INNER THAM GIA thành viên TRÊN thành viên.memberid=borrowings.memberid INNER THAM GIA sách TRÊN books.bookid=borrowings.bookid WHERE loans.bookid IN (CHỌN bookid TỪ sách WHERE stock> (CHỌN avg(stock) ) TỪ sách)) NHÓM THEO thành viên.firstname, thành viên.lastname;

Truy vấn này trả về danh sách những người đã mượn sách từ thư viện có tổng số trên mức trung bình.


Kết quả:


Họ và tên
Lida Tyler

Tôi hy vọng bạn có thể tìm ra nó mà không gặp bất kỳ vấn đề gì. Nhưng nếu không, tôi rất mong nhận được ý kiến ​​​​và phản hồi của bạn để tôi có thể cải thiện bài đăng này.

Thẻ: Thêm thẻ

Chúng ta hãy xem nó là gì truy vấn lồng nhau vào và tại sao chúng lại cần thiết.
Thường có một tình huống khi một số hành động tuần tự cần được thực hiện trên một bàn. Một ví dụ khá minh họa là khi lần đầu tiên bạn cần, sau đó áp đặt một số điều kiện lên một bảng được nhóm hoặc kết nối nó với một bảng khác. Trong những trường hợp như vậy, họ đến giải cứu truy vấn lồng nhau.

Truy vấn lồng nhau thực tế không khác gì truy vấn thông thường. Nó được đặt trong ngoặc và hầu hết tất cả các phương thức và chức năng của ngôn ngữ truy vấn 1C đều có sẵn trong đó. Và đối với truy vấn gốc, tất cả các trường của truy vấn phụ đều có sẵn.
Cấu trúc của truy vấn lồng nhau nguyên thủy nhất trông như thế này

CHỌN TỪ (CHỌN TỪ) NHƯ NestedQuery

Tất nhiên, ở dạng này, việc sử dụng truy vấn lồng nhau không có ý nghĩa gì, bởi vì Bạn có thể chọn ngay các trường bắt buộc mà không cần sử dụng lồng nhau. Mọi thứ ở đây đều cực kỳ đơn giản để dễ hiểu.

Bây giờ chúng ta hãy xem xét tất cả những điều trên bằng một ví dụ.
Hãy cho chúng tôi có một bảng Nhân viênDivisions:

Và chúng tôi muốn chọn từ bảng này tất cả các phòng ban có nhiều hơn một nhân viên làm việc.

CHỌN Nhân viênDivisions.Division AS Division, NUMBER(EmployeesDivisions.Employee) AS Số lượng nhân viên TỪ Nhân viênCác bộ phận NHƯ Nhân viênCác bộ phận NHÓM THEO Nhân viênDivisions.Division

Nếu chúng ta chạy truy vấn này, kết quả chúng ta sẽ nhận được bảng sau

Bước thứ hai là áp đặt giới hạn về số lượng nhân viên trên bàn này. Để làm điều này, hãy lồng truy vấn trên vào nhau và viết điều kiện tương ứng vào truy vấn cao hơn

CHỌN NestedQuery.Unit NHƯ Đơn vị TỪ (CHỌN Nhân viênUnits.Unit NHƯ Đơn vị, SỐ LƯỢNG(EmployeesUnits.Employee) NHƯ Số lượng nhân viên TỪ Nhân viên NHƯ NHÓM Nhân viên NHÓM THEO Nhân viênUnits.Unit) NHƯ NestedQuery WHERE NestedQuery.NumberofEmployees > 1

Như vậy, kết quả của truy vấn cuối cùng sẽ như sau

Công bằng mà nói, điều đáng lưu ý là có thể đạt được kết quả tương tự khi sử dụng hàm ĐANG CÓ Ngôn ngữ truy vấn 1C, cũng như sử dụng các bảng tạm thời.
Trong thực tế, tất nhiên bạn sẽ gặp phải các truy vấn lồng nhau phức tạp hơn có thể sử dụng cả bảng và bảng. Cũng có thể có nhiều cấp độ lồng nhau.

Trong bài học trước chúng ta đã gặp phải một điều bất tiện. Khi chúng tôi muốn biết ai đã tạo ra chủ đề “xe đạp”, chúng tôi đã đưa ra yêu cầu tương ứng:

Thay vì tên tác giả, chúng tôi nhận được mã nhận dạng của anh ấy. Điều này cũng dễ hiểu, vì chúng ta đã thực hiện truy vấn vào một bảng - Chủ đề, còn tên tác giả chủ đề được lưu trữ trong một bảng khác - Người dùng. Do đó, sau khi tìm ra mã định danh của tác giả chủ đề, chúng ta cần thực hiện một truy vấn khác - tới bảng Người dùng để tìm ra tên của anh ta:

SQL cung cấp khả năng kết hợp các truy vấn đó thành một bằng cách biến một trong số chúng thành truy vấn con (truy vấn lồng nhau). Vì vậy, để tìm ra ai đã tạo chủ đề "xe đạp", chúng ta sẽ thực hiện truy vấn sau:

Tức là sau từ khóa Ở ĐÂU, chúng ta viết một yêu cầu khác trong điều kiện. Đầu tiên, MySQL xử lý truy vấn con, trả về id_author=2 và giá trị này được chuyển đến mệnh đề Ở ĐÂU yêu cầu bên ngoài.

Có thể có một số truy vấn con trong một truy vấn, cú pháp cho truy vấn đó như sau: Lưu ý rằng các truy vấn con chỉ có thể chọn một cột, các giá trị mà chúng sẽ trả về truy vấn bên ngoài. Cố gắng chọn nhiều cột sẽ dẫn đến lỗi.

Để củng cố điều này, chúng ta hãy thực hiện một yêu cầu khác và tìm hiểu xem tác giả của chủ đề “xe đạp” đã để lại thông điệp gì trên diễn đàn:

Bây giờ chúng ta hãy phức tạp hóa nhiệm vụ, tìm hiểu xem tác giả của chủ đề “xe đạp” đã để lại tin nhắn ở chủ đề nào:

Hãy tìm hiểu cách nó hoạt động.

  • MySQL sẽ thực hiện truy vấn sâu nhất trước tiên:

  • Kết quả thu được (id_author=2) sẽ được chuyển đến một yêu cầu bên ngoài, có dạng:

  • Kết quả thu được (id_topic:4,1) sẽ được chuyển đến một yêu cầu bên ngoài, có dạng:

  • Và nó sẽ cho kết quả cuối cùng (topic_name: về câu cá, về câu cá). Những thứ kia. tác giả chủ đề "xe đạp" đã để lại tin nhắn trong chủ đề "Giới thiệu về câu cá" do Sergei (id=1) tạo và trong chủ đề "Giới thiệu về câu cá" do Sveta tạo (id=4).
Đó là tất cả những gì tôi muốn nói về các truy vấn lồng nhau. Tuy nhiên, có hai điểm đáng chú ý:
  • Không nên tạo các truy vấn có mức độ lồng nhau lớn hơn ba. Điều này dẫn đến tăng thời gian thực thi và khó hiểu mã.
  • Cú pháp cho các truy vấn lồng nhau có lẽ là phổ biến nhất nhưng không phải là cú pháp duy nhất. Ví dụ, thay vì hỏi

    viết

    Những thứ kia. chúng ta có thể sử dụng bất kỳ toán tử nào được sử dụng với từ khóa WHERE (chúng ta đã nghiên cứu chúng trong bài học trước).
  • 4. Các khái niệm cơ bản trong thiết kế khái niệm cơ sở dữ liệu quan hệ (thực thể, thuộc tính, mối quan hệ). Các thành phần của mô hình quan hệ
  • Sự phụ thuộc giữa các thuộc tính
  • 5. Tính toàn vẹn của dữ liệu và các loại của nó. Vi phạm tính toàn vẹn (bất thường).
  • 6. Kết nối chức năng của các thuộc tính và chuẩn hóa bảng. Các dạng chuẩn cơ bản (NF). Các ví dụ của sf.
  • 7.Sử dụng mô hình er trong thiết kế khái niệm cơ sở dữ liệu. Sơ đồ của các phiên bản er và loại er.
  • 8. Chuyển đổi mô hình khái niệm thành mô hình quan hệ. Các giai đoạn chính và quy tắc hình thành mối quan hệ (ví dụ).
  • 9. Cấu trúc và đặc tính kỹ thuật chính của cơ sở dữ liệu access 200 *. Khả năng thiết kế các ứng dụng cá nhân và mạng.
  • 10.Xây dựng các bảng trong thuộc tính truy cập ms archive.Field. Định nghĩa kiểu dữ liệu, khóa, chỉ mục.
  • 11. Liên kết các bảng trong cơ sở dữ liệu truy cập. Thiết kế logic và đảm bảo tính toàn vẹn tham chiếu của dữ liệu.
  • 12. Công cụ thực hiện truy vấn trong cơ sở dữ liệu truy cập. Các loại yêu cầu.
  • 5.2.3 Truy vấn các bảng liên quan
  • 5.2.4 Yêu cầu xóa
  • 13.Thực hiện các truy vấn với các phép toán nhóm và các trường được tính toán. Ví dụ.
  • 14. Thực hiện các yêu cầu sửa đổi, tạo bảng.
  • 15. Các tiêu chuẩn triển khai ngôn ngữ sql hiện đại. Các phần chính và nội dung của chúng trong sql-Jet.
  • 16. Định dạng chung của lệnh chọn (yêu cầu chọn). Ví dụ thực hiện.
  • 17.Ví dụ về việc triển khai qbe- và sql của truy vấn chéo.
  • 18.Tạo giao diện ứng dụng trong cơ sở dữ liệu truy cập. Làm việc trong lĩnh vực thiết kế biểu mẫu. Các phần, điều khiển, thuộc tính.
  • 19.Tạo các truy vấn sql lồng nhau. Ví dụ thực hiện.
  • 20. Các chương trình dịch vụ truy cập cơ sở dữ liệu.
  • 21. Bảo vệ và quản trị cơ sở dữ liệu bằng cơ sở dữ liệu truy cập.
  • 22.Sử dụng macro, báo cáo và trang truy cập dữ liệu trong các ứng dụng lưu trữ truy cập ms.
  • 23. Hệ thống lập trình Matlab: đặc điểm chung. Gói mở rộng và ứng dụng chuyên biệt: mục đích và khả năng. Hệ thống con Simulink
  • 24. Cấu trúc dữ liệu và cấu trúc điều khiển cơ bản trong hệ lập trình matlab
  • 25. Các công cụ đồ họa của hệ thống matlab. Làm việc với công cụ lti-Viewer để phân tích đồ họa của hệ thống điều khiển tuyến tính.
  • 26.Các giai đoạn xây dựng mô hình trong hệ thống con Simulink. Các yếu tố của công nghệ mô hình khối trực quan. Thiết lập các tham số mô hình và tham số khối.
  • 27. Mô tả chung về khối thư viện simulink.
  • 28. Thực hiện nguyên tắc phân cấp trong mô hình Simulink sử dụng các khối cổng và hệ thống con. Mặt nạ hệ thống con.
  • 29.Các thành phần của thiết bị ảo và việc lắp ráp chúng thành một ứng dụng trong môi trường LabView. Các điều khiển và chỉ báo LabView cơ bản cũng như kết nối của chúng trong sơ đồ khối.
  • 19.Tạo các truy vấn sql lồng nhau. Ví dụ thực hiện.

    Với SQL bạn có thể lồng các truy vấn vào nhau. Thông thường, truy vấn bên trong tạo ra một giá trị được kiểm tra trong vị từ của truy vấn bên ngoài (trong mệnh đề WHERE hoặc HAVING) để xác định xem giá trị đó đúng hay sai. Cùng với truy vấn con, bạn có thể sử dụng vị từ EXISTS, biến này trả về true nếu đầu ra của truy vấn con không trống.

    Khi kết hợp với các tính năng khác của toán tử chọn, chẳng hạn như nhóm, truy vấn con là một công cụ mạnh mẽ để đạt được kết quả mong muốn. Ở phần TỪ câu lệnh CHỌNĐược phép áp dụng các từ đồng nghĩa cho tên bảng nếu khi tạo một truy vấn, chúng ta cần nhiều hơn một thể hiện của một mối quan hệ nhất định. Từ đồng nghĩa được chỉ định bằng từ khóa AS, có thể bỏ qua hoàn toàn. Vì vậy, phần TỪ có thể trông như thế này:

    TỪ Rl NHƯ A, Rl NHƯ B

    TỪ Rl A. Rl B:

    cả hai biểu thức đều tương đương và được coi là ứng dụng của câu lệnh SELECT cho hai phiên bản của bảng R1.

    Ví dụ: hãy hiển thị một số truy vấn tới cơ sở dữ liệu “Phiên” trông như thế nào trong SQL:

     Danh sách những người đã vượt qua tất cả các kỳ thi bắt buộc.

    Ở ĐÂU Điểm > 2

    CÓ ĐẾM(*) = (CHỌN ĐẾM(*)

    WHERE R2.Group=R3.Group VÀ tên đầy đủa.tên đầy đủ)

    Tại đây, truy vấn tích hợp sẽ xác định tổng số bài kiểm tra mà mỗi học sinh trong lớp của học sinh đó phải làm và so sánh con số này với số bài kiểm tra mà học sinh đó đã thực hiện.

     Danh sách những người dự định thi DB nhưng chưa thi.

    SELEST Tên đầy đủ

    WHERE R2.Fpynna=R3.Group AND Discipline = "DB" VÀ KHÔNG TỒN TẠI

    (CHỌN tên đầy đủ TỪ Rl WHERE tên đầy đủ=a.tên đầy đủ VÀ Kỷ luật = "DB")

    Vị từ EXISTS (SubQuery) là đúng khi truy vấn con của SubQuery không trống, nghĩa là nó chứa ít nhất một bộ dữ liệu, nếu không thì vị từ EXISTS là sai.

    Vị từ NOT EXISTS chỉ đúng khi Truy vấn con trống.

    Lưu ý cách NOT EXISTS với truy vấn lồng nhau cho phép bạn tránh thao tác chênh lệch mối quan hệ. Ví dụ: việc tạo một truy vấn có từ “tất cả” có thể được thực hiện như thể với một số âm kép. Hãy xem xét một ví dụ về cơ sở dữ liệu mô hình hóa việc cung cấp các bộ phận riêng lẻ của từng nhà cung cấp; nó được thể hiện bằng một mối quan hệ SP “Nhà cung cấp-bộ phận” với sơ đồ.

    SP (Số_nhà cung cấp. Số_bộ phận) P (Số_bộ phận. Tên)

    Đây là cách đưa ra câu trả lời cho yêu cầu: “Tìm nhà cung cấp cung cấp tất cả các bộ phận”.

    CHỌN DISTINCT VENDOR_NUMBER TỪ SP SP1 Ở ĐÂU KHÔNG TỒN TẠI

    (CHỌN phần_số

    TỪ P NƠI KHÔNG HIỆN TẠI

    (CHỌN * TỪ SP SP2

    Ở ĐÂU SP2.supplier_number=SP1.supplier_number VÀ

    sp2.part_number = P.part_number)):

    Trên thực tế, chúng tôi đã trình bày lại yêu cầu này như sau: “Tìm nhà cung cấp sao cho không có bộ phận nào họ không cung cấp”. Cần lưu ý rằng truy vấn này cũng có thể được triển khai thông qua các hàm tổng hợp bằng truy vấn con:

    CHỌN DISTINCT Nhà cung cấp_số

    NHÓM THEO nhà cung cấp_số

    CÓ QUỐC GIA Part_number) =

    (CHỌN Đếm(part_number)

    Tiêu chuẩn SQL92 mở rộng các toán tử so sánh thành nhiều phép so sánh bằng cách sử dụng từ khóa ANY và ALL. Tiện ích mở rộng này được sử dụng khi so sánh giá trị của một cột cụ thể với cột dữ liệu được truy vấn con trả về.

    Từ khóa BẤT CỨ, được cung cấp trong bất kỳ vị từ so sánh nào, có nghĩa là vị từ sẽ đúng nếu ít nhất một giá trị từ truy vấn con mà vị từ so sánh là đúng. Từ khóa ALL yêu cầu vị từ so sánh phải đúng khi so sánh với tất cả các hàng trong truy vấn con.

    Ví dụ: hãy tìm những học sinh đã vượt qua tất cả các bài kiểm tra với điểm không thấp hơn “tốt”. Chúng tôi làm việc với cùng một cơ sở dữ liệu “Phiên”, nhưng thêm vào đó một mối quan hệ R4 nữa, đặc trưng cho việc phân phối công việc trong phòng thí nghiệm trong học kỳ:

    R 1 = (Tên, Ngành, Lớp);

    R 2 = (tên đầy đủ, nhóm);

    R 3 = (Nhóm, Kỷ luật)

    R 4 = (Tên, Ngành, Mã số Lab_work, Lớp);

    Chọn R1.Tên đầy đủ Từ R1 Trong đó 4 > = Tất cả (Chọn Rl.Xếp hạng

    Trong đó R1.Họ tên = R11.Họ tên)

    Hãy xem một ví dụ khác:

    Chọn những học sinh có điểm thi không dưới ít nhất một điểm trong bài tập thí nghiệm mà họ đã đạt trong môn học này:

    Chọn R1.Name

    Từ R1 Trong đó R1.Rating >= BẤT CỨ (Chọn R4.Rating

    Trong đó Rl.Kỷ luật = R4. Kỷ luật VÀ R1.Họ tên = R4.Họ tên)