Skip to main content

การใช้คำสั่ง 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 เป็นไปได้อย่างมีประสิทธิภาพและยืดหยุ่นมากขึ้น.