Apache Derby: złączenia (joins)
Złączenia to operacje pozwalające na łączenie wyników z dwu tabel.
Złączenia tabel
Poniżej przedstawiono klasyfikację złączeń występujących w bazach danych. Złączenia występujące w Apache Derby zapisano dużymi literami, stylem normalnym. Kursywą oznaczono złączenia nie występujące w Apache Derby, ale opisane we wpisach. Nazwy zapisane małymi literami mają znaczenie porządkowe. Klamry oznaczają elementy opcjonalne.
- join
Złączenia mogą być tworzone przy pomocy wyżej przedstawionych oznaczeń albo w inny sposób.
Złączenia mogą być wyrażeniami tablicowymi w klauzuli FROM
.
Złączenia moga też być tworzone przez testowanie równości w klauzuli WHERE
(na przykład: WHERE t1.col = t2.col
)
Złączenia zbiorów rzędów (rowset)
JoinRowSet
pozwala na tworzenie złączeń między dwoma zbiorami rzędów (rowset). Oferowane złączenia to:
- INNER_JOIN
- LEFT_OUTER_JOIN
- RIGHT_OUTER_JOIN
- FULL_JOIN
- CROSS_JOIN
Baza danych
Poniżej przedstawiam dwie tabele wzięte z domeny publicznej Wikipedii, które posłużą nam do pracy ze złączeniami. A oto te dane:
LASTNAME | DEPARTMENTID |
---|---|
Rafferty | 31 |
Jones | 33 |
Heisenberg | 33 |
Robinson | 34 |
Smith | 34 |
Williams | null |
DEPARTMENTID | DEPARTMENTNAME |
---|---|
31 | Sales |
33 | Engineering |
34 | Clerical |
35 | Marketing |
Skrypt zatrudnieni.sql
CREATE TABLE department(DepartmentID INT PRIMARY KEY NOT NULL, DepartmentName VARCHAR(20)); CREATE TABLE employee (LastName VARCHAR(20), DepartmentID INT REFERENCES department(DepartmentID)); INSERT INTO department VALUES (31, 'Sales'), (33, 'Engineering'), (34, 'Clerical'), (35, 'Marketing'); INSERT INTO employee VALUES ('Rafferty', 31), ('Jones', 33), ('Heisenberg', 33), ('Robinson', 34), ('Smith', 34), ('Williams', NULL);
Utworzenie bazy danych
package aderby.sqls.joins; import aderby.DerbyUtil; import java.sql.*; public class R116_CreateDB { private static final String baza = "C:/Przyklady/zatrudnieni_db"; private static final String skrypt = "aderby/src/resources/sqls/zatrudnieni.sql"; public static void main(String[] args) { DerbyUtil.startDerbyEngine(DerbyUtil.embdriver); Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true"); DerbyUtil.jdbcRunScript(skrypt, con); DerbyUtil.close(con); DerbyUtil.shutdownEmbeddedDB(baza); DerbyUtil.shutdownDerbyEngine(); } }
Po uruchomieniu klasy utworzona zostanie baza danych.
Sprawdzenie poprawności tabel
package aderby.sqls.joins; import aderby.DerbyUtil; import java.sql.*; public class R117_PrintResultSet { private static final String baza = "C:/Przyklady/zatrudnieni_db"; static final String selectsql1 = "SELECT * FROM employee"; static final String selectsql2 = "SELECT * FROM department"; public static void main(String[] args) { DerbyUtil.startDerbyEngine(DerbyUtil.embdriver); Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=false"); Statement stat = null; ResultSet rs = null; ResultSetMetaData rsmd; try { stat = con.createStatement(); rs = stat.executeQuery(selectsql1); rsmd = rs.getMetaData(); int cols = rsmd.getColumnCount(); while(rs.next()) { for(int i = 1; i <cols + 1; i++) { if(i<cols) { System.out.print(rs.getString(i) + ", "); } else{ System.out.print(rs.getString(i)); } } System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(rs); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownEmbeddedDB(baza); DerbyUtil.shutdownDerbyEngine(); } }
Po uruchomieniu klasy na konsoli zobaczymy pierwszą tabelę. Aby zobaczyć drugą należy uruchomić klasę dla 'selectsql2′.
Rafferty, 31 Jones, 33 Heisenberg, 33 Robinson, 34 Smith, 34 Williams, null
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java
może być potrzebne skreślenie niepotrzebnych wpisów.