Одно из самых больших преимуществ использования реляционных баз данных, таких как MySQL, заключается в том, что его реляционная структура позволяет легко хранить и запрашивать информацию в нескольких таблицах.
Давайте рассмотрим, как получить именно те данные, которые вам нужны, из нескольких таблиц базы данных, а также различные доступные соединения, которые позволяют получать именно те результаты, которые вам нужны.
Инициализировать образец базы данных
Это не обязательно, но если вы хотите следовать примерам из этой статьи, вы можете инициализировать образец базы данных локально с помощью следующих команд терминала:
git clone https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> ВЫБРАТЬ СЧЕТЧИК (*) ИЗ клиентов;
Вы должны получить результат, в котором указано, что в пределах 2000 строк клиенты стол.
По умолчанию / ВНУТРЕННЕЕ соединение
Соединение по умолчанию, используемое внутри Базы данных MySQL называется INNER join и является наиболее распространенным и прямым. Это соединение возвращает все записи, для которых есть совпадающие записи в обеих таблицах, и отклоняет все остальные записи.
Java предоставляет JDBC как часть Java SDK. В этой статье давайте рассмотрим детали подключения к базе данных MySQL и выполнения запросов к ней.
Например, если вы хотите видеть имя и фамилию клиента, а также сумму и дату заказа для всех заказов на сумму более 1000 долларов США, вы можете использовать следующий оператор SQL:
ВЫБРАТЬ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ИЗ
клиенты c, заказы o
КУДА
o.customer_id = c.id И o.amount> = 1000;
Несколько примечаний по поводу вышеуказанного запроса:
- Выбираются пять различных столбцов: три из таблицы клиентов и два из таблицы заказов.
- В предложении FROM определены две таблицы, но с суффиксами «c» и «o». Они просто определяют псевдонимы в SQL, могут быть чем угодно и используются для сокращения SQL-запроса.
- В o.customer_id = c.id является аспектом соединения запроса и обеспечивает правильную корреляцию между клиентами и заказами.
Другой и технически более верный с точки зрения синтаксиса способ написания того же запроса приведен ниже:
ВЫБРАТЬ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ИЗ
клиенты c INNER JOIN заказы o
НА
customer_id = c.id
КУДА
o.amount> = 1000;
Вышеупомянутый запрос, как правило, немного легче читать, поскольку вы можете легко увидеть соединение между таблицами клиентов и заказов. Тем не менее, по сути, эти два запроса одинаковы и будут производить одни и те же записи.
LEFT Присоединяется
Левое объединение вернет все записи из левой таблицы, которые также совпадают с записями из правой таблицы, и отклонит все остальные записи. Например, если вы хотите просмотреть общую сумму продаж для каждого продукта в базе данных, вы можете попробовать использовать такой запрос, как:
ВЫБРАТЬ
p.name, sum (item.amount) AS tamount
ИЗ
orders_items item LEFT JOIN products p
НА
item.product_id = p.id
ГРУППА ПО item.product_id ORDER BY tamount DESC
В результате получается красивый вид из двух столбцов, показывающий название продукта с общей суммой продаж и работающий, как ожидалось. Запрос прошел через все продукты в таблице orders_items, соединил их с записями в таблице продуктов и вернул общую сумму продаж каждого из них.
ВПРАВО присоединяется
Используя приведенный выше пример, обратите внимание на тот факт, что указанный выше запрос вернул только 19 записей, в то время как в базе данных всего 22 продукта. Это связано с тем, что запрос начинается с таблицы orders_items, а слева он присоединяется к таблице продуктов, и так как некоторые продукты никогда не были заказаны, в orders_items нет записей об этих продуктах. стол.
Что произойдет, если вы хотите получить список всех продуктов с суммами продаж, включая продукты, которые не были заказаны? Попробуйте выполнить правильное соединение со следующим запросом:
ВЫБРАТЬ
p.name, sum (item.amount) AS tamount
ИЗ
orders_items item ПРАВО ПРИСОЕДИНЯЙТЕСЬ к продуктам p
НА
item.product_id = p.id
ГРУППИРОВАТЬ ПО ИДЕНТИФИКАТОРУ ПОРЯДОК ПО ТАМУНАМ УДАЛ.
Это лучше, и теперь запрос возвращает полные 22 продукта, три из которых имеют количество ноль. Это связано с тем, что вместо использования orders_items в качестве основной таблицы, которая присоединяется к таблице продуктов, правое соединение переворачивает порядок и присоединяет таблицу продуктов к таблице orders_items.
Множественные соединения в запросе
Иногда вам необходимо объединить три или более таблиц вместе, чтобы получить определенный набор результатов.
Например, может быть, вам нужен список всех клиентов, которые приобрели микроволновую печь (идентификатор продукта №1), включая их имена и дату заказа. Для этого требуется SELECT для трех таблиц, что может быть выполнено с помощью двух объединений со следующим запросом:
ВЫБРАТЬ
c.first_name, c.last_name, o.amount, o.created_at
ИЗ
клиенты c INNER JOIN заказы o
НА
c.id = o.customer_id INNER JOIN orders_items item
НА
item.order_id = o.id
КУДА
item.product_id = 1 ЗАКАЗ ОТ o.created_at;
Этот запрос возвращает все 426 заказов микроволн и работает должным образом. Сначала он сопоставляет всех клиентов с их соответствующими заказами, а затем выполняет дальнейшие запросы, которые устанавливаются сопоставление всех заказов только с теми в таблице orders_items, которые содержат микроволновый продукт (id # 1).
Никогда не используйте подзапросы с предложениями IN
В качестве небольшого примечания: любой ценой вы всегда должны избегать использования подзапросов в своих SQL-запросах, таких как:
ВЫБЕРИТЕ first_name, last_name FROM клиентов, WHERE id IN (ВЫБЕРИТЕ customer_id из заказов, WHERE status = «одобрено» И количество <100);
Запросы, подобные приведенным выше, очень неэффективны, используют большое количество ресурсов, и их следует по возможности избегать. Вместо этого используйте правильные соединения, как описано в предыдущих разделах. Например, приведенный выше запрос следует переписать как:
ВЫБЕРИТЕ c.first_name, c.last_name ИЗ клиентов c LEFT JOIN заказы o ON o.customer_id = c.id ГДЕ o.status = 'одобрен' И o.amount <100;
Экономьте время с помощью SQL-соединений
Мы надеемся, что эта статья поможет вам показать мощь реляционных баз данных, таких как MySQL, и то, как создавать SQL запросы которые извлекают записи из нескольких таблиц в одном запросе с помощью объединений, что позволяет получить желаемые точные результаты.
Вы узнали о трех различных соединениях в SQL, как использовать псевдонимы для имен столбцов и таблиц, использовать несколько соединений в одном запросе и почему вам следует избегать подзапросов. Никогда больше не возитесь, пытаясь вручную скомпилировать разные наборы данных в один, и начните использовать объединения, чтобы произвести впечатление на своих коллег по работе и сэкономить время.
Google Docs - это офисный центр. С помощью этих надстроек вы можете сделать свои Google Документы красивыми и стильными.
- Программирование
- SQL
- база данных
Подписывайтесь на нашу новостную рассылку
Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!
Еще один шаг…!
Пожалуйста, подтвердите свой адрес электронной почты в электронном письме, которое мы вам только что отправили.