Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách làm việc với truy vấn con MySQL

Một truy vấn con là một truy vấn SQL (Ngôn ngữ Truy vấn Có cấu trúc) được lồng trong một truy vấn SQL khác. Lệnh mà truy vấn con được lồng vào được gọi là truy vấn mẹ. Truy vấn con được sử dụng để xử lý trước dữ liệu được sử dụng trong truy vấn mẹ. Truy vấn con có thể được áp dụng trong SELECT , INSERT , UPDATEDELETE hoạt động.

Khi truy vấn con được thực thi, truy vấn con được xử lý trước tiên trước truy vấn mẹ. Khi xây dựng các ứng dụng MySQL, sử dụng truy vấn con mang lại một số lợi thế:

  • Chúng chia các câu lệnh SQL thành các đơn vị logic đơn giản, điều này có thể làm cho chúng dễ hiểu và dễ bảo trì hơn. Nói cách khác, truy vấn phụ giúp tách biệt các phần phức tạp của truy vấn.
  • Chúng loại bỏ nhu cầu sử dụng UNION phức tạp câu lệnh và JOIN tuyên bố.
  • Chúng được sử dụng để thực thi tính toàn vẹn của tham chiếu trong một trường hợp mà khóa ngoại không được triển khai.
  • Chúng giúp các nhà phát triển viết mã logic nghiệp vụ vào các truy vấn MySQL.

Trong hướng dẫn này, bạn sẽ học:

  • Cách sử dụng một truy vấn con tương quan
  • Cách sử dụng truy vấn con tương quan trong toán tử so sánh
  • Cách sử dụng truy vấn con làm bảng dẫn xuất

Trước khi bạn bắt đầu

Để làm theo hướng dẫn này, hãy đảm bảo bạn có những điều sau:

  1. Nếu bạn chưa làm như vậy, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo phiên bản Máy tính của chúng tôi.

  2. Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, định cấu hình tên máy chủ của mình, tạo tài khoản người dùng hạn chế và tăng cường quyền truy cập SSH.

  3. Phần mềm máy chủ MySQL (hoặc MariaDB) được cài đặt trên Linode của bạn. Vui lòng tham khảo phần MySQL, trong đó có các hướng dẫn mô tả cách cài đặt MySQL trên một số bản phân phối Linux.

Thiết lập cơ sở dữ liệu

Để hiểu cách hoạt động của truy vấn con, trước tiên hãy tạo một cơ sở dữ liệu mẫu. Cơ sở dữ liệu mẫu này được sử dụng để chạy các truy vấn mẫu khác nhau trong hướng dẫn này:

  1. SSH vào máy chủ của bạn và đăng nhập vào MySQL bằng quyền root:

     mysql -u root -p
    

    Khi được nhắc, hãy nhập mật khẩu gốc của máy chủ MySQL của bạn và nhấn Enter để tiếp tục. Lưu ý rằng mật khẩu gốc của máy chủ MySQL của bạn không giống với mật khẩu gốc cho Linode của bạn.

    Lưu ý

    Nếu mật khẩu của bạn không được chấp nhận, bạn có thể phải chạy lệnh trước đó với sudo :

    sudo mysql -u root -p
    
  2. Nếu mật khẩu của bạn được chấp nhận, bạn sẽ thấy lời nhắc MySQL:

    
    mysql >
    
    Lưu ý

    Nếu bạn đang sử dụng MariaDB, thay vào đó bạn có thể thấy một lời nhắc như sau:

    
    MariaDB [(none)]>
    
  3. Để tạo cơ sở dữ liệu mẫu có tên test_db , chạy:

    CREATE DATABASE test_db;
    

    Bạn sẽ thấy kết quả này, xác nhận rằng cơ sở dữ liệu đã được tạo thành công:

    
    Query OK, 1 row affected (0.01 sec)
    
  4. Chuyển sang test_db cơ sở dữ liệu:

    USE test_db;
    

    Bạn sẽ thấy kết quả này:

    
    Database changed
    
  5. Bạn đã tạo test_db và đã chọn nó. Tiếp theo, tạo một bảng có tên customers :

     CREATE TABLE customers
     (
     customer_id BIGINT PRIMARY KEY AUTO_INCREMENT,
     customer_name VARCHAR(50)
     ) ENGINE = InnoDB;
    

    Bạn sẽ thấy kết quả này:

    
    Query OK, 0 rows affected (0.03 sec)
    
  6. Thêm một số bản ghi cho customers bàn. Chạy INSERT bên dưới từng lệnh một:

    INSERT INTO customers(customer_name) VALUES ('JOHN PAUL');
    INSERT INTO customers(customer_name) VALUES ('PETER DOE');
    INSERT INTO customers(customer_name) VALUES ('MARY DOE');
    INSERT INTO customers(customer_name) VALUES ('CHRISTINE JAMES');
    INSERT INTO customers(customer_name) VALUES ('MARK WELL');
    INSERT INTO customers(customer_name) VALUES ('FRANK BRIAN');
    

    Đầu ra này được hiển thị sau khi mỗi bản ghi được chèn:

    
    Query OK, 1 row affected (0.00 sec)
    ...
    
  7. Xác minh rằng thông tin của khách hàng đã được đưa vào cơ sở dữ liệu. Thực thi SELECT này lệnh:

      SELECT *
      FROM
      customers;
    

    Bạn sẽ thấy danh sách khách hàng này:

    
    +-------------+-----------------+
    | customer_id | customer_name   |
    +-------------+-----------------+
    |           1 | JOHN PAUL       |
    |           2 | PETER DOE       |
    |           3 | MARY DOE        |
    |           4 | CHRISTINE JAMES |
    |           5 | MARK WELL       |
    |           6 | FRANK BRIAN     |
    +-------------+-----------------+
    6 rows in set (0.00 sec)
    
  8. Tạo sales bàn. Bảng này sử dụng cột customer_id để tham khảo customers bảng:

    CREATE TABLE sales
    (
    order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    customer_id BIGINT,
    sales_amount DECIMAL(17,2)
    ) ENGINE = InnoDB;
    

    Kết quả này xuất hiện:

    
    Query OK, 0 rows affected (0.03 sec)
    
  9. Tiếp theo, điền sales bảng với một số bản ghi. Chạy INSERT bên dưới từng lệnh một:

    INSERT INTO sales (customer_id, sales_amount) VALUES ('1','25.75');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('2','85.25');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('5','3.25');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('4','200.75');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('5','88.10');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('1','100.00');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('2','45.00');
    INSERT INTO sales (customer_id, sales_amount) VALUES ('4','15.80');
    

    Đầu ra này được hiển thị sau khi mỗi bản ghi được chèn:

    
    Query OK, 1 row affected (0.01 sec)
    ...
    
  10. Xác minh dữ liệu trong sales bàn. Thực thi SELECT này lệnh:

    SELECT * FROM sales;
    

    Danh sách dữ liệu bán hàng này bây giờ sẽ được hiển thị:

    
    +----------+-------------+--------------+
    | order_id | customer_id | sales_amount |
    +----------+-------------+--------------+
    |        1 |           1 |        25.75 |
    |        2 |           2 |        85.25 |
    |        3 |           5 |         3.25 |
    |        4 |           4 |       200.75 |
    |        5 |           5 |        88.10 |
    |        6 |           1 |       100.00 |
    |        7 |           2 |        45.00 |
    |        8 |           4 |        15.80 |
    +----------+-------------+--------------+
    8 rows in set (0.00 sec)
    

Sau khi thiết lập cơ sở dữ liệu và các bảng liên quan, bây giờ bạn có thể triển khai các truy vấn con khác nhau trong MySQL.

Cách sử dụng truy vấn con có liên quan

Truy vấn con tương quan là một loại truy vấn lồng nhau sử dụng các giá trị từ truy vấn mẹ. Các loại truy vấn này tham chiếu đến truy vấn mẹ với một cột. Truy vấn lồng nhau được thực thi một lần cho mỗi hàng trong truy vấn mẹ.

Ví dụ dưới đây trình bày một truy vấn chọn tất cả khách hàng. Bên trong truy vấn, có một truy vấn con tương quan tìm nạp tổng số tiền bán hàng cho mỗi khách hàng từ sales bảng.

  1. Chạy truy vấn mẫu:

    SELECT
    customer_id,
    customer_name,
    (SELECT SUM(sales_amount)
    FROM sales WHERE customer_id = customers.customer_id) as total_sales_amount
    FROM
    customers;
    

    Trong ví dụ này, truy vấn con là SELECT SUM(sales_amount) FROM sales WHERE customer_id = customers.customer_id , xuất hiện trong dấu ngoặc đơn.

    Danh sách tổng doanh số bán hàng của khách hàng sẽ xuất hiện:

    
    +-------------+-----------------+--------------------+
    | customer_id | customer_name   | total_sales_amount |
    +-------------+-----------------+--------------------+
    |           1 | JOHN PAUL       |             125.75 |
    |           2 | PETER DOE       |             130.25 |
    |           3 | MARY DOE        |               NULL |
    |           4 | CHRISTINE JAMES |             216.55 |
    |           5 | MARK WELL       |              91.35 |
    |           6 | FRANK BRIAN     |               NULL |
    +-------------+-----------------+--------------------+
    6 rows in set (0.00 sec)
    

    Kết quả ở trên từ truy vấn con tương quan có thể cung cấp cho bạn danh sách tóm tắt các đơn đặt hàng của khách hàng. Xin lưu ý, vì customer_id s 36 không có bất kỳ bản ghi liên quan nào trong bảng bán hàng, total_sales_amount của chúng là NULL .

  2. Một cách thanh lịch hơn để trình bày danh sách này là trả về 0 thay vì NULL cho những khách hàng không có doanh số bán hàng. Để thực hiện việc này, hãy đặt đầu ra được tạo bởi truy vấn con bằng IFNULL(expression, 0) tuyên bố. Chạy lệnh đã cập nhật này:

     SELECT
     customer_id,
     customer_name,
     IFNULL((SELECT SUM(sales_amount)
     FROM sales WHERE customer_id = customers.customer_id), 0) as total_sales_amount
     FROM
     customers;
    

    Kết quả sau xuất hiện. MySQL trả về 0,00 cho tất cả các hàng mà nếu không sẽ trả về NULL giá trị.

    
    +-------------+-----------------+--------------------+
    | customer_id | customer_name   | total_sales_amount |
    +-------------+-----------------+--------------------+
    |           1 | JOHN PAUL       |             125.75 |
    |           2 | PETER DOE       |             130.25 |
    |           3 | MARY DOE        |               0.00 |
    |           4 | CHRISTINE JAMES |             216.55 |
    |           5 | MARK WELL       |              91.35 |
    |           6 | FRANK BRIAN     |               0.00 |
    +-------------+-----------------+--------------------+
    6 rows in set (0.00 sec)
    

    Cách tiếp cận này giúp đảm bảo rằng kết quả đầu ra không gây hại cho bất kỳ tính toán nào khác trên hồ sơ.

Cách Sử dụng Truy vấn Con Tương quan trong Toán tử So sánh

Truy vấn con hữu ích để chuyển logic nghiệp vụ sang cấp truy vấn cơ sở dữ liệu. Các trường hợp sử dụng nghiệp vụ sau có các truy vấn con tương quan được đặt bên trong mệnh đề WHERE của truy vấn mẹ:

  • Hãy xem xét một tình huống mà bạn muốn có được danh sách tất cả khách hàng đã đăng ký trong cơ sở dữ liệu không có doanh số bán hàng liên quan. Bạn có thể sử dụng một truy vấn con cùng với toán tử so sánh MySQL NOT IN và lấy lại những khách hàng này:

      SELECT
      customer_id,
      customer_name
      FROM
      customers
      WHERE customer_id NOT IN (SELECT customer_id FROM sales);
    

    Trong ví dụ này, truy vấn con là SELECT customer_id FROM sales , xuất hiện trong ngoặc đơn. Lệnh SQL ở trên xuất ra danh sách hai khách hàng không được tìm thấy trong bảng bán hàng:

    
    +-------------+---------------+
    | customer_id | customer_name |
    +-------------+---------------+
    |           3 | MARY DOE      |
    |           6 | FRANK BRIAN   |
    +-------------+---------------+
    2 rows in set (0.00 sec)
    

    Trong môi trường sản xuất, bạn có thể sử dụng loại bộ ghi này để đưa ra các quyết định kinh doanh tốt hơn. Ví dụ:bạn có thể tạo một tập lệnh bằng ngôn ngữ khác như PHP hoặc Python để gửi email cho những khách hàng này và hỏi xem họ có gặp sự cố khi đặt hàng hay không.

  • Một trường hợp sử dụng khác là làm sạch dữ liệu. Ví dụ:bạn có thể sử dụng một truy vấn con để xóa những khách hàng chưa từng đặt hàng:

      DELETE
      FROM
      customers
      WHERE customer_id NOT IN (SELECT customer_id FROM sales);
    

    Lệnh SQL ở trên xóa hai khách hàng và xuất ra kết quả sau:

    
    Query OK, 2 rows affected (0.01 sec)
    

    Nếu bạn thực hiện lệnh liệt kê lại tất cả khách hàng, những khách hàng này sẽ không còn xuất hiện trong bảng:

      SELECT *
      FROM
      customers;
    

    Kết quả bên dưới xác nhận rằng những khách hàng không có đơn đặt hàng liên quan đã bị xóa:

    
    +-------------+-----------------+
    | customer_id | customer_name   |
    +-------------+-----------------+
    |           1 | JOHN PAUL       |
    |           2 | PETER DOE       |
    |           4 | CHRISTINE JAMES |
    |           5 | MARK WELL       |
    +-------------+-----------------+
    4 rows in set (0.00 sec)
    

Cách sử dụng truy vấn con làm bảng gốc

Khi truy vấn con được sử dụng trong FROM mệnh đề của truy vấn chính, chúng được gọi là bảng dẫn xuất . Chúng rất quan trọng khi triển khai các truy vấn phức tạp mà nếu không sẽ yêu cầu MySQL VIEW , JOIN hoặc UNION mệnh đề. Một bảng dẫn xuất tồn tại trong truy vấn đã tạo ra nó và không được lưu vĩnh viễn vào cơ sở dữ liệu.

Khi các truy vấn con được sử dụng làm bảng dẫn xuất, chúng sẽ tách biệt các phần khác nhau của câu lệnh SQL. Nói cách khác, truy vấn con cung cấp một biểu thức đơn giản của bảng có thể được sử dụng trong phạm vi của truy vấn mẹ.

Lưu ý Hãy nhớ rằng mọi bảng dẫn xuất phải có bí danh.

Chạy lệnh bên dưới để tạo một truy vấn con bảng dẫn xuất có bí danh là order_summary :

SELECT customer_id
FROM
    (
    SELECT
    customer_id,
    count(order_id) as total_orders
    FROM sales
    group by customer_id
    ) as order_summary
WHERE order_summary.total_orders > 1;
Lưu ý

Trong lệnh này, truy vấn con xuất hiện trong dấu ngoặc đơn là:

SELECT
customer_id,
count(order_id) as total_orders
FROM sales
group by customer_id

Lệnh trên truy vấn bảng bán hàng để xác định khách hàng có nhiều hơn 1 đơn hàng. Khi bạn chạy truy vấn, kết quả này xuất hiện:


+-------------+
| customer_id |
+-------------+
|           1 |
|           2 |
|           5 |
|           4 |
+-------------+
4 rows in set (0.00 sec)

Danh sách trên hiển thị bốn customer_id s có nhiều hơn một đơn đặt hàng. Như một trường hợp sử dụng kinh doanh ví dụ, bạn có thể sử dụng một truy vấn như vậy trong một tập lệnh để thưởng cho khách hàng phần thưởng trong lần mua hàng tiếp theo của họ.

Thông tin khác

Bạn có thể tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.

  • Truy vấn con MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tắt cảnh báo và lỗi trên PHP và MySQL

  2. Mã lỗi:1005. Không thể tạo bảng '...' (errno:150)

  3. Cách tốt nhất để có được 'thứ hạng' của ai đó từ bảng điểm với php và mysql mà không lặp lại

  4. Thủ tục lưu trữ MySQL

  5. Sử dụng Mẫu hình thành đám mây để tạo các phiên bản MySQL trên RDS