Введение в запросы SQL: SELECT и JOIN на примерах и простыми словами
Запросы-запросы-запросы… На множестве позиций для собеседования на программиста в качестве необходимого требования указывают составление MySQL-запросов. Для программиста PHP, Java,C# - везде часто надо уметь работать с базами данных. А так как большинство баз сейчас реляционные и для управления ими используется язык SQL, то необходимо учиться писать запросы. На самом деле это не так уж сложно, давайте разберемся, рассмотрим самые основы.
Запросы SELECT
Это самый первый и самый распространенный тип запросов – выборка из базы данных (таблицы). Запрос в самом простом случае выглядит так SELECT поля_которые_выбираем FROM таблица_откуда_выбираем WHERE условие_выбора Например. Вот есть у нас такая таблица:
Здесь мы используем запрос
SELECT * FROM `less_manufacturer`А если нам надо выбрать производителя по названию, например «BEKO», то используем вот такой запрос
SELECT * FROM `less_manufacturer` WHERE `name` = 'BEKO'
Обратите внимание на звездочку после SELECT – это значит, что мы выбираем все поля в таблице. А если нам надо выбрать одно поле, например, идентификатор производителя, то и подставляем его вместо звездочки. Вот так:
SELECT `id` FROM `less_manufacturer` WHERE `name` = 'BEKO'
Что нужно понимать. Результат запроса SELECT – это всегда таблица. Запомните – в результате мы получаем таблицу, с которой уже можно работать. Иногда это будет одна строка, но даже строка – это все равно таблица из одной строки. Или даже одно поле – но одно поле это тоже таблица. Запомните, в будущем это очень пригодится для понимания.
Нормализация и внешний ключ
Теперь давайте посмотрим на другую таблицу.
SELECT * FROM `less_product`
Обратите внимание на последний столбец - manufacturer_id – в нем числа – идентификаторы предыдущей таблицы less_manufacturer. Зачем так сделано, спросите вы – можно же писать прямо в этом столбце название производителя – бош или самсунг. Да, действительно можно. Но так не делают по двум основным причинам
- Чтобы изменять в одном месте. Вот, скажем, бош решит сменить свое название на бош электроникс. Тогда во всей таблице less_product придется менять это название. А тут поменяли в одном месте – в таблице производителей и все, везде уже будет другое.
- Нормализация. Если говорить по-простому – это упрощение, снижение объема информации. В базе данных число занимает меньше места, чем строка из нескольких символов. В базах с миллионами записей эта выгода очень заметна.
Теперь давайте поговорим о JOIN-ах. Поставим задачу: нам требуется выбрать все товары, у которых id производителя равно 2. Ну например мы получили их в запросе и надо вывести на странице производителя в интернет-магазине. Сам запрос будет простым
SELECT * FROM `less_product` WHERE `manufacturer_id` = 2
А теперь нам надо получит еще и название производителя. Тут на помощь и придет JOIN. Их два вида: LEFT, RIGHT и INNER. Чуть позже рассмотрим отличие, пока просто LEFT пусть будет.
Итак, структура запроса с JOIN такая:
SELECT поля_которые_выбираем FROM таблица1_откуда_выбираем LEFT JOIN таблица2_присоединяемая_откуда_выбираем ON таблица2.поле_таблицы2 = таблица1.поле_таблицы1 WHERE условие_выбораНепонятно? Давайте посмотрим пример:
SELECT less_product.id, less_product.name, less_manufacturer.name AS manufacturer_name FROM `less_product` LEFT JOIN less_manufacturer ON less_manufacturer.id = less_product.manufacturer_id WHERE `manufacturer_id` = 2
Посмотрите внимательно на код. Самое главное тут после ON мы пишем условие объединения таблиц. В данном случае из таблицы less_manufacturer берется поле id, а из таблицы less_product – поле manufacturer_id – и по этим полям объединяются в одну таблицу.
Рассмотрим еще пример.Добавим в нашу базу данных еще таблицы - less_option и less_product_option. Первая будет хранить характеристики (опции) вообще:
А вторая эти опции применительно к товарам:
Примечание: было бы более правильно еще добавить, например, единицы измерения или виды опций, но для простоты мы все же ограничимся пока такими таблицами.
Итак, давайте теперь с помощью JOIN вытащим из нашей базы данных все о стиральной машине номер 1. Запрос будет вот примерно такой:
SELECT less_product.id, less_product.name, less_manufacturer.name AS manufacturer_name, less_option.name AS option_name, less_product_option.value_option FROM `less_product` LEFT JOIN less_manufacturer ON less_manufacturer.id = less_product.manufacturer_id LEFT JOIN less_product_option ON less_product_option.product_id = less_product.id LEFT JOIN less_option ON less_option.id = less_product_option.option_id WHERE less_product.name = 'Стиральная машина'Наглядно:
Запрос на первый взгляд может показаться сложным, но если разобрать его построчно, то мы видим, что ничего такого и нет – просто добавляются еще таблицы по внешним ключам. Ну и в самой первой строке вы выбираем то, что нам нужно.
Задачи к уроку
- Попробуйте самостоятельно написать такой запрос, который покажет все товары со всеми характеристиками одного производителя.
- Напишите код PHP, который выводит (echo) на страницу эти товары.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.