HSQLDB - Birleştirmeler

Tek bir sorgu kullanarak birden çok tablodan veri alma gereksinimi olduğunda, RDBMS'den JOINS'i kullanabilirsiniz. Tek SQL sorgunuzda birden çok tablo kullanabilirsiniz. HSQLDB'ye katılma eylemi, iki veya daha fazla tabloyu tek bir tabloda parçalamak anlamına gelir.

Aşağıdaki Müşteriler ve Siparişler tablolarını inceleyin.

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

Şimdi müşterilerin verilerini ve ilgili müşterinin verdiği sipariş miktarını almaya çalışalım. Bu, kayıt verilerini hem müşterilerden hem de siparişler tablosundan aldığımız anlamına gelir. Bunu HSQLDB'deki JOINS konseptini kullanarak başarabiliriz. Aynı için JOIN sorgusu aşağıdadır.

SELECT ID, NAME, AGE, AMOUNT FROM CUSTOMERS, ORDERS WHERE CUSTOMERS.ID =
ORDERS.CUSTOMER_ID;

Yukarıdaki sorguyu yaptıktan sonra aşağıdaki çıktıyı alacaksınız.

+----+----------+-----+--------+
| ID |   NAME   | AGE | AMOUNT |
+----+----------+-----+--------+
|  3 | kaushik  |  23 |  3000  |
|  3 | kaushik  |  23 |  1500  |
|  2 | Khilan   |  25 |  1560  |
|  4 | Chaitali |  25 |  2060  |
+----+----------+-----+--------+

JOIN Türleri

HSQLDB'de farklı tipte birleştirme mevcuttur.

  • INNER JOIN - Her iki tabloda da eşleşme olduğunda satırları döndürür.

  • LEFT JOIN - Sağ tabloda hiç eşleşme olmasa bile, soldaki tablodaki tüm satırları döndürür.

  • RIGHT JOIN - Soldaki tabloda eşleşme olmasa bile, sağ tablodaki tüm satırları döndürür.

  • FULL JOIN - Tablolardan birinde eşleşme olduğunda satırları döndürür.

  • SELF JOIN - Bir tabloyu, tablo iki tablodaymış gibi kendisine birleştirmek için kullanılır, SQL deyimindeki en az bir tabloyu geçici olarak yeniden adlandırır.

İç birleşim

En sık kullanılan ve en önemlisi INNER JOIN'dir. Aynı zamanda EQUIJOIN olarak da anılır.

INNER JOIN, iki tablonun (tablo1 ve tablo2) sütun değerlerini birleştirme koşuluna göre birleştirerek yeni bir sonuç tablosu oluşturur. Sorgu, birleştirme koşulunu karşılayan tüm satır çiftlerini bulmak için tablo1'in her satırını her tablo2 satırıyla karşılaştırır. Birleştirme koşulu karşılandığında, eşleşen her A ve B satır çiftinin sütun değerleri bir sonuç satırında birleştirilir.

Sözdizimi

INNER JOIN'in temel sözdizimi aşağıdaki gibidir.

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

Misal

Aşağıdaki, biri MÜŞTERİLER tablosu ve diğeri SİPARİŞLER tablosu başlıklı iki tabloyu düşünün:

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

Şimdi, INNER JOIN sorgusunu kullanarak bu iki tabloyu aşağıdaki gibi birleştirelim -

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Yukarıdaki sorguyu yaptıktan sonra aşağıdaki çıktıyı alacaksınız.

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

Sol yönden katılım

HSQLDB LEFT JOIN, sağ tabloda eşleşme olmasa bile, soldaki tablodaki tüm satırları döndürür. Bunun anlamı, ON yan tümcesi sağ tablodaki 0 ​​(sıfır) kayıtla eşleşirse, birleşim sonuçta yine de bir satır döndürür, ancak sağ tablodaki her sütunda NULL olur.

Bu, bir sol birleştirmenin sol tablodaki tüm değerleri, artı sağ tablodaki eşleşen değerleri veya eşleşen birleştirme koşulu olmaması durumunda NULL döndürdüğü anlamına gelir.

Sözdizimi

LEFT JOIN'in temel sözdizimi aşağıdaki gibidir -

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

Burada verilen koşul, gereksiniminize göre verilen herhangi bir ifade olabilir.

Misal

Aşağıdaki, biri MÜŞTERİLER tablosu ve diğeri SİPARİŞLER tablosu başlıklı iki tabloyu düşünün:

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

Şimdi bu iki tabloyu LEFT JOIN sorgusunu kullanarak aşağıdaki gibi birleştirelim -

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Yukarıdaki sorguyu gerçekleştirdikten sonra, aşağıdaki çıktıyı alacaksınız -

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

Sağ Katıl

HSQLDB RIGHT JOIN, soldaki tabloda hiç eşleşme olmasa bile, sağ tablodaki tüm satırları döndürür. Bu, ON yan tümcesi soldaki tablodaki 0 ​​(sıfır) kayıtla eşleşirse, birleşimin sonuçta yine de bir satır döndüreceği, ancak soldaki tablodaki her sütunda NULL olduğu anlamına gelir.

Bu, bir sağ birleştirmenin sağ tablodaki tüm değerleri, artı soldaki tablodan eşleşen değerleri veya eşleşen birleştirme yükleminin olmaması durumunda NULL döndürdüğü anlamına gelir.

Sözdizimi

Temel sözdizimi RIGHT JOIN aşağıdaki gibidir -

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

Misal

Aşağıdaki, biri MÜŞTERİLER tablosu ve diğeri SİPARİŞLER tablosu başlıklı iki tabloyu düşünün:

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

Şimdi bu iki tabloyu RIGHT JOIN sorgusunu kullanarak aşağıdaki gibi birleştirelim -

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Yukarıdaki sorguyu yaptıktan sonra aşağıdaki sonucu alacaksınız.

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

Tam Katılma

HSQLDB FULL JOIN, hem sol hem de sağ dış birleştirmelerin sonuçlarını birleştirir.

Birleştirilen tablo, her iki tablodaki tüm kayıtları içerecek ve her iki taraftaki eksik eşleşmeler için NULL dolduracaktır.

Sözdizimi

FULL JOIN'in temel sözdizimi aşağıdaki gibidir -

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

Burada verilen koşul, gereksiniminize göre verilen herhangi bir ifade olabilir.

Misal

Aşağıdaki, biri MÜŞTERİLER tablosu ve diğeri SİPARİŞLER tablosu başlıklı iki tabloyu düşünün:

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

Şimdi bu iki tabloyu FULL JOIN sorgusunu kullanarak aşağıdaki gibi birleştirelim -

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Yukarıdaki sorguyu yaptıktan sonra aşağıdaki sonucu alacaksınız.

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

Kendinden Katılma

SQL SELF JOIN, bir tabloyu, tablo iki tablodaymış gibi kendisine birleştirmek için kullanılır, SQL deyimindeki en az bir tabloyu geçici olarak yeniden adlandırır.

Sözdizimi

SELF JOIN'in temel sözdizimi aşağıdaki gibidir -

SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;

Burada, WHERE yan tümcesi, gereksiniminize göre verilen herhangi bir ifade olabilir.

Misal

Aşağıdaki, biri MÜŞTERİLER tablosu ve diğeri SİPARİŞLER tablosu başlıklı iki tabloyu düşünün:

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

Şimdi, SELF JOIN sorgusunu kullanarak bu tabloyu aşağıdaki gibi birleştirelim -

SELECT a.ID, b.NAME, a.SALARY FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY > b.SALARY;

Yukarıdaki sorguyu gerçekleştirdikten sonra, aşağıdaki çıktıyı alacaksınız -

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