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

MYSQL - Tạo một truy vấn sql từ nhiều truy vấn

Kỹ thuật 1:Kết hợp các đại lượng vô hướng:

SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;

-->

SELECT
    ( SELECT a ... LIMIT 1) AS a,
    ( SELECT b ... LIMIT 1) AS b ;

Nếu a là một cái gì đó giống như COUNT(*) , thì bạn biết rằng sẽ có chính xác một kết quả; do đó LIMIT 1 là không cần thiết.

Nếu một trong các truy vấn con đó có thể không trả về bất kỳ hàng nào, thì bạn nhận được NULL .

Kỹ thuật 2:Một vùng chọn có thể được sử dụng ở hầu hết mọi nơi mà một biểu thức có thể được sử dụng. Ở trên, về mặt kỹ thuật, là một ví dụ về điều đó. Ngoài ra ...

SELECT ... WHERE x = ( SELECT ... ) ...

Một lần nữa, truy vấn con phải trả về một hàng để có thể thực hiện điều đó.

SELECT ...
    WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
    ...;

Điều đó sẽ trở thành một cái gì đó như thế này sau khi truy vấn con được đánh giá:

SELECT
    WHERE x LIKE '%foo%'
    ...;

(Nó không hiệu quả, nhưng nó hoạt động.)

3 điều này tương tự nhau, nhưng không nhất thiết phải hiệu quả như nhau:

SELECT ...
    WHERE x IN ( SELECT ... )

SELECT ... FROM A
    WHERE EXISTS( SELECT ... FROM B
                  WHERE B.x = A.x )

SELECT ... FROM A JOIN B ON B.x = A.x

Điều này tương tự nhưng tìm thấy các mục phù hợp bị thiếu từ B:

SELECT ... FROM A LEFT JOIN B ON B.x = A.x
    WHERE B.id IS NULL
    

UNION nên được sử dụng cho các truy vấn có đầu ra tương tự:

SELECT x,y FROM A
UNION
SELECT x,y FROM B

Điều đó sẽ tạo ra bất kỳ số lượng hàng nào từ A và bất kỳ số hàng nào từ B. Các bản sao sẽ bị xóa nếu bạn sử dụng UNION DISTINCT hoặc được giữ lại nếu bạn sử dụng UNION ALL .

ORDER BY ... LIMIT ... khó khăn. OFFSET thậm chí còn phức tạp hơn.

Hiệu suất

  • Tránh IN ( SELECT ...) nó thường chậm hơn trong ba cái.
  • Tránh các ký tự đại diện đứng đầu trong LIKE; xem nếu FULLTEXT sẽ là một lựa chọn tốt hơn.
  • INDEX(path) , INDEX(parent_id, child_id) ("cover"), INDEX(scope, path, scope_id); có thể khác, nhưng tôi cần xem SHOW CREATE TABLE .
  • Tránh lược đồ EAV; nó không tốt cho hiệu suất. Tôi đã thêm một liên kết; xem nhiều cuộc thảo luận khác. Ngoài ra: http://mysql.rjweb.org/doc.php/eav http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding / a>

Những mặt hàng đó có lẽ là quan trọng hơn (đối với hiệu suất) hơn là kết hợp các câu lệnh với nhau. Xem https://meta.stackexchange.com/questions/ 66377 / what-is-the-xy-problem



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bài viết trung bình mỗi giờ trên MySQL?

  2. SQLSTATE [23000]:Vi phạm ràng buộc toàn vẹn:1217

  3. Làm cách nào để kết nối với cơ sở dữ liệu MySQL bằng Scala?

  4. Di chuyển Cơ sở dữ liệu MySQL từ Amazon RDS sang DigitalOcean

  5. Dữ liệu vào bộ nhớ đệm trong PHIÊN BẢN PHP hoặc truy vấn từ db mỗi lần?