Basic SQL Part 3 - GROUP BY , Build in function , HAVING

GROUP BY , Build in function , HAVING

รูปตอนไปฮ่องกงครั้งแรก

ผมเขียนเกี่ยวกับ SQL ไว้ 6 ตอน คุณสามารถกด Link ด้านล่างเพื่ออ่านที่เกี่ยวกับ SQL ตอนต่างๆได้เลย

ตอนนี้เราจะเริ่มใช้ความสามารถของ SQL มากยิ่งขึ้น ตอนนี้อาจจะยากนิดนึงแต่เชื่อเถอะว่าไม่ยากจนเข้าใจไม่ได้ แต่ก่อนเริ่ม GROUP BY , Build in function , HAVING ผมขอเริ่มด้วย KEY WORD : DISTINCT กับ COUNT(*) ก่อน

COUNT(*) มีไว้นับ ROW

COUNT เป็น Build in function ของ SQL มันมีไว้ใช้นับจำนวน ROW โดยถ้าเราอยากจะนับ ROW ทั้งหมดที่ได้ออกมาตามเงื่อนไขเนี่ย เราสามารถใช้คำสั่ง SQL แบบนี้

1
2
SELECT COUNT(*)
FROM PRESIDENT

จากผลลัพธ์นั้นทำให้เรารู้ว่าในตาราง PRESIDENT เนี่ยมีข้อมูลทั้งหมด 39 ROW หรือถ้าเราอยากรู้ว่ามีประธานาธิบดีกี่คนที่อยู่พรรค Republican บ้างก็สามารถใช้คำสั่ง

1
2
3
SELECT COUNT(*)
FROM PRESIDENT
WHERE PARTY = 'Republican'

จากผลลัพธ์ทำให้เรารู้ว่ามีประธานาธิบดีอยู่ในพรรค Republican จำนวน 16 คน

DISTINCT มีไว้แสดงข้อมูลไม่ซ้ำ

ถ้ามีความต้องการอยากรู้ว่าประธานาธิบดีมาจากพรรคไหนบ้าง เราก็สามารถเขียน SQL ได้ดังนี้

1
2
SELECT PARTY
FROM PRESIDENT

ผลลัพธ์แบบไม่ DISTINCT

ซึ่งจากผลลัพธ์จะเห็นว่าค่า PARTY ที่ออกมานั้นแสดงผลซ้ำออกมา ทำให้เราต้องมาไล่ดูทุก ROW ว่ามีค่าอะไรบ้างแล้วมานั่งจำเอาเองว่าซ้ำไม่ซ้ำ ด้วยความต้องการที่อยากเห็นข้อมูลไม่ซ้ำ SQL เลยให้ KEY WORD : DISTINCT ขึ้นมา โดยเราสามารถเขียนคำสั่ง SQL ได้ดังนี้

1
2
SELECT DISTINCT PARTY
FROM PRESIDENT

ผลลัพธ์แบบ DISTINCT

ผลลัพธ์จะเห็นว่าแสดงข้อมูล PARTY ออกมาไม่ซ้ำเลย ตรงตามความต้องการของเรา โดยการทำงานของ DISTINCT นั้นขอให้คิดว่ามันทำงานแบนี้ (เป็นการทำงานแบบให้เข้าใจง่ายแต่การทำงานจริงๆอาจไม่ใช่แบบนี้) หลังจากทำการ WHERE ตัดเอาเฉพาะ ROW ที่ต้องการหมดแล้ว ถ้ามี DISTINCT จะเอาทุก ROW มาตรวจสอบ ถ้าเจอซ้ำจะเอามาแค่อันเดียว

คราวนี้เราอยากรู้ว่าแต่ละพรรคเนี่ยมีประธานาธิบดีจากรัฐอะไรบ้างล่ะ คำตอบนั้นไม่อยากเลยครับ เราก็แค่เลือก PARTY กับ STATE_BORN แล้ว DISTINCT ออกมา เราจะได้ว่าแต่ละพรรคนั้นมีประธานาธิบดีจากรัฐอะไรบ้าง

1
2
SELECT DISTINCT PARTY, STATE_BORN
FROM PRESIDENT

GROUP BY , Build in function

สองเรื่องนี้มันมาพร้อมกันเลยต้องพูดพร้อมกัน เรามาพูดถึง GROUP BY กันก่อน

GROUP BY

ถ้าอยากรู้ว่าแต่ละพรรคนั้นมีประธานาธิบดีมาแล้วกี่คน เราจะรู้ได้อย่างไร ถ้าด้วยความรู้ที่เรามีเราสามารถใช้คำสั่ง SQL ประมาณนี้

1
2
3
4
5
6
7
8
9
SELECT COUNT(*)
FROM PRESIDENT
WHERE PARTY = 'Republican'

SELECT COUNT(*)
FROM PRESIDENT
WHERE PARTY = 'Democratic'

-- ทำไปเรื่อยๆทุกพรรค

หากสังเกตดีๆเราจะเห็นว่าคำถามแบบนี้นั้นมันคือเราต้องการจัดข้อมูลเป็นกลุ่มด้วยการใช้ค่า PARTY เป็นตัวจัดกลุ่มจากนั้นเราก็ใช้ COUNT(*) นับ ROW ด้วยความต้องการแบบนี้ตัว SQL ก็เลยอำนวยความสะดวกตรงนี้ให้กับเรา โดยใช้ KEY WORD : GROUP BY โดยสามารถเขียนคำสั่ง SQL ได้แบบนี้

1
2
3
SELECT PARTY, COUNT(*)
FROM PRESIDENT
GROUP BY PARTY

ผลลัพธ์ออกมาสวยงาม ช่วยให้เราไม่ต้องไปเขียนคำสั่ง SQL หลายๆคำสั่งแล้วเอาผลลัพธ์มาต่อเอง

เพื่อความเข้าใจที่มากขึ้นโดยเพิ่มพวกเงื่อนไขการ WHERE เข้าไปด้วย ผมจะลองตั้งคำถามใหม่เป็น “อยากรู้ว่ามีพรรคไหนบ้างมีประธานาธิบดีที่ดำรงตำแหน่งเกิน 4 ปี แล้วมีกี่คน” ด้วยความต้องการนี้เราสามารถเขียนคำสั่ง SQL ได้ดังนี้

1
2
3
4
SELECT PARTY, COUNT(*)
FROM PRESIDENT
WHERE YRS_SERV > 4
GROUP BY PARTY

คราวนี้เรามาอธิบายการทำงานของการทำงาน GROUP BY กัน โดยคำสั่ง GROUP BY นั้นจะทำงานหลังคำสั่ง WHERE ก็คือ หลังใช้ WHERE เลือก ROW ที่เอาทั้งหมดแล้ว เราจะเริ่มจับกลุ่มด้วยคำสั่ง GROUP BY แบ่งข้อมูลออกเป็น GROUP จากนั้นดูที่ SELECT ต่อครับว่าให้เอาอะไรไปแสดง

คราวนี้มีเรื่องสำคัญจะบอกครับใน SELECT จะเป็นการเอาข้อมูลออกไปแสดงโดยจะเอาข้อมูลไปแสดงได้แค่ COLUMN ที่โดนสั่ง GROUP BY กับ Build in function เท่านั้น คราวนี้จะเกิดคำถามว่าทำไมเลือกแสดงได้แค่ COLUMN ที่โดน GROUP BY ล่ะ ก็ง่ายครับถ้าเราเจาะลึกลงไปในผลลัพธ์จากการ GROUP BY ด้วย PARTY โดยผมจะ Show ของ GROUP ของพรรค Republican

จะเห็นว่าผลลัพธ์ที่อยู่ใน GROUP นี้มีหลาย ROW ถ้าสมมุติจะ SELECT field อื่นที่ไม่ใช่ PARTY ไปแสดงจะเอา ROW ไหนไปแสดงล่ะ ในเมื่อไม่รู้สามารถตัดสินใจได้ก็เลยห้ามไม่ให้ทำซะเลยดีกว่า ส่วน Build in function นั้นจะทำงานกับกลุ่มของ ROW แล้วผลลัพธ์เหลือผลลัพธ์เดียวอยู่แล้วดังนั้นจึงสามารถเอาไปแสดงได้ ตัวอย่างเช่น COUNT(*) คือนับทุก ROW ในกลุ่มแล้วผลลัพธ์ออกมาเป็นค่าเดียวคือจำนวน ROW ในกลุ่ม

Build in function

Build in function ก็เป็น Function ที่ Database มีให้เราใช้ครับ โดย Database แต่ละเจ้าก็จะมี Build in function ให้เราเลือกใช้มากมาย โดย Build in function ที่ผมจะนำเสนอในตอนนี้จะเป็น Build in function ที่ทำงานกับกลุ่มของ ROW แล้วย่อยมันเหลือแค่คำตอบเดียว ส่วน Build in function อื่นๆค่อยพูดทีหลัง

Build in function ที่ทำงานกับกลุ่มของ ROW ที่เจอกันบ่อยๆจะมีดังนี้

  • COUNT
    มีไว้นับจำนวน ROW ในกลุ่มของ ROW นั้นว่ามีเท่าไหร่
  • MIN , MAX
    มีไว้หาค่าสูงสุดต่ำสุดของ COLUMN ที่ต้องการในกลุ่มนั้น
  • AVG
    มีไว้หาค่าเฉลี่ยของ COLUMN ที่ต้องการในกลุ่มนั้น
  • SUM
    มีไว้หาค่าผลรวมของ COLUMN ที่ต้องการในกลุ่มนั้น

ผมรวมทุก Build in function ที่นำเสนอมาในคำสั่งเดียวเลยละกัน

1
2
3
4
5
6
7
8
9
10
SELECT 
PARTY,
COUNT(*), -- นับทุก ROW
COUNT(DISTINCT STATE_BORN), -- นับ COLUMN STATE_BORN โดยนับเฉพาะที่ไม่ซ้ำ
MAX(YRS_SERV),
MIN(YRS_SERV),
AVG(YRS_SERV),
SUM(YRS_SERV)
FROM PRESIDENT
GROUP BY PARTY

Having

Having นั้นทำงานคล้ายๆ WHERE แต่ทำงานหลัง GROUP BY ง่ายๆคือจะเอา GROUP ไหนไปแสดง ตัวอย่างเช่น จาก QUERY ที่แล้ว อยากแสดงเฉพาะพรรคที่มีจำนวนประธานาธิบดีมากกว่า 4 ขึ้นไป เราสามารถเขียน Query ได้ดังนี้

1
2
3
4
5
6
7
8
9
10
11
SELECT 
PARTY,
COUNT(*),
COUNT(DISTINCT STATE_BORN),
MAX(YRS_SERV),
MIN(YRS_SERV),
AVG(YRS_SERV),
SUM(YRS_SERV)
FROM PRESIDENT
GROUP BY PARTY
HAVING COUNT(*) > 4

จะเห็นว่าผลลัพธ์ที่ทำการเพิ่ม HAVING COUNT(*) > 4 ผลลัพธ์จะแสดงเฉพาะกลุ่มที่ COUNT(*) > มากกว่า 4 ก็สำหรับ HAVING ก็ทำงานแค่นี้เลยง่ายมะ

จบตอนนี้แล้ว

ก็สำหรับตอนนี้ยาวหน่อยเพราะต้องพูดหลายเรื่องต้องปูทาง COUNT(*) กับ DISTINCT ก่อนเพื่อให้ไม่งง โดยหลังจากอ่านตอนนี้จบเราก็รู้เกี่ยวกับ KEY WORD เกือบจะทั้งหมดของ SQL แล้วไม่ว่าจะเป็น SELECT , FROM, WHERE, GROUP BY, HAVING, ORDER BY สำหรับตอนหน้าเราจะเข้าสู่เรื่อง JOIN ซึ่งเป็นอีก KEY WORD สำคัญที่จะทำให้เราสามารถเอาข้อมูลจากตารางอื่นๆมาใช้ได้ สำหรับตอนนี้จบแค่นี้ครับ

เพลงประกอบการเขียน Blog

เพลง “ออกอาการ” เพลงนี้ผมฟังตอนสมัยเรียนอุดมศึกษา ช่วงนั้น Facebook กับ Line กำลังดังมาก ตอนดู MV นี้ครั้งแรกอย่างงงเลยว่าจะสื่ออะไร แต่พอดูจบแล้วว้าวมากคือคิดได้ไงครับ ส่วนตัวเนื้อเพลงผมชอบมากคือมันคืออาการแบบนี้จริงๆเวลาคุยกับใครสักคนแล้วพอเขาเริ่มคิดว่าเราไม่ใช่เขาก็เริ่ม “ออกอาการ” บางอย่างให้เราเห็น