Zielony Smok - logo witryny

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.

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:

EMPLOYEE
LASTNAME DEPARTMENTID
Rafferty 31
Jones 33
Heisenberg 33
Robinson 34
Smith 34
Williams null
DEPARTMENT
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.