SQLite แบบสอบถาม: เลือก, โดยที่, จำกัด, ออฟเซ็ต, นับ, จัดกลุ่มตาม
ในการเขียนคำสั่ง SQL ในไฟล์ SQLite คุณต้องรู้ว่าส่วนคำสั่ง SELECT, FROM, WHERE, GROUP BY, ORDER BY และ LIMIT ทำงานอย่างไร และวิธีการใช้งาน
ในระหว่างบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้อนุประโยคเหล่านี้และวิธีการเขียน SQLite ข้อ
การอ่านข้อมูลด้วยการเลือก
ส่วนคำสั่ง SELECT เป็นคำสั่งหลักที่คุณใช้ในการสืบค้น SQLite ฐานข้อมูล ในส่วนคำสั่ง SELECT คุณระบุว่าจะเลือกอะไร แต่ก่อนจะเลือกคำสั่งย่อย เรามาดูกันว่าเราจะเลือกข้อมูลโดยใช้คำสั่งย่อย FROM ได้จากจุดใด
คำสั่ง FROM ใช้เพื่อระบุว่าคุณต้องการเลือกข้อมูลจากที่ใด ในคำสั่ง from คุณสามารถระบุตารางหรือซับคิวรีหนึ่งรายการหรือมากกว่าเพื่อเลือกข้อมูลจากนั้นได้ ดังที่เราจะเห็นในบทช่วยสอนในภายหลัง
โปรดทราบว่าสำหรับตัวอย่างทั้งหมดต่อไปนี้ คุณต้องเรียกใช้ sqlite3.exe และเปิดการเชื่อมต่อกับฐานข้อมูลตัวอย่างแบบไหล:
ขั้นตอน 1) ในขั้นตอนนี้
- เปิด My Computer และไปที่ไดเร็กทอรีต่อไปนี้ “C:\sqlite"และ
- แล้วเปิด”sqlite3.exe"
ขั้นตอน 2) เปิดฐานข้อมูล “บทช่วยสอนSampleDB.db” โดยคำสั่งต่อไปนี้:
ตอนนี้คุณพร้อมที่จะเรียกใช้แบบสอบถามประเภทใดก็ได้บนฐานข้อมูลแล้ว
ในคำสั่ง SELECT คุณสามารถเลือกไม่เพียงแค่ชื่อคอลัมน์ แต่ยังมีตัวเลือกอื่นๆ มากมายในการระบุสิ่งที่ต้องการเลือก ดังต่อไปนี้:
SELECT *
คำสั่งนี้จะเลือกคอลัมน์ทั้งหมดจากตารางที่อ้างอิงทั้งหมด (หรือแบบสอบถามย่อย) ในส่วนคำสั่ง FROM ตัวอย่างเช่น:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
ซึ่งจะเลือกคอลัมน์ทั้งหมดจากทั้งตารางนักเรียนและตารางแผนก:
เลือกชื่อตาราง*
ซึ่งจะเลือกคอลัมน์ทั้งหมดจากตาราง “ชื่อตาราง” เท่านั้น ตัวอย่างเช่น:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
ซึ่งจะเลือกคอลัมน์ทั้งหมดจากตารางนักเรียนเท่านั้น:
มูลค่าตามตัวอักษร
ค่าตัวอักษรคือค่าคงที่ที่สามารถระบุได้ในคำสั่ง select โดยปกติแล้วคุณสามารถใช้ค่าตัวอักษรได้ในลักษณะเดียวกับที่คุณใช้ชื่อคอลัมน์ในคำสั่ง SELECT ค่าตัวอักษรเหล่านี้จะแสดงสำหรับแต่ละแถวจากแถวที่ส่งคืนโดยแบบสอบถาม SQL
นี่คือตัวอย่างบางส่วนของค่าตัวอักษรต่างๆ ที่คุณสามารถเลือกได้:
- ตัวเลขตามตัวอักษร – ตัวเลขในรูปแบบใดก็ได้ เช่น 1, 2.55, … เป็นต้น
- ตัวอักษรสตริง – สตริงใดๆ 'USA', 'นี่คือข้อความตัวอย่าง', … ฯลฯ
- โมฆะ – ค่าโมฆะ
- Current_TIME - มันจะบอกเวลาปัจจุบันให้คุณ
- CURRENT_DATE – จะให้วันที่ปัจจุบันแก่คุณ
ซึ่งจะมีประโยชน์ในบางสถานการณ์ที่คุณต้องเลือกค่าคงที่สำหรับแถวที่ส่งคืนทั้งหมด ตัวอย่างเช่น หากคุณต้องการเลือกนักเรียนทั้งหมดจากตารางนักเรียน โดยมีคอลัมน์ใหม่ที่เรียกว่าประเทศซึ่งมีค่า "USA" คุณสามารถทำได้ดังนี้:
SELECT *, 'USA' AS Country FROM Students;
ซึ่งจะแสดงคอลัมน์ของนักเรียนทั้งหมด พร้อมด้วยคอลัมน์ใหม่ "ประเทศ" เช่นนี้
โปรดทราบว่าคอลัมน์ใหม่นี้ประเทศไม่ใช่คอลัมน์ใหม่ที่เพิ่มลงในตาราง เป็นคอลัมน์เสมือนที่สร้างขึ้นในแบบสอบถามเพื่อแสดงผลลัพธ์และจะไม่ถูกสร้างขึ้นในตาราง
ชื่อและนามแฝง
นามแฝงคือชื่อใหม่สำหรับคอลัมน์ที่ช่วยให้คุณสามารถเลือกคอลัมน์ที่มีชื่อใหม่ได้ ระบุนามแฝงของคอลัมน์โดยใช้คำหลัก "AS"
ตัวอย่างเช่น หากคุณต้องการเลือกคอลัมน์ StudentName ที่จะส่งคืนด้วย “Student Name” แทนที่จะเป็น “StudentName” คุณสามารถตั้งชื่อแทนได้ดังนี้:
SELECT StudentName AS 'Student Name' FROM Students;
สิ่งนี้จะให้ชื่อนักเรียนที่มีชื่อ “ชื่อนักเรียน” แทน “ชื่อนักเรียน” เช่นนี้:
โปรดทราบว่าชื่อคอลัมน์ยังคงอยู่ “ชื่อนักเรียน- คอลัมน์ StudentName ยังคงเหมือนเดิม แต่จะไม่เปลี่ยนตามนามแฝง
นามแฝงจะไม่เปลี่ยนชื่อคอลัมน์ มันจะเปลี่ยนชื่อที่แสดงในส่วนคำสั่ง SELECT
นอกจากนี้ โปรดทราบว่าคำหลัก “AS” เป็นทางเลือก คุณสามารถใส่ชื่อแทนได้โดยไม่ต้องใส่ก็ได้ ในลักษณะนี้:
SELECT StudentName 'Student Name' FROM Students;
และมันจะให้ผลลัพธ์เดียวกันกับแบบสอบถามก่อนหน้า:
คุณยังสามารถตั้งชื่อแทนตารางได้ ไม่ใช่แค่คอลัมน์เท่านั้น ด้วยคีย์เวิร์ดเดียวกัน “AS” ตัวอย่างเช่น คุณสามารถทำได้:
SELECT s.* FROM Students AS s;
นี่จะทำให้คุณมีคอลัมน์ทั้งหมดในตาราง นักเรียน:
วิธีนี้อาจมีประโยชน์มากหากคุณกำลังรวมตารางมากกว่าหนึ่งตารางเข้าด้วยกัน แทนที่จะทำซ้ำชื่อตารางทั้งหมดในแบบสอบถาม คุณสามารถตั้งชื่อย่อให้กับแต่ละตารางได้ ตัวอย่างเช่น ในแบบสอบถามต่อไปนี้:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
แบบสอบถามนี้จะเลือกชื่อนักเรียนแต่ละคนจากตาราง "นักเรียน" พร้อมด้วยชื่อแผนกจากตาราง "แผนก":
อย่างไรก็ตาม แบบสอบถามเดียวกันสามารถเขียนได้ดังนี้:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
- เราให้นามแฝงว่า “s” แก่ตารางนักเรียน และนามแฝงว่า “d” ให้กับตารางแผนกต่างๆ
- จากนั้นแทนที่จะใช้ชื่อเต็มตาราง เราใช้นามแฝงเพื่ออ้างถึงพวกเขา
- INNER JOIN รวมตั้งแต่สองตารางขึ้นไปเข้าด้วยกันโดยใช้เงื่อนไข ในตัวอย่างของเรา เราได้รวมตาราง Student กับตาราง Departments พร้อมด้วยคอลัมน์ DepartmentId นอกจากนี้ยังมีคำอธิบายเชิงลึกเกี่ยวกับ INNER JOIN ใน “SQLite เข้าร่วม” บทช่วยสอน
สิ่งนี้จะให้ผลลัพธ์ที่แน่นอนแก่คุณเหมือนกับแบบสอบถามก่อนหน้า:
WHERE
การเขียนคำสั่ง SQL โดยใช้คำสั่งย่อย SELECT เพียงอย่างเดียวกับคำสั่งย่อย FROM ดังที่เราเห็นในส่วนก่อนหน้า จะทำให้คุณได้แถวทั้งหมดจากตาราง อย่างไรก็ตาม หากคุณต้องการกรองข้อมูลที่ส่งคืน คุณต้องเพิ่มส่วนคำสั่ง "WHERE"
ส่วนคำสั่ง WHERE ใช้เพื่อกรองชุดผลลัพธ์ที่ส่งคืนโดย แบบสอบถาม SQL- นี่เป็นวิธีการทำงานของส่วนคำสั่ง WHERE:
- ในส่วนคำสั่ง WHERE คุณสามารถระบุ "นิพจน์" ได้
- นิพจน์นั้นจะได้รับการประเมินสำหรับแต่ละแถวที่ส่งคืนจากตารางที่ระบุในส่วนคำสั่ง FROM
- นิพจน์จะได้รับการประเมินเป็นนิพจน์บูลีน โดยให้ผลลัพธ์เป็น จริง เท็จ หรือ null
- จากนั้นเฉพาะแถวที่ได้รับการประเมินนิพจน์ด้วยค่าจริงเท่านั้นที่จะถูกส่งกลับ และแถวที่มีผลลัพธ์เป็นเท็จหรือเป็นโมฆะจะถูกละเว้นและไม่รวมไว้ในชุดผลลัพธ์
- ในการกรองผลลัพธ์ที่กำหนดโดยใช้คำสั่ง WHERE คุณต้องใช้นิพจน์และตัวดำเนินการ
รายชื่อผู้ประกอบการใน SQLite และวิธีการใช้งาน
ในหัวข้อต่อไปนี้เราจะอธิบายว่าคุณสามารถกรองโดยใช้นิพจน์และตัวดำเนินการได้อย่างไร
นิพจน์คือค่าตัวอักษรหนึ่งค่าขึ้นไปหรือคอลัมน์ที่รวมเข้าด้วยกันด้วยตัวดำเนินการ
โปรดทราบว่า คุณสามารถใช้นิพจน์ได้ทั้งในส่วนคำสั่ง SELECT และในส่วนคำสั่ง WHERE
ในตัวอย่างต่อไปนี้ เราจะลองใช้นิพจน์และตัวดำเนินการทั้งในคำสั่ง select และคำสั่ง WHERE เพื่อแสดงให้คุณเห็นว่านิพจน์และตัวดำเนินการเหล่านี้ทำงานอย่างไร
มีนิพจน์และตัวดำเนินการประเภทต่างๆ ที่คุณสามารถระบุได้ดังต่อไปนี้:
SQLite ตัวดำเนินการเรียงต่อกัน “||”
ตัวดำเนินการนี้ใช้ในการต่อค่าตัวอักษรหรือคอลัมน์หนึ่งรายการหรือมากกว่าเข้าด้วยกัน โดยจะสร้างสตริงผลลัพธ์หนึ่งชุดจากค่าตัวอักษรหรือคอลัมน์ที่ต่อกันทั้งหมด ตัวอย่างเช่น:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
ซึ่งจะต่อกันเป็นนามแฝงใหม่”StudentIdWithName"
- ค่าสตริงตามตัวอักษร “รหัสชื่อ: "
- ด้วยคุณค่าของ “รหัสนักศึกษา” คอลัมน์และ
- ด้วยคุณค่าจาก “ชื่อนักเรียน” คอลัมน์
SQLite ผู้ดำเนินการ CAST:
ตัวดำเนินการ CAST ใช้เพื่อแปลงค่าจากชนิดข้อมูลหนึ่งไปเป็นอีกชนิดหนึ่ง ประเภทข้อมูล.
ตัวอย่างเช่น หากคุณมีค่าตัวเลขที่เก็บเป็นค่าสตริงเช่นนี้ ” '12.5' ” และคุณต้องการแปลงให้เป็นค่าตัวเลข คุณสามารถใช้ตัวดำเนินการ CAST เพื่อทำสิ่งนี้ได้ดังนี้ “นักแสดง ('12.5' เหมือนจริง)- หรือถ้าคุณมีค่าทศนิยม เช่น 12.5 และต้องการเฉพาะส่วนที่เป็นจำนวนเต็ม คุณสามารถแปลงให้เป็นจำนวนเต็มได้ เช่น "CAST(12.5 AS INTEGER)"
ตัวอย่าง
ในคำสั่งต่อไปนี้เราจะพยายามแปลงค่าต่างๆ ให้เป็นประเภทข้อมูลอื่น:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
สิ่งนี้จะทำให้คุณ:
ผลลัพธ์เป็นดังนี้:
- CAST('12.5' AS REAL) – ค่า '12.5' คือค่าสตริง ซึ่งจะถูกแปลงเป็นค่า REAL
- CAST(12.5 AS INTEGER) – ค่า 12.5 เป็นค่าทศนิยม โดยจะถูกแปลงเป็นค่าจำนวนเต็ม ส่วนทศนิยมจะถูกตัดทอน และกลายเป็น 12
SQLite คณิตศาสตร์ Operaทอร์:
ใช้ค่าตัวเลขหรือคอลัมน์ตัวเลขสองค่าขึ้นไป แล้วส่งคืนค่าตัวเลขหนึ่งค่า ตัวดำเนินการทางคณิตศาสตร์ที่รองรับใน SQLite คือ:
|
ตัวอย่าง:
ในตัวอย่างต่อไปนี้ เราจะลองใช้ตัวดำเนินการทางคณิตศาสตร์ทั้งห้าตัวที่มีค่าตัวเลขตามตัวอักษรในค่าเดียวกัน
เลือกข้อ:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
สิ่งนี้จะทำให้คุณ:
สังเกตว่าเราใช้คำสั่ง SELECT โดยไม่มีส่วนคำสั่ง FROM อย่างไร และสิ่งนี้ได้รับอนุญาตใน SQLite ตราบใดที่เราเลือกค่าตามตัวอักษร
SQLite ตัวดำเนินการเปรียบเทียบ
เปรียบเทียบตัวดำเนินการสองตัวกันและส่งคืนค่าจริงหรือเท็จดังต่อไปนี้:
|
โปรดทราบว่า SQLite แสดงค่าจริงด้วย 1 และค่าเท็จด้วย 0
ตัวอย่าง:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
สิ่งนี้จะให้สิ่งนี้:
SQLite ตัวดำเนินการจับคู่รูปแบบ
"LIKE” – ใช้สำหรับการจับคู่รูปแบบ โดยใช้ "Like“ คุณสามารถค้นหาค่าที่ตรงกับรูปแบบที่ระบุโดยใช้ไวด์การ์ดได้
ตัวดำเนินการทางด้านซ้ายสามารถเป็นค่าสตริงหรือคอลัมน์สตริงก็ได้ โดยสามารถระบุรูปแบบได้ดังนี้:
- ประกอบด้วยลวดลาย. ตัวอย่างเช่น, ชื่อนักศึกษา LIKE '%a%' – สิ่งนี้จะค้นหาชื่อนักเรียนที่มีตัวอักษร “a” ในตำแหน่งใดก็ได้ในคอลัมน์ StudentName
- เริ่มต้นด้วยรูปแบบ ตัวอย่างเช่น, "ชื่อนักศึกษา LIKE 'a%'” – ค้นหาชื่อนักเรียนที่ขึ้นต้นด้วยตัวอักษร “a”
- ปิดท้ายด้วยรูปแบบ ตัวอย่างเช่น, "ชื่อนักศึกษา LIKE '%a'” – ค้นหาชื่อนักเรียนที่ลงท้ายด้วยตัวอักษร “a”
- จับคู่อักขระเดี่ยวใดๆ ในสตริงโดยใช้ตัวอักษรขีดล่าง “_” ตัวอย่างเช่น, "ชื่อนักศึกษา เช่น 'J___'” – ค้นหาชื่อนักเรียนที่มีความยาว 4 ตัวอักษร ต้องขึ้นต้นด้วยตัวอักษร “J” และมีอักขระได้อีกสามตัวหลังตัวอักษร “J”
ตัวอย่างการจับคู่รูปแบบ:
- รับชื่อนักเรียนที่ขึ้นต้นด้วยตัวอักษร 'j':
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
ผลลัพธ์:
- รับชื่อนักเรียนที่ลงท้ายด้วยตัวอักษร 'y':
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
ผลลัพธ์:
- รับชื่อนักเรียนที่มีตัวอักษร 'n':
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
ผลลัพธ์:
“โลก” – เทียบเท่ากับตัวดำเนินการ LIKE แต่ GLOB จะคำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ต่างจากตัวดำเนินการ LIKE ตัวอย่างเช่น คำสั่งสองคำสั่งต่อไปนี้จะส่งคืนผลลัพธ์ที่แตกต่างกัน:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
สิ่งนี้จะทำให้คุณ:
- คำสั่งแรกส่งคืน 0 (false) เนื่องจากตัวดำเนินการ GLOB คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ดังนั้น 'j' จึงไม่เท่ากับ 'J' อย่างไรก็ตาม คำสั่งที่สองจะส่งคืน 1 (true) เนื่องจากตัวดำเนินการ LIKE ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ดังนั้น 'j' จึงเท่ากับ 'J'
ตัวดำเนินการอื่นๆ:
SQLite AND
ตัวดำเนินการเชิงตรรกะที่รวมนิพจน์หนึ่งรายการหรือมากกว่าเข้าด้วยกัน โดยจะคืนค่าเป็นจริงก็ต่อเมื่อนิพจน์ทั้งหมดให้ค่า "จริง" อย่างไรก็ตาม ตัวดำเนินการจะคืนค่าเท็จก็ต่อเมื่อนิพจน์ทั้งหมดให้ค่า "เท็จ"
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะค้นหานักเรียนที่มี StudentId > 5 และ StudentName ขึ้นต้นด้วยตัวอักษร N นักเรียนที่ส่งคืนจะต้องตรงตามเงื่อนไขสองข้อต่อไปนี้:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
ในภาพหน้าจอด้านบน จะให้เฉพาะ "แนนซี่" แก่คุณเท่านั้น แนนซี่เป็นนักเรียนคนเดียวที่มีคุณสมบัติตรงตามเงื่อนไขทั้งสองข้อ
SQLite OR
ตัวดำเนินการเชิงตรรกะที่รวมนิพจน์หนึ่งรายการหรือมากกว่าเข้าด้วยกัน ดังนั้นหากตัวดำเนินการที่รวมกันรายการใดรายการหนึ่งให้ผลลัพธ์เป็นจริง ตัวดำเนินการดังกล่าวจะส่งคืนผลลัพธ์เป็นจริง อย่างไรก็ตาม หากนิพจน์ทั้งหมดให้ผลลัพธ์เป็นเท็จ ตัวดำเนินการดังกล่าวจะส่งคืนผลลัพธ์เป็นเท็จ
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะค้นหานักเรียนที่มี StudentId > 5 หรือ StudentName ขึ้นต้นด้วยตัวอักษร N นักเรียนที่ส่งคืนจะต้องตรงตามเงื่อนไขอย่างน้อยหนึ่งข้อ:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
สิ่งนี้จะทำให้คุณ:
จากผลลัพธ์ ในภาพหน้าจอด้านบน สิ่งนี้จะให้ชื่อของนักเรียนที่มีตัวอักษร "n" อยู่ในชื่อ บวกกับรหัสนักเรียนที่มีค่า>5
ตามที่คุณเห็น ผลลัพธ์จะแตกต่างจากการค้นหาด้วยตัวดำเนินการ AND
SQLite ระหว่าง
BETWEEN ใช้เพื่อเลือกค่าที่อยู่ในช่วงของสองค่า ตัวอย่างเช่น, "X ระหว่าง Y และ Z” จะส่งกลับค่าจริง (1) หากค่า X อยู่ระหว่างค่า Y และ Z มิฉะนั้นจะส่งกลับค่าเท็จ (0)X ระหว่าง Y และ Z” เทียบเท่ากับ “X >= Y และ X <= Z“ X ต้องมากกว่าหรือเท่ากับ Y และ X น้อยกว่าหรือเท่ากับ Z
ตัวอย่าง:
ในตัวอย่างแบบสอบถามต่อไปนี้ เราจะเขียนแบบสอบถามเพื่อรับค่า Id ของนักเรียนระหว่าง 5 ถึง 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
สิ่งนี้จะให้เฉพาะนักเรียนที่มีรหัส 5, 6, 7 และ 8:
SQLite IN
ใช้ตัวดำเนินการหนึ่งตัวและรายการตัวดำเนินการหนึ่งรายการ ซึ่งจะส่งคืนค่าจริงหากค่าตัวดำเนินการแรกมีค่าเท่ากับค่าตัวดำเนินการตัวใดตัวหนึ่งจากรายการ ตัวดำเนินการ IN จะส่งคืนค่าจริง (1) หากรายการตัวดำเนินการมีค่าตัวดำเนินการแรกภายในค่าของมัน มิฉะนั้น จะส่งคืนค่าเท็จ (0)
แบบนี้: "คอลัม IN(x, y, z)- นี่เท่ากับ” (col=x) หรือ (col=y) หรือ (col=z) "
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะเลือกเฉพาะนักเรียนที่มีรหัส 2, 4, 6, 8 เท่านั้น:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
อย่างนี้:
แบบสอบถามก่อนหน้านี้จะให้ผลลัพธ์ที่เหมือนกับแบบสอบถามต่อไปนี้เนื่องจากเทียบเท่ากัน:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
แบบสอบถามทั้งสองแบบให้ผลลัพธ์ที่แน่นอน อย่างไรก็ตาม ความแตกต่างระหว่างแบบสอบถามทั้งสองแบบคือ แบบสอบถามแรกเราใช้ตัวดำเนินการ "IN" ในแบบสอบถามที่สอง เราใช้ตัวดำเนินการ "OR" หลายตัว
ตัวดำเนินการ IN เทียบเท่ากับการใช้ตัวดำเนินการ OR หลายตัว “รหัสนักศึกษาอยู่ที่ไหน (2, 4, 6, 8)” เทียบเท่ากับ ” โดยที่ (StudentId = 2) หรือ (StudentId = 4) หรือ (StudentId = 6) หรือ (StudentId = 8);"
อย่างนี้:
SQLite ไม่อยู่ใน
ตัวดำเนินการ "NOT IN" ตรงข้ามกับตัวดำเนินการ IN แต่มีรูปแบบเดียวกัน คือ ใช้ตัวดำเนินการหนึ่งตัวและรายการตัวดำเนินการหนึ่งรายการ โดยจะคืนค่าเป็นจริงหากค่าตัวดำเนินการแรกไม่เท่ากับค่าตัวดำเนินการตัวใดตัวหนึ่งจากรายการ กล่าวคือ จะคืนค่าเป็นจริง (0) หากรายการตัวดำเนินการไม่มีตัวดำเนินการแรก เช่นนี้: “คอไม่อยู่ใน(x, y, z)- นี่เทียบเท่ากับ “(คอลัมน์<>x) และ (คอลัมน์<>y) และ (คอลัมน์<>z)"
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะเลือกนักเรียนที่มีรหัสไม่เท่ากับรหัส 2, 4, 6, 8 เหล่านี้:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
เช่นนี้
จากการสอบถามครั้งก่อน เราให้ผลลัพธ์ที่เหมือนกับการสอบถามต่อไปนี้เนื่องจากผลลัพธ์เทียบเท่ากัน:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
อย่างนี้:
ในภาพหน้าจอด้านบน
เราใช้ตัวดำเนินการไม่เท่ากันหลายตัว “<>” เพื่อรับรายชื่อนักเรียนที่ไม่เท่ากับรหัส 2, 4, 6 หรือ 8 ต่อไปนี้ แบบสอบถามนี้จะส่งคืนนักเรียนคนอื่นๆ ทั้งหมดนอกเหนือจากรายชื่อรหัสเหล่านี้
SQLite มีอยู่
ตัวดำเนินการ EXISTS จะไม่รับตัวดำเนินการใดๆ แต่จะรับเฉพาะคำสั่ง SELECT ตามหลังเท่านั้น ตัวดำเนินการ EXISTS จะส่งคืนค่า true (1) หากมีแถวใดๆ ที่ส่งคืนจากคำสั่ง SELECT และจะส่งคืนค่า false (0) หากไม่มีแถวใดๆ ที่ส่งคืนจากคำสั่ง SELECT
ตัวอย่าง:
ในตัวอย่างต่อไปนี้ เราจะเลือกชื่อแผนก หากมีรหัสแผนกอยู่ในตารางนักศึกษา:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
สิ่งนี้จะทำให้คุณ:
เพียงสามหน่วยงาน”ไอที ฟิสิกส์ และศิลปะ” จะถูกส่งคืน และชื่อหน่วยงาน”คณิตศาสตร์” จะไม่ถูกส่งกลับเนื่องจากไม่มีนักศึกษาในแผนกนั้น ดังนั้น Id ของแผนกจึงไม่มีอยู่ในตารางนักศึกษา นั่นเป็นสาเหตุที่ตัวดำเนินการ EXISTS ไม่สนใจ “คณิตศาสตร์" แผนก.
SQLite ไม่
Revแสดงผลลัพธ์ของตัวดำเนินการที่อยู่ก่อนหน้าซึ่งอยู่ถัดไป ตัวอย่างเช่น:
- NOT BETWEEN – มันจะคืนค่าเป็นจริงหาก BETWEEN ส่งคืนค่า false และในทางกลับกัน
- ไม่ชอบ – มันจะคืนค่าเป็นจริงถ้า LIKE ส่งคืนค่าเท็จและในทางกลับกัน
- ไม่ใช่ GLOB – มันจะคืนค่าเป็นจริงหาก GLOB ส่งคืนค่าเท็จและในทางกลับกัน
- ไม่มีอยู่ – มันจะคืนค่าเป็นจริงถ้า EXISTS คืนค่าเท็จและในทางกลับกัน
ตัวอย่าง:
ในตัวอย่างต่อไปนี้ เราจะใช้ตัวดำเนินการ NOT ร่วมกับตัวดำเนินการ EXISTS เพื่อรับชื่อแผนกที่ไม่มีอยู่ในตาราง Students ซึ่งเป็นผลลัพธ์ย้อนกลับของตัวดำเนินการ EXISTS ดังนั้น การค้นหาจะดำเนินการผ่าน DepartmentId ที่ไม่มีอยู่ในตารางแผนก
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
เอาท์พุต:
เฉพาะหน่วยงาน”คณิตศาสตร์ ” จะถูกส่งคืน เพราะว่า "คณิตศาสตร์” แผนกเป็นแผนกเดียวที่ไม่มีอยู่ในตารางนักเรียน
การจำกัดและการสั่งซื้อ
SQLite สั่งซื้อ
SQLite ลำดับ คือการจัดเรียงผลลัพธ์ของคุณตามหนึ่งนิพจน์ขึ้นไป หากต้องการเรียงลำดับชุดผลลัพธ์ คุณต้องใช้คำสั่งย่อย ORDER BY ดังต่อไปนี้:
- ขั้นแรก คุณต้องระบุส่วนคำสั่ง ORDER BY
- ต้องระบุส่วนคำสั่ง ORDER BY ที่ส่วนท้ายของแบบสอบถาม เฉพาะส่วนคำสั่ง LIMIT เท่านั้นที่สามารถระบุได้หลังจากนั้น
- ระบุนิพจน์เพื่อเรียงลำดับข้อมูล นิพจน์นี้อาจเป็นชื่อคอลัมน์หรือนิพจน์ก็ได้
- หลังจากนิพจน์ คุณสามารถระบุทิศทางการเรียงลำดับที่เป็นทางเลือกได้ ไม่ว่าจะเป็น DESC เพื่อเรียงลำดับข้อมูลจากมากไปหาน้อย หรือ ASC เพื่อเรียงลำดับข้อมูลจากน้อยไปหามาก หากคุณไม่ได้ระบุข้อมูลใดเลย ข้อมูลจะถูกจัดเรียงจากน้อยไปหามาก
- คุณสามารถระบุนิพจน์เพิ่มเติมได้โดยใช้เครื่องหมาย “” ระหว่างกัน
ตัวอย่าง
ในตัวอย่างต่อไปนี้ เราจะเลือกนักศึกษาทั้งหมดโดยเรียงตามชื่อแต่ในลำดับจากมากไปน้อย จากนั้นจึงเรียงตามชื่อแผนกในลำดับจากน้อยไปมาก:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
สิ่งนี้จะทำให้คุณ:
- SQLite ขั้นแรกจะเรียงลำดับนักศึกษาทั้งหมดตามชื่อแผนกของตนจากน้อยไปหามาก
- จากนั้นสำหรับชื่อแผนกแต่ละชื่อ นักศึกษาทั้งหมดภายใต้ชื่อแผนกนั้นจะถูกแสดงตามลำดับชื่อจากมากไปน้อย
SQLite จำกัด :
คุณสามารถจำกัดจำนวนแถวที่ส่งคืนโดยการสืบค้น SQL ของคุณโดยใช้ส่วนคำสั่ง LIMIT ตัวอย่างเช่น LIMIT 10 จะให้เพียง 10 แถวและละเว้นแถวอื่นๆ ทั้งหมด
ในส่วนคำสั่ง LIMIT คุณสามารถเลือกจำนวนแถวที่ต้องการโดยเริ่มจากตำแหน่งที่ต้องการโดยใช้ส่วนคำสั่ง OFFSET ตัวอย่างเช่น, "จำกัด 4 ออฟเซ็ต 4” จะไม่สนใจ 4 แถวแรก และส่งคืน 4 แถวโดยเริ่มจากแถวที่ 5,6,7 ดังนั้นคุณจะได้แถว 8 และ XNUMX
โปรดทราบว่าส่วนคำสั่ง OFFSET เป็นทางเลือก คุณสามารถเขียนได้เช่น “จำกัด 4, 4” และมันจะให้ผลลัพธ์ที่แน่นอนแก่คุณ
ตัวอย่าง:
ในตัวอย่างต่อไปนี้ เราจะส่งคืนเฉพาะนักเรียน 3 คนโดยเริ่มจากรหัสนักเรียน 5 โดยใช้แบบสอบถาม:
SELECT * FROM Students LIMIT 4,3;
ซึ่งจะให้นักเรียนเพียงสามคนโดยเริ่มจากแถวที่ 5 ดังนั้นมันจะให้แถวที่มี StudentId 5, 6 และ 7:
การลบรายการซ้ำ
หากแบบสอบถาม SQL ของคุณส่งคืนค่าที่ซ้ำกัน คุณสามารถใช้คำสั่ง “DISTINCT” คีย์เวิร์ดเพื่อลบรายการที่ซ้ำกันเหล่านั้นและส่งกลับค่าที่แตกต่างกัน คุณสามารถระบุได้มากกว่าหนึ่งคอลัมน์หลังจากที่คีย์ DISTINCT ทำงาน
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะส่งคืน “ค่าชื่อแผนก” ซ้ำ: ที่นี่เรามีค่าซ้ำกันโดยมีชื่อว่า ไอที ฟิสิกส์ และศิลปศาสตร์
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
สิ่งนี้จะทำให้คุณได้รับค่าที่ซ้ำกันสำหรับชื่อแผนก:
สังเกตว่าชื่อแผนกมีค่าซ้ำกันอย่างไร ตอนนี้ เราจะใช้คีย์เวิร์ด DISTINCT กับข้อความค้นหาเดียวกันเพื่อลบรายการที่ซ้ำกันและรับเฉพาะค่าที่ไม่ซ้ำเท่านั้น แบบนี้:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
ซึ่งจะให้ค่าที่ไม่ซ้ำกันเพียงสามค่าสำหรับคอลัมน์ชื่อแผนก:
สรุป
SQLite การรวมเป็นฟังก์ชันในตัวที่กำหนดไว้ใน SQLite ที่จะจัดกลุ่มค่าหลายค่าของหลายแถวให้เป็นค่าเดียว
นี่คือผลรวมที่สนับสนุนโดย SQLite:
SQLite AVG()
ส่งกลับค่าเฉลี่ยของค่า x ทั้งหมด
ตัวอย่าง:
ในตัวอย่างต่อไปนี้ เราจะได้คะแนนเฉลี่ยที่นักเรียนจะได้รับจากการสอบทั้งหมด:
SELECT AVG(Mark) FROM Marks;
สิ่งนี้จะให้ค่าแก่คุณ “18.375”:
ผลลัพธ์เหล่านี้มาจากผลรวมของค่าเครื่องหมายทั้งหมดหารด้วยการนับ
นับ() – นับ(X) หรือ นับ(*)
ส่งกลับจำนวนรวมของจำนวนครั้งที่ค่า x ปรากฏ และนี่คือตัวเลือกบางส่วนที่คุณสามารถใช้กับ COUNT ได้:
- COUNT(x): นับเฉพาะค่า x โดยที่ x คือชื่อคอลัมน์ มันจะละเว้นค่า NULL
- COUNT(*): นับแถวทั้งหมดจากทุกคอลัมน์
- COUNT (DISTINCT x): คุณสามารถระบุคีย์เวิร์ด DISTINCT ก่อน x ซึ่งจะนับค่าเฉพาะของ x
ตัวอย่าง
ในตัวอย่างต่อไปนี้ เราจะได้รับจำนวนแผนกทั้งหมดที่มี COUNT(DepartmentId), COUNT(*) และ COUNT(DISTINCT DepartmentId) และความแตกต่างกัน:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
สิ่งนี้จะทำให้คุณ:
ดังต่อไปนี้:
- COUNT(DepartmentId) จะให้จำนวนรหัสแผนกทั้งหมดแก่คุณ และจะไม่สนใจค่าว่าง
- COUNT(DISTINCT DepartmentId) ให้ค่าที่ชัดเจนของ DepartmentId ซึ่งมีเพียง 3 เท่านั้น ซึ่งเป็นค่าที่แตกต่างกันสามค่าของชื่อแผนก โปรดสังเกตว่าชื่อแผนกในชื่อนักเรียนมี 8 ค่า แต่มีเพียงค่าที่แตกต่างกันสามค่าเท่านั้น ได้แก่ คณิตศาสตร์ ไอที และฟิสิกส์
- COUNT(*) นับจำนวนแถวในตารางนักเรียน ซึ่งเท่ากับ 10 แถวสำหรับนักเรียน 10 คน
GROUP_CONCAT() – GROUP_CONCAT(X) หรือ GROUP_CONCAT(X,Y)
ฟังก์ชันการรวม GROUP_CONCAT จะรวมค่าหลายค่าเข้าเป็นค่าเดียวโดยใช้เครื่องหมายจุลภาคเพื่อคั่นค่าเหล่านั้น โดยมีตัวเลือกดังต่อไปนี้:
- GROUP_CONCAT(X): การดำเนินการนี้จะเชื่อมค่าทั้งหมดของ x ให้เป็นสตริงเดียว โดยใช้เครื่องหมายจุลภาค “,” ใช้เป็นตัวคั่นระหว่างค่าต่างๆ ค่า NULL จะถูกละเว้น
- GROUP_CONCAT(X, Y): การดำเนินการนี้จะเชื่อมค่าของ x ให้เป็นสตริงเดียว โดยใช้ค่า y เป็นตัวคั่นระหว่างแต่ละค่าแทนการใช้ตัวคั่นเริ่มต้น ',' ค่า NULL ก็จะถูกละเว้นเช่นกัน
- GROUP_CONCAT(DISTINCT X): การดำเนินการนี้จะเชื่อมค่าที่แตกต่างกันทั้งหมดของ x ให้เป็นสตริงเดียว โดยใช้เครื่องหมายจุลภาค "" ที่ใช้เป็นตัวคั่นระหว่างค่าต่างๆ ค่า NULL จะถูกละเว้น
GROUP_CONCAT(ชื่อแผนก) ตัวอย่าง
แบบสอบถามต่อไปนี้จะรวมค่าของชื่อแผนกทั้งหมดจากตารางนักศึกษาและแผนกเป็นสตริงเดียวที่คั่นด้วยจุลภาค ดังนั้นแทนที่จะส่งคืนรายการค่า ค่าหนึ่งค่าในแต่ละแถวจะส่งคืนเพียงค่าเดียวในหนึ่งแถว โดยค่าทั้งหมดจะคั่นด้วยจุลภาค:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
สิ่งนี้จะทำให้คุณ:
นี่จะให้รายการค่าชื่อแผนก 8 แผนกที่ต่อกันเป็นสตริงเดียวโดยคั่นด้วยเครื่องหมายจุลภาค
GROUP_CONCAT(ชื่อแผนก DISTINCT) ตัวอย่าง
แบบสอบถามต่อไปนี้จะรวมค่าที่แตกต่างกันของชื่อแผนกจากตารางนักศึกษาและแผนกเข้าเป็นสตริงเดียวที่คั่นด้วยจุลภาค:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
สิ่งนี้จะทำให้คุณ:
สังเกตว่าผลลัพธ์แตกต่างจากผลลัพธ์ก่อนหน้าอย่างไร ส่งคืนเพียงสามค่าซึ่งเป็นชื่อของแผนกที่แตกต่างกัน และค่าที่ซ้ำกันถูกลบออก
GROUP_CONCAT(ชื่อแผนก ,'&') ตัวอย่าง
แบบสอบถามต่อไปนี้จะรวมค่าทั้งหมดของคอลัมน์ชื่อแผนกจากตารางนักศึกษาและแผนกไว้ในสตริงเดียว แต่มีอักขระ '&' แทนเครื่องหมายจุลภาคเป็นตัวคั่น:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
สิ่งนี้จะทำให้คุณ:
สังเกตว่ามีการใช้อักขระ “&” แทนอักขระเริ่มต้น “” เพื่อแยกระหว่างค่าต่างๆ
SQLite สูงสุด() & นาที()
MAX(X) ส่งคืนค่าสูงสุดจากค่า X MAX จะส่งคืนค่า NULL หากค่า x ทั้งหมดเป็นค่าว่าง ในขณะที่ MIN(X) จะส่งกลับค่าที่น้อยที่สุดจากค่า X MIN จะส่งกลับค่า NULL หากค่าทั้งหมดของ X เป็นค่าว่าง
ตัวอย่าง
ในแบบสอบถามต่อไปนี้ เราจะใช้ฟังก์ชัน MIN และ MAX เพื่อรับคะแนนสูงสุดและคะแนนต่ำสุดจาก “เครื่องหมาย" โต๊ะ:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
สิ่งนี้จะทำให้คุณ:
SQLite ผลรวม(x), ผลรวม(x)
ทั้งสองค่าจะคืนค่าผลรวมของค่า x ทั้งหมด แต่จะแตกต่างกันดังต่อไปนี้:
- SUM จะส่งกลับค่าว่างถ้าค่าทั้งหมดเป็นค่าว่าง แต่ผลรวมจะส่งกลับ 0
- TOTAL ส่งคืนค่าทศนิยมเสมอ SUM จะส่งกลับค่าจำนวนเต็มถ้าค่า x ทั้งหมดเป็นจำนวนเต็ม อย่างไรก็ตาม หากค่าไม่ใช่จำนวนเต็ม ก็จะส่งกลับค่าจุดทศนิยม
ตัวอย่าง
ในแบบสอบถามต่อไปนี้ เราจะใช้ SUM และ total เพื่อหาผลรวมของคะแนนทั้งหมดใน “เครื่องหมาย” ตาราง:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
สิ่งนี้จะทำให้คุณ:
อย่างที่คุณเห็น TOTAL จะส่งกลับจุดลอยตัวเสมอ แต่ SUM จะส่งกลับค่าจำนวนเต็มเนื่องจากค่าในคอลัมน์ "ทำเครื่องหมาย" อาจเป็นจำนวนเต็ม
ความแตกต่างระหว่างตัวอย่าง SUM และ TOTAL:
ในแบบสอบถามต่อไปนี้ เราจะแสดงความแตกต่างระหว่าง SUM และ TOTAL เมื่อได้รับค่า SUM ของค่า NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
สิ่งนี้จะทำให้คุณ:
โปรดทราบว่าไม่มีเครื่องหมายสำหรับ TestId = 4 ดังนั้นจึงมีค่าว่างสำหรับการทดสอบนั้น SUM ส่งกลับค่า Null เป็นค่าว่าง ในขณะที่ TOTAL ส่งกลับค่า 0
จัดกลุ่มตาม
GROUP BY clause ใช้เพื่อระบุคอลัมน์ตั้งแต่หนึ่งคอลัมน์ขึ้นไปที่จะใช้เพื่อจัดกลุ่มแถวออกเป็นกลุ่ม แถวที่มีค่าเท่ากันจะถูกรวบรวม (จัดเรียง) เข้าด้วยกันเป็นกลุ่ม
สำหรับคอลัมน์อื่นๆ ที่ไม่รวมอยู่ในกลุ่มตามคอลัมน์ คุณสามารถใช้ฟังก์ชันการรวมได้
ตัวอย่าง:
แบบสอบถามต่อไปนี้จะแจ้งจำนวนนักศึกษาทั้งหมดในแต่ละแผนก
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
สิ่งนี้จะทำให้คุณ:
ส่วนคำสั่ง GROUPBY DepartmentName จะจัดกลุ่มนักเรียนทั้งหมดออกเป็นกลุ่มๆ หนึ่งสำหรับแต่ละชื่อแผนก สำหรับ “ภาควิชา” แต่ละกลุ่มจะนับจำนวนนักศึกษาในนั้น
มีข้อ
หากคุณต้องการกรองกลุ่มที่ส่งคืนโดย GROUP BY clause คุณสามารถระบุประโยค “HAVING” ด้วยนิพจน์หลัง GROUP BY นิพจน์จะถูกใช้เพื่อกรองกลุ่มเหล่านี้
ตัวอย่าง
ในการสอบถามต่อไปนี้ เราจะเลือกแผนกที่มีนักศึกษาเพียง 2 คน:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
สิ่งนี้จะทำให้คุณ:
คำสั่ง HAVING COUNT(S.StudentId) = 2 จะกรองกลุ่มที่ส่งคืน และส่งคืนเฉพาะกลุ่มที่มีนักศึกษา 2 คนเท่านั้น ในกรณีของเรา ภาควิชาศิลปศาสตร์มีนักศึกษา XNUMX คน ดังนั้นจึงแสดงในผลลัพธ์
SQLite แบบสอบถามและแบบสอบถามย่อย
ภายในแบบสอบถามใดๆ คุณสามารถใช้แบบสอบถามอื่นใน SELECT, INSERT, DELETE, UPDATE หรือภายในแบบสอบถามย่อยอื่น
แบบสอบถามแบบซ้อนนี้เรียกว่าแบบสอบถามย่อย เราจะเห็นตัวอย่างของการใช้แบบสอบถามย่อยในส่วนคำสั่ง SELECT อย่างไรก็ตาม ในบทช่วยสอนการปรับเปลี่ยนข้อมูล เราจะดูว่าเราสามารถใช้แบบสอบถามย่อยกับคำสั่ง INSERT, DELETE และ UPDATE ได้อย่างไร
การใช้แบบสอบถามย่อยในตัวอย่างคำสั่ง FROM
ในแบบสอบถามต่อไปนี้ เราจะรวมแบบสอบถามย่อยไว้ภายในคำสั่ง FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
แบบสอบถาม:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
แบบสอบถามข้างต้นเรียกว่าแบบสอบถามย่อยที่นี่เนื่องจากถูกซ้อนอยู่ภายในส่วนคำสั่ง FROM โปรดสังเกตว่าเราตั้งชื่อนามแฝงว่า "t" เพื่อให้เราสามารถอ้างอิงถึงคอลัมน์ที่ส่งคืนมาในแบบสอบถาม
แบบสอบถามนี้จะให้คุณ:
ดังนั้นในกรณีของเรา
- s.StudentName ถูกเลือกจากแบบสอบถามหลักที่ให้ชื่อนักเรียนและ
- t.Mark ถูกเลือกจากแบบสอบถามย่อย ที่ให้คะแนนที่นักเรียนแต่ละคนได้รับ
การใช้แบบสอบถามย่อยในตัวอย่างคำสั่ง WHERE
ในแบบสอบถามต่อไปนี้ เราจะรวมแบบสอบถามย่อยไว้ในคำสั่ง WHERE:
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
แบบสอบถาม:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
แบบสอบถามด้านบนนี้เรียกว่าแบบสอบถามย่อยเนื่องจากอยู่ในคำสั่ง WHERE แบบสอบถามย่อยนี้จะส่งคืนค่า DepartmentId ที่จะใช้โดยตัวดำเนินการ NOT EXISTS
แบบสอบถามนี้จะให้คุณ:
จากข้อความข้างต้น เราได้เลือกแผนกที่ไม่มีนักศึกษาลงทะเบียนเรียน ซึ่งก็คือแผนก “คณิต” ตรงนี้
ชุด Operations – ยูเนี่ยน,ตัดกัน
SQLite รองรับการดำเนินการ SET ต่อไปนี้:
ยูเนี่ยนและยูเนี่ยนทั้งหมด
โดยจะรวมชุดผลลัพธ์ตั้งแต่หนึ่งชุดขึ้นไป (กลุ่มของแถว) ที่ส่งคืนจากคำสั่ง SELECT หลายชุดมาไว้ในชุดผลลัพธ์ชุดเดียว
UNION จะส่งคืนค่าที่แตกต่าง อย่างไรก็ตาม UNION ALL จะไม่และจะรวมข้อมูลซ้ำไว้ด้วย
โปรดทราบว่าชื่อคอลัมน์จะเป็นชื่อคอลัมน์ที่ระบุในคำสั่ง SELECT แรก
ตัวอย่างยูเนี่ยน
ในตัวอย่างต่อไปนี้ เราจะได้รับรายการ DepartmentId จากตารางนักศึกษาและรายการ DepartmentId จากตารางแผนกในคอลัมน์เดียวกัน:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามส่งคืนเพียง 5 แถวซึ่งเป็นค่ารหัสแผนกที่แตกต่างกัน สังเกตค่าแรกซึ่งเป็นค่าว่าง
SQLite ยูเนี่ยนตัวอย่างทั้งหมด
ในตัวอย่างต่อไปนี้ เราจะได้รับรายการ DepartmentId จากตารางนักศึกษาและรายการ DepartmentId จากตารางแผนกในคอลัมน์เดียวกัน:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามจะส่งกลับ 14 แถว 10 แถวจากตารางนักเรียน และ 4 แถวจากตารางแผนก โปรดทราบว่ามีค่าที่ซ้ำกันในค่าที่ส่งคืน นอกจากนี้ โปรดทราบว่าชื่อคอลัมน์เป็นชื่อที่ระบุไว้ในคำสั่ง SELECT แรก
ตอนนี้ เรามาดูกันว่า UNION ทั้งหมดจะให้ผลลัพธ์ที่แตกต่างกันอย่างไร ถ้าเราแทนที่ UNION ALL ด้วย UNION:
SQLite ตัด
ส่งกลับค่าที่มีอยู่ในชุดผลลัพธ์ที่รวมกันทั้งสองชุด ค่าที่มีอยู่ในชุดผลลัพธ์ที่รวมกันชุดใดชุดหนึ่งจะถูกละเว้น
ตัวอย่าง
ในแบบสอบถามต่อไปนี้ เราจะเลือกค่า DepartmentId ที่มีอยู่ในทั้งตาราง Students และ Departments ในคอลัมน์ DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามส่งกลับค่า 1, 2 และ 3 เพียงสามค่าเท่านั้น ซึ่งเป็นค่าที่มีอยู่ในทั้งสองตาราง
อย่างไรก็ตาม ค่า Null และ 4 ไม่ได้ถูกรวมไว้ เนื่องจากค่า Null มีอยู่ในตารางนักเรียนเท่านั้น และไม่ได้อยู่ในตารางแผนก และค่า 4 มีอยู่ในตารางแผนก ไม่ใช่ในตารางนักเรียน
นั่นเป็นสาเหตุที่ทั้งค่า NULL และ 4 ถูกละเว้น และไม่รวมอยู่ในค่าที่ส่งคืน
ยกเว้น
สมมติว่าคุณมีรายการแถวสองรายการ คือ list1 และ list2 และคุณต้องการแถวจาก list1 เท่านั้นที่ไม่มีอยู่ใน list2 คุณสามารถใช้คำสั่ง “EXCEPT” ได้ คำสั่ง EXCEPT จะเปรียบเทียบรายการทั้งสองรายการและส่งคืนแถวที่มีอยู่ใน list1 และไม่มีอยู่ใน list2
ตัวอย่าง
ในแบบสอบถามต่อไปนี้ เราจะเลือกค่า DepartmentId ที่มีอยู่ในตารางแผนก และไม่มีอยู่ในตารางนักศึกษา:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามจะส่งกลับเฉพาะค่า 4 ซึ่งเป็นค่าเดียวที่มีอยู่ในตารางแผนก และไม่มีอยู่ในตารางนักเรียน
การจัดการโมฆะ
"NULL” value คือค่าพิเศษใน SQLite- ใช้เพื่อแสดงค่าที่ไม่ทราบหรือค่าที่ขาดหายไป โปรดทราบว่าค่า Null แตกต่างอย่างสิ้นเชิงกับ “0” หรือค่า “” ว่าง เนื่องจาก 0 และค่าว่างเป็นค่าที่ทราบ อย่างไรก็ตาม จึงไม่ทราบค่า null
ค่า NULL จำเป็นต้องมีการจัดการพิเศษ SQLiteเราจะมาดูวิธีจัดการกับค่า NULL กัน
ค้นหาค่า NULL
คุณไม่สามารถใช้ตัวดำเนินการความเท่าเทียมปกติ (=) เพื่อค้นหาค่าว่างได้ ตัวอย่างเช่น แบบสอบถามต่อไปนี้จะค้นหาข้อมูลนักศึกษาที่มีค่า DepartmentId เป็นค่าว่าง:
SELECT * FROM Students WHERE DepartmentId = NULL;
แบบสอบถามนี้จะไม่ให้ผลลัพธ์ใด ๆ :
เนื่องจากค่า NULL ไม่เท่ากับค่าอื่นๆ ที่รวมค่า Null ไว้ด้วย ด้วยเหตุนี้จึงไม่ส่งกลับผลลัพธ์ใดๆ
- อย่างไรก็ตาม เพื่อให้แบบสอบถามทำงานได้ คุณต้องใช้ “เป็นโมฆะ” ตัวดำเนินการเพื่อค้นหาค่า null ดังต่อไปนี้:
SELECT * FROM Students WHERE DepartmentId IS NULL;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามจะส่งกลับนักเรียนเหล่านั้นที่มีค่า DepartmentId เป็นโมฆะ
- หากคุณต้องการรับค่าเหล่านั้นที่ไม่ใช่ค่าว่าง คุณต้องใช้เครื่องหมาย “ไม่ว่าง” ตัวดำเนินการเช่นนี้:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
สิ่งนี้จะทำให้คุณ:
แบบสอบถามจะส่งกลับนักเรียนที่ไม่มีค่า DepartmentId NULL
ผลลัพธ์แบบมีเงื่อนไข
หากคุณมีรายการค่าและต้องการเลือกค่าใดค่าหนึ่งตามเงื่อนไขบางประการ ด้วยเหตุนี้ เงื่อนไขสำหรับค่านั้นควรเป็นจริงจึงจะสามารถเลือกได้
นิพจน์ CASE จะประเมินรายการเงื่อนไขเหล่านี้สำหรับค่าทั้งหมด หากเงื่อนไขเป็นจริง ก็จะส่งกลับค่านั้น
ตัวอย่างเช่น หากคุณมีคอลัมน์ “เกรด” และคุณต้องการเลือกค่าข้อความตามค่าเกรดดังต่อไปนี้:
– “ดีเยี่ยม” หากเกรดสูงกว่า 85
– “ดีมาก” หากเกรดอยู่ระหว่าง 70 ถึง 85
– “ดี” หากเกรดอยู่ระหว่าง 60 ถึง 70
จากนั้นคุณสามารถใช้นิพจน์ CASE เพื่อดำเนินการดังกล่าวได้
สามารถใช้เพื่อกำหนดตรรกะบางอย่างในส่วนคำสั่ง SELECT เพื่อให้คุณสามารถเลือกผลลัพธ์บางอย่างโดยขึ้นอยู่กับเงื่อนไขบางอย่าง เช่น คำสั่ง if เป็นต้น
ตัวดำเนินการ CASE สามารถกำหนดได้โดยใช้รูปแบบทางไวยากรณ์ที่แตกต่างกันดังต่อไปนี้:
- คุณสามารถใช้เงื่อนไขที่แตกต่างกันได้:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 … ELSE resultn END
- หรือคุณสามารถใช้เพียงนิพจน์เดียวและใส่ค่าที่เป็นไปได้ที่แตกต่างกันเพื่อเลือก:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 … ELSE restuln END
โปรดทราบว่าส่วนคำสั่ง ELSE เป็นทางเลือก
ตัวอย่าง
ในตัวอย่างต่อไปนี้เราจะใช้ กรณี การแสดงออกด้วย NULL ค่าในคอลัมน์รหัสแผนกในตารางนักศึกษาเพื่อแสดงข้อความ 'ไม่มีแผนก' ดังต่อไปนี้:
SELECT StudentName, CASE WHEN DepartmentId IS NULL THEN 'No Department' ELSE DepartmentId END AS DepartmentId FROM Students;
- ตัวดำเนินการ CASE จะตรวจสอบค่าของ DepartmentId ว่าเป็นค่าว่างหรือไม่
- หากเป็นค่า NULL ก็จะเลือกค่าตามตัวอักษร 'ไม่มีแผนก' แทนค่า DepartmentId
- หากไม่ใช่ค่า Null ก็จะเลือกค่าของคอลัมน์ DepartmentId
ซึ่งจะให้ผลลัพธ์ตามที่แสดงด้านล่าง:
นิพจน์ตารางทั่วไป
Common Table Expression (CTE) คือแบบสอบถามย่อยที่กำหนดไว้ภายในคำสั่ง SQL ด้วยชื่อที่กำหนด
มีข้อได้เปรียบเหนือคิวรีย่อยเนื่องจากถูกกำหนดจากคำสั่ง SQL และจะทำให้คิวรีอ่าน บำรุงรักษา และทำความเข้าใจได้ง่ายขึ้น
คุณสามารถกำหนดนิพจน์ตารางทั่วไปได้โดยการวางคำสั่ง WITH ไว้ข้างหน้าคำสั่ง SELECT ดังต่อไปนี้:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
"CTEชื่อ” คือชื่อใดๆ ที่คุณสามารถตั้งให้กับ CTE ได้ ซึ่งคุณสามารถใช้เพื่ออ้างอิงในภายหลังได้ โปรดทราบว่าคุณสามารถกำหนดคำสั่ง SELECT, UPDATE, INSERT หรือ DELETE บน CTE ได้
ตอนนี้เรามาดูตัวอย่างวิธีใช้ CTE ในส่วนคำสั่ง SELECT
ตัวอย่าง
ในตัวอย่างต่อไปนี้ เราจะกำหนด CTE จากคำสั่ง SELECT จากนั้นเราจะใช้ในภายหลังกับแบบสอบถามอื่น:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
ในแบบสอบถามนี้ เราได้กำหนด CTE และตั้งชื่อให้ว่า "ทุกแผนก- CTE นี้ถูกกำหนดจากแบบสอบถาม SELECT:
SELECT DepartmentId, DepartmentName FROM Departments
หลังจากที่เรากำหนด CTE แล้ว เราก็ใช้มันในการสืบค้น SELECT ซึ่งตามมาภายหลัง
โปรดทราบว่านิพจน์ตารางทั่วไปจะไม่ส่งผลต่อผลลัพธ์ของคิวรี เป็นวิธีการกำหนดมุมมองแบบลอจิคัลหรือแบบสอบถามย่อยเพื่อนำมาใช้ซ้ำในแบบสอบถามเดียวกัน นิพจน์ตารางทั่วไปเปรียบเสมือนตัวแปรที่คุณประกาศ และนำมาใช้ซ้ำเป็นแบบสอบถามย่อย เฉพาะคำสั่ง SELECT เท่านั้นที่ส่งผลต่อผลลัพธ์ของแบบสอบถาม
แบบสอบถามนี้จะให้คุณ:
แบบสอบถามขั้นสูง
แบบสอบถามขั้นสูงคือแบบสอบถามที่ประกอบด้วยการรวมข้อมูลที่ซับซ้อน แบบสอบถามย่อย และการรวมข้อมูลบางส่วน ในส่วนต่อไปนี้ เราจะดูตัวอย่างแบบสอบถามขั้นสูง:
ที่ที่เราได้รับ,
- ชื่อภาควิชากับนักศึกษาทั้งหมดในแต่ละภาควิชา
- ชื่อนักเรียนคั่นด้วยลูกน้ำและ
- แสดงว่าภาควิชามีนักศึกษาอย่างน้อย 3 คน
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
เราได้เพิ่มก สมัคร ส่วนคำสั่งเพื่อรับชื่อแผนกจากตารางแผนก หลังจากนั้นเราได้เพิ่ม GROUP BY clause พร้อมด้วยฟังก์ชันรวม 2 ฟังก์ชัน:
- “COUNT” เพื่อนับจำนวนนักศึกษาในแต่ละกลุ่มแผนก
- GROUP_CONCAT เพื่อเชื่อมต่อนักเรียนสำหรับแต่ละกลุ่มด้วยเครื่องหมายจุลภาคคั่นด้วยสตริงเดียว
- หลังจาก GROUP BY เราใช้คำสั่งย่อย HAVING เพื่อกรองแผนกต่างๆ และเลือกเฉพาะแผนกที่มีนักศึกษาอย่างน้อย 3 คน
ผลลัพธ์จะออกมาเป็นดังนี้:
สรุป
นี่เป็นการแนะนำการเขียน SQLite การสืบค้นและพื้นฐานของการสืบค้นฐานข้อมูลและวิธีกรองข้อมูลที่ส่งคืน ตอนนี้คุณสามารถเขียนของคุณเอง SQLite คำสั่ง