Các truy vấn con ở WHERE ở đâu?

Xử lý dữ liệu trong SQL

Mona Khalil

Data Scientist, Greenhouse Software

Truy vấn con là gì?

  • Một truy vấn lồng bên trong truy vấn khác
SELECT column
FROM (SELECT column
      FROM table) AS subquery;
  • Hữu ích cho các bước biến đổi trung gian
Xử lý dữ liệu trong SQL

Dùng truy vấn con để làm gì?

  • Có thể ở bất kỳ phần nào của truy vấn

    • SELECT, FROM, WHERE, GROUP BY
  • Có thể trả về nhiều dạng thông tin

    • Giá trị vô hướng (3.14159, -2, 0.001)
    • Danh sách (id = (12, 25, 392, 401, 939))
    • Một bảng
Xử lý dữ liệu trong SQL

Tại sao dùng truy vấn con?

  • So sánh nhóm với giá trị tổng hợp
    • Liverpool so với hiệu suất trung bình của Ngoại hạng Anh năm đó?
  • Tái cấu trúc dữ liệu
    • Mức trung bình bàn thắng theo tháng cao nhất ở Bundesliga là bao nhiêu?
  • Kết hợp dữ liệu không thể JOIN
    • Làm sao có cả tên đội nhà và đội khách trong bảng kết quả trận đấu?
Xử lý dữ liệu trong SQL

Truy vấn con đơn giản

  • Có thể đánh giá độc lập với truy vấn ngoài
SELECT home_goal
FROM match
WHERE home_goal > (
    SELECT AVG(home_goal) 
    FROM match);

SELECT AVG(home_goal) FROM match;
1.56091291478423
Xử lý dữ liệu trong SQL

Truy vấn con đơn giản

  • Chỉ được xử lý một lần trong toàn bộ câu lệnh
SELECT home_goal
FROM match
WHERE home_goal > (
    SELECT AVG(home_goal) 
    FROM match);
Xử lý dữ liệu trong SQL

Truy vấn con trong mệnh đề WHERE

  • Những trận mùa 2012/2013 có số bàn sân nhà cao hơn trung bình toàn bộ?
SELECT AVG(home_goal) FROM match;
1.56091291478423
SELECT date, hometeam_id, awayteam_id, home_goal, away_goal
FROM match
WHERE season = '2012/2013'
      AND home_goal > 1.56091291478423;
Xử lý dữ liệu trong SQL

Truy vấn con trong mệnh đề WHERE

  • Những trận mùa 2012/2013 có số bàn sân nhà cao hơn trung bình toàn bộ?
SELECT date, hometeam_id, awayteam_id, home_goal, away_goal
FROM match
WHERE season = '2012/2013'
      AND home_goal > (SELECT AVG(home_goal)
                     FROM match);
| date       | hometeam_id | awayteam_id | home_goal | away_goal |
|------------|-------------|-------------|-----------|-----------|
| 2012-07-28 | 9998        | 1773        | 5         | 2         |
| 2012-07-29 | 9987        | 9984        | 3         | 3         |
| 2012-10-05 | 9993        | 9991        | 2         | 2         |
Xử lý dữ liệu trong SQL

Lọc danh sách với IN bằng truy vấn con

  • Những đội nào thuộc giải vô địch Ba Lan?
SELECT
  team_long_name,
  team_short_name AS abbr
FROM team
WHERE 
  team_api_id IN 
  (SELECT hometeam_id
   FROM match
   WHERE country_id = 15722);
| team_long_name | abbr |
|----------------|------|
| Ruch Chorzów   | CHO  |
| Jagiellonia    | BIA  |
| Lech Poznań    | POZ  |
| P. Warszawa    | PWA  |
| Cracovia       | CKR  |
| Górnik Łęczna  | LEC  |
| Polonia Bytom  | GOR  |
| Zagłębie Lubin | ZAG  |
| Pogoń Szczecin | POG  |
| Widzew Łódź    | WID  |
| Śląsk Wrocław  | SLA  |
Xử lý dữ liệu trong SQL

Practice time!

Xử lý dữ liệu trong SQL

Preparing Video For Download...