HSQLDB - เข้าร่วม
เมื่อใดก็ตามที่มีข้อกำหนดในการดึงข้อมูลจากหลายตารางโดยใช้แบบสอบถามเดียวคุณสามารถใช้ JOINS จาก RDBMS คุณสามารถใช้หลายตารางในแบบสอบถาม SQL เดียวของคุณ การเข้าร่วมใน HSQLDB หมายถึงการรวมสองตารางขึ้นไปให้เป็นตารางเดียว
พิจารณาตารางลูกค้าและใบสั่งซื้อต่อไปนี้
Customer:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
Orders:
+-----+---------------------+-------------+--------+
|OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
ตอนนี้ให้เราพยายามดึงข้อมูลของลูกค้าและจำนวนคำสั่งซื้อที่ลูกค้ารายนั้นวางไว้ ซึ่งหมายความว่าเรากำลังดึงข้อมูลบันทึกจากทั้งลูกค้าและตารางคำสั่งซื้อ เราสามารถบรรลุสิ่งนี้ได้โดยใช้แนวคิด JOINS ใน HSQLDB ต่อไปนี้คือข้อความค้นหา JOIN สำหรับสิ่งเดียวกัน
SELECT ID, NAME, AGE, AMOUNT FROM CUSTOMERS, ORDERS WHERE CUSTOMERS.ID =
ORDERS.CUSTOMER_ID;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ต่อไปนี้
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
เข้าร่วมประเภท
HSQLDB มีการรวมประเภทต่างๆ
INNER JOIN - ส่งคืนแถวเมื่อมีการจับคู่ในทั้งสองตาราง
LEFT JOIN - ส่งคืนแถวทั้งหมดจากตารางด้านซ้ายแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านขวา
RIGHT JOIN - ส่งคืนแถวทั้งหมดจากตารางด้านขวาแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านซ้าย
FULL JOIN - ส่งคืนแถวเมื่อมีการจับคู่ในตารางใดตารางหนึ่ง
SELF JOIN - ใช้เพื่อรวมตารางเข้ากับตัวเองราวกับว่าตารางเป็นสองตารางโดยเปลี่ยนชื่อตารางอย่างน้อยหนึ่งตารางในคำสั่ง SQL เป็นการชั่วคราว
การเข้าร่วมภายใน
การรวมที่ใช้บ่อยและสำคัญที่สุดคือ INNER JOIN เรียกอีกอย่างว่า EQUIJOIN
INNER JOIN สร้างตารางผลลัพธ์ใหม่โดยการรวมค่าคอลัมน์ของสองตาราง (table1 และ table2) โดยยึดตามการเข้าร่วม แบบสอบถามเปรียบเทียบแต่ละแถวของ table1 กับแต่ละแถวของ table2 เพื่อค้นหาคู่ของแถวทั้งหมดซึ่งตรงตามเงื่อนไขการรวม เมื่อเข้าร่วมเพรดิเคตเป็นที่พอใจแล้วค่าของคอลัมน์สำหรับแถว A และ B ที่ตรงกันแต่ละคู่จะรวมกันเป็นแถวผลลัพธ์
ไวยากรณ์
ไวยากรณ์พื้นฐานของ INNER JOIN มีดังนี้
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;
ตัวอย่าง
พิจารณาตารางสองตารางต่อไปนี้ตารางหนึ่งชื่อตารางลูกค้าและอีกตารางหนึ่งชื่อว่าตารางคำสั่งซื้อดังต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
+-----+---------------------+-------------+--------+
| OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
ตอนนี้ให้เราเข้าร่วมสองตารางนี้โดยใช้แบบสอบถาม INNER JOIN ดังนี้ -
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ต่อไปนี้
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+----+----------+--------+---------------------+
เข้าร่วมทางซ้าย
HSQLDB LEFT JOIN ส่งคืนแถวทั้งหมดจากตารางด้านซ้ายแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านขวา ซึ่งหมายความว่าหากคำสั่ง ON ตรงกับระเบียน 0 (ศูนย์) ในตารางด้านขวาการรวมจะยังคงส่งคืนแถวในผลลัพธ์ แต่จะมีค่า NULL ในแต่ละคอลัมน์จากตารางด้านขวา
ซึ่งหมายความว่าการรวมด้านซ้ายจะส่งคืนค่าทั้งหมดจากตารางด้านซ้ายบวกกับค่าที่ตรงกันจากตารางด้านขวาหรือ NULL ในกรณีที่ไม่มีเพรดิเคตการรวมที่ตรงกัน
ไวยากรณ์
ไวยากรณ์พื้นฐานของ LEFT JOIN มีดังนี้ -
SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;
เงื่อนไขที่กำหนดอาจเป็นนิพจน์ใดก็ได้ตามความต้องการของคุณ
ตัวอย่าง
พิจารณาตารางสองตารางต่อไปนี้ตารางหนึ่งชื่อตารางลูกค้าและอีกตารางหนึ่งชื่อว่าตารางคำสั่งซื้อดังต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
+-----+---------------------+-------------+--------+
| OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
ตอนนี้ให้เราเข้าร่วมสองตารางนี้โดยใช้แบบสอบถาม LEFT JOIN ดังนี้ -
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ต่อไปนี้ -
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+----+----------+--------+---------------------+
เข้าร่วมขวา
HSQLDB RIGHT JOIN ส่งคืนแถวทั้งหมดจากตารางด้านขวาแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านซ้าย ซึ่งหมายความว่าหากคำสั่ง ON ตรงกับระเบียน 0 (ศูนย์) ในตารางด้านซ้ายการรวมจะยังคงส่งคืนแถวในผลลัพธ์ แต่จะมีค่า NULL ในแต่ละคอลัมน์จากตารางด้านซ้าย
ซึ่งหมายความว่าการรวมทางขวาจะส่งคืนค่าทั้งหมดจากตารางด้านขวาบวกกับค่าที่ตรงกันจากตารางด้านซ้ายหรือค่า NULL ในกรณีที่ไม่มีเพรดิเคตการรวมที่ตรงกัน
ไวยากรณ์
ไวยากรณ์พื้นฐานของ RIGHT JOIN มีดังนี้ -
SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;
ตัวอย่าง
พิจารณาตารางสองตารางต่อไปนี้ตารางหนึ่งชื่อตารางลูกค้าและอีกตารางหนึ่งชื่อว่าตารางคำสั่งซื้อดังต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
+-----+---------------------+-------------+--------+
| OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
ตอนนี้ให้เราเข้าร่วมสองตารางนี้โดยใช้แบบสอบถาม RIGHT JOIN ดังนี้ -
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ดังต่อไปนี้
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
เข้าร่วมแบบเต็ม
HSQLDB FULL JOIN รวมผลลัพธ์ของการรวมภายนอกทั้งซ้ายและขวา
ตารางที่เข้าร่วมจะมีระเบียนทั้งหมดจากทั้งสองตารางและกรอกค่า NULL สำหรับการแข่งขันที่ขาดหายไปในด้านใดด้านหนึ่ง
ไวยากรณ์
ไวยากรณ์พื้นฐานของ FULL JOIN มีดังนี้ -
SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;
เงื่อนไขที่กำหนดอาจเป็นนิพจน์ใดก็ได้ตามความต้องการของคุณ
ตัวอย่าง
พิจารณาตารางสองตารางต่อไปนี้ตารางหนึ่งชื่อตารางลูกค้าและอีกตารางหนึ่งชื่อว่าตารางคำสั่งซื้อดังต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
+-----+---------------------+-------------+--------+
| OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
ตอนนี้ให้เราเข้าร่วมสองตารางนี้โดยใช้แบบสอบถาม FULL JOIN ดังนี้ -
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ดังต่อไปนี้
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
เข้าร่วมด้วยตนเอง
SQL SELF JOIN ใช้เพื่อรวมตารางเข้ากับตัวเองราวกับว่าตารางเป็นสองตารางโดยเปลี่ยนชื่อตารางอย่างน้อยหนึ่งตารางในคำสั่ง SQL เป็นการชั่วคราว
ไวยากรณ์
ไวยากรณ์พื้นฐานของ SELF JOIN มีดังนี้ -
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;
ที่นี่ส่วนคำสั่ง WHERE อาจเป็นนิพจน์ใดก็ได้ตามความต้องการของคุณ
ตัวอย่าง
พิจารณาตารางสองตารางต่อไปนี้ตารางหนึ่งชื่อตารางลูกค้าและอีกตารางหนึ่งชื่อว่าตารางคำสั่งซื้อดังต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ตอนนี้ให้เราเข้าร่วมตารางนี้โดยใช้แบบสอบถาม SELF JOIN ดังนี้ -
SELECT a.ID, b.NAME, a.SALARY FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY > b.SALARY;
หลังจากดำเนินการค้นหาข้างต้นคุณจะได้รับผลลัพธ์ต่อไปนี้ -
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 1 | Chaitali | 2000.00 |
| 2 | Chaitali | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 6 | Chaitali | 4500.00 |
| 1 | Hardik | 2000.00 |
| 2 | Hardik | 1500.00 |
| 3 | Hardik | 2000.00 |
| 4 | Hardik | 6500.00 |
| 6 | Hardik | 4500.00 |
| 1 | Komal | 2000.00 |
| 2 | Komal | 1500.00 |
| 3 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Muffy | 1500.00 |
| 3 | Muffy | 2000.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+