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

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

Сделаем запрос, который достанет всех юзеров вместе с их городами. Для этого нужна команда LEFT JOIN:

Ее синтаксис выглядит следующим образом:

SELECT поля FROM имя_таблицы LEFT JOIN имя_связанной_таблицы ON условие_связи WHERE условие_выборки

Разберем отдельные части синтаксиса этой команды.

Поля

Так как выборка идет из нескольких таблиц, выборка всех полей через * не будет работать. Следующий запрос выберет поля только из основной таблицы, но не из связанной:

SELECT *

Чтобы данные выбирались из всех таблиц, перед * указывают имя таблицы для выборки:

SELECT users.*, cities.*

Либо перечисляют нужные поля с указанием имени таблицы перед ними:

SELECT users.name, cities.name

Эти два способа имеют проблему. Если поля в таблицах имеют одинаковые имена, в результате запроса произойдет конфликт имен и останется только одно поле, а второго не будет. В Java колонку читают через getString, и второе значение с тем же именем уже не достать.

Для решения проблемы конфликтные имена переименовывают через команду AS:

SELECT users.name, cities.name AS city_name

Связь

После команды ON указывают поля из двух таблиц, по которым осуществляется связь. В этом случае это поле id из таблицы с городами и поле city_id из таблицы с юзерами:

ON cities.id = users.city_id

Запрос

В итоге запрос, который достанет юзеров вместе с их городами, будет выглядеть следующим образом:

SELECT users.name, cities.name AS city_name FROM users LEFT JOIN cities ON cities.id = users.city_id

В Java эту строку передают в executeQuery. Колонку после AS читают по новому имени:

import java.sql.Connection; import java.sql.DriverManager; 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:getting_users.db")) { connection.createStatement().execute( "CREATE TABLE IF NOT EXISTS cities (id INTEGER PRIMARY KEY, name TEXT NOT NULL)" ); connection.createStatement().execute( "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, city_id INTEGER)" ); try (Statement statement = connection.createStatement()) { ResultSet result = statement.executeQuery( """ SELECT users.name, cities.name AS city_name FROM users LEFT JOIN cities ON cities.id = users.city_id """ ); while (result.next()) { System.out.println(result.getString("name")); System.out.println(result.getString("city_name")); } } } } }

Пусть есть таблица с товарами и таблица с их категориями. Напишите запрос, который достанет названия товаров вместе с их категориями.

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