การใช้คำสั่ง SQL ขั้นสูง (Advanced Queries) ใน PostgreSQL
บทนำ
คำสั่ง SQL ขั้นสูง (Advanced Queries) ใน PostgreSQL คือการใช้ฟีเจอร์ที่มีความซับซ้อนมากขึ้นใน SQL เช่น การใช้ Subqueries, CTE (Common Table Expressions), Window Functions, และการใช้ฟังก์ชันต่างๆ เพื่อการคำนวณที่ซับซ้อนและการประมวลผลข้อมูลในลักษณะที่มีประสิทธิภาพ. การเรียนรู้คำสั่ง SQL ขั้นสูงจะช่วยให้คุณสามารถจัดการข้อมูลที่ซับซ้อนได้ดียิ่งขึ้นและทำให้การทำงานกับ PostgreSQL มีความยืดหยุ่นสูงขึ้น.
1. Subqueries (การใช้คำสั่งย่อย)
Subqueries คือคำสั่ง SQL ที่ถูกฝังอยู่ในคำสั่ง SQL อื่น โดยสามารถใช้ในการกรองข้อมูล, คำนวณค่าต่างๆ หรือใช้ในการอัปเดตข้อมูล.
1.1 Subqueries ใน SELECT
SELECT name, salary
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales');
ในตัวอย่างนี้, คำสั่งย่อย (Subquery) ใช้ในการหาหมายเลขแผนกที่มีชื่อว่า "Sales" และนำมาใช้ในการกรองพนักงานที่อยู่ในแผนกนั้น.
1.2 Subqueries ใน WHERE
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
คำสั่งนี้จะเลือกพนักงานที่มีเงินเดือนมากกว่าค่าเฉลี่ยของเงินเดือนทั้งหมดในตาราง employees.
2. Common Table Expressions (CTEs)
CTE หรือ Common Table Expressions คือการใช้การคิวรีชั่วคราวที่สามารถเรียกใช้ซ้ำภายในคำสั่ง SQL เดียวกัน. CTE จะช่วยให้โค้ดอ่านง่ายและทำให้คำสั่ง SQL ซับซ้อนน้อยลง.
2.1 การใช้ CTE
WITH DepartmentSalaries AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.name, e.salary, ds.avg_salary
FROM employees e
JOIN DepartmentSalaries ds ON e.department_id = ds.department_id
WHERE e.salary > ds.avg_salary;
ในตัวอย่างนี้, เราใช้ CTE ชื่อ DepartmentSalaries เพื่อหาค่าเฉลี่ยของเงินเดือนในแต่ละแผนก แล้วนำไปใช้ในคำสั่ง SELECT เพื่อกรองพนักงานที่มีเงินเดือนสูงกว่าค่าเฉลี่ยของแผนกนั้น.
3. Window Functions (ฟังก์ชันหน้าต่าง)
Window Functions เป็นฟังก์ชันที่ทำการคำนวณบนชุดข้อมูลที่ได้จากการแบ่งกลุ่มข้อมูล (Partition) โดยไม่ต้องรวมข้อมูลในกลุ่มนั้นๆ. ฟังก์ชันเหล่านี้ช่วยให้การคำนวณที่ซับซ้อน เช่น การคำนวณยอดรวมสะสม, ค่าเฉลี่ยสะสม หรือการจัดอันดับข้อมูล.
3.1 การใช้ Window Functions
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
ในตัวอย่างนี้, ฟังก์ชัน RANK() จะใช้ในการจัดอันดับพนักงานตามเงินเดือนจากมากไปหาน้อย.
3.2 การคำนวณยอดรวมสะสมด้วย Window Function
SELECT name, salary,
SUM(salary) OVER (ORDER BY salary) AS cumulative_salary
FROM employees;
ฟังก์ชัน SUM() ในตัวอย่างนี้คำนวณยอดรวมสะสมของเงินเดือนจากพนักงานคนแรกจนถึงคนปัจจุบันตามลำดับเงินเดือน.
4. การใช้ GROUP BY และ HAVING
การใช้ GROUP BY ช่วยในการจัดกลุ่มข้อมูล และ HAVING ใช้ในการกรองกลุ่มข้อมูลหลังจากที่ได้ทำการจัดกลุ่มแล้ว.
4.1 การใช้ GROUP BY
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
คำสั่งนี้จะคำนวณค่าเฉลี่ยของเงินเดือนในแต่ละแผนก.
4.2 การใช้ HAVING
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
คำสั่งนี้จะเลือกแผนกที่มีค่าเฉลี่ยเงินเดือนมากกว่า 50,000 บาท.
5. การใช้ JOINs ที่ซับซ้อน
การใช้ JOIN ในการรวมข้อมูลจากหลายตารางเป็นหนึ่งในฟีเจอร์ที่สำคัญของ SQL. PostgreSQL รองรับการใช้ INNER JOIN, LEFT JOIN, RIGHT JOIN, และ FULL JOIN ที่สามารถนำมารวมข้อมูลได้ตามเงื่อนไขต่างๆ.
5.1 การใช้ INNER JOIN
SELECT e.name, d.name AS department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
ในตัวอย่างนี้, ข้อมูลของพนักงานจะถูกเชื่อมกับข้อมูลแผนกที่เกี่ยวข้องโดยใช้ INNER JOIN.
5.2 การใช้ LEFT JOIN
SELECT e.name, d.name AS department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
การใช้ LEFT JOIN จะดึงข้อมูลของพนักงานทั้งหมด รวมทั้งพนักงานที่ไม่มีแผนก.
6. การใช้ DISTINCT
คำสั่ง DISTINCT ใช้ในการกรองข้อมูลที่ซ้ำซ้อนออกจากผลลัพธ์.
ตัวอย่างการใช้ DISTINCT
SELECT DISTINCT department_id
FROM employees;
คำสั่งนี้จะแสดงผลลัพธ์เป็นหมายเลขแผนกที่ไม่ซ้ำกันจากตาราง employees.
7. การใช้ EXCEPT และ INTERSECT
EXCEPT และ INTERSECT ใช้ในการดำเนินการที่เกี่ยวข้องกับผลลัพธ์ของหลายๆ คำสั่ง SELECT.
7.1 การใช้ EXCEPT
SELECT department_id FROM employees
EXCEPT
SELECT department_id FROM contractors;
คำสั่งนี้จะแสดงแผนกที่มีในตาราง employees แต่ไม่มีในตาราง contractors.
7.2 การใช้ INTERSECT
SELECT department_id FROM employees
INTERSECT
SELECT department_id FROM contractors;
คำสั่งนี้จะแสดงแผนกที่มีในทั้งตาราง employees และ contractors.
8. การใช้ UNION
UNION ใช้ในการรวมผลลัพธ์จากคำสั่ง SELECT หลายๆ ตัวเข้าไว้ด้วยกันโดยไม่ให้ข้อมูลซ้ำกัน.
ตัวอย่างการใช้ UNION
SELECT department_id FROM employees
UNION
SELECT department_id FROM contractors;
คำสั่งนี้จะแสดงแผนกทั้งหมดที่มีในทั้ง employees และ contractors, โดยไม่ให้แผนกซ้ำกัน.
9. สรุป
คำสั่ง SQL ขั้นสูงใน PostgreSQL ช่วยให้สามารถคิวรีข้อมูลที่ซับซ้อนมากขึ้นได้อย่างมีประสิทธิภาพ. การใช้ Subqueries, CTEs, Window Functions, การใช้ JOINs, และฟังก์ชันต่างๆ ช่วยให้คุณสามารถทำการคำนวณที่ซับซ้อนและการประมวลผลข้อมูลได้อย่างมีประสิทธิภาพ. การเรียนรู้และเข้าใจฟีเจอร์เหล่านี้จะช่วยให้การใช้งาน PostgreSQL เป็นไปได้อย่างมีประสิทธิภาพและยืดหยุ่นมากขึ้น.