SQLite - แบบสอบถามย่อย
แบบสอบถามย่อยหรือแบบสอบถามภายในหรือแบบสอบถามที่ซ้อนกันคือแบบสอบถามภายในแบบสอบถาม SQLite อื่นและฝังอยู่ภายในส่วนคำสั่ง WHERE
แบบสอบถามย่อยใช้เพื่อส่งคืนข้อมูลที่จะใช้ในแบบสอบถามหลักเป็นเงื่อนไขในการ จำกัด ข้อมูลที่จะเรียกเพิ่มเติม
สามารถใช้แบบสอบถามย่อยกับคำสั่ง SELECT, INSERT, UPDATE และ DELETE พร้อมกับตัวดำเนินการเช่น =, <,>,> =, <=, IN, BETWEEN เป็นต้น
มีกฎสองสามข้อที่ต้องปฏิบัติตามแบบสอบถามย่อย -
แบบสอบถามย่อยต้องอยู่ในวงเล็บ
แบบสอบถามย่อยสามารถมีได้เพียงคอลัมน์เดียวในส่วนคำสั่ง SELECT เว้นแต่ว่าจะมีหลายคอลัมน์ในแบบสอบถามหลักเพื่อให้แบบสอบถามย่อยเปรียบเทียบคอลัมน์ที่เลือก
ไม่สามารถใช้ ORDER BY ในแบบสอบถามย่อยแม้ว่าแบบสอบถามหลักจะสามารถใช้ ORDER BY ได้ GROUP BY สามารถใช้เพื่อทำฟังก์ชันเดียวกับ ORDER BY ในแบบสอบถามย่อย
แบบสอบถามย่อยที่ส่งคืนมากกว่าหนึ่งแถวสามารถใช้ได้กับตัวดำเนินการหลายค่าเท่านั้นเช่นตัวดำเนินการ IN
BETWEEN ไม่สามารถใช้กับเคียวรีย่อยได้ อย่างไรก็ตามสามารถใช้ BETWEEN ภายในแบบสอบถามย่อยได้
แบบสอบถามย่อยที่มีคำสั่ง SELECT
แบบสอบถามย่อยมักใช้กับคำสั่ง SELECT ไวยากรณ์พื้นฐานมีดังนี้ -
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
ตัวอย่าง
พิจารณาตารางCOMPANY ที่มีบันทึกต่อไปนี้
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
ตอนนี้ให้เราตรวจสอบแบบสอบถามย่อยต่อไปนี้ด้วยคำสั่ง SELECT
sqlite> SELECT *
FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY
WHERE SALARY > 45000) ;
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
แบบสอบถามย่อยที่มีคำสั่ง INSERT
นอกจากนี้ยังสามารถใช้แบบสอบถามย่อยกับคำสั่ง INSERT คำสั่ง INSERT ใช้ข้อมูลที่ส่งกลับจากเคียวรีย่อยเพื่อแทรกลงในตารางอื่น ข้อมูลที่เลือกในแบบสอบถามย่อยสามารถแก้ไขได้ด้วยฟังก์ชันอักขระวันที่หรือตัวเลขใด ๆ
ต่อไปนี้เป็นไวยากรณ์พื้นฐานมีดังนี้ -
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
ตัวอย่าง
พิจารณาตาราง COMPANY_BKP ที่มีโครงสร้างคล้ายกับตาราง COMPANY และสามารถสร้างได้โดยใช้ CREATE TABLE เดียวกันโดยใช้ COMPANY_BKP เป็นชื่อตาราง ในการคัดลอกตาราง COMPANY ที่สมบูรณ์ไปยัง COMPANY_BKP ไวยากรณ์ต่อไปนี้ -
sqlite> INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
แบบสอบถามย่อยพร้อมคำชี้แจง UPDATE
สามารถใช้แบบสอบถามย่อยร่วมกับคำสั่ง UPDATE สามารถอัปเดตคอลัมน์เดียวหรือหลายคอลัมน์ในตารางได้เมื่อใช้แบบสอบถามย่อยกับคำสั่ง UPDATE
ต่อไปนี้เป็นไวยากรณ์พื้นฐานมีดังนี้ -
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
ตัวอย่าง
สมมติว่าเรามีตาราง COMPANY_BKP ซึ่งเป็นข้อมูลสำรองของตาราง COMPANY
ตัวอย่างต่อไปนี้จะอัปเดต SALARY 0.50 ครั้งในตาราง COMPANY สำหรับลูกค้าทั้งหมดที่ AGE มากกว่าหรือเท่ากับ 27
sqlite> UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
สิ่งนี้จะส่งผลกระทบต่อสองแถวและสุดท้ายตาราง COMPANY จะมีบันทึกต่อไปนี้ -
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 10000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
แบบสอบถามย่อยที่มีคำสั่ง DELETE
สามารถใช้การสืบค้นย่อยร่วมกับคำสั่ง DELETE เช่นเดียวกับข้อความอื่น ๆ ที่กล่าวถึงข้างต้น
ต่อไปนี้เป็นไวยากรณ์พื้นฐานมีดังนี้ -
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
ตัวอย่าง
สมมติว่าเรามีตาราง COMPANY_BKP ซึ่งเป็นข้อมูลสำรองของตาราง COMPANY
ตัวอย่างต่อไปนี้จะลบระเบียนจากตาราง COMPANY สำหรับลูกค้าทั้งหมดที่มี AGE มากกว่าหรือเท่ากับ 27
sqlite> DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );
สิ่งนี้จะส่งผลกระทบต่อสองแถวและในที่สุดตาราง COMPANY จะมีบันทึกต่อไปนี้ -
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0