На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Введение в запросы 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, базы данных, уроки





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


Что за папка .well-known?
Расчет возраста человека в годах на C#


© upread.ru 2013-2023
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.