Sql Code And Response Tables
Tab ⇥เติมข้อความอัตโนมัติ
⇧ Shift×2
อธิบายข้อความที่คลุมดำไว้ทันที
💡
คำแนะนำ: การเปิดโหมดสรุปเนื้อหาสามารถ แตะหน้าจอค้างไว้ (Long-press) ที่ย่อหน้าใดก็ได้ประมาณ 1 วินาที เพื่ออ่านสรุปใจความสำคัญ

SQL สรุปโค้ด + Response Table ให้เห็นภาพ

เอกสารนี้สรุปแบบ “ดูโค้ด แล้วดูผลลัพธ์”
เหมาะกับใช้ทบทวนเร็ว


1) INNER JOIN

ตารางตั้งต้น

customers

customer_idname
1Aom
2Bank
3Chai

orders

order_idcustomer_idproduct
1012Mouse
1023Keyboard
1034Monitor

โค้ด

sql
SELECT c.customer_id, c.name, o.order_id, o.product
FROM customers c
INNER JOIN orders o
  ON c.customer_id = o.customer_id;

ผลลัพธ์

customer_idnameorder_idproduct
2Bank101Mouse
3Chai102Keyboard

2) LEFT JOIN

โค้ด

sql
SELECT c.customer_id, c.name, o.order_id, o.product
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id;

ผลลัพธ์

customer_idnameorder_idproduct
1AomNULLNULL
2Bank101Mouse
3Chai102Keyboard

3) LEFT JOIN ... IS NULL

โค้ด

sql
SELECT c.customer_id, c.name
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL;

ผลลัพธ์

customer_idname
1Aom

4) SELF JOIN

ตารางตั้งต้น employees

emp_idemp_nametitlemanager_id
1Andrew AdamsGeneral ManagerNULL
2Nancy EdwardsSales Manager1
3Jane PeacockSales Support Agent2
4Margaret ParkSales Support Agent2

โค้ด

sql
SELECT
  e.emp_id,
  e.emp_name,
  e.title,
  m.emp_name AS manager_name,
  m.title AS manager_title
FROM employees e
LEFT JOIN employees m
  ON e.manager_id = m.emp_id
ORDER BY e.emp_id;

ผลลัพธ์

emp_idemp_nametitlemanager_namemanager_title
1Andrew AdamsGeneral ManagerNULLNULL
2Nancy EdwardsSales ManagerAndrew AdamsGeneral Manager
3Jane PeacockSales Support AgentNancy EdwardsSales Manager
4Margaret ParkSales Support AgentNancy EdwardsSales Manager

5) One-to-Many / Many-to-One

ตาราง

customers

customer_idname
1Aom
2Bank

orders

order_idcustomer_idproduct
1011Mouse
1021Keyboard
1032Monitor

มุมมอง

  • customers -> orders = One-to-Many
  • orders -> customers = Many-to-One

โค้ด

sql
SELECT c.name, o.order_id, o.product
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id;

ผลลัพธ์

nameorder_idproduct
Aom101Mouse
Aom102Keyboard
Bank103Monitor

6) ON DELETE CASCADE

ตารางก่อนลบ

customers

customer_idname
1Aom
2Bank

orders

order_idcustomer_idproduct
1011Mouse
1021Keyboard
1032Monitor

โค้ด

sql
DELETE FROM customers
WHERE customer_id = 1;

ผลลัพธ์ถ้าใช้ ON DELETE CASCADE

customers

customer_idname
2Bank

orders

order_idcustomer_idproduct
1032Monitor

7) ON DELETE RESTRICT

โค้ด

sql
DELETE FROM customers
WHERE customer_id = 1;

ผลลัพธ์

  • ระบบจะ error
  • เพราะยังมี order ที่อ้างถึง customer 1 อยู่

8) ON DELETE SET NULL

ตารางตั้งต้น tasks

task_idtask_nameassignee_id
1Prepare report10
2Follow up client11
3Update dashboard10

โค้ด

sql
DELETE FROM users
WHERE user_id = 10;

ผลลัพธ์ถ้าใช้ ON DELETE SET NULL

task_idtask_nameassignee_id
1Prepare reportNULL
2Follow up client11
3Update dashboardNULL

9) TRANSACTION

ตารางตั้งต้น

products

product_idnamestock
1Mouse10

โค้ด

sql
BEGIN;

SELECT stock
FROM products
WHERE product_id = 1
FOR UPDATE;

INSERT INTO orders (user_id, total, status)
VALUES (101, 500, 'pending');

INSERT INTO order_items (order_id, product_id, qty, price)
VALUES (9001, 1, 2, 250);

UPDATE products
SET stock = stock - 2
WHERE product_id = 1;

COMMIT;

ผลลัพธ์หลังสำเร็จ

products

product_idnamestock
1Mouse8

orders

order_iduser_idtotalstatus
9001101500pending

order_items

item_idorder_idproduct_idqtyprice
1900112250

ถ้า error ระหว่างทาง

sql
ROLLBACK;

ผลลัพธ์

  • ไม่มี order ใหม่
  • ไม่มี order_items ใหม่
  • stock กลับไปเหมือนเดิม

10) Application-level Audit Log

ตาราง customers ก่อน update

idname
10Old Name

ตาราง audit_logs ก่อน update

ยังไม่มีข้อมูล

โค้ด

sql
BEGIN;

UPDATE customers
SET name = 'New Name'
WHERE id = 10;

INSERT INTO audit_logs (
  table_name,
  record_id,
  action,
  old_data,
  new_data,
  changed_by,
  changed_at
)
VALUES (
  'customers',
  '10',
  'UPDATE',
  '{"name":"Old Name"}',
  '{"name":"New Name"}',
  99,
  CURRENT_TIMESTAMP
);

COMMIT;

ผลลัพธ์

customers

idname
10New Name

audit_logs

table_namerecord_idactionold_datanew_datachanged_by
customers10UPDATE{"name":"Old Name"}{"name":"New Name"}99

11) SQL Functions


11.1 TRIM

ตาราง customers

first_namelast_name
" John "" Doe "

โค้ด

sql
SELECT TRIM(first_name) AS first_name_clean,
       TRIM(last_name) AS last_name_clean
FROM customers;

ผลลัพธ์

first_name_cleanlast_name_clean
JohnDoe

11.2 LOWER

ตาราง customers

โค้ด

sql
SELECT LOWER(email) AS email_clean
FROM customers;

ผลลัพธ์


11.3 COALESCE

ตาราง customers

namephone
AomNULL
Bank0812345678

โค้ด

sql
SELECT name, COALESCE(phone, '-') AS phone_display
FROM customers;

ผลลัพธ์

namephone_display
Aom-
Bank0812345678

11.4 COUNT / SUM / AVG

ตาราง orders

order_idtotal
101100
102200
103300

โค้ด

sql
SELECT COUNT(*) AS total_orders,
       SUM(total) AS revenue,
       AVG(total) AS avg_order
FROM orders;

ผลลัพธ์

total_ordersrevenueavg_order
3600200

11.5 ROUND

โค้ด

sql
SELECT ROUND(AVG(total), 2) AS avg_order
FROM orders;

ผลลัพธ์

avg_order
200.00

11.6 CASE WHEN

ตาราง orders

order_idtotal
10112000
1027000
1033000

โค้ด

sql
SELECT order_id,
       total,
       CASE
         WHEN total >= 10000 THEN 'high'
         WHEN total >= 5000 THEN 'medium'
         ELSE 'low'
       END AS order_level
FROM orders;

ผลลัพธ์

order_idtotalorder_level
10112000high
1027000medium
1033000low

12) สรุปสั้นสุด

ถ้าเอาแค่ของที่ใช้จริงบ่อยสุด ให้จำภาพนี้

  • INNER JOIN = เอาเฉพาะที่ match
  • LEFT JOIN = เอาฝั่งซ้ายทั้งหมด
  • LEFT JOIN ... IS NULL = หาแถวที่ยังไม่มีคู่
  • SELF JOIN = join ตารางเดิมกับตัวเอง
  • One-to-Many / Many-to-One = ความสัมพันธ์ที่ใช้จริงบ่อยสุด
  • RESTRICT = กันลบมั่ว
  • CASCADE = ลบลูกตามแม่
  • SET NULL = แม่หาย ลูกยังอยู่
  • TRANSACTION = หลาย query ต้องสำเร็จพร้อมกัน
  • Audit Log = ให้ backend เขียน log เองใน transaction เดียวกัน
  • Functions ที่ควรรู้ก่อน = TRIM, COALESCE, COUNT, SUM, AVG, ROUND, CASE WHEN