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 |
+----+----------+---------+