Subqueries ได้ทุกที่! และแนวปฏิบัติที่ดี!

การจัดการข้อมูลใน SQL

Mona Khalil

Data Scientist, Greenhouse Software

ใส่ subquery ได้ตามต้องการ...

  • ใส่ subquery ได้หลายตัวใน SELECT, FROM, WHERE
SELECT 
    s.stage,
    ROUND(s.avg_goals,2) AS avg_goal,
    (SELECT AVG(home_goal + away_goal)
     FROM match WHERE season = '2013/2014') AS overall_avg
FROM 
    (SELECT
         stage,
         AVG(home_goal + away_goal) AS avg_goals
     FROM match
     WHERE season = '2013/2014'
     GROUP BY stage) AS s
WHERE 
    s.avg_goals > (SELECT AVG(home_goal + away_goal) 
                   FROM match WHERE season = '2013/2014');
การจัดการข้อมูลใน SQL

จัดรูปแบบคิวรีให้เป็นระเบียบ

  • จัดแนว SELECT, FROM, WHERE และ GROUP BY ให้เป็นระเบียบ
SELECT
    col1,
    col2,
    col3
FROM table1
WHERE col1 = 2;
การจัดการข้อมูลใน SQL

เพิ่มหมายเหตุในคิวรี

/* This query filters for col1 = 2
and only selects data from table1 */
SELECT
    col1,
    col2,
    col3
FROM table1
WHERE col1 = 2;
การจัดการข้อมูลใน SQL

เพิ่มหมายเหตุในคิวรี

SELECT
    col1,
    col2,
    col3
FROM table1 -- this table has 10,000 rows
WHERE col1 = 2; -- Filter WHERE value 2
การจัดการข้อมูลใน SQL

ย่อหน้าคิวรีให้ถูกต้อง

  • ย่อหน้า subquery ด้วย!
SELECT
    col1,
    col2,
    col3
FROM table1
WHERE col1 IN
        (SELECT id
         FROM table2
         WHERE year = 1991);
การจัดการข้อมูลใน SQL

ย่อหน้าคิวรีให้ถูกต้อง

SELECT 
  date, 
  hometeam_id, 
  awayteam_id,
  CASE WHEN hometeam_id = 8455 AND home_goal > away_goal 
            THEN 'Chelsea home win'
       WHEN awayteam_id = 8455 AND home_goal < away_goal
            THEN 'Chelsea away win'
       WHEN hometeam_id = 8455 AND home_goal < away_goal
            THEN 'Chelsea home loss'
       WHEN awayteam_id = 8455 AND home_goal > away_goal
            THEN 'Chelsea away loss'
       WHEN (hometeam_id = 8455 OR awayteam_id = 8455) 
            AND home_goal = away_goal THEN 'Chelsea Tie'
       END AS outcome
FROM match
WHERE hometeam_id = 8455 OR awayteam_id = 8455;

Holywell's SQL Style Guide

การจัดการข้อมูลใน SQL

subquery นั้นจำเป็นจริงหรือ?

  • Subquery ต้องใช้พลังประมวลผล

    • ฐานข้อมูลใหญ่แค่ไหน?
    • ตารางที่คิวรีมีขนาดใหญ่แค่ไหน?
  • จำเป็นต้องใช้ subquery จริงๆ ไหม?

การจัดการข้อมูลใน SQL

กรองข้อมูลใน subquery แต่ละตัวให้ถูกต้อง!

  • ระวังเงื่อนไขการกรองด้วย!
SELECT 
    s.stage,
    ROUND(s.avg_goals,2) AS avg_goal,
    (SELECT AVG(home_goal + away_goal)
     FROM match WHERE season = '2013/2014') AS overall_avg
FROM 
    (SELECT
         stage,
         AVG(home_goal + away_goal) AS avg_goals
     FROM match
     WHERE season = '2013/2014'
     GROUP BY stage) AS s
WHERE 
    s.avg_goals > (SELECT AVG(home_goal + away_goal) 
                   FROM match WHERE season = '2013/2014');
การจัดการข้อมูลใน SQL

มาฝึกกันเถอะ!

การจัดการข้อมูลใน SQL

Preparing Video For Download...