ฐานข้อมูลและ SQL: ข้อสอบฝึกหัดพร้อมคำอธิบาย

ข้อสอบปรนัย ฐานข้อมูลและ SQL ฟรี พร้อมคำใบ้และคำอธิบาย สามระดับ: ศัพท์สำคัญและข้อเท็จจริง, การประยุกต์ใช้แนวคิด, กรณีศึกษาและการวิเคราะห์

โจทย์ฝึกฟรีง่าย

ข้อจำกัด (constraint) ใดรับรองว่าคอลัมน์ไม่มีทางเว้นว่าง (NULL)?

โจทย์ถัดไป →
ฝึก ฐานข้อมูลและ SQL ฟรีฝึก ฐานข้อมูลและ SQL เลยโจทย์ฟรีวันละ 5 ข้อ ไม่ต้องใช้บัตร

สิ่งที่คุณจะได้ฝึก

  1. ง่ายศัพท์สำคัญและข้อเท็จจริง
  2. ปานกลางการประยุกต์ใช้แนวคิด
  3. ยากกรณีศึกษาและการวิเคราะห์

เรียนรู้ ฐานข้อมูลและ SQL ตั้งแต่ต้น

1ฐานข้อมูลเชิงสัมพันธ์คืออะไร

ฐานข้อมูลเชิงสัมพันธ์ (relational database) เก็บข้อมูลในตาราง ตารางเหมือนสเปรดชีต: แต่ละแถวคือหนึ่งระเบียน แต่ละคอลัมน์คือหนึ่งคุณสมบัติ

ร้านค้าอาจมีตาราง customers ที่มีคอลัมน์ id, name และ city และตาราง orders ที่มีคอลัมน์ id, customer_id และ total

คีย์หลัก (primary key) คือคอลัมน์หรือชุดคอลัมน์ที่ระบุแต่ละแถวได้อย่างไม่ซ้ำ ห้ามซ้ำและห้ามว่าง ในที่นี้คือ id ของแต่ละตาราง

คีย์นอก (foreign key) คือคอลัมน์ที่อ้างถึงคีย์หลักของตารางอื่น ใน orders customer_id บอกว่าลูกค้าคนใดสั่งซื้อ

นี่คือวิธีเชื่อมตาราง: ลูกค้าหนึ่งคนมีคำสั่งซื้อได้หลายรายการ แต่แต่ละคำสั่งซื้อเป็นของลูกค้าหนึ่งคน นั่นคือความสัมพันธ์หนึ่งต่อกลุ่ม (one-to-many)

SQL (Structured Query Language) คือภาษาที่ใช้สร้างตาราง เปลี่ยนข้อมูล และถามคำถามเกี่ยวกับข้อมูล

ตรวจสอบตนเอง คีย์หลักคืออะไร
  1. คอลัมน์ที่อ้างถึงแถวในตารางอื่น
  2. คอลัมน์หรือชุดคอลัมน์ที่ระบุแต่ละแถวได้อย่างไม่ซ้ำ
  3. คอลัมน์แรกของทุกตาราง
  4. ดัชนีที่ทำให้การค้นหาเร็วขึ้น

คำตอบ: คอลัมน์หรือชุดคอลัมน์ที่ระบุแต่ละแถวได้อย่างไม่ซ้ำ. คีย์หลักไม่ซ้ำและไม่เป็น NULL จึงเลือกได้เพียงแถวเดียวพอดี คอลัมน์ที่อ้างถึงตารางอื่นคือคีย์นอก

2การอ่านข้อมูลด้วย SELECT

คำถามส่วนใหญ่เกี่ยวกับคำสั่ง SELECT ประกอบด้วยส่วนคำสั่ง (clause) ที่เขียนตามลำดับนี้เสมอ:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT ระบุคอลัมน์ที่ต้องการ DISTINCT ลบแถวที่ซ้ำ
  • FROM ระบุตาราง หรือตารางที่เชื่อมกัน
  • WHERE เก็บเฉพาะแถวที่ตรงเงื่อนไข เช่น WHERE total > 20
  • GROUP BY จัดแถวที่มีค่าเดียวกันเป็นกลุ่มเดียว เพื่อให้นับหรือรวมต่อกลุ่มได้
  • HAVING เก็บเฉพาะกลุ่มที่ตรงเงื่อนไข ใช้ฟังก์ชันรวมได้ ซึ่ง WHERE ใช้ไม่ได้
  • ORDER BY เรียงผลลัพธ์ จากน้อยไปมากโดยปริยาย เพิ่ม DESC เพื่อให้มากสุดก่อน

ฟังก์ชันรวม (aggregate function) สรุปหลายแถวเป็นค่าเดียว: COUNT, SUM, AVG, MIN และ MAX

ฐานข้อมูลไม่ทำงานตามลำดับที่คุณเขียน มันทำ FROM ก่อน แล้ว WHERE, GROUP BY, HAVING, SELECT และสุดท้าย ORDER BY

คำสั่งอื่นเปลี่ยนข้อมูล: INSERT เพิ่มแถว UPDATE เปลี่ยนแถว และ DELETE ลบแถว CREATE, ALTER และ DROP เปลี่ยนตารางเอง

ตรวจสอบตนเอง คุณต้องการเฉพาะลูกค้าที่มีคำสั่งซื้อมากกว่า 5 รายการ ส่วนคำสั่งใดกรองด้วย COUNT(*) > 5
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

คำตอบ: HAVING. ค่านับมีเมื่อแถวถูกจัดกลุ่มแล้วเท่านั้น และ HAVING กรองกลุ่ม WHERE ทำก่อนการจัดกลุ่ม จึงใช้ฟังก์ชันรวมอย่าง COUNT ไม่ได้

3การรวมตาราง นอร์มัลไลเซชัน และทรานแซกชัน

การรวมตาราง (join) รวมแถวของสองตารางโดยใช้เงื่อนไข ปกติคือคีย์นอก = คีย์หลัก:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (หรือ JOIN) เก็บเฉพาะแถวที่จับคู่ได้ในทั้งสองตาราง
  • LEFT JOIN เก็บทุกแถวของตารางซ้าย ที่ไม่มีคู่ คอลัมน์ของตารางขวาเป็น NULL
  • NULL หมายถึงค่าขาดหายหรือไม่ทราบ ทดสอบด้วย IS NULL ไม่ใช่ = NULL

นอร์มัลไลเซชัน (normalisation) แยกตารางเพื่อให้ทุกข้อเท็จจริงถูกเก็บครั้งเดียว ช่วยหลีกเลี่ยงการแก้ข้อเท็จจริงเดียวกันในหลายที่

  • 1NF: ทุกเซลล์เก็บค่าอะตอมิกหนึ่งค่า ไม่มีกลุ่มที่ซ้ำ
  • 2NF: 1NF และทุกคอลัมน์ที่ไม่ใช่คีย์ขึ้นกับคีย์ทั้งหมด ไม่ใช่ส่วนหนึ่งของคีย์ประกอบ
  • 3NF: 2NF และไม่มีคอลัมน์ที่ไม่ใช่คีย์ขึ้นกับคอลัมน์อื่นที่ไม่ใช่คีย์

ทรานแซกชัน (transaction) จัดกลุ่มคำสั่งเป็นหน่วยเดียว COMMIT ทำให้ถาวรและ ROLLBACK ยกเลิก ทรานแซกชันเป็นไปตาม ACID: atomicity (ทำทั้งหมดหรือไม่ทำเลย) consistency isolation และ durability

ตรวจสอบตนเอง ลูกค้าไม่เคยสั่งซื้อ ลูกค้าคนนั้นเกิดอะไรขึ้นใน customers LEFT JOIN orders
  1. การค้นหาล้มเหลวด้วยข้อผิดพลาด
  2. ลูกค้าถูกตัดออกจากผลลัพธ์
  3. ลูกค้าปรากฏหนึ่งครั้ง โดยคอลัมน์คำสั่งซื้อเป็น NULL
  4. ลูกค้าปรากฏหนึ่งครั้งต่อทุกคำสั่งซื้อในตาราง

คำตอบ: ลูกค้าปรากฏหนึ่งครั้ง โดยคอลัมน์คำสั่งซื้อเป็น NULL. LEFT JOIN เก็บทุกแถวของตารางซ้ายและเติมด้านขวาที่ขาดด้วย NULL การตัดลูกค้าออกคือสิ่งที่ INNER JOIN ทำ

4วิธีทำทีละขั้น

เพื่อเขียนคิวรี หรือหาว่าคิวรีที่ให้มาคืนค่าอะไร:

  1. หาตารางที่เก็บข้อมูลและวิธีที่คีย์เชื่อมกัน
  2. เขียน FROM พร้อมการรวมตาราง เลือก LEFT JOIN เมื่อแถวที่ไม่มีคู่ต้องคงไว้
  3. เพิ่ม WHERE สำหรับเงื่อนไขของแต่ละแถว
  4. ถ้าคำถามบอกว่า “ต่อ” หรือ “สำหรับแต่ละ” ให้เพิ่ม GROUP BY และฟังก์ชันรวม
  5. เพิ่ม HAVING สำหรับเงื่อนไขของฟังก์ชันรวม แล้ว ORDER BY ถ้าลำดับสำคัญ
  6. ตรวจผลด้วยตัวอย่างเล็ก ๆ: เขียนแถวหลังแต่ละส่วนคำสั่ง ตามลำดับที่ฐานข้อมูลทำ

สำหรับคำถามทฤษฎี ให้ระบุแนวคิดก่อน (คีย์ ชนิดการรวมตาราง รูปนอร์มัล คุณสมบัติ ACID) แล้วเลือกตัวเลือกที่ตรงกับนิยามของมัน

5ตัวอย่างที่แก้ให้ดู

ทำตามทุกขั้นตอน ลองทำนายขั้นถัดไปก่อนเปิดดู

ตัวอย่างที่แก้ให้ดู

ตาราง customers มีแถว (1, Ana), (2, Ben) และ (3, Cas) ตาราง orders มีแถว (id, customer_id) = (10, 1), (11, 1), (12, 2) และ (13, 1) คิวรีนี้คืนค่าอะไร SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

ทำ FROM และการรวมตาราง

ลูกค้าแต่ละคนถูกจับคู่กับคำสั่งซื้อที่มี id ของเขา Ana ตรงกับคำสั่งซื้อ 10, 11 และ 13 Ben ตรงกับคำสั่งซื้อ 12

Cas ไม่มีคำสั่งซื้อ เพราะเป็น LEFT JOIN Cas จึงคงอยู่ในผลลัพธ์ โดย o.id เป็น NULL

2

เขียนแถวที่รวมแล้ว

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

นั่นคือ 5 แถว

3

จัดกลุ่มตามชื่อ

GROUP BY c.name สร้างสามกลุ่ม: Ana 3 แถว Ben 1 แถว และ Cas 1 แถว

4

นับต่อกลุ่ม

COUNT(o.id) นับเฉพาะค่าที่ไม่ใช่ NULL Ana ได้ 3 และ Ben ได้ 1

Cas มีหนึ่งแถว แต่ o.id เป็น NULL ดังนั้น Cas ได้ 0

5

ตรวจสอบคำตอบ

Ana, Ben และ Cas รวมกันมี 3 + 1 + 0 = 4 คำสั่งซื้อ เท่ากับจำนวนแถวใน orders ถ้าใช้ COUNT(*) แทน Cas จะได้ 1 อย่างผิด ๆ เพราะ COUNT(*) นับตัวแถวเอง

คำตอบ

Ana 3, Ben 1, Cas 0

6ข้อผิดพลาดที่พบบ่อย

  • ใช้ฟังก์ชันรวมใน WHERE เงื่อนไขของ COUNT, SUM หรือ AVG อยู่ใน HAVING
  • เขียน = NULL การเปรียบเทียบใด ๆ กับ NULL ไม่ทราบผล ใช้ IS NULL หรือ IS NOT NULL
  • ใช้ INNER JOIN เมื่อแถวที่ไม่มีคู่ต้องคงไว้ ใช้ LEFT JOIN
  • ลืมเงื่อนไขการรวมตาราง ถ้าไม่มี ON ทุกแถวถูกจับคู่กับทุกแถว (cross join)
  • เลือกคอลัมน์ที่ไม่อยู่ใน GROUP BY และไม่อยู่ในฟังก์ชันรวม
  • สับสน DELETE (ลบแถว) กับ DROP TABLE (ลบทั้งตาราง)
  • รัน UPDATE หรือ DELETE โดยไม่มี WHERE มันเปลี่ยนทุกแถวในตาราง
ตรวจสอบตนเอง ตารางมี 10 แถว และคอลัมน์ col เป็น NULL ทุกแถว SELECT COUNT(col) คืนค่าอะไร
  1. 0
  2. 10
  3. 1
  4. NULL

คำตอบ: 0. COUNT(col) นับเฉพาะค่าที่ไม่ใช่ NULL จึงคืน 0 COUNT(*) นับแถวและจะคืน 10

7ข้อสอบมีหน้าตาอย่างไร

  • ง่าย: ศัพท์และข้อเท็จจริงสำคัญ SELECT, WHERE, ORDER BY หรือ DELETE ทำอะไร คีย์หลักและคีย์นอก NULL หมายถึงอะไร
  • ปานกลาง: การประยุกต์แนวคิด คิวรีที่ถูกต้องสำหรับงาน WHERE เทียบกับ HAVING การรวมตารางแบบ inner เทียบกับ outer รูปนอร์มัล ACID
  • ยาก: กรณีศึกษาและการวิเคราะห์ ซับคิวรี ระดับการแยกตัวและความผิดปกติของมัน BCNF ฟังก์ชันหน้าต่าง ดัชนีและประสิทธิภาพคิวรี SQL injection

เมื่อให้คิวรี ให้ไล่บนไม่กี่แถวตามลำดับ FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY กับดักส่วนใหญ่ปรากฏภายในสามแถว

เรียนรู้ทีละขั้นในแอปเรียนรู้ทีละขั้นในแอป

ตัวอย่างคำถาม

ตัวอย่างที่ 1ง่าย

UNION ทำอะไรกับผลลัพธ์ของคิวรี SELECT สองคิวรี?

  1. Aเชื่อมเคียงกันด้วยคีย์
  2. Bเก็บเฉพาะแถวที่ปรากฏในทั้งสอง
  3. Cรวมเป็นผลลัพธ์เดียวและลบแถวซ้ำ
  4. Dเก็บเฉพาะแถวที่อยู่ในคิวรีแรกแต่ไม่อยู่ในคิวรีที่สอง
แสดงคำใบ้
  1. ทั้งสองคิวรีต้องมีจำนวนคอลัมน์เท่ากันและเข้ากันได้
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

UNION ซ้อนแถวของทั้งสองคิวรีและลบแถวซ้ำ ส่วน UNION ALL เก็บแถวซ้ำไว้

คำตอบ

C · รวมเป็นผลลัพธ์เดียวและลบแถวซ้ำ
ตัวอย่างที่ 2ปานกลาง

SELECT SUM(amount) FROM orders คืนอะไรเมื่อ WHERE ไม่ตรงกับแถวใดเลย?

  1. Aข้อผิดพลาด
  2. B0
  3. CNULL
  4. Dสตริงว่าง
แสดงคำใบ้
  1. SUM ต่างจาก COUNT ตรงนี้
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

SUM, AVG, MIN และ MAX คืน NULL เมื่อเซตว่าง ส่วน COUNT คืน 0 COALESCE(SUM(amount), 0) ให้ 0 แทน

คำตอบ

C · NULL
ตัวอย่างที่ 3ยาก

SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp คืนอะไร?

  1. Aเฉพาะพนักงานที่ได้มากกว่าค่าเฉลี่ยของแผนก
  2. Bทุกแถวพนักงานพร้อมเงินเดือนเฉลี่ยของแผนกตน
  3. Cข้อผิดพลาด เพราะ name ไม่อยู่ใน GROUP BY
  4. Dหนึ่งแถวต่อแผนกพร้อมเงินเดือนเฉลี่ย
แสดงคำใบ้
  1. ฟังก์ชันหน้าต่างไม่ยุบแถว
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

ต่างจาก GROUP BY ฟังก์ชันหน้าต่างคงทุกแถวนำเข้าและเพิ่มค่าที่คำนวณบนพาร์ทิชันของมัน ในที่นี้คือแผนก

คำตอบ

B · ทุกแถวพนักงานพร้อมเงินเดือนเฉลี่ยของแผนกตน

คำถามและคำตอบ

ฐานข้อมูลและ SQL คืออะไร

ร้านค้าอาจมีตาราง customers ที่มีคอลัมน์ id, name และ city และตาราง orders ที่มีคอลัมน์ id, customer_id และ total

นี่คือวิธีเชื่อมตาราง: ลูกค้าหนึ่งคนมีคำสั่งซื้อได้หลายรายการ แต่แต่ละคำสั่งซื้อเป็นของลูกค้าหนึ่งคน นั่นคือความสัมพันธ์หนึ่งต่อกลุ่ม (one-to-many)

จะเรียน ฐานข้อมูลและ SQL ทีละขั้นได้อย่างไร
  1. ฐานข้อมูลเชิงสัมพันธ์คืออะไร
  2. การอ่านข้อมูลด้วย SELECT
  3. การรวมตาราง นอร์มัลไลเซชัน และทรานแซกชัน
  4. วิธีทำทีละขั้น
  5. ตัวอย่างที่แก้ให้ดู
  6. ข้อผิดพลาดที่พบบ่อย
  7. ข้อสอบมีหน้าตาอย่างไร
แบบฝึกหัด ฐานข้อมูลและ SQL ครอบคลุมเรื่องอะไรบ้าง
  • ง่าย: ศัพท์สำคัญและข้อเท็จจริง
  • ปานกลาง: การประยุกต์ใช้แนวคิด
  • ยาก: กรณีศึกษาและการวิเคราะห์

ทุกคำถามมีสี่ตัวเลือก และถูกเพียงข้อเดียว ติดขัดใช่ไหม เปิดคำใบ้เล็ก ๆ ก่อน และเปิดคำอธิบายฉบับเต็มเมื่อจำเป็นเท่านั้น

การฝึกทำงานอย่างไร

  • ทุกคำถามมีสี่ตัวเลือก และถูกเพียงข้อเดียว
  • ติดขัดใช่ไหม เปิดคำใบ้เล็ก ๆ ก่อน และเปิดคำอธิบายฉบับเต็มเมื่อจำเป็นเท่านั้น
  • ความก้าวหน้า ข้อที่ผิด และโจทย์ที่บันทึกไว้จะถูกเก็บไว้ เพื่อให้คุณทบทวนก่อนสอบได้

รายวิชาที่มีหัวข้อนี้

หัวข้ออื่นในวิทยาการคอมพิวเตอร์

ใบงานสำหรับพิมพ์

ฝึก ฐานข้อมูลและ SQL ฟรีฝึก ฐานข้อมูลและ SQL เลยโจทย์ฟรีวันละ 5 ข้อ ไม่ต้องใช้บัตร