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