Кроме обычных простых запросов с простыми условиями язык SQL позволяет составлять довольно сложные выражения, на вил которых порой страшно смотреть, такими непонятными они выглядят. Однако такие запросы встречаются не очень часто, и следующий уровень сложности после обычного SELECT на мой взгляд идет команда JOIN. Давайте разберемся как с ней работать.
Для начала давайте посмотрим простейшие часто употребимые запросы.
SELECT COUNT(*) FROM table; //подсчет кол-ва записей SELECT * FROM table LIMIT 5,10; //начиная с 5-ой записи выберет 10 строк. чаще всего используется для постраничной навигации SELECT * FROM table ORDER BY num; //отсортирует все записи из таблицы по полю num SELECT * FROM table WHERE year='1990'; //выбрать запись/записи где значение year равно 1990 SELECT * FROM table WHERE name LIKE '%ova%'; //поиск в таблице имени в котором есть последовательность 'ova' SELECT DISTINCT name FROM table; //если есть повторяющиеся поля то они будут учтены только один раз SELECT * FROM name WHERE age IN (12,15,18); // выведет имена которым соответствуют поля с возрастом 12,15,18 SELECT MAX(age) FROM table; //MAX/MIN - выберет запись с максимальным или минимальным значением age
Теперь перейдем непосредственно к примерам JOIN:
Очень популярная задача где используется команда JOIN это объединение нескольких таблиц имеющий какой то общий признак. Рассмотрим пример. Допустим у нас есть две таблицы. В первой хранятся данные об имени и адресе юзера и также есть колонка user_id. Во второй колонке у нас также есть колонка user_id и колонка с домашним индексом юзера.
SELECT name, addres FROM table1 LEFT JOIN table2 ON table1.user_id=table2.user_id;
Чтобы было еще понятнее, то этот запрос можно переписать классическим образом:
SELECT table1.name, table1.addres, table2.index FROM table1, table2 WHERE table1.user_id = table2.user_id;
Таким образом можно получить данные из нескольких таблиц, а если есть дополнительное условие то допишем и его:
SELECT name, addres FROM table1 LEFT JOIN table2 ON table1.user_id=table2.user_id WHERE name = 'Вася';
Если окунуться в теорию, то добавим что есть следующие варианты JOIN:
Тут будет уместно нарисовать знаменитые кружочки:
INNER JOIN
возвращает пересечение двух множеств
SELECT t1.name, t2.city FROM Table1 t1 INNER JOIN Table2 t2 ON t1.key2 = t2.key2;
Отражением INNER JOIN является OUTER JOIN. Нам предоставлено три типа OUTER JOIN – FULL, LEFT и RIGHT. Слово OUTER писать не обязательно.
FULL JOIN
Объединяет два множества
FULL JOIN вернет ВСЕ записи из таблиц table и table2, без повторяющихся данных. Где данных нет, будет подставленно NULL.
LEFT JOIN
Возвращает данные из левой таблицы, а также данные из правой, которые пересекаются с левой.
Если данных из правой таблицы будет не хватать, то подставится NULL значение.
RIGHT JOIN – как вы наверное поняли, вернет все значения из правой таблицы и пересекающиеся данные из левой.
Исключения
Если нам понадобятся данные из первой таблицы для которых нет данных в правой, то нам просто надо добавить условие WHERE
SELECT t1.name, t2.city FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.key2 = t2.key2 WHERE t2.key2 IS NULL;
Множественные JOIN
С помощью JOIN можно соединить не только 2 таблицы, а сколько надо. Если вам надо соединить 2 таблицы, то потребуется 2 команды JOIN. Но не стоит впадать в крайность и объединять кучу таблиц, все это ощутимо скажется на производительности, поэтому иногда лучше выполнить несколько подзапросов. Пример соединения трех таблиц:
SELECT t1.Name, t2.City, t3.Profession FROM Table1 t1 INNER JOIN Table2 t2 ON t1.key2 = t2.key2 INNER JOIN Table3 t3 ON t1.key3 = t3.key3;
Что же, надеюсь перечисленные простые примеры JOIN помогли вам разобраться с этим оператором.