SQLite เข้าร่วม: ด้านซ้ายตามธรรมชาติ, ด้านใน, กากบาทพร้อมตัวอย่างตาราง
SQLite รองรับประเภทต่างๆ SQL รวม เช่น INNER JOIN, LEFT OUTER JOIN และ CROSS JOIN JOIN แต่ละประเภทใช้สำหรับสถานการณ์ที่แตกต่างกัน ดังที่เราจะเห็นในบทช่วยสอนนี้
รู้เบื้องต้นเกี่ยวกับ SQLite เข้าร่วมข้อ
เมื่อคุณทำงานกับฐานข้อมูลที่มีหลายตาราง คุณมักจะจำเป็นต้องรับข้อมูลจากหลายตารางเหล่านี้
ด้วยส่วนคำสั่ง JOIN คุณสามารถเชื่อมโยงตารางหรือแบบสอบถามย่อยตั้งแต่สองตัวขึ้นไปโดยการรวมเข้าด้วยกัน นอกจากนี้คุณยังสามารถกำหนดได้ว่าคอลัมน์ใดที่คุณต้องการเชื่อมโยงตารางและตามเงื่อนไข
คำสั่ง JOIN ใด ๆ จะต้องมีรูปแบบดังต่อไปนี้:

แต่ละคำสั่งเข้าร่วมประกอบด้วย:
- ตารางหรือแบบสอบถามย่อยซึ่งเป็นตารางด้านซ้าย ตารางหรือแบบสอบถามย่อยก่อนส่วนคำสั่งเข้าร่วม (ทางด้านซ้าย)
- ตัวดำเนินการ JOIN – ระบุประเภทการเข้าร่วม (INNER JOIN, LEFT OUTER JOIN หรือ CROSS JOIN)
- เข้าร่วม-ข้อจำกัด – หลังจากที่คุณระบุตารางหรือแบบสอบถามย่อยที่จะเข้าร่วม คุณจะต้องระบุข้อจำกัดการรวม ซึ่งจะเป็นเงื่อนไขในการเลือกแถวที่ตรงกันซึ่งตรงกับเงื่อนไขนั้น โดยขึ้นอยู่กับประเภทการรวม
หมายเหตุว่าสำหรับสิ่งต่อไปนี้ทั้งหมด SQLite ตัวอย่างตาราง JOIN คุณต้องเรียกใช้ sqlite3.exe และเปิดการเชื่อมต่อกับฐานข้อมูลตัวอย่างตามขั้นตอนต่อไปนี้:
ขั้นตอน 1) ในขั้นตอนนี้
- เปิด My Computer และไปที่ไดเร็กทอรีต่อไปนี้ “C:\sqlite"และ
- แล้วเปิด”sqlite3.exe"
ขั้นตอน 2) เปิดฐานข้อมูล “บทช่วยสอนSampleDB.db” โดยคำสั่งต่อไปนี้:
ตอนนี้คุณพร้อมที่จะเรียกใช้แบบสอบถามประเภทใดก็ได้บนฐานข้อมูลแล้ว
SQLite INNER JOIN
INNER JOIN ส่งคืนเฉพาะแถวที่ตรงกับเงื่อนไขการรวม และกำจัดแถวอื่นๆ ทั้งหมดที่ไม่ตรงกับเงื่อนไขการรวม
ตัวอย่าง
ในตัวอย่างต่อไปนี้เราจะรวมตารางทั้งสองเข้าด้วยกัน “นักเรียน"และ"หน่วยงาน” ด้วย DepartmentId เพื่อรับชื่อแผนกสำหรับนักเรียนแต่ละคน ดังนี้:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
คำอธิบายของรหัส
การทำงานของ INNER JOIN มีดังนี้:
- ในส่วนคำสั่ง Select คุณสามารถเลือกคอลัมน์ใดก็ได้ที่คุณต้องการเลือกจากตารางที่อ้างอิงสองตาราง
- ส่วนคำสั่ง INNER JOIN ถูกเขียนหลังจากตารางแรกที่อ้างอิงด้วยส่วนคำสั่ง “จาก”
- จากนั้นเงื่อนไขการรวมจะถูกระบุด้วย ON
- สามารถระบุนามแฝงสำหรับตารางอ้างอิงได้
- คำ INNER เป็นทางเลือก คุณสามารถเขียน JOIN ได้เลย
เอาท์พุต
- INNER JOIN จัดทำบันทึกจากทั้งนักศึกษาและตารางภาควิชาที่ตรงกับเงื่อนไขคือ “Students.DepartmentId = Departments.DepartmentId - แถวที่ไม่ตรงกันจะถูกละเว้นและไม่รวมไว้ในผลลัพธ์
- ด้วยเหตุนี้จึงมีเพียง 8 คนจาก 10 คนเท่านั้นที่ได้รับผลลัพธ์จากการค้นหานี้พร้อมกับแผนกไอที คณิตศาสตร์ และฟิสิกส์ ในขณะที่นักศึกษา “Jena” และ “George” ไม่ถูกรวมอยู่ด้วย เนื่องจากมีรหัสแผนกว่าง ซึ่งไม่ตรงกับคอลัมน์รหัสแผนกจากตารางแผนก ดังต่อไปนี้:
SQLite เข้าร่วม … การใช้
INNER JOIN สามารถเขียนได้โดยใช้ส่วนคำสั่ง "USING" เพื่อหลีกเลี่ยงความซ้ำซ้อน ดังนั้น แทนที่จะเขียน "ON Students.DepartmentId = Departments.DepartmentId" คุณสามารถเขียนแค่ "USING(DepartmentID)" ได้
คุณสามารถใช้ “JOIN .. USING” เมื่อใดก็ตามที่คอลัมน์ที่คุณจะเปรียบเทียบในเงื่อนไขการรวมมีชื่อเดียวกัน ในกรณีเช่นนี้ ไม่จำเป็นต้องทำซ้ำโดยใช้เงื่อนไข on และเพียงระบุชื่อคอลัมน์และ SQLite จะตรวจพบสิ่งนั้น
ความแตกต่างระหว่าง INNER JOIN และ JOIN .. การใช้:
ด้วย “JOIN … USING” คุณไม่ต้องเขียนเงื่อนไขการรวม คุณเพียงแค่เขียนคอลัมน์การรวมซึ่งมีเหมือนกันระหว่างตารางที่รวมเข้าด้วยกัน แทนที่จะเขียน table1 “INNER JOIN table2 ON table1.cola = table2.cola” ที่เราเขียน มันเหมือนกับ “table1 JOIN table2 USING(cola)”
ตัวอย่าง
ในตัวอย่างต่อไปนี้เราจะรวมตารางทั้งสองเข้าด้วยกัน “นักเรียน"และ"หน่วยงาน” ด้วย DepartmentId เพื่อรับชื่อแผนกสำหรับนักเรียนแต่ละคน ดังนี้:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
คำอธิบาย
- ต่างจากตัวอย่างที่แล้วเราไม่ได้เขียนว่า “ON Students.DepartmentId = Departments.DepartmentId- เราเพิ่งเขียนว่า “การใช้ (รหัสแผนก)"
- SQLite อนุมานเงื่อนไขการเข้าร่วมโดยอัตโนมัติและเปรียบเทียบ DepartmentId จากทั้งตาราง – นักศึกษาและแผนก
- คุณสามารถใช้ไวยากรณ์นี้เมื่อใดก็ตามที่ทั้งสองคอลัมน์ที่คุณกำลังเปรียบเทียบมีชื่อเดียวกัน
เอาท์พุต
- นี่จะให้ผลลัพธ์ที่เหมือนกันทุกประการกับตัวอย่างก่อนหน้านี้:
SQLite เข้าร่วมอย่างเป็นธรรมชาติ
NATURAL JOIN คล้ายกับ JOIN...การใช้ ความแตกต่างคือจะทดสอบความเท่าเทียมกันระหว่างค่าของทุกคอลัมน์ที่มีอยู่ในทั้งสองตารางโดยอัตโนมัติ
ความแตกต่างระหว่าง INNER JOIN และ NATURAL JOIN:
- ใน INNER JOIN คุณต้องระบุเงื่อนไขการรวมที่การรวมภายในใช้เพื่อรวมทั้งสองตาราง ในขณะที่การรวมแบบธรรมชาติ คุณไม่ต้องเขียนเงื่อนไขการรวม คุณเพียงแค่เขียนชื่อทั้งสองตารางโดยไม่มีเงื่อนไขใดๆ จากนั้นการรวมแบบธรรมชาติจะทดสอบความเท่าเทียมกันระหว่างค่าของทุกคอลัมน์ที่มีอยู่ในทั้งสองตารางโดยอัตโนมัติ การรวมแบบธรรมชาติอนุมานเงื่อนไขการรวมโดยอัตโนมัติ
- ใน NATURAL JOIN คอลัมน์ทั้งหมดจากทั้งสองตารางที่มีชื่อเดียวกันจะถูกจับคู่กัน ตัวอย่างเช่น หากเรามีตารางสองตารางที่มีชื่อคอลัมน์สองคอลัมน์เหมือนกัน (ทั้งสองคอลัมน์มีชื่อเดียวกันในตารางทั้งสอง) การรวมแบบธรรมชาติจะรวมทั้งสองตารางเข้าด้วยกันโดยการเปรียบเทียบค่าของทั้งสองคอลัมน์ ไม่ใช่แค่จากคอลัมน์เดียว คอลัมน์.
ตัวอย่าง
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
คำอธิบาย
- เราไม่จำเป็นต้องเขียนเงื่อนไขการรวมด้วยชื่อคอลัมน์ (เหมือนที่เราทำใน INNER JOIN) เราไม่จำเป็นต้องเขียนชื่อคอลัมน์แม้แต่ครั้งเดียว (เหมือนที่เราทำใน JOIN USING)
- การรวมแบบธรรมชาติจะสแกนทั้งสองคอลัมน์จากทั้งสองตาราง จะตรวจพบว่าเงื่อนไขควรประกอบด้วยการเปรียบเทียบ DepartmentId จากทั้ง 2 ตาราง Student และ Departments
เอาท์พุต
- การ JOIN ตามธรรมชาติจะให้ผลลัพธ์ที่เหมือนกันกับผลลัพธ์ที่ได้จากตัวอย่าง INNER JOIN และ JOIN USING เนื่องจากในตัวอย่างของเรา แบบสอบถามทั้งสามนั้นเทียบเท่ากัน แต่ในบางกรณี ผลลัพธ์จะแตกต่างจากการ Join ภายในและจากการ Join ตามธรรมชาติ ตัวอย่างเช่น หากมีตารางที่มีชื่อเดียวกันมากกว่า การ Join ตามธรรมชาติจะจับคู่คอลัมน์ทั้งหมดเข้าด้วยกัน อย่างไรก็ตาม การ Join ภายในจะจับคู่เฉพาะคอลัมน์ในเงื่อนไขการ Join เท่านั้น (รายละเอียดเพิ่มเติมในหัวข้อถัดไป ความแตกต่างระหว่างการ Join ภายในและการ Join ตามธรรมชาติ)
SQLite ซ้าย OUTER เข้าร่วม
มาตรฐาน SQL กำหนด OUTER JOIN สามประเภท: LEFT, RIGHT และ FULL SQLite รองรับเฉพาะ LEFT OUTER JOIN ที่เป็นธรรมชาติเท่านั้น
ใน LEFT OUTER JOIN ค่าทั้งหมดของคอลัมน์ที่คุณเลือกจากตารางด้านซ้ายจะรวมอยู่ในผลลัพธ์ของ การสอบถามดังนั้นไม่ว่าค่าจะตรงกับเงื่อนไขการรวมหรือไม่ก็ตาม ค่านั้นจะถูกรวมไว้ในผลลัพธ์
ดังนั้นหากตารางด้านซ้ายมีแถว 'n' ผลลัพธ์ของแบบสอบถามก็จะมีแถว 'n' อย่างไรก็ตาม สำหรับค่าของคอลัมน์ที่มาจากตารางที่ถูกต้อง หากค่าใดๆ ที่ไม่ตรงกับเงื่อนไขการรวม ค่านั้นจะมีค่าเป็น “null”
ดังนั้นคุณจะได้จำนวนแถวเท่ากับจำนวนแถวในการรวมด้านซ้าย เพื่อที่คุณจะได้แถวที่ตรงกันจากทั้งสองตาราง (เช่นผลลัพธ์ INNER JOIN) บวกกับแถวที่ไม่ตรงกันจากตารางด้านซ้าย
ตัวอย่าง
ในตัวอย่างต่อไปนี้ เราจะลองใช้ “LEFT JOIN” เพื่อรวมตารางสองตาราง “นักศึกษา” และ “แผนก”:
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
คำอธิบาย
- SQLite ไวยากรณ์ LEFT JOIN เหมือนกับ INNER JOIN; คุณเขียน LEFT JOIN ระหว่างทั้งสองตาราง จากนั้นเงื่อนไขการรวมจะอยู่หลังส่วนคำสั่ง ON
- ตารางแรกหลัง from clause คือตารางด้านซ้าย ในขณะที่ตารางที่สองที่ระบุหลังจาก LEFT JOIN แบบธรรมชาติเป็นตารางด้านขวา
- ส่วนคำสั่ง OUTER เป็นทางเลือก LEFT OUTER JOIN ตามธรรมชาติจะเหมือนกับ LEFT JOIN
เอาท์พุต
- ดังที่คุณเห็นแถวทั้งหมดจากตารางนักเรียนรวมอยู่ด้วยซึ่งมีนักเรียนทั้งหมด 10 คน แม้ว่านักเรียนคนที่สี่และคนสุดท้าย Jena และ George departmentIds จะไม่มีอยู่ในตาราง Departments แต่รหัสเหล่านั้นก็จะถูกรวมไว้ด้วย
- และในกรณีเหล่านี้ ค่า departmentName สำหรับทั้ง Jena และ George จะเป็น “null” เนื่องจากตารางแผนกไม่มี departmentName ที่ตรงกับค่า departmentId ของพวกเขา
เรามาถามคำถามก่อนหน้านี้โดยใช้ด้านซ้ายเพื่ออธิบายเชิงลึกโดยใช้ Van Diagram:
LEFT JOIN จะให้ชื่อนักเรียนทั้งหมดจากตารางนักเรียน แม้ว่านักเรียนจะมีรหัสแผนกที่ไม่มีอยู่ในตารางแผนกก็ตาม ดังนั้นแบบสอบถามจะไม่ได้ให้เฉพาะแถวที่ตรงกันเป็น INNER JOIN แต่จะให้ส่วนพิเศษแก่คุณซึ่งมีแถวที่ไม่ตรงกันจากตารางด้านซ้ายซึ่งเป็นตารางนักเรียน
โปรดทราบว่าชื่อนักเรียนที่ไม่มีแผนกที่ตรงกันจะมีค่า "null" สำหรับชื่อแผนก เนื่องจากไม่มีค่าที่ตรงกัน และค่าเหล่านั้นคือค่าในแถวที่ไม่ตรงกัน
SQLite ข้ามเข้าร่วม
CROSS JOIN ให้ผลคูณคาร์ทีเซียนสำหรับคอลัมน์ที่เลือกของสองตารางที่รวมเข้าด้วยกัน โดยจับคู่ค่าทั้งหมดจากตารางแรกกับค่าทั้งหมดจากตารางที่สอง
ดังนั้น สำหรับทุกค่าในตารางแรก คุณจะได้รับการจับคู่ 'n' จากตารางที่สอง โดยที่ n คือจำนวนแถวของตารางที่สอง
ไม่เหมือนกับ INNER JOIN และ LEFT OUTER JOIN เมื่อใช้ CROSS JOIN คุณไม่จำเป็นต้องระบุเงื่อนไขการรวม เนื่องจาก SQLite ไม่ต้องการมันสำหรับ CROSS JOIN
เค้ก SQLite จะทำให้เกิดผลลัพธ์เชิงตรรกะที่กำหนดโดยการรวมค่าทั้งหมดจากตารางแรกเข้ากับค่าทั้งหมดจากตารางที่สอง
ตัวอย่างเช่น ถ้าคุณเลือกคอลัมน์จากตารางแรก (colA) และอีกคอลัมน์หนึ่งจากตารางที่สอง (colB) colA มีสองค่า (1,2) และ colB ก็มีสองค่าด้วย (3,4)
จากนั้นผลลัพธ์ของ CROSS JOIN จะเป็นสี่แถว:
- สองแถวโดยการรวมค่าแรกจาก colA ซึ่งเป็น 1 กับสองค่าของ colB (3,4) ซึ่งจะเป็น (1,3), (1,4)
- ในทำนองเดียวกันสองแถวโดยการรวมค่าที่สองจาก colA ซึ่งเป็น 2 เข้ากับค่าสองค่าของ colB (3,4) ซึ่งคือ (2,3), (2,4)
ตัวอย่าง
ในแบบสอบถามต่อไปนี้ เราจะลองใช้ CROSS JOIN ระหว่างตารางนักศึกษาและแผนก:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
คำอธิบาย
- ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร SQLite เลือกจากหลายตาราง เราเพิ่งเลือกสองคอลัมน์ “ชื่อนักเรียน” จากตารางนักเรียน และ “ชื่อแผนก” จากตารางแผนก
- สำหรับการรวมแบบข้าม เราไม่ได้ระบุเงื่อนไขการรวมใดๆ เพียงสองตารางที่รวมกับ CROSS JOIN ที่อยู่ตรงกลางเท่านั้น
เอาท์พุต
ดังที่คุณจะเห็น ผลลัพธ์คือ 40 แถว โดยมีค่า 10 ค่าจากตารางนักศึกษาที่ตรงกับ 4 แผนกจากตารางแผนก ดังนี้
- ค่าสี่ค่าสำหรับสี่แผนกจากตารางแผนกตรงกับมิเชลนักเรียนคนแรก
- ค่าสี่ค่าสำหรับสี่แผนกจากตารางแผนกที่ตรงกับนักเรียนคนที่สอง John
- สี่ค่าสำหรับสี่แผนกจากตารางแผนกที่ตรงกับแจ็คนักเรียนคนที่สาม... และอื่นๆ
สรุป
การใช้ SQLite เข้าร่วมแบบสอบถาม คุณสามารถเชื่อมโยงตารางหรือแบบสอบถามย่อยตั้งแต่หนึ่งรายการขึ้นไปเข้าด้วยกันเพื่อเลือกคอลัมน์จากทั้งตารางหรือแบบสอบถามย่อย