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

MySQL Multiple Subqueries so với toàn bộ các truy vấn

Vì ba tổng hợp này đến từ cùng một bảng với cùng một WHERE điều kiện, bạn không cần lựa chọn con. Tất cả ba tập hợp đang hoạt động trên cùng một nhóm hàng (không có GROUP BY được chỉ định, vì vậy một hàng cho toàn bộ bảng), vì vậy tất cả chúng đều có thể tồn tại trong SELECT liệt kê trực tiếp.

SELECT
  SUM(number) AS number_sum,
  MAX(number) AS number_max,
  MIN(number) AS number_min
FROM `table`

Nếu bất kỳ tổng hợp nào cần dựa trên các điều kiện khác nhau, bạn sẽ lọc trong WHERE , sau đó bạn sẽ cần phải sử dụng một lựa chọn con cho các điều kiện khác nhau, hoặc thực hiện một phép nối cacte. Chọn con này và LEFT JOIN sau phương thức phải tương đương, phù hợp với hiệu suất đối với các tổng hợp chỉ trả về một hàng:

SELECT
  /* Unique filtering condition - must be done in a subselect */
  (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum,
  MAX(number) AS number_max,
  MIN(number) AS number_min
FROM `table`

Hoặc tương đương với truy vấn ở trên, bạn có thể LEFT JOIN chống lại truy vấn con không có ON mệnh đề . Điều này chỉ nên được thực hiện trong các tình huống khi bạn biết truy vấn con sẽ chỉ trả về một hàng. Nếu không, bạn sẽ kết thúc với một sản phẩm cacte - bao nhiêu hàng được trả về bởi một bên của phép nối nhân với số hàng được trả về bởi phía bên kia.

Điều này rất hữu ích nếu bạn cần trả về một vài cột với một tập hợp WHERE điều kiện mệnh đề và một vài cột có tập hợp WHERE khác điều kiện, nhưng chỉ một hàng từ mỗi bên của JOIN . Trong trường hợp này, JOIN sẽ nhanh hơn hơn để làm hai các lựa chọn con có cùng WHERE mệnh đề.

Điều này sẽ nhanh hơn ....

SELECT
  /* this one has two aggregates sharing a WHERE condition */
  subq.number_sum_filtered,
  subq.number_max_filtered,
  /* ...and two aggregates on the main table with no WHERE clause filtering */
  MAX(`table`.number) AS number_max,
  MIN(`table`.number) AS number_min
FROM
  `table`
  LEFT JOIN (
    SELECT 
       SUM(number) AS number_sum_filtered,
       MAX(number) AS number_max_filtered
    FROM `table`
    WHERE `somecolumn = `somevalue`
  ) subq /* No ON clause here since there's no common column to join on... */

Hơn cái này ...

SELECT
  /* Two different subselects each over the same filtered set */
  (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered,
  (SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered,
  MAX(`table`.number) AS number_max,
  MIN(`table`.number) AS number_min
FROM
  `table`



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gửi thông báo Firesbase cho nhiều người dùng

  2. Làm cách nào để sử dụng Entity Framework trên biểu đồ đối tượng sau độ sâu 2 với MySQL Connector / NET?

  3. MySQL trigger:Cập nhật khi đạt đến một ngày giờ nhất định

  4. Quay lại sao chép truyền thống từ GTID

  5. Dấu gạch chéo ngược trong tệp csv