Введение в запросы 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. Зачем так сделано, спросите вы – можно же писать прямо в этом столбце название производителя – бош или самсунг. Да, действительно можно. Но так не делают по двум основным причинам

  1. Чтобы изменять в одном месте. Вот, скажем, бош решит сменить свое название на бош электроникс. Тогда во всей таблице less_product придется менять это название. А тут поменяли в одном месте – в таблице производителей и все, везде уже будет другое.
  2. Нормализация. Если говорить по-простому – это упрощение, снижение объема информации. В базе данных число занимает меньше места, чем строка из нескольких символов. В базах с миллионами записей эта выгода очень заметна.
Ну и сами посудите: при наборе строки вы можете же ошибиться – ввести не Samsung,а Sansung – и потом при поиске пропустите товар. А вот при внешнем ключе вы не ошибетесь. JOIN

Теперь давайте поговорим о 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 = 'Стиральная машина'
Наглядно:



Запрос на первый взгляд может показаться сложным, но если разобрать его построчно, то мы видим, что ничего такого и нет – просто добавляются еще таблицы по внешним ключам. Ну и в самой первой строке вы выбираем то, что нам нужно.

Задачи к уроку
  1. Попробуйте самостоятельно написать такой запрос, который покажет все товары со всеми характеристиками одного производителя.
  2. Напишите код PHP, который выводит (echo) на страницу эти товары.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, sql, mysql, базы данных, уроки




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Выбор хостинга: некоторые хитрости
Урок 5. Конкатенация строк JavaScript
Фильтрация товаров на опенкарт без перезагрузки страницы