Learning AtlasIT Support → Cybersecurity
คลังบทอ่าน12.2 / ฐานข้อมูลและเอสคิวแอลบทถัดไป
สารบัญบทอ่าน / Databases and SQL / 12.2
04 · เขียนโค้ดและนำระบบไปใช้ · บท 12.2

Querying

การสืบค้น

SQL บอกว่าต้องการข้อมูลอะไรและเงื่อนไขไหน เริ่มจากเลือกตารางแล้วค่อยกรอง

4 หัวข้อคำอธิบายในหน้านี้ภาพอธิบายและกลไกทีละส่วน
หัวข้อในบทนี้
ศัพท์ในบทนี้ · กดคำที่ขีดเส้นใต้ในเนื้อหาเพื่อดูความหมายได้ด้วย
SQL
ภาษาประมวลข้อมูลในฐานข้อมูล เช่นเลือก กรอง join และเปลี่ยนข้อมูล
จากหลักการไปถึงกลไก

SELECT คิดเป็นขั้นเลือกชุดข้อมูล

อ่าน query จากความหมายของแหล่งข้อมูลและเงื่อนไข แม้ จะเขียน SELECT ก่อน FROM แบบจำลองเชิงตรรกะเริ่มจากแหล่งแถว แล้วคัดตามเงื่อนไข ก่อนเลือกคอลัมน์และจัดผล แผนประมวลผลจริงของฐานข้อมูลอาจปรับลำดับเพื่อให้เร็วขึ้นโดยรักษาความหมาย

ลำดับงาน · อ่านตามลูกศรSELECT คิดเป็นขั้นเลือกชุดข้อมูล
  1. FROM

    ระบุชุดข้อมูล เช่น login_events มี user_id status และ event_time

  2. WHERE

    คัดแถว เช่น status = 'failed' เปรียบเทียบค่าตามชนิดและกฎของฐานข้อมูล

  3. AND / OR / NOT

    AND ต้องผ่านทั้งสอง OR อย่างน้อยหนึ่ง ใส่วงเล็บให้เจตนาชัดเมื่อผสมหลายเงื่อนไข

  4. SELECT

    เลือกคอลัมน์ที่ต้องใช้ ไม่ดึงทุกข้อมูลโดยไม่มีเหตุผล

  5. ORDER BY

    กำหนดลำดับผล ถ้าไม่มี clause นี้ไม่ถือว่าลำดับแถวรับรองได้

ดูแถวที่ WHERE เลือกจริง
iduserstatusผ่าน WHERE
1Annsuccessไม่
2Benfailedใช่
3Annfailedใช่
4Carasuccessไม่

เลือก 2 จาก 4 แถว

ข้อมูลสังเคราะห์เพื่ออธิบายเงื่อนไข SQL แสดงแถวที่ไม่ถูกเลือกจางลงแทนการซ่อน เพื่อให้เห็นเหตุที่ AND กับ OR ให้ผลต่างกัน

WHERE amount > 10 ต่างจากการค้นข้อความที่มีเลข 10 เวลาและ timezone ต้องตรงความหมายของข้อมูล LIKE ใช้ pattern ตาม dialect ไม่ใช่ regex ทุกแบบ การเทียบ NULL ต้องใช้ IS NULL หรือ IS NOT NULL ตามที่รองรับ เพราะ NULL = NULL ไม่ให้ผลเป็นจริงแบบค่าปกติ

01 / 04

เลือกข้อมูลและตารางSELECT and FROM · 12.2.1

SELECT เลือกคอลัมน์ FROM ระบุตาราง เช่น SELECT name FROM users

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

อ่านภาพตามลำดับการทำงาน
01SELECT

คอลัมน์ที่ต้องการ

02FROM

แหล่งข้อมูล

03Result set

ชุดแถวที่ query ส่งคืน

SELECT hostname, last_seen FROM devices; อ่านสองคอลัมน์ ไม่มีการเรียงรับรองจนใช้ ORDER BY ถ้าต้องการชื่อซ้ำเพียงครั้งเดียวใช้ DISTINCT ตามความหมายงาน ไม่ใช้เพื่อกลบปัญหา join ที่ผิด

อ่านสองคอลัมน์
SELECT hostname, last_seen
FROM devices
ORDER BY hostname;

FROM ระบุ devices SELECT ระบุคอลัมน์ที่จะคืน ORDER BY เรียงผลตาม hostname สมมติฐานคือตารางและคอลัมน์มีชื่อนี้จริง ไม่ใช่ query ที่ใช้ได้กับฐานข้อมูลทุกชุด

SELECT username, login_time FROM logins WHERE success = false; เลือกสองคอลัมน์จากแถวที่ login ไม่สำเร็จ ชื่อตาราง field และชนิดค่าต้องตรง schema ที่ใช้อยู่ ตัวอย่างเป็นข้อมูลสมมติเพื่ออ่านส่วนของ query

Query ที่รันไม่ error ยังอาจตอบคำถามผิดถ้าเงื่อนไขหรือช่วงเวลาไม่ตรง ตรวจจำนวนแถว ค่า NULL และตัวอย่างผลก่อนนำไปสรุปเหตุ

ที่มาของหัวข้อนี้ · 1 รายการ

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

02 / 04

เงื่อนไขและการเปรียบเทียบWHERE and Comparison · 12.2.2

WHERE เลือกแถวที่เข้าเงื่อนไข เช่น status = 'active'

WHERE กรองแต่ละแถวด้วยเงื่อนไข เช่น =, <, > หรือ IN ใช้ชนิดข้อมูลให้ตรง ค่า string มักครอบ single quote การเทียบ NULL ต้องใช้ IS NULL หรือ IS NOT NULL แทน = NULL

อ่านภาพตามลำดับการทำงาน
01Rows

รายการก่อนกรอง

02Predicate

เงื่อนไขที่ตรวจต่อแถว

03Matching rows

รายการที่ผ่านเงื่อนไข

WHERE status = 'active' AND last_seen < '2026-09-01' เลือกเครื่อง active ที่เก่ากว่าวันกำหนด ก่อนใช้กับการแก้ข้อมูลควร SELECT เงื่อนไขเดียวกันดู scope ให้ชัด

ดูเงื่อนไขทีละส่วน
SELECT hostname FROM devices
WHERE status = 'active'
  AND owner_id IS NULL;

เลือกเฉพาะเครื่อง active ที่ไม่มีค่าผู้รับผิดชอบ NULL ใช้ IS NULL หากใช้ = NULL ผลจะไม่เป็น true แบบที่คาด ตัวอย่างเป็นการอ่านข้อมูล

ที่มาของหัวข้อนี้ · 1 รายการ

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

03 / 04

กรองข้อความ ตัวเลข และวันที่Text, Number and Date Filters · 12.2.3

ข้อความ ตัวเลข และวันที่ต้องใช้การเปรียบเทียบที่เหมาะกับชนิดข้อมูล

Text filtering ใช้ LIKE ตาม pattern เช่น % แทนหลายอักขระและ _ แทนอักขระหนึ่งตัวใน มาตรฐาน การเทียบตัวใหญ่เล็กขึ้นกับ DB และ collation วันที่และเวลาต้องรู้ timezone และชนิดคอลัมน์

เทียบหน้าที่เพื่อไม่สับสน
•Text pattern

ค้นตามรูปแบบข้อความ

•Numeric range

เทียบจำนวนตามชนิด

•Time boundary

ขอบช่วงและเขตเวลา

ช่วงหนึ่งวันควรใช้ตั้งแต่ต้นวันแบบ inclusive ถึงต้นวันถัดไปแบบ exclusive หากคอลัมน์มีเวลา WHERE at >= start AND at < next_start ช่วยไม่ตกหล่นข้อมูลเศษวินาทีปลายวัน

ที่มาของหัวข้อนี้ · 2 รายการ

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

04 / 04

รวมเงื่อนไขAND, OR and NOT · 12.2.4

AND ต้องจริงทุกส่วน OR จริงอย่างน้อยส่วนหนึ่ง NOT กลับค่าความจริง ต้องระวังวงเล็บ

AND ต้องจริงทั้งสองเงื่อนไข OR ให้จริงอย่างน้อยหนึ่ง NOT กลับผลเงื่อนไข แต่ มีค่า unknown จาก NULL จึงไม่ใช่ตรรกะสองค่าทุกกรณี ใช้วงเล็บแสดงกลุ่มเงื่อนไขให้ตรงความต้องการ

เทียบหน้าที่เพื่อไม่สับสน
•AND

ต้องผ่านร่วมกัน

•OR

ผ่านอย่างน้อยหนึ่ง

•NOT / NULL

กลับเงื่อนไขโดยระวังค่า unknown

status = 'active' AND (team = 'IT' OR team = 'Security') ต่างจากไม่มีวงเล็บที่อาจเลือก Security ทั้งหมด ตรวจผลของตัวอย่างที่ควรเข้าและควรไม่เข้าโดยอ่านเงื่อนไขทีละกลุ่ม

NULL and Three-valued Logic (ค่าว่างเชิงข้อมูลกับตรรกะสามค่า)

ใช้ NULL เพื่อแทนการไม่มีค่าตามแบบข้อมูล การเทียบ age > 18 เมื่อ age เป็น NULL ไม่ให้ TRUE หรือ FALSE แบบจำนวนทั่วไป แต่ให้ UNKNOWN WHERE เก็บแถวที่ predicate เป็น TRUE เท่านั้น จึงต้องระบุ IS NULL หากต้องการรายการที่ไม่มีข้อมูล แทน age = NULL

AND OR และ NOT ต้องอ่านร่วม UNKNOWN และวงเล็บเช่น A AND (B OR C) ต่างจาก (A AND B) OR C การรู้ว่าต้องการคนที่ไม่ผ่านเงื่อนไขกับคนที่ยังไม่มีข้อมูลเป็นสองกลุ่มช่วยไม่ทำรายงานคนหรือเหตุหายโดยไม่ตั้งใจ

NULL and Three-valued Logic (ค่าว่างเชิงข้อมูลกับตรรกะสามค่า)
Expression เมื่อ x เป็น NULLผล
x = 5UNKNOWN
x IS NULLTRUE
NOT (x = 5)UNKNOWN
WHERE x = 5แถวไม่ถูกเก็บ
WHERE x IS NULLแถวถูกเก็บ
วงเล็บเปลี่ยนความหมาย
WHERE status = 'active'
AND (team = 'IT' OR team = 'Security')

ผลต้องเป็น active และอยู่ในหนึ่งในสองทีม หากเอาวงเล็บออก precedence ปกติของ AND/OR ทำให้เงื่อนไขต่างออกไป จึงเขียนกลุ่มให้สื่อความตั้งใจ

ที่มาของหัวข้อนี้ · 1 รายการ

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

เชื่อมความเข้าใจ

นำศัพท์มาเชื่อมกับงาน

ตัวอย่างให้เห็นภาพ

ค้นการล็อกอินที่ล้มเหลวในช่วงเวลาหนึ่ง โดยระบุทั้งสถานะและช่วงวันที่

สิ่งที่บทนี้เชื่อมไว้

SQL บอกว่าต้องการข้อมูลอะไรและเงื่อนไขไหน เริ่มจากเลือกตารางแล้วค่อยกรอง

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

บันทึกในเบราว์เซอร์นี้
บทเรียนที่เกี่ยวข้องและที่มาของบทอ่าน

transcript ที่เคยใช้ตรวจแนวคิดพื้นฐานและตัวอย่างบางส่วน: T0268 · Tools of the Trade Linux and SQL คำอธิบายเป็นการเขียนใหม่ ไม่ใช่การแปลครบทุกประโยค ภาพและตัวอย่างเป็นการเรียบเรียงเพื่อเชื่อมความเข้าใจ

คำอธิบายหน้านี้เขียนใหม่ตามหัวข้อใน Atlas รายการด้านล่างเป็นชื่อ Video/Reading ที่เคยจับคู่ไว้ แสดงไว้ให้ตรวจที่มาของชื่อหัวข้อ และไม่รับรองว่าคอร์สสอนทุกส่วนของคำอธิบายนี้