Изучаем SQL. №18. SQL соединения JOIN

Изучаем SQL
Мы с вами рассмотрели как устроены внешние ключи и связи между таблицами. Теперь пришел логический черед научиться делать выборку информации из этих таблиц. В предыдущих уроках я показывал универсальный вариант с LEFT JOIN, но он не единственный и не самый простой. Так что гоу изучать)).
Начнем с теории.
Чтобы выбирать информацию из нескольких таблиц, существует команда JOIN и имеет несколько вариаций, которые мы и рассмотрим в сегодняшнем уроке.
Внутреннее соединение

    • Cross Joins (Перекрестное соединение)
поле CROSS JOIN поле
    • Natural Joins (Естественное соединений)
поле NATURAL JOIN поле
    • Inner Joins (Внутреннее соединений)
поле INNER JOIN поле ON условие

Внешнее соединение

    • Left (Outer) Joins (Левое (внешнее) соединение)
поле LEFT JOIN поле ON условие
    • Right (Outer) Joins (Правое (внешнее) соединение)
поле RIGHT JOIN поле ON условие

Прежде чем мы начнем, напоминаю, что у меня есть форум, где можно обсудить как данную статью, так и всю тему баз данных в целом.
Вот ссылка на форум: http://forum.slusar.su/viewforum.php?f=25

Создадим базу библиотеки(bibl). У нас будет две таблички Аторы(author: id_author,name ) и Книги(book: id,name,id_author).

CREATE DATABASE bibl;
USE bibl;
CREATE TABLE author(id_author INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50));
CREATE TABLE book(id_book INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(250),id_author INT,FOREIGN KEY(id_author) REFERENCES author(id_author));

Наполняем таблицу авторов:

INSERT INTO author (name) VALUES ('Пелевин');
INSERT INTO author (name) VALUES ('Желязны');
INSERT INTO author (name) VALUES ('Кастанеда');
INSERT INTO author (name) VALUES ('Лукьяненко');
SELECT * FROM author;

И таблицу Книг:

INSERT INTO book (name,id_author) VALUES ('Генерация П',1);
INSERT INTO book (name,id_author) VALUES ('Владения Хаоса',2);
INSERT INTO book (name,id_author) VALUES ('Ночной Дозор',4);
INSERT INTO book (name,id_author) VALUES ('Сказки о силе',4);
SELECT * FROM book;

Вот теперь можем приступать к экспериментам с запросами.
CROSS JOIN
Результат использования CROSS JOIN, такой же, как если бы вы вызвали две таблицы через запятую без всяких JOINов. Такой тип соединения практически не используется, поскольку не удобен.

SELECT b.name, a.name FROM book b CROSS JOIN author a;
+----------------+------------+
| name           | name       |
+----------------+------------+
| Генерация П    | Пелевин    |
| Владения Хаоса | Пелевин    |
| Ночной Дозор   | Пелевин    |
| Сказки о силе  | Пелевин    |
| Генерация П    | Желязны    |
| Владения Хаоса | Желязны    |
| Ночной Дозор   | Желязны    |
| Сказки о силе  | Желязны    |
| Генерация П    | Кастанеда  |
| Владения Хаоса | Кастанеда  |
| Ночной Дозор   | Кастанеда  |
| Сказки о силе  | Кастанеда  |
| Генерация П    | Лукьяненко |
| Владения Хаоса | Лукьяненко |
| Ночной Дозор   | Лукьяненко |
| Сказки о силе  | Лукьяненко |
+----------------+------------+

NATURAL JOIN
Для использования NATURAL JOIN имя внешнего ключа должно совпадать с именем ключа на который он ссылается. Именно поэтому id автора я указал как id_author, как и внешний ключ в таблице book.

Но пример можете посмотреть тут http://slusar.su/izuchaem-sql-n19-sql-views-ili-predstavleniya/

INNER JOIN
Используется чаще всего. Результатом запроса является вывод записей из обеих таблиц отвечающих параметру запроса.

SELECT b.name, a.name FROM book b INNER JOIN author a ON b.id_author = a.id_author;
+----------------+------------+
| name           | name       |
+----------------+------------+
| Генерация П    | Пелевин    |
| Владения Хаоса | Желязны    |
| Ночной Дозор   | Лукьяненко |
| Сказки о силе  | Кастанеда  |
+----------------+------------+

LEFT JOIN
Функция USING() служит для указания поля которое будем сравнивать. Ее можно использовать, если имя внешнего ключа совпадает с именем на которое он ссылается, как в нашем случае:

SELECT b.name, a.name FROM book b LEFT JOIN author a USING(id_author);
+----------------+------------+
| name           | name       |
+----------------+------------+
| Генерация П    | Пелевин    |
| Владения Хаоса | Желязны    |
| Сказки о силе  | Кастанеда  |
| Ночной Дозор   | Лукьяненко |
+----------------+------------+

Если же имена не совпадают, тогда используйте такой запрос, с таким же результатом:

SELECT b.name, a.name FROM book b LEFT JOIN author a ON b.id_author = a.id_author;

LEFT — это то, что стоит до слова LEFT.Выходит, что мы получаем все значения из таблички book, не зависимо есть ли у них автор или нет. То же самое можно проделать с авторами заменив LEFT на RIGHT

SELECT b.name, a.name FROM book b RIGHT JOIN author a ON b.id_author = a.id_author;

Хотите действительно уникальный сайт, который будет отвечать вашим ожиданиям на 100%? Тогда никаких самоделок. Отличная веб студия решит все задачи по реализации проекта сайта, поставленные перед ней.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

×