SQL — DDL และ DML
แนะนำใหม่| English | ความหมาย |
|---|---|
| SQL/ˌes kjuː ˈel/ | ภาษา SQL |
| Data Definition Language/ˈdeɪtə ˌdefɪˈnɪʃn ˈlæŋɡwɪdʒ/ | ภาษานิยามข้อมูล (DDL) |
| Data Manipulation Language/ˈdeɪtə məˌnɪpjʊˈleɪʃn ˈlæŋɡwɪdʒ/ | ภาษาจัดการข้อมูล (DML) |
| INNER JOIN/ˈɪnə dʒɔɪn/ | การเชื่อมภายใน (INNER JOIN) |
| aggregate functions/ˈæɡrɪɡeɪt ˈfʌŋkʃnz/ | ฟังก์ชันรวมค่า |
ภาษาที่นักพัฒนาบรรพบุรุษของคุณก็ใช้
- ในปี 1974 นักวิจัย IBM สองคนออกแบบภาษาสำหรับ query ในตารางของ Codd และตั้งชื่อว่า SEQUEL: Structured English Query Language ชื่อถูกตัดเหลือ SQL และภาษานี้ไม่เคยหายไป
- ห้าสิบปีต่อมา ธนาคาร สายการบิน โรงพยาบาล และเว็บไซต์ที่คุณใช้งานทั้งหมดทำงานอยู่บนมัน นักเรียนที่พิมพ์
SELECTวันนี้ กำลังเขียน statement เดียวกับที่นักพัฒนาก่อนหน้าเธอเขียนก่อนที่พ่อแม่ของเธอจะเกิด - มีสองส่วน และการสอบจะให้คุณอ่านส่วนใดส่วนหนึ่งและเขียนทั้งสองส่วน: Data Definition Language ที่ใช้สร้างโครงสร้าง และ Data Manipulation Language ที่ใช้เติมข้อมูล เปลี่ยนแปลง และสอบถามข้อมูล
- บทเรียนนี้เป็นส่วนย่อยของ SQL ตามหลักสูตร โดยแยกเป็นคำสั่งทีละคำสั่ง พร้อมคะแนนของแต่ละคำสั่ง
DDL และ DML
- DBMS ทำ ทุก การสร้างและการแก้ไข โครงสร้าง ของฐานข้อมูลผ่าน DDL: สร้างฐานข้อมูล, สร้างและแก้ไขตาราง, เพิ่มคีย์
- มันทำ ทุก คำสั่งและบำรุงรักษา ข้อมูล ผ่าน DML: เลือก, แทรก, แก้ไข และลบแถว
- SQL เป็นมาตรฐานอุตสาหกรรมสำหรับทั้งสอง การแยก statement เข้าไปอยู่ในฝั่งที่ถูกต้องเป็นคำถาม 1 คะแนนทั่วไป:
CREATE TABLEคือ DDL,SELECTคือ DML

ด้านซ้ายคือโครงสร้าง ด้านขวาคือข้อมูล
ข้อใดเป็นส่วนหนึ่งของภาษานิยามข้อมูล (DDL)?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
DDL เปลี่ยนแปลงโครงสร้าง (CREATE, ALTER, DROP). SELECT/INSERT/UPDATE/DELETE คือ DML (การทำงานกับข้อมูล)
DDL นิยามโครงสร้าง (เช่น CREATE TABLE) ในขณะที่ DML ทำงานกับข้อมูลภายใน (SELECT, INSERT, UPDATE, DELETE)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
นิยาม vs การจัดการ: DDL จัดรูปทรงตาราง; DML อ่านและแก้ไขแถว
DDL: การสร้างโครงสร้าง
CREATE DATABASE Shop;
CREATE TABLE CUSTOMER (
CustomerID INTEGER,
Name VARCHAR(50),
Town VARCHAR(30),
Joined DATE,
Active BOOLEAN,
PRIMARY KEY (CustomerID)
);
ALTER TABLE CUSTOMER ADD Email VARCHAR(100);
- Data types ในหลักสูตร:
CHARACTER(จำนวนตัวอักษรคงที่),VARCHAR(n)(สูงสุด n ตัวอักษร),BOOLEAN,INTEGER,REAL,DATE,TIME PRIMARY KEY (field)ใช้ตั้งชื่อ key;ALTER TABLE … ADDเพิ่ม attribute เข้าไปในตารางที่มีอยู่เดิม
จับคู่รายการข้อมูลแต่ละรายการกับประเภทข้อมูล SQL ที่เหมาะสม
Difficulty 2/5 · 140 coins + a small bonus on first completion today
สองสถานะ ข้อความความยาวแปรผัน จำนวนที่มีทศนิยม และวันปฏิทิน INTEGER ใช้สำหรับนับจำนวนเต็ม และ TIME ใช้สำหรับเวลาของวัน
ตัวอย่างคำตอบ: ตารางสองตารางที่มี foreign key
- เขียน SQL เพื่อสร้าง
ORDERStable ที่มีOrderIDเป็น primary key,CustomerIDเป็น foreign key ไปยังCUSTOMER, และมีOrderDate
CREATE TABLE ORDERS (
OrderID INTEGER,
CustomerID INTEGER,
OrderDate DATE,
PRIMARY KEY (OrderID),
FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID)
);
- คะแนน:
CREATE TABLEพร้อมชื่อ; แต่ละ attribute กับ type ที่เหมาะสม;PRIMARY KEY;FOREIGN KEY … REFERENCESที่ตั้งชื่อทั้ง ตาราง และ ฟิลด์
DML: การถามคำถามด้วย SELECT
SELECT Name, Town
FROM CUSTOMER
WHERE Town = 'London'
ORDER BY Name ASC;
SELECT列出 fields ที่ต้องการ output (*สำหรับทั้งหมด),FROMตั้งชื่อตาราง,WHEREกรองเฉพาะแถวที่ตรงเงื่อนไข,ORDER BYเรียงลำดับผลลัพธ์,ASCหรือDESC- String ต้องใส่ใน เครื่องหมายอัญQuotes; จำนวนไม่ใส่ Comparison:
=,<,>,<=,>=,<>; เงื่อนไขเชื่อมด้วยAND,OR,NOT;LIKE 'A%'ตรงกับข้อความขึ้นต้นด้วย A;BETWEEN 10 AND 20ให้ช่วงค่า

*เฉพาะแถวที่ผ่าน WHERE เท่านั้นที่จะปรากฏในผลลัพธ์
คำสำคัญ SQL nàoใช้ดึงข้อมูลจากตาราง? (หนึ่งคำ)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
SELECT ระบุฟิลด์ที่จะดึง; FROM ระบุชื่อตาราง
clause WHERE ในคำสั่ง SELECT ทำหน้าที่:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WHERE กรองแถวตามเงื่อนไข; ORDER BY เรียงลำดับ; ส่วน SELECT list เลือกคอลัมน์
ตัวอย่างคำตอบ: เขียนคำสั่ง
- เขียนสคริปต์ SQL เพื่อ output ชื่อและอีเมลของลูกค้าทุกคนที่ยังใช้งานอยู่ในแมนเชสเตอร์, เรียงตามชื่อจาก A-Z
SELECT Name, Email
FROM CUSTOMER
WHERE Town = 'Manchester' AND Active = TRUE
ORDER BY Name;
- ข้อละ 1 คะแนน: ช่องว่างที่ถูกต้องหลัง
SELECT; ตารางที่ถูกต้องหลังFROM; คำสั่งWHEREที่มีเงื่อนไขทั้งคู่และข้อความในเครื่องหมายอัญক্ষณ;ORDER BY Name. ใช้ชื่อตารางและช่องว่างตามคำถามที่กำหนดอย่าง แม่นยำ
วาง clause ของคำสั่ง SELECT ตามลำดับการเขียน
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Fields, table, filter, sort. ORDER BY ต้องอยู่ท้ายเสมอ และคำสั่งลงท้ายด้วยเครื่องหมายกึ่งทวิภาค (;)
ตารางสองตาราง: INNER JOIN
SELECT CUSTOMER.Name, ORDERS.OrderDate
FROM CUSTOMER INNER JOIN ORDERS
ON CUSTOMER.CustomerID = ORDERS.CustomerID
WHERE ORDERS.OrderDate >= '2024-01-01';
- INNER JOIN รวมแถวของสองตารางเมื่อ foreign key ในตารางหนึ่งตรงกับ primary key ในอีกตารางหนึ่ง, ซึ่งระบุไว้ใน clause
ON - ให้ระบุชื่อตารางนำหน้าชื่อฟิลด์เมื่อมีชื่อซ้ำกันในทั้งสองตาราง ซิลแลบัสต้องการการสืบค้นข้อมูลจากตารางไม่เกินสองตาราง
เชื่อมสองตารางด้วย INNER JOIN
การ Join จับคู่แถวที่ฟอเรนคีย์เท่ากับคีย์หลัก — ที่นี่ Orders.CustomerID = Customer.CustomerID — และรวมคู่ที่ตรงกันนั้นเป็นแถวที่กว้างขึ้นหนึ่งแถว
ใช้ INNER JOIN เพื่อ:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
JOIN รวมสองตารางเข้าด้วยกันบนความสัมพันธ์ (โดยทั่วไปคือ foreign key ที่ตรงกับ primary key)
ฟังก์ชันสรุปผลและการใช้ GROUP BY
SELECT CustomerID, COUNT(*) AS NumOrders
FROM ORDERS
GROUP BY CustomerID;
SELECT AVG(Price) FROM PRODUCT;
SELECT SUM(Quantity) FROM ORDER_LINE WHERE OrderID = 1042;
- ฟังก์ชันสรุปผล (Aggregate functions) ช่วยสรุปรายละเอียดของหลายแถวให้เป็นค่าเดียว:
COUNTจำนวนแถว,SUMค่ารวม,AVGค่าเฉลี่ย GROUP BYจะสร้างแถวสรุปผลหนึ่งแถวต่อทุกค่าของฟิลด์: เช่น จำนวนคำสั่งซื้อ ต่อลูกค้า หากไม่มีคำสั่งนี้ ฟังก์ชันสรุปผลจะประมวลผลทั้งตาราง
COUNT(*) จะคืนค่าอะไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
COUNT(*)นับจำนวนแถว; SUM/AVG/MIN/MAX เป็นฟังก์ชันhistoricอื่น ๆ
ต้องการแสดงผลจำนวนคำสั่งซื้อของแต่ละลูกค้า คำสั่งนี้ต้องใช้: เลือก ทุก ข้อที่ถูกต้อง
Difficulty 2/5 · 140 coins + a small bonus on first completion today
นับจำนวนแถว โดยแบ่งกลุ่มละหนึ่งกลุ่มต่อลูกค้า จากตารางคำสั่งซื้อ การเรียงลำดับเป็นทางเลือก
การแก้ไขข้อมูล: INSERT, UPDATE, DELETE
INSERT INTO CUSTOMER (CustomerID, Name, Town, Joined, Active)
VALUES (101, 'Ada Lovelace', 'London', '2024-03-01', TRUE);
UPDATE CUSTOMER SET Town = 'Bristol' WHERE CustomerID = 101;
DELETE FROM CUSTOMER WHERE CustomerID = 101;
INSERT INTO … VALUESเพิ่มแถว: ระบุชื่อฟิลด์ก่อน แล้วตามด้วยค่าในลำดับเดียวกันUPDATE … SET … WHEREแก้ไขแถวที่ตรงกันDELETE FROM … WHEREลบแถวออก- ต้อง ระบุ
UPDATEและDELETEพร้อมกับWHEREเสมอ มิฉะนั้นการเปลี่ยนแปลงจะกระทบถึงทุกแถวในตาราง
จะเกิดอะไรขึ้นหากรัน UPDATE หรือ DELETE โดยไม่มี WHERE clause?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
เมื่อไม่มี WHERE การกระทำจะกระทบทุกแถว — ซึ่งเป็นข้อผิดพลาดที่พบบ่อยและอันตราย
จับคู่แต่ละ DML statement กับสิ่งที่มันทำ
Difficulty 2/5 · 140 coins + a small bonus on first completion today
SELECT อ่าน; INSERT เพิ่ม; UPDATE แก้ไข; DELETE ลบ — คำนามหลักสี่ชนิดของ DML
ตัวอย่างวิธีทำ: อ่านคำสั่ง
SELECT Name
FROM CUSTOMER INNER JOIN ORDERS
ON CUSTOMER.CustomerID = ORDERS.CustomerID
WHERE OrderDate = '2024-05-01'
ORDER BY Name DESC;
- ระบุว่าสคริปต์นี้จะแสดงผลลัพธ์อะไร ชื่อของลูกค้าทุกคนที่สั่งซื้อสินค้าในวันที่ 1 พฤษภาคม 2024 โดยแสดงหนึ่งแถวสำหรับแต่ละคำสั่งซื้อ เรียงลำดับตัวอักษรถอยหลัง
- อ่านตามลำดับการดำเนินการ: เชื่อมต่อตารางด้วย ID ลูกค้า, กรองแถวของวันนั้น, แสดงชื่อ, เรียงลำดับจากมากไปน้อย ลูกค้าที่มีคำสั่งซื้อสองครั้งในวันเดียวกันจะปรากฏสองครั้ง
คะแนนที่หลุดหายไป
- ข้อความอยู่ใน เครื่องหมายอัญประกาศเดี่ยว, ตัวเลขไม่ใส่เครื่องหมาย:
Town = 'London',CustomerID = 101 ORDER BYอยู่ หลังWHERE; การเชื่อมต่อตารางต้องใช้ONclause; คำสั่งทั้งหมดลงท้ายด้วยเครื่องหมายกึ่งทศนิยมCOUNT(*)นับ จำนวนแถว ไม่ใช่ค่าที่ไม่ซ้ำกัน; คำถามที่ต้องการแยกกลุ่มต้องใช้GROUP BYCREATE,ALTERและPRIMARY KEYเป็น DDL;SELECT,INSERT,UPDATE,DELETEเป็น DML ใช้ชื่อบทความตามที่โจทย์กำหนดให้เป๊ะ
คุณเข้าใจแล้ว
- DDL สร้างและแก้ไขโครงสร้าง:
CREATE DATABASE,CREATE TABLEพร้อมกำหนดชนิดข้อมูล,PRIMARY KEY,FOREIGN KEY … REFERENCES,ALTER TABLE … ADD· DML ทำงานกับข้อมูล - ชนิดข้อมูล:
CHARACTER,VARCHAR(n),BOOLEAN,INTEGER,REAL,DATE,TIME SELECT fields FROM table WHERE condition ORDER BY field;INNER JOIN … ONสำหรับสองตาราง;COUNT,SUM,AVGพร้อมGROUP BYสำหรับหนึ่งแถวต่อกลุ่มINSERT INTO … VALUES,UPDATE … SET … WHERE,DELETE FROM … WHERE: ห้ามมีการอัปเดตหรือลบโดยไม่ใช้WHERE