Mysql không có trong truy vấn con không hoạt động

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 MySQL

Truy 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ác

Truy 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

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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 đề WHERE

Chú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ọa

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

Truy vấn con MySQL với các toán tử so sánh

Bạ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)
6

Ví 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)

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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)

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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)1

Nế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)
4

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)
5 và

SELECT customerNumber, checkNumber, amount FROM payments WHERE amount > (SELECT AVG(amount) FROM payments);

Code language: SQL (Structured Query Language) (sql)
6 sau đây

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

Ví 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ư sau

SELECT customerName FROM customers WHERE customerNumber NOT IN (SELECT DISTINCT customerNumber FROM orders);

Code language: SQL (Structured Query Language) (sql)

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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)8

Khi 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óa

Truy 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)

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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ục

Truy vấn con tương quan MySQL

Trong 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ẫu

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

Ví 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)

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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ài

Khô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)8

Khi 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)
7

SELECT * 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)
2

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)
8 thường được sử dụng trong các truy vấn con tương quan

Hã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ẫu

Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

Truy 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)
Mysql không có trong truy vấn con không hoạt động
Mysql không có trong truy vấn con không hoạt động

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.