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

Truy vấn MySQL cơ bản

Bạn có thể thử các truy vấn tại http://sqlfiddle.com/#!9/839d2/1

Truy vấn 1

Danh sách tất cả các hành tinh có thuyền trưởng. Nó hiển thị id_planet, hành tinh_name, tổng số đội trưởng trên mỗi hành tinh đó cũng như số lượng trận chiến (nếu có) đã diễn ra ở đó.

SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
    SELECT planet_id, COUNT(*) AS captains_count
    FROM soldier
    WHERE rank = 'captain'
    GROUP BY planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
    SELECT id_planet_battle, COUNT(*) AS battles_count
    FROM battle
    GROUP BY id_planet_battle
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';

Bạn có thể có kết quả tương tự bằng cách sử dụng cái này:

SELECT DISTINCT aa.id_planet, aa.planet_name,
(
    SELECT COUNT(*)
    FROM soldier AS _aa
    WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
    GROUP BY _aa.planet_id
) AS captains_count,
(
    SELECT COUNT(*)
    FROM battle AS _bb
    WHERE aa.id_planet = _bb.id_planet_battle
    GROUP BY _bb.id_planet_battle 
) AS battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
WHERE bb.rank = 'captain';

Truy vấn 3

SELECT aa.name, aa.rank, bb.planet_name AS planet_from, (
    SELECT COUNT(*) 
    FROM soldier AS _aa 
    WHERE _aa.planet_id = aa.planet_id
) AS number_of_soldiers, 
(
    SELECT COUNT(*)
    FROM battle AS _bb
    WHERE _bb.id_planet_battle = aa.planet_id
) AS number_of_battles
FROM soldier AS aa
INNER JOIN planet AS bb
ON aa.planet_id = bb.id_planet;

Ở đây, tôi đã không sử dụng Tham gia để tính toán number_of_soldiers và number_of_battles như tôi đã thực hiện ở Truy vấn 1.1 vì đó sẽ là một truy vấn con tương quan và do đó, nó không thể có quyền truy cập ở các truy vấn bên ngoài ( https://dev.mysql.com/doc/refman/5.5/en/from-clause -subqueries.html ).

Truy vấn sai:

SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
    SELECT COUNT(*) AS captains_count
    FROM soldier AS _aa
    WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
    GROUP BY _aa.planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
    SELECT COUNT(*) AS battles_count
    FROM battle AS _bb
    WHERE aa.id_planet = _bb.id_planet_battle
    GROUP BY _bb.id_planet_battle 
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';

Vì vậy, truy vấn trên là sai và tạo ra lỗi:Cột không xác định 'aa.id_planet' trong 'mệnh đề where'.

Đối với truy vấn thứ hai mà bạn yêu cầu, tôi hy vọng ai đó có thể thử.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ chọn và trả về Checksum (không phải Table) từ bảng checksum trong mysql

  2. mySQL regex trong mệnh đề where

  3. SQLAlchemy và UnicodeDecodeError

  4. Mẹo nâng cấp từ MySQL 5.7 lên MySQL 8

  5. Làm thế nào để làm cho Django hoạt động với các trình điều khiển MySQL không được hỗ trợ chẳng hạn như trình điều khiển MySQL của gevent-mysql hoặc Concained?