Subqueries ใน SELECT

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

Mona Khalil

Data Scientist, Greenhouse Software

SELECT อะไร?

  • คืนค่า ค่าเดียว
    • ใส่ค่า aggregate เพื่อเปรียบเทียบกับค่ารายบุคคล
  • ใช้ในการคำนวณทางคณิตศาสตร์
    • ส่วนเบี่ยงเบนจากค่าเฉลี่ย
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT

  • คำนวณจำนวนแมตช์ทั้งหมดในทุกฤดูกาล
SELECT COUNT(id) FROM match;
12837
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT

SELECT
  season,
  COUNT(id) AS matches,
  12837 as total_matches
FROM match
GROUP BY season;
| season    | matches | total_matches |
|-----------|---------|---------------|
| 2011/2012 | 3220    | 12837         |
| 2012/2013 | 3260    | 12837         |
| 2013/2014 | 3032    | 12837         |
| 2014/2015 | 3325    | 12837         |
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT

SELECT
  season,
  COUNT(id) AS matches,
  (SELECT COUNT(id) FROM match) as total_matches
FROM match
GROUP BY season;
| season    | matches | total_matches |
|-----------|---------|---------------|
| 2011/2012 | 3220    | 12837         |
| 2012/2013 | 3260    | 12837         |
| 2013/2014 | 3032    | 12837         |
| 2014/2015 | 3325    | 12837         |
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT สำหรับการคำนวณทางคณิตศาสตร์

SELECT AVG(home_goal + away_goal) 
FROM match
WHERE season = '2011/2012';
2.72
SELECT
  date,
  (home_goal + away_goal) AS goals,
  (home_goal + away_goal) - 2.72 AS diff
FROM match
WHERE season = '2011/2012';
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT

SELECT
  date,
  (home_goal + away_goal) AS goals,
  (home_goal + away_goal) - 
     (SELECT AVG(home_goal + away_goal) 
      FROM match
      WHERE season = '2011/2012') AS diff
FROM match
WHERE season = '2011/2012';
| date       | goals | diff              |
|------------|-------|-------------------|
| 2011-07-29 | 3     | 0.28354037267081  |
| 2011-07-30 | 2     | -0.71645962732919 |
| 2011-07-30 | 4     | 1.28354037267081  |
| 2011-07-30 | 1     | -1.71645962732919 |
การจัดการข้อมูลใน SQL

Subqueries ใน SELECT -- สิ่งที่ควรระวัง

  • ต้องคืนค่า เพียงค่าเดียว

    • มิฉะนั้นจะเกิดข้อผิดพลาด
  • ตรวจสอบให้แน่ใจว่าใส่ตัวกรองไว้ในตำแหน่งที่ถูกต้อง

    • กรองทั้งคิวรีหลักและ subquery ให้ครบถ้วน!
SELECT
    date,
    (home_goal + away_goal) AS goals,
    (home_goal + away_goal) - 
       (SELECT AVG(home_goal + away_goal) 
        FROM match
        WHERE season = '2011/2012') AS diff
FROM match
WHERE season = '2011/2012';
การจัดการข้อมูลใน SQL

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

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

Preparing Video For Download...