![]() |
Введение в запросы 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. Зачем так сделано, спросите вы – можно же писать прямо в этом столбце название производителя – бош или самсунг. Да, действительно можно. Но так не делают по двум основным причинам
Теперь давайте поговорим о 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 = 'Стиральная машина'Наглядно: ![]() Запрос на первый взгляд может показаться сложным, но если разобрать его построчно, то мы видим, что ничего такого и нет – просто добавляются еще таблицы по внешним ключам. Ну и в самой первой строке вы выбираем то, что нам нужно. Задачи к уроку
![]() Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда. ![]() |
© upread.ru 2013-2023 При перепечатке активная ссылка на сайт обязательна. |