Kiến thức về SQL dành cho tester

Bài viết này giới thiệu các câu lệnh SQL cơ bản và thông dụng đối với tester, hi vọng hữu ích cho mọi người.

Các câu lệnh SELECT cơ bản

Trong một cơ sở dữ liệu quan hệ, dữ liệu được lưu trữ trong bảng. Ví dụ bảng EmployeeAddressTable liên quan đến Social Security Number, Name, and Address:

Muốn xem địa chỉ của từng nhân viên thì ta sẽ sử dụng câu lệnh SELECT: SELECT FirstName, LastName, Address, City, State FROM EmployeeAddressTable;

Sau đây là kết quả truy vấn của cơ sở dữ liệu:

Để có được tất cả các cột của một bảng mà không cần gõ tất cả các tên cột, sử dụng: SELECT * FROM TableName;

Conditional Selection

Để thảo luận thêm về câu lệnh SELECT, hãy xem bảng ví dụ mới:

a) Các toán tử quan hệ

Có sáu Toán tử Quan hệ trong SQL

Mệnh đề WHERE được sử dụng để xác định rằng chỉ hàng nào đó của bảng được hiển thị, dựa trên các tiêu chí mô tả trong mệnh đề WHERE . Nếu muốn xem EMPLOYEEIDNO của những người có từ 50.000 đô la trở lên, sử dụng câu lệnh

SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY = 50000;

Lưu ý rằng ký hiệu > = (lớn hơn hoặc bằng) được sử dụng, vì muốn thấy những người kiếm được >= 50.000 USD, được liệt kê cùng nhau. Điều này hiển thị:

EMPLOYEEIDNO ------------ 010 105 152 215 244

Mô tả WHERE, SALARY >= 50000, là một điều kiện (True hoặc False) . Cùng có thể được thực hiện cho các cột văn bản:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE POSITION = 'Manager';

--> Hiển thị ID Numbers của tất cả các Managers.

Các điều kiện phức tạp hơn: Điều kiện phức tạp/ Toán tử Logic

  • Toán tử AND tham gia hai hoặc nhiều điều kiện, và chỉ hiển thị một hàng nếu dữ liệu của hàng thỏa mãn điều kiện ALL (tức là tất cả các điều kiện giữ đúng).

Ví dụ: để hiển thị tất cả nhân viên làm hơn 40.000 đô la, sử dụng:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE SALARY > 40000 AND POSITION = 'Staff'; 
  • Điều kiện OR tham gia hai hoặc nhiều điều kiện, nhưng trả về một hàng nếu bất kỳ các điều kiện giữ đúng.

VD để xem tất cả những người kiếm được ít hơn 40.000 đô la hoặc có trợ cấp ít hơn 10.000 đô la, sử dụng câu lệnh sau:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE SALARY <  40000 OR BENEFITS < 10000;

AND và OR có thể được kết hợp, ví dụ:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE POSITION = 'Manager' AND SALARY > 60000 OR BENEFITS > 12000;
  • Trước tiên, SQL tìm các hàng có mức lương cao hơn 60.000 đô la và cột vị trí là Manager, lấy các hàng danh sách mới, sau đó SQL sẽ xem xét nếu bất kỳ hàng nào đáp ứng điều kiện AND trước hoặc điều kiện là cột Benefits lớn hơn $ 12,000.
  • SQL chỉ hiển thị danh sách hàng mới thứ hai này, bất kỳ ai có Benefits trên $ 12,000 sẽ được bao gồm trong khi toán tử OR bao gồm một hàng nếu điều kiện kết quả là True.
  • Lưu ý là toán tử AND được thực hiện đầu tiên.

IN & BETWEEN

Một phương pháp dễ dàng hơn trong việc sử dụng các điều kiện phức hợp sử dụng IN hoặc BETWEEN. Ví dụ: nếu bạn muốn liệt kê tất cả người quản lý và nhân viên:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE POSITION IN ('Manager', 'Staff');

hoặc liệt kê những người kiếm được nhiều hơn hoặc bằng 30.000 đô la, nhưng ít hơn hoặc bằng 50.000 đô la, hãy sử dụng:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE SALARY BETWEEN 30000 AND 50000;

Để liệt kê tất cả mọi người không ở trong phạm vi này, sử dụng:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEESTATISTICSTABLE 
WHERE SALARY NOT BETWEEN 30000 AND 50000;

Tương tự, NOT IN liệt kê tất cả các hàng bị loại khỏi danh sách IN .

Ngoài ra, NOT có thể được ném vào cùng AND & OR, ngoại trừ NOT là toán tử đơn vị (đánh giá một điều kiện, đảo ngược giá trị của nó, trong khi AND's & OR đánh giá hai điều kiện) và tất cả các NOT đều được thực hiện trước AND và OR.

Thứ tự SQL của toán tử Logic (từ trái sang phải)

  1. NOT
  2. AND
  3. OR

Sử dụng Like

Ví dụ bảng EmployeeStatisticsTable, ta muốn thấy tất cả những người có họ bắt đầu bằng chữ "S", sử dụng:

SELECT EMPLOYEEIDNO 
FROM EMPLOYEEADDRESSTABLE 
WHERE LASTNAME LIKE 'S%';

Dấu phần trăm (%) được sử dụng để biểu diễn bất kỳ ký tự nào có thể (số, chữ hoặc chấm câu) hoặc tập hợp các ký tự có thể xuất hiện sau chữ "S". Để tìm những người có LastName kết thúc bằng "S", hãy sử dụng '% S', hoặc nếu bạn muốn chữ "S" ở giữa từ, hãy thử '% S%'. '%' Có thể được sử dụng cho bất kỳ ký tự nào ở cùng vị trí tương ứng với các ký tự nhất định.

JOIN

Thiết kế cơ sở dữ liệu tốt cho thấy mỗi bảng chỉ liệt kê dữ liệu về một thực thể duy nhất , và có thể thu thập được thông tin chi tiết trong một cơ sở dữ liệu quan hệ bằng cách sử dụng các bảng bổ sung và sử dụng một tham gia.

Bảng ví dụ:

KEY

Khái niệm về các khóa.

  • PRIMARY KEY: khóa chính của bảng, là định danh duy nhất cho mỗi bản ghi trong bảng. Nó đòi hỏi cột (hoặc các cột) tạo thành khóa chính phải thỏa mãn 2 điều kiện: không NULL và mỗi giá trị phải duy nhất trong toàn bảng. Mỗi bảng chỉ cho phép tối đa 1 khóa chính và theo nguyên tắc thiết kế, mỗi bảng đều cần có khóa chính.

Ví dụ, trong bảng AntiqueOwners, cột OwnerID duy nhất nhận diện hàng đó. Điều này có nghĩa là hai điều:

  • Không thể có hai hàng có OwnerID giống nhau

  • Nếu hai chủ sở hữu có cùng tên và họ, cột OwnerID đảm bảo rằng hai chủ sở hữu sẽ không bị nhầm lẫn với nhau, vì cột OwnerID duy nhất sẽ được sử dụng trong cơ sở dữ liệu để theo dõi các chủ sở hữu, chứ không phải là tên.

  • FOREIGN KEY: ràng buộc khóa ngoại là một cột trong một bảng, trong đó cột đó là khóa chính của một bảng khác, nghĩa là bất kỳ dữ liệu nào trong cột khoá ngoại phải có dữ liệu tương ứng trong bảng khác, nơi cột đó là khóa chính. Ràng buộc này đảm bảo tính toàn vẹn tham chiếu dữ liệu.

Ví dụ:

  • Trong bảng Antiques table, cả BuyerID và SellerID đều là khoá ngoại cho khoá chính của bảng AntiqueOwners (OwnerID, người chủ phải là Antique Owner trước khi có thể mua hoặc bán bất kỳ vật phẩm nào).
  • Trong cả hai bảng, các hàng ID được sử dụng để xác định chủ sở hữu hoặc người mua và người bán, và OwnerID là chìa khóa chính của bảng AntiqueOwners. Nói cách khác, tất cả dữ liệu "ID" này được sử dụng để chỉ chủ sở hữu, người mua hoặc người bán hàng đồ cổ mà họ không cần sử dụng tên thật.

Thực hiện JOIN

Mục đích là để dữ liệu liên quan qua các bảng, mà không cần phải lặp lại dữ liệu trong mỗi bảng - đây là sức mạnh của cơ sở dữ liệu quan hệ.

Ví dụ: Tìm tên của những người đã mua ghế mà không cần liệt kê tên đầy đủ tên của người mua trong bảng AntiqueOwners ... bạn có thể lấy tên bằng cách liên hệ với những người đã mua một chiếc ghế có tên trong bảng AntiqueOwners thông qua việc sử dụng OwnerID, liên quan đến dữ liệu trong hai bảng.

Để tìm tên của những người đã mua một chiếc ghế, hãy sử dụng truy vấn sau đây:

SELECT OWNERLASTNAME, OWNERFIRSTNAME 
FROM ANTIQUEOWNERS, ANTIQUES 
WHERE BUYERID = OWNERID AND ITEM = 'Chair';

Chú ý: cả hai bảng liên quan đến mối quan hệ được liệt kê trong mệnh đề FROM của câu lệnh.

  • Trong mệnh đề WHERE, phần ITEM = 'Chair' hạn chế danh sách cho những người đã mua ghế. Thứ hai, thông báo các cột ID có liên quan như thế nào từ một bảng này sang bảng kế tiếp bằng cách sử dụng mệnh đề BUYERID = OWNERID. Chỉ có nơi khớp ID giữa các bảng và mặt hàng đã mua là một chiếc ghế (do AND), các tên từ bảng AntiqueOwners sẽ được liệt kê ra sao. Bởi vì điều kiện kết nối sử dụng một dấu bằng, được gọi là equijoin . --> Kết quả của truy vấn này là hai tên: Smith, Bob & Fowler, Sam.

Dấu chấm "." dùng để chỉ tiền tố tên bảng cho tên cột, để tránh sự mơ hồ, như sau:

SELECT ANTIQUEOWNERS.OWNERLASTNAME, ANTIQUEOWNERS.OWNERFIRSTNAME 
FROM ANTIQUEOWNERS, ANTIQUES 
WHERE ANTIQUES.BUYERID = ANTIQUEOWNERS.OWNERID AND ANTIQUES.ITEM = 'Chair';

Vì các tên cột khác nhau trong mỗi bảng, tuy nhiên, điều này là không cần thiết.

DISTINCT và Eliminating Duplicates

  • Muốn vào danh sách các ID và tên của những người đã bán một antique.

  • Muốn có một danh sách mà mỗi người bán chỉ được liệt kê một lần.

--> Có nghĩa là cần sử dụng SQL để loại bỏ các hàng bán trùng lặp, và chỉ cần liệt kê từng người một lần.

  • Để làm điều này, sử dụng từ khóa DISTINCT . Đầu tiên, equijoin vào bảng AntiqueOwners để lấy dữ liệu chi tiết của LastName và FirstName của người đó. Chú ý: cột SellerID trong bảng Antiques là khoá ngoại đối với bảng AntiqueOwners, người bán sẽ chỉ được liệt kê nếu có một hàng trong bảng AntiqueOwners liệt kê ID và tên.

  • Muốn loại bỏ nhiều lần xuất hiện của SellerID trong danh sách, sử dụng DISTINCT trên cột nơi mà lặp lại có thể xảy ra (tuy nhiên, không nhất thiết phải đặt Distinct ở phía trước của cột).

  • Sau đó, muốn danh sách được sắp xếp theo thứ tự bởi LastName, FirstName (trên một LastName tie). Như vậy, sẽ sử dụng mệnh đề ORDER BY :

SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME T FROM ANTIQUES, ANTIQUEOWNERS WHERE SELLERID = QUYỀN S OC QUYỀN CỦA OWNERLASTNAME, OWNERFIRSTNAME;

Trong ví dụ này, vì mọi người đã bán một mặt hàng, ta sẽ có một danh sách tất cả các chủ sở hữu, theo thứ tự chữ cái theo họ.

Aliases(bí danh) và các truy vấn In/Sub

  • Để in last name của những chủ sở hữu đã đặt hàng và thứ tự là gì, chỉ liệt kê các đơn đặt hàng có thể fill:
SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered
FROM ORDERS ORD, ANTIQUEOWNERS OWN 
WHERE ORD.OWNERID = OWN.OWNERID 
AND ORD.ITEMDESIRED IN
(SELECT ITEM 
FROM ANTIQUES);

Kết quả Last Name Item Ordered


Smith Table Smith Desk Akins Chair Lawson Mirror

Các câu lệnh SQL khác

Hàm Aggregate

5 hàm tổng hợp quan trọng : SUM, AVG, MAX, MIN và COUNT.

Các hàm tổng hợp tóm tắt kết quả của một truy vấn thay vì liệt kê tất cả các hàng.

  • SUM () cho tổng của tất cả các hàng, thỏa mãn mọi điều kiện, của cột đã cho, trong đó cột được cho là số.
  • AVG () cho biết mức trung bình của cột cho trước.
  • MAX () cho biết con số lớn nhất trong cột nhất định.
  • MIN () cho biết con số nhỏ nhất trong cột cho trước.
  • COUNT ( * ) cho biết số hàng thỏa mãn các điều kiện.

Nhìn vào bảng EmployeeStatisticsTable, xét ví dụ: VD1

SELECT SUM(SALARY), AVG(SALARY) 
FROM EMPLOYEESTATISTICSTABLE;

--> Truy vấn này cho thấy tổng số tiền lương trong bảng và mức lương trung bình của tất cả các mục trong bảng. VD2

SELECT MIN(BENEFITS) 
FROM EMPLOYEESTATISTICSTABLE 
WHERE POSITION = 'Manager';

--> Truy vấn này cho biết con số nhỏ nhất của cột Benefits, của nhân viên là Managers, là 12500.

VD3

SELECT COUNT(*) 
FROM EMPLOYEESTATISTICSTABLE 
WHERE POSITION = 'Staff';

--> Truy vấn này cho bạn biết có bao nhiêu nhân viên có trạng thái Staff (3).

VIEW

  • Trong SQL, view là để cho phép gán các kết quả của truy vấn vào một bảng mới, mà có thể sử dụng trong các truy vấn khác, ở đó bảng mới này được cung cấp tên xem trong mệnh đề FROM.

  • Khi truy cập vào view, truy vấn được định nghĩa trong câu lệnh tạo chế độ xem thực và kết quả của truy vấn đó giống như một bảng khác trong truy vấn đã viết khi gọi truy vấn.

Ví dụ: để tạo chế độ xem:

CREATE VIEW ANTVIEW AS SELECT ITEMDESIRED FROM ORDERS;

Truy vấn bằng cách sử dụng view này dưới dạng một bảng, trong đó bảng chỉ là một danh sách tất cả các Mục mong muốn từ bảng Orders:

SELECT SELLERID 
FROM ANTIQUES, ANTVIEW 
WHERE ITEMDESIRED = ITEM;

Truy vấn này cho thấy tất cả các SellerID từ bảng Antiques, trong đó mục trong bảng đó xuất hiện trong khung nhìn Antview, đó là tất cả các mục Tìm kiếm mong muốn trong bảng Orders.

Danh sách được tạo ra bằng cách duyệt qua mục Antique Items từng cái một cho đến khi có một sự phù hợp với khung nhìn Antview. Các lượt xem có thể được sử dụng để hạn chế truy cập cơ sở dữ liệu, cũng như, trong trường hợp này, đơn giản hóa một truy vấn phức tạp.

Tạo bảng mới

Tất cả các bảng trong một cơ sở dữ liệu phải được tạo ra tại một số điểm trong thời gian ... VD: tạo bảng Orders :

CREATE TABLE ORDERS 
(OWNERID INTEGER NOT NULL, 
ITEMDESIRED CHAR(40) NOT NULL);

Câu lệnh này cho biết tên bảng và mỗi cột trong bảng.

  • Lưu ý rằng câu lệnh này sử dụng các loại dữ liệu chung chung, và các loại dữ liệu có thể khác nhau, tùy thuộc vào những gì DBMS bạn đang kiểm tra danh sách địa phương. Một số kiểu dữ liệu phổ biến chung là:
  • Char (x) - Một cột các ký tự, trong đó x là một số chỉ định số ký tự cho phép tối đa (chiều dài tối đa) trong cột.
  • Integer - Một cột của toàn bộ số, số dương hoặc số âm.
  • Số thập phân (x, y) - Một cột số thập phân, trong đó x là chiều dài cực đại trong các chữ số của các số thập phân trong cột này, và y là số cực đại cho phép sau dấu thập phân. Số lượng tối đa (4,2) sẽ là 99,99.
  • Ngày - Một cột ngày trong một định dạng cụ thể của DBMS.
  • Logical - Một cột chỉ có thể chứa hai giá trị: TRUE hoặc FALSE.
  • Lưu ý: NOT NULL nghĩa là cột phải có giá trị trong mỗi hàng. Nếu NULL được sử dụng, cột đó có thể để trống trong một hàng nhất định.

ALTER TABLE

Thêm một cột vào bảng Antiques để cho phép nhập giá của một Item (Dấu ngoặc đơn tùy chọn):

ALTER TABLE ANTIQUES ADD (PRICE DECIMAL(8,2) NULL);

Dữ liệu cho cột mới này có thể được cập nhật hoặc chèn như sau.

  • Thêm dữ liệu

Để chèn các hàng vào một bảng, hãy thực hiện theo các bước sau: INSERT INTO ANTIQUES VALUES (21, 01, 'Ottoman', 200.00);

Điều này chèn dữ liệu vào bảng, như một hàng mới, cột-by-cột, theo thứ tự được xác định trước.

Thay vào đó, chúng ta hãy thay đổi thứ tự và để Giá trống:

INSERT INTO ANTIQUES (BUYERID, SELLERID, ITEM) 
VALUES (01, 21, 'Ottoman'); 
  • Cập nhật dữ liệu

Cập nhật một Giá thành một hàng không có giá niêm yết:

UPDATE ANTIQUES SET PRICE = 500.00 WHERE ITEM = 'Chair';

Điều này đặt tất cả các Chair's Prices lên 500.00. Như được hiển thị ở trên, cần sử dụng WHERE, sử dụng AND, để hạn chế việc cập nhật các hàng cụ thể hơn. Ngoài ra, các cột bổ sung có thể được đặt bằng cách tách các câu lệnh equal với dấu phẩy.

  • Xóa dữ liệu

Hãy xóa hàng mới Ottoman ra khỏi cơ sở dữ liệu:

DELETE FROM ANTIQUES 
WHERE ITEM = 'Ottoman';
  • Nhưng nếu có một hàng có chứa 'Ottoman', hàng đó cũng sẽ bị xóa. Hãy xóa tất cả các hàng (trong trường hợp này) chứa dữ liệu cụ thể mà chúng tôi đã thêm vào trước đây:

DELETE FROM ANTIQUES WHERE ITEM = 'Ottoman' AND BUYERID = 01 AND SELLERID = 21;


Các chủ đề khác

Index (Chỉ mục)

  • Chỉ mục cho phép DBMS truy cập dữ liệu nhanh hơn (tính năng này không chuẩn / không có sẵn trên tất cả các hệ thống). Hệ thống tạo cấu trúc dữ liệu nội bộ (chỉ số) gây ra việc lựa chọn các hàng, khi lựa chọn dựa trên các cột được lập chỉ mục, sẽ xảy ra nhanh hơn.

  • Chỉ mục này cho biết DBMS có một hàng nhất định trong bảng với giá trị cột được lập chỉ mục.

VD Tạo một chỉ mục cho OwnerID trong bảng AntiqueOwners:

CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);

Bây giờ trên các tên:

CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME, OWNERFIRSTNAME);

  • Để thoát khỏi chỉ mục, drop nó:

DROP INDEX OID_IDX;

  • Bạn cũng có thể "drop" một bảng, (cẩn thận - có nghĩa là bảng của bạn bị xóa).

  • Trong ví dụ thứ hai, chỉ mục được giữ trên hai cột, tổng hợp lại với nhau - hành vi lạ thường có thể xảy ra trong trường hợp này ... hãy kiểm tra bằng tay trước khi thực hiện thao tác như vậy.

  • Một số DBMS không thực thi các khoá chính; nói cách khác, sự độc đáo của một cột không được thi hành tự động. VD, để chèn một hàng vào bảng AntiqueOwners với một OwnerID của 02, một số hệ thống sẽ cho phép tôi để làm điều đó, vì cột đó là nghĩa vụ phải là duy nhất rằng bảng (mỗi giá trị hàng được cho là khác nhau).

  • Một cách để có được xung quanh đó là để tạo ra một chỉ số duy nhất trên cột mà chúng tôi muốn là một chìa khóa chính, buộc hệ thống để thực thi việc cấm các bản sao:

CREATE UNIQUE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);

GROUP BY & HAVING

  • GROUP BY là liên kết một hàm tổng hợp (đặc biệt là COUNT, đếm số hàng trong mỗi nhóm) với các nhóm các hàng.
  • Giả sử rằng bảng Antiques có cột Price, và mỗi hàng có một giá trị cho cột đó. Muốn xem giá mặt hàng đắt nhất mà từng chủ sở hữu mua.
SELECT BUYERID, MAX(PRICE) 
FROM ANTIQUES 
GROUP BY BUYERID;

Nếu chỉ muốn xem giá mua tối đa nếu mua hàng là trên $ 1000, sử dụng HAVING:

SELECT BUYERID, MAX(PRICE) 
FROM ANTIQUES 
GROUP BY BUYERID 
HAVING PRICE > 1000;

More Sub queries (Thêm truy vấn phụ)

Các truy vấn con liên quan đến việc sử dụng toán tử để cho phép một điều kiện WHERE để bao gồm các SELECT đầu ra của một truy vấn phụ.

  • Liệt kê những người mua đã mua một mặt hàng đắt tiền (giá của mặt hàng lớn hơn 100 đô la so với giá trung bình của tất cả các mặt hàng đã mua):

SELECT BUYERID 
FROM ANTIQUES 
WHERE PRICE >
(SELECT AVG(PRICE) + 100 
FROM ANTIQUES);
  • Câu hỏi con tính giá trung bình, cộng với 100 đô la và sử dụng con số đó, một OwnerID được in cho mọi mặt hàng có chi phí trên con số đó. Người ta có thể sử dụng DISTINCT BUYERID, để loại bỏ các bản sao.

  • Liệt kê các Last Names của những người trong bảng AntiqueOwners, chỉ nếu họ đã mua một món hàng:


SELECT OWNERLASTNAME 
FROM ANTIQUEOWNERS 
WHERE OWNERID IN
(SELECT DISTINCT BUYERID 
FROM ANTIQUES);
  • Truy vấn con trả về danh sách người mua và last name được in cho chủ sở hữu Antique khi và chỉ khi ID của chủ sở hữu xuất hiện trong danh sách truy vấn phụ (đôi khi được gọi là danh sách ứng cử viên ).
  • Lưu ý: đối với một số DBMS, có thể sử dụng equals thay vì IN, nhưng vì sự rõ ràng, vì một tập được trả về từ truy vấn con, IN là sự lựa chọn tốt hơn.
  • Đối với một ví dụ Cập nhật, ví dụ quý ông đã mua kệ sách có sai Tên trong cơ sở dữ liệu ... phải là John:

UPDATE ANTIQUEOWNERS 
SET OWNERFIRSTNAME = 'John' 
WHERE OWNERID =
(SELECT BUYERID 
FROM ANTIQUES 
WHERE ITEM = 'Bookcase');

Trước tiên, truy vấn phụ tìm BuyerID cho (những) người đã mua Bookcase, sau đó truy vấn bên ngoài cập nhật Tên của bạn.

Quy tắc về các truy vấn phụ:

  • Khi có một truy vấn con là một phần của một điều kiện WHERE, mệnh đề Select trong truy vấn con phải có các cột phù hợp với số và gõ vào trong mệnh đề Where của truy vấn bên ngoài.

  • Nói cách khác, nếu bạn có "WHERE ColumnName = (SELECT ...);", Select phải có chỉ một cột trong nó, để phù hợp với ColumnName trong mệnh đề Where bên ngoài, và chúng phải phù hợp với kiểu (cả hai là số nguyên , cả hai đều là chuỗi ký tự, v.v ...).

  • EXIST & ALL

** EXISTS** sử dụng truy vấn con là một điều kiện

  • True nếu truy vấn con trả về bất kỳ hàng nào.
  • False nếu truy vấn con không trả về bất kỳ hàng nào.
  • Đây là một tính năng ít sử dụng duy nhất. Tuy nhiên, nếu một khách hàng tiềm năng muốn xem danh sách chủ sở hữu chỉ khi cửa hàng giải quyết trong Chair, hãy thử:
SELECT OWNERFIRSTNAME, OWNERLASTNAME 
FROM ANTIQUEOWNERS 
WHERE EXISTS
(SELECT * 
FROM ANTIQUES 
WHERE ITEM = 'Chair');
  • Nếu có bất kỳ Chairs trong cột Antiques, truy vấn phụ sẽ trả về một hàng hoặc các hàng, làm cho EXISTS đúng, khiến SQL liệt kê các Antique Owners. Nếu không có Ghế nào, không có hàng nào được trả về bởi truy vấn bên ngoài.

ALL

  • Là một tính năng khác thường, vì ALL truy vấn thường có thể được thực hiện với các phương pháp khác nhau, hãy xem xét một truy vấn ví dụ:
SELECT BUYERID, ITEM 
FROM ANTIQUES 
WHERE PRICE >= ALL
(SELECT PRICE 
FROM ANTIQUES);

--> Trả lại các mặt hàng có giá lớn nhất (hoặc nhiều hơn một mặt hàng nếu có một tie), và người mua của nó. --> Truy vấn con trả về một danh sách tất cả các giá trong bảng Antiques, và truy vấn bên ngoài đi qua mỗi hàng của bảng Antiques, và nếu Giá của nó lớn hơn hoặc bằng với mỗi (hoặc ALL) Giá trong danh sách, nó được liệt kê , đưa ra Item có giá cao nhất. Lý do "=" phải được sử dụng là giá cao nhất sẽ bằng với giá cao nhất trong danh sách vì mục này nằm trong Giá.

Nguồn dịch

http://www.gcreddy.com/2014/07/sql-for-testers.html