
- HSQLDB 教程
- HSQLDB - 首頁
- HSQLDB - 簡介
- HSQLDB - 安裝
- HSQLDB - 連線
- HSQLDB - 資料型別
- HSQLDB - 建立表
- HSQLDB - 刪除表
- HSQLDB - 插入查詢
- HSQLDB - 選擇查詢
- HSQLDB - WHERE 子句
- HSQLDB - 更新查詢
- HSQLDB - DELETE 子句
- HSQLDB - LIKE 子句
- HSQLDB - 排序結果
- HSQLDB - 聯接
- HSQLDB - 空值
- HSQLDB - 正則表示式
- HSQLDB - 事務
- HSQLDB - ALTER 命令
- HSQLDB - 索引
- HSQLDB 有用資源
- HSQLDB - 快速指南
- HSQLDB - 有用資源
- HSQLDB - 討論
HSQLDB - 聯接
當需要使用單個查詢從多個表中檢索資料時,您可以使用 RDBMS 中的聯接。您可以在單個 SQL 查詢中使用多個表。在 HSQLDB 中,聯接是指將兩個或多個表合併成一個表的動作。
考慮以下 Customers 和 Orders 表。
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 | +-----+---------------------+-------------+--------+
現在,讓我們嘗試檢索客戶的資料以及相應客戶下的訂單金額。這意味著我們正在從 Customers 和 Orders 兩個表中檢索記錄資料。我們可以透過在 HSQLDB 中使用聯接的概念來實現這一點。以下是相同的聯接查詢。
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;
示例
考慮以下兩個表,一個名為 CUSTOMERS 表,另一個名為 ORDERS 表,如下所示 -
+----+----------+-----+-----------+----------+ | 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;
此處給定的條件可以是基於您的需求的任何給定表示式。
示例
考慮以下兩個表,一個名為 CUSTOMERS 表,另一個名為 ORDERS 表,如下所示 -
+----+----------+-----+-----------+----------+ | 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;
示例
考慮以下兩個表,一個名為 CUSTOMERS 表,另一個名為 ORDERS 表,如下所示 -
+----+----------+-----+-----------+----------+ | 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;
此處給定的條件可以是基於您的需求的任何給定表示式。
示例
考慮以下兩個表,一個名為 CUSTOMERS 表,另一個名為 ORDERS 表,如下所示 -
+----+----------+-----+-----------+----------+ | 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 子句可以是基於您的需求的任何給定表示式。
示例
考慮以下兩個表,一個名為 CUSTOMERS 表,另一個名為 ORDERS 表,如下所示 -
+----+----------+-----+-----------+----------+ | 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 | +----+----------+---------+