Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpRlJn 276 of 322 menu
◀ ▶

Соединение связанных таблиц в Java

Когда данные разнесены по таблицам, для отчёта нужны поля с обеих сторон. INNER JOIN оставляет только те пары, где ключ ссылки совпал.

Выборка отделов и сотрудников с равенством идентификаторов выглядит так:

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { try (Connection connection = DriverManager.getConnection("jdbc:sqlite:join_staff.db")) { connection.createStatement().execute( "PRAGMA foreign_keys = ON" ); try (Statement statement = connection.createStatement()) { statement.execute( """ CREATE TABLE IF NOT EXISTS departments ( id INTEGER PRIMARY KEY, title TEXT NOT NULL ) """ ); statement.execute( """ CREATE TABLE IF NOT EXISTS staff ( id INTEGER PRIMARY KEY, dept_id INTEGER NOT NULL, full_name TEXT NOT NULL, FOREIGN KEY (dept_id) REFERENCES departments (id) ) """ ); } PreparedStatement dept = connection.prepareStatement( "INSERT INTO departments (title) VALUES (?)" ); dept.setString(1, "Support"); dept.executeUpdate(); PreparedStatement member = connection.prepareStatement( """ INSERT INTO staff (dept_id, full_name) VALUES (?, ?) """ ); member.setInt(1, 1); member.setString(2, "Alice Gray"); member.executeUpdate(); member.setInt(1, 1); member.setString(2, "Ben Holt"); member.executeUpdate(); try (Statement statement = connection.createStatement()) { ResultSet result = statement.executeQuery( """ SELECT s.full_name, d.title FROM staff s INNER JOIN departments d ON s.dept_id = d.id ORDER BY s.id """ ); while (result.next()) { System.out.println(result.getString("full_name")); System.out.println(result.getString("title")); } } } } }

Псевдонимы s и d сокращают имена столбцов. Фильтр по отделу задают в WHERE после соединения:

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { try (Connection connection = DriverManager.getConnection("jdbc:sqlite:join_filter.db")) { connection.createStatement().execute( "PRAGMA foreign_keys = ON" ); try (Statement statement = connection.createStatement()) { statement.execute( """ CREATE TABLE IF NOT EXISTS departments ( id INTEGER PRIMARY KEY, title TEXT NOT NULL ) """ ); statement.execute( """ CREATE TABLE IF NOT EXISTS staff ( id INTEGER PRIMARY KEY, dept_id INTEGER NOT NULL, full_name TEXT NOT NULL, FOREIGN KEY (dept_id) REFERENCES departments (id) ) """ ); } PreparedStatement dept = connection.prepareStatement( "INSERT INTO departments (title) VALUES (?)" ); dept.setString(1, "Support"); dept.executeUpdate(); dept.setString(1, "Archive"); dept.executeUpdate(); PreparedStatement member = connection.prepareStatement( """ INSERT INTO staff (dept_id, full_name) VALUES (?, ?) """ ); member.setInt(1, 1); member.setString(2, "Alice Gray"); member.executeUpdate(); member.setInt(1, 2); member.setString(2, "Cara Mint"); member.executeUpdate(); try (Statement statement = connection.createStatement()) { ResultSet result = statement.executeQuery( """ SELECT s.full_name FROM staff s INNER JOIN departments d ON s.dept_id = d.id WHERE d.title = 'Support' """ ); while (result.next()) { System.out.println(result.getString("full_name")); } } } } }

В join_staff.db добавьте отдел "Sales" и сотрудника в нём. Выведите имя и название отдела одной строкой на человека.

Создайте join_fleet.db с таблицами garages и vehicles. Выведите номер машины и код гаража для каждой пары.

В join_fleet.db оставьте в выводе только машины гаража с кодом "G-7".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить