SQL ย่อมาจาก Structured Query Language เป็นภาษาที่ใช้ทำงานกับ database และถูกพัฒนาโดย IBM ในช่วง ค.ศ. 1970s
แม้ SQL จะมีมานานแล้ว แต่ SQL ยังเป็นทักษะที่สำคัญในยุคนี้ที่ data เป็น resource ที่สำคัญ ทั้งในการใช้ชีวิตและการทำงาน
.
ถ้าเราใช้ SQL เป็น เราจะสามารถ:
- สร้างและจัดการ database
- เรียกดูข้อมูลจาก database
- จัดการข้อมูลบน database
- วิเคราะห์ข้อมูลบน database
.
ในบทความนี้ เราจะทำความรู้จักกับ 7 คำสั่ง SQL ที่สำคัญ ผ่านตัวอย่างของ Chinook database กัน:
SELECTWHEREORDER BYGROUP BY- Aggregate functions
JOINLIMIT
(พร้อม best practices แนะนำ resources ในการพัฒนา SQL ต่อ)
ถ้าพร้อมแล้วไปเริ่มกันเลย
- 💽 Example Database: Chinook
- 1️⃣ Statement #1: SELECT
- 2️⃣ Statement #2: WHERE
- 3️⃣ Statement #3: ORDER BY
- 4️⃣ Statement #4: GROUP BY
- 5️⃣ Statement #5: Aggregate Functions
- 6️⃣ Statement #6: JOIN
- 7️⃣ Statement #7: LIMIT
- 💪Put It All Together
- 🍩 Bonus: SQL Best Practice
- ⏭️Next: Sharpen Your SQL
- 📃 References
💽 Example Database: Chinook
สำหรับบทความนี้ เราจะใช้ Chinook database ซึ่งเป็น database ที่มักใช้ฝึก SQL เป็นตัวอย่างกัน

Chinook database เป็นข้อมูลร้านขายมีเดียออนไลน์ และแบ่งออกเป็น 11 ชุดข้อมูล (tables):
| No. | Table Name | Description |
|---|---|---|
| 1 | Album | ข้อมูลอัลบัม |
| 2 | Artist | ข้อมูลศิลปิน |
| 3 | Customer | ข้อมูลลูกค้า |
| 4 | Employee | ข้อมูลพนักงาน |
| 5 | Genre | ข้อมูลแนวเพลง |
| 6 | Invoice | ข้อมูลใบเสร็จขายของ |
| 7 | InvoiceLine | ข้อมูลรายการซื้อในใบเสร็จ |
| 8 | MediaType | ข้อมูลประเภทมีเดีย |
| 9 | Playlist | ข้อมูลเพลย์ลิสต์ |
| 10 | PlaylistTrack | ข้อมูลสำหรับจับคู่เพลย์ลิสต์กับเพลง |
| 11 | Track | ข้อมูลเพลง |
เรามาดูวิธีเขียน 7 คำสั่ง SQL กันด้วย Chinook database กัน
1️⃣ Statement #1: SELECT
Usage:
คำสั่งพื้นฐาน สำหรับเลือกข้อมูลจาก database
.
Syntax:
SELECT columns
FROM table
- columns ให้ระบุชื่อ columns ที่เราต้องการ (ระบุได้มากกว่า 1 โดยใช้
,คั่น) - table ให้ระบุ ชื่อ table ที่มีข้อมูลที่เราต้องการ
.
Example:
เลือกดูชื่อเพลง (Name) และรหัสอัลบัม (AlbumID) จาก Track:
SELECT Name, AlbumId
FROM Track;
ผลลัพธ์:

Note:
เราสามารถเลือกข้อมูลทั้งหมดจาก table ได้ โดยใช้ * เช่น:
SELECT *
FROM Tracks;
โดยผลลัพธ์จะแสดงข้อมูลทุก columns และ rows ใน Track
นอกจากนี้ เราสามารถตั้งชื่อ column ได้ โดยใช้ AS เช่น:
SELECT Name AS Song, AlbumId AS Album
FROM Track;
ผลลัพธ์:

จะเห็นว่า ข้อมูลจะเหมือนเดิม แต่ชื่อ column จะเปลี่ยนไป
2️⃣ Statement #2: WHERE
Usage:
ใช้กรองข้อมูลที่เรียกมาแสดง
.
Syntax:
WHERE conditions
- conditions ให้ระบุเงื่อนไขในการกรอง
.
Example:
หาเพลงที่มีราคา (UnitPrice) สูงกว่า $0.99:
SELECT Name, UnitPrice
FROM Track
WHERE UnitPrice > 0.99;
ผลลัพธ์:

.
WHERE operators:
ในการกรอง เราสามารถใช้ operators เหล่านี้ในการกำหนดเงื่อนไขได้:
| Operator | Meaning | Example |
|---|---|---|
= | เท่ากับ | UnitPrice = 0.99 |
<> หรือ != | ไม่เท่ากับ | UnitPrice <> 0.99 |
> | มากกว่า | UnitPrice > 0.99 |
< | น้อยกว่า | UnitPrice < 0.99 |
>= | มากกว่า/เท่ากับ | UnitPrice >= 0.99 |
<= | น้อยกว่า/เท่ากับ | UnitPrice <= 0.99 |
BETWEEN | กรองข้อมูลตามช่วง | UnitPrice BETWEEN 0.99 and 1.99 |
IN | กรองข้อมูลตามเซตข้อมูล | UnitPrice IN (0.99, 1.99, 2.99) |
นอกจากนี้ เรายังสามารถใช้ LIKE กับ WHERE เพื่อกรอง text ได้อีกด้วย
โดย LIKE ใช้คู่กับ 2 อย่าง:
| Operator | Meaning |
|---|---|
_ | แทน 1 characters |
% | แทน 0, 1, หรือมากกว่า 1 characters |
เช่น:
SELECT FirstName, LastName
FROM Customer
WHERE FirstName LIKE '_ohn';
ผลลัพธ์:
ผลลัพธ์: เราจะได้ข้อมูลทั้งหมดที่มี FirstName ขึ้นต้นด้วยตัวอักษรใด ๆ 1 ตัว + “ohn”
เช่น:
- John
- Gohn
- Wohn
อย่างในตัวอย่าง เราจะได้ “John Gordon” ขึ้นมา:

หรือ:
SELECT FirstName, LastName
FROM Customer
WHERE FirstName LIKE 'J%';
ผลลัพธ์:
เราจะได้ข้อมูลที่ FirstName เริ่มด้วย J และตามด้วยตัวอักษรใด ๆ + กี่ตัวก็ได้
เช่น:
- John
- Jo
- Jane
- James
อย่างในตัวอย่าง เราจะได้ชื่อเหล่านี้มา:

3️⃣ Statement #3: ORDER BY
Usage:
จัดลำดับข้อมูล
.
Syntax:
ORDER BY columns
- columns ให้ระบุชื่อ column ที่ใช้ในการจัดลำดับ (ใส่ได้มากกว่า 1)
.
Example:
ดึงรายชื่อลูกค้า ให้แสดงตามชื่อจริง (FirstName):
SELECT FirstName, LastName
FROM Customer
ORDER BY FirstName;
ผลลัพธ์:

Note:
Default ของ ORDER BY จะเป็นการเรียงแบบ ascending (A-Z)
ถ้าเราอยากเรียงแบบ descending (Z-A) ให้ใส่ DESC ต่อท้าย เช่น:
SELECT FirstName, LastName
FROM Customer
ORDER BY FirstName DESC;
ผลลัพธ์:

4️⃣ Statement #4: GROUP BY
Usage:
จับกลุ่มข้อมูล
.
Syntax:
GROUP BY columns
- columns ระบุชื่อ column ที่ใช้จับกลุ่ม (ระบุได้มากกว่า 1)
.
Example:
นับจำนวนเพลงในแต่ละอัลบัม:
SELECT AlbumId, COUNT(*) AS TrackCount
FROM Track
GROUP BY AlbumId;
ผลลัพธ์:

จากตัวอย่าง เราจะเห็นว่า album ที่ 1 มี 10 เพลง, album ที่ 2 มี 1 เพลง, ไปเรื่อย ๆ
5️⃣ Statement #5: Aggregate Functions
Usage:
สรุป (aggregate) ข้อมูล
.
Syntax:
SELECT agg(column)
- agg ให้ระบุ aggregate function ที่ต้องการใช้งาน
- column ให้ระบุชื่อ column ที่เป็น input ของ aggregate function
.
Common aggregate functions:
ใน SQL, เรามี 5 aggregate functions ที่มักใช้บ่อย ได้แก่:
| No. | Aggregate | Description |
|---|---|---|
| 1 | COUNT() | นับจำนวนข้อมูล |
| 2 | SUM() | หาผลรวม (sum) |
| 3 | AVG() | หาค่าเฉลี่ย (mean) |
| 4 | MIN() | หาค่าต่ำสุด |
| 5 | MAX() | หาค่าสูงสุด |
.
Example:
เราต้องการรู้ข้อมูลการใช้จ่ายของลูกค้าแต่ละคน
โดยเราต้องการรู้:
- จำนวนครั้งในการซื้อ (count)
- เงินที่เคยใช้จ่ายทั้งหมด (sum)
- ค่าใช้จ่ายโดยเฉลี่ย (mean)
SELECT CustomerId, COUNT(*), SUM(Total) AS TotalSpent, AVG(Total) AS AverageSpent
FROM Invoice
GROUP BY CustomerId;
ผลลัพธ์:

Note:
เพื่อให้ข้อมูลอ่านง่าย เราสามารถใช้ ROUND() เพื่อกำหนดจุดทศนิยมได้ เช่น:
SELECT CustomerId, COUNT(*), ROUND(SUM(Total), 2) AS TotalSpent, ROUND(AVG(Total), 2) AS AverageSpent
FROM Invoice
GROUP BY CustomerId;
ผลลัพธ์:

สังเกตว่า ข้อมูลใน TotalSpent และ AverageSpent จะแสดงทศนิยมแค่ 2 ตำแหน่ง
6️⃣ Statement #6: JOIN
Usage:
เชื่อม tables เข้าด้วยกัน
.
Syntax:
SELECT columns
FROM table1
JOIN table2
ON table1.key1 on table2.key2
- table1, table2 คือ tables ที่เราต้องการเชื่อมกัน
- key1, key2 คือ column ที่ใช้ระบุว่า ข้อมูลไหนจะเชื่อมกับข้อมูลไหน (primary key, foreign key)
.
Example:
เราอยากรู้ว่าเพลงไหนอยู่ในอัลบัลอะไร ให้เชื่อม Track เข้ากับ Album เพื่อหาคำตอบ:
SELECT Track.Name AS TrackName, Album.Title AS AlbumName
FROM Track
JOIN Album
ON Track.AlbumId = Album.AlbumId;
ผลลัพธ์:

7️⃣ Statement #7: LIMIT
Usage:
จำกัดจำนวนข้อมูลที่จะแสดง
.
Syntax:
LIMIT x
- x ให้ใส่จำนวนที่ต้องการ
.
Example:
SELECT FirstName, LastName
FROM Customer
LIMIT 10;
ผลลัพธ์:

💪Put It All Together
เราสามารถใช้คำสั่ง SQL ทั้งหมดร่วมกัน เพื่อตอบโจทย์ data ที่ซับซ้อนได้
ตัวอย่างเช่น หา 5 อัลบัมที่ขายดีที่สุด ซึ่งมีเพลงราคาตั้งแต่ $0.99 ขึ้นไป:
SELECT Album.Title AS AlbumName, SUM(Track.UnitPrice) AS TotalRevenue
FROM Album
JOIN Track
ON Album.AlbumId = Track.AlbumId
WHERE Track.UnitPrice > 0.99
GROUP BY Album.AlbumId
ORDER BY TotalRevenue DESC
LIMIT 5;
- เราใช้
SELECTเพื่อเลือกชื่ออัลบัมและหาผลรวมยอดขาย (SUM) - เชื่อม tables (
JOIN) เพื่อดึงข้อมูลราคาเพลง จากTrack - กรองข้อมูลเฉพาะเพลงที่มีราคาตั้งแต่ $0.99 (
WHERE) - จับกลุ่มข้อมูล (
GROUP BY) เพื่อหาผลรวมของแต่ละอัลบัม - จัดเรียงข้อมูล (
ORDER BY) ตามผลรวมยอดขาย จากมากไปน้อย (DESC) - เลือกแสดงข้อมูล 5 อันดับแรก (
LIMIT)
ผลลัพธ์:

🍩 Bonus: SQL Best Practice
เพื่อเป็นความรู้เพิ่มเติม มาดู 3 best practices ในการเขียน SQL กัน:
- ใช้ UPPERCASE ในเขียนคำสั่ง เช่น:
- ✅ Do:
SELECT,WHERE,GROUP BY - ❌ Don’t:
select,where,group by
- ✅ Do:
- ใช้ snake_case ในการตั้งชื่อ tables และ columns เช่น:
user_idorder_dateduration_ms
- ใช้ indentation (เคาะย่อหน้า) และแบ่งบรรทัด เพื่อความอ่านง่าย เช่น:
-- เขียนแบบนี้:
SELECT
FirstName,
LastName
FROM Customer
ORDER BY LastName;
-- แทนแบบนี้:
SELECT FirstName, LastName
FROM Customer
ORDER BY LastName;
Note:
- จะเห็นว่า ตัวอย่างในบทความ ยังไม่ได้ทำตาม ข้อ 2 และ 3 😅
- อ่าน best practices อื่น ๆ เพิ่มเติมได้ที่ SQL Style Guide
⏭️Next: Sharpen Your SQL
.
😺 GitHub
ดู database และตัวอย่าง SQL ทั้งหมดในบทความ ได้ที่ GitHub
.
🔨 Free Tool
สำหรับใครที่อยากเริ่มฝึก SQL สามารถใช้ SQL ได้ฟรี ผ่าน https://sqliteonline.com/

.
🎒 Free Course
สำหรับคนที่สนใจเรียน SQL แนะนำคอร์สเรียน SQL Crash Course จาก DataRockie
- ง่าย
- ฟรี
- ใช้เวลาเรียนเพียง 30 นาที
- ได้ certificate หลังเรียนจบ

.
📖 Free Tutorial
สำหรับใครที่อยากศึกษาคำสั่ง SQL นอกเหนือจากนี้ สามารถอ่านเพิ่มได้ที่ SQL Tutorial จาก W3Schools
- ฟรี
- เข้าใจง่าย

