Tóm lược. trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách sử dụng truy vấn con MySQL để viết các truy vấn phức tạp và giải thích khái niệm truy vấn con tương quan Giới thiệu về Truy vấn con MySQLTruy vấn con MySQL là một truy vấn được lồng trong một truy vấn khác, chẳng hạn như SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 1, SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 2, SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 3 hoặc SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 4. Ngoài ra, một truy vấn con có thể được lồng trong một truy vấn con khácTruy vấn con MySQL được gọi là truy vấn bên trong trong khi truy vấn chứa truy vấn con được gọi là truy vấn bên ngoài. Truy vấn con có thể được sử dụng ở bất kỳ đâu mà biểu thức đó được sử dụng và phải được đóng trong ngoặc đơn Ví dụ: truy vấn sau sử dụng truy vấn con để trả về những nhân viên làm việc trong văn phòng ở Hoa Kỳ SELECT
lastName, firstName
FROM
employees
WHERE
officeCode IN (SELECT
officeCode
FROM
offices
WHERE
country = 'USA'); Code language: SQL (Structured Query Language) (sql)
trong ví dụ này - Truy vấn con trả về tất cả các mã văn phòng của các văn phòng đặt tại Hoa Kỳ
- Truy vấn bên ngoài chọn họ và tên của nhân viên làm việc trong văn phòng có mã văn phòng trong tập kết quả được trả về bởi truy vấn con
Khi thực hiện truy vấn, MySQL đánh giá truy vấn con trước và sử dụng kết quả của truy vấn con cho truy vấn bên ngoài Sử dụng truy vấn con MySQL trong mệnh đề WHEREChúng tôi sẽ sử dụng bảng SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 5 trong cơ sở dữ liệu mẫu để minh họaTruy vấn con MySQL với các toán tử so sánhBạn có thể sử dụng các toán tử so sánh e. g. , =, >, < để so sánh một giá trị duy nhất được truy vấn con trả về với biểu thức trong mệnh đề SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 6Ví dụ: truy vấn sau trả về khách hàng có khoản thanh toán cao nhất SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql)
Bên cạnh toán tử SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 7, bạn có thể sử dụng các toán tử so sánh khác như lớn hơn (SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 8), lớn hơn hoặc bằng (>=) nhỏ hơn (SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount = (SELECT MAX(amount) FROM payments); Code language: SQL (Structured Query Language) (sql) 9) và nhỏ hơn hoặc bằng (<=)Ví dụ: bạn có thể tìm khách hàng có khoản thanh toán lớn hơn khoản thanh toán trung bình bằng cách sử dụng truy vấn con SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql)
trong ví dụ này - Đầu tiên, nhận khoản thanh toán trung bình bằng cách sử dụng truy vấn con
- Sau đó, chọn các khoản thanh toán lớn hơn khoản thanh toán trung bình do truy vấn con trả về trong truy vấn bên ngoài
Truy vấn con MySQL với các toán tử SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments);Code language: SQL (Structured Query Language) (sql)0 và SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments);Code language: SQL (Structured Query Language) (sql)1Nếu một truy vấn con trả về nhiều hơn một giá trị, bạn có thể sử dụng các toán tử khác như toán tử SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 2 hoặc SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 3 trong mệnh đề SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 4Xem các bảng SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 5 và SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 6 sau đâyVí dụ: bạn có thể sử dụng truy vấn con với toán tử SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 1 để tìm những khách hàng chưa đặt hàng như sauSELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql)
Truy vấn con MySQL trong mệnh đề SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments);Code language: SQL (Structured Query Language) (sql)8Khi bạn sử dụng truy vấn con trong mệnh đề SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 8, tập kết quả trả về từ truy vấn con được dùng làm bảng tạm thời. Bảng này được gọi là bảng dẫn xuất hoặc truy vấn con cụ thể hóaTruy vấn con sau tìm số lượng mặt hàng tối đa, tối thiểu và trung bình trong đơn đặt hàng SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql)
Lưu ý rằng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 0 được sử dụng để loại bỏ các chữ số thập phân khỏi giá trị trung bình của các mụcTruy vấn con tương quan MySQLTrong các ví dụ trước, bạn nhận thấy rằng một truy vấn phụ là độc lập. Điều đó có nghĩa là bạn có thể thực thi truy vấn con dưới dạng truy vấn độc lập, chẳng hạn SELECT
orderNumber,
COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber; Code language: SQL (Structured Query Language) (sql)
Không giống như truy vấn con độc lập, truy vấn con tương quan là truy vấn con sử dụng dữ liệu từ truy vấn bên ngoài. Nói cách khác, truy vấn con tương quan phụ thuộc vào truy vấn bên ngoài. Truy vấn con tương quan được đánh giá một lần cho mỗi hàng trong truy vấn bên ngoài Xem bảng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 1 sau đây từ cơ sở dữ liệu mẫuVí dụ sau sử dụng truy vấn con tương quan để chọn các sản phẩm có giá mua cao hơn giá mua trung bình của tất cả các sản phẩm trong mỗi dòng sản phẩm SELECT
productname,
buyprice
FROM
products p1
WHERE
buyprice > (SELECT
AVG(buyprice)
FROM
products
WHERE
productline = p1.productline) Code language: SQL (Structured Query Language) (sql)
Trong ví dụ này, cả truy vấn bên ngoài và truy vấn con tương quan đều tham chiếu đến cùng một bảng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 1. Do đó, chúng ta cần sử dụng bí danh bảng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 3 cho bảng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 1 trong truy vấn bên ngoàiKhông giống như truy vấn con thông thường, bạn không thể thực thi độc lập truy vấn con tương quan như thế này. Nếu bạn làm như vậy, MySQL không biết bảng p1 và sẽ báo lỗi SELECT
AVG(buyprice)
FROM
products
WHERE
productline = p1.productline;
Đối với mỗi hàng trong bảng SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 1 (hoặc p1), truy vấn con tương quan cần thực hiện một lần để có được giá mua trung bình của tất cả các sản phẩm trong SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 6 của hàng đóNếu giá mua của hàng hiện tại lớn hơn giá mua trung bình do truy vấn con tương quan trả về, thì truy vấn sẽ bao gồm hàng đó trong tập kết quả Truy vấn con MySQL với SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders);Code language: SQL (Structured Query Language) (sql)7 và SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders);Code language: SQL (Structured Query Language) (sql)8Khi truy vấn con được sử dụng với toán tử SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 7 hoặc SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 0, truy vấn con trả về giá trị Boolean là SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 1 hoặc SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 2. Truy vấn sau đây minh họa một truy vấn con được sử dụng với toán tử SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 7SELECT
*
FROM
table_name
WHERE
EXISTS( subquery ); Code language: SQL (Structured Query Language) (sql)
Trong truy vấn trên, nếu truy vấn con trả về bất kỳ hàng nào, thì SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 4 trả về SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 1, ngược lại, nó trả về SELECT
MAX(items),
MIN(items),
FLOOR(AVG(items))
FROM
(SELECT
orderNumber, COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber) AS lineitems; Code language: SQL (Structured Query Language) (sql) 2SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 7 và SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 8 thường được sử dụng trong các truy vấn con tương quanHãy xem các bảng SELECT
customerNumber,
checkNumber,
amount
FROM
payments
WHERE
amount > (SELECT
AVG(amount)
FROM
payments); Code language: SQL (Structured Query Language) (sql) 6 và SELECT
orderNumber,
COUNT(orderNumber) AS items
FROM
orderdetails
GROUP BY orderNumber; Code language: SQL (Structured Query Language) (sql) 0 từ cơ sở dữ liệu mẫuTruy vấn sau tìm các đơn đặt hàng có tổng giá trị lớn hơn 60K SELECT
orderNumber,
SUM(priceEach * quantityOrdered) total
FROM
orderdetails
INNER JOIN
orders USING (orderNumber)
GROUP BY orderNumber
HAVING SUM(priceEach * quantityOrdered) > 60000; Code language: SQL (Structured Query Language) (sql)
Nó trả về 3 hàng, nghĩa là có ba đơn đặt hàng có tổng giá trị lớn hơn 60K. Bạn có thể sử dụng truy vấn ở trên dưới dạng truy vấn con tương quan để tìm những khách hàng đã đặt ít nhất một đơn đặt hàng có tổng giá trị lớn hơn 60K bằng cách sử dụng toán tử SELECT
customerName
FROM
customers
WHERE
customerNumber NOT IN (SELECT DISTINCT
customerNumber
FROM
orders); Code language: SQL (Structured Query Language) (sql) 7
Tôi có thể sử dụng cái gì thay vì không có trong SQL?
Nếu vậy, bạn nên cân nhắc sử dụng toán tử NOT EXISTS thay vì NOT IN hoặc viết lại câu lệnh dưới dạng phép nối ngoài bên trái.
Điều gì đúng về việc sử dụng not in khi viết các truy vấn có các truy vấn phụ trong đó?
Khi sử dụng NOT IN , truy vấn con trả về một danh sách gồm 0 hoặc nhiều giá trị trong truy vấn bên ngoài trong đó cột so sánh không khớp với bất kỳ giá trị nào được trả về từ truy vấn con. Using the previous example, NOT IN returns all the products that are not supplied from MA.
Làm thế nào để sử dụng không bằng trong MySQL?
không bằng (<>,. =) toán tử . MySQL Not equal được sử dụng để trả về một tập hợp các hàng (từ một bảng) sau khi đảm bảo rằng hai biểu thức được đặt ở hai bên của toán tử NOT EQUAL TO (<>) không bằng nhau.
Làm cách nào để kiểm tra xem một mục có tồn tại trong MySQL không?
Toán tử EXISTS của MySQL
. Toán tử EXISTS trả về TRUE nếu truy vấn con trả về một hoặc nhiều bản ghi. |