SQL
Детально о JOIN в SQL
Рассмотрим 7 типов join:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN (в MySQL UNION)
- LEFT JOIN EXCLUDING INNER JOIN
- RIGHT JOIN EXCLUDING INNER JOIN
- OUTER JOIN EXCLUDING INNER JOIN
Наглядно посмотрим в чем разница.
А теперь подробно о каждом из них.
Inner JOIN
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
Left JOIN
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
Right JOIN
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
Outer JOIN
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
Left Excluding JOIN
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Right Excluding JOIN
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL
Outer Excluding JOIN
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
А теперь все это на примере 2 простых таблиц из БД:
TABLE_A
PK Value
---- ----------
1 FOX
2 COP
3 TAXI
6 WASHINGTON
7 DELL
5 ARIZONA
4 LINCOLN
10 LUCENT
TABLE_B
PK Value
---- ----------
1 TROT
2 CAR
3 CAB
6 MONUMENT
7 PC
8 MICROSOFT
9 APPLE
11 SCOTCH
-- INNER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
1 FOX TROT 1
2 COP CAR 2
3 TAXI CAB 3
6 WASHINGTON MONUMENT 6
7 DELL PC 7
(5 row(s) affected)
-- LEFT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
1 FOX TROT 1
2 COP CAR 2
3 TAXI CAB 3
4 LINCOLN NULL NULL
5 ARIZONA NULL NULL
6 WASHINGTON MONUMENT 6
7 DELL PC 7
10 LUCENT NULL NULL
(8 row(s) affected)
-- RIGHT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
1 FOX TROT 1
2 COP CAR 2
3 TAXI CAB 3
6 WASHINGTON MONUMENT 6
7 DELL PC 7
NULL NULL MICROSOFT 8
NULL NULL APPLE 9
NULL NULL SCOTCH 11
(8 row(s) affected)
-- OUTER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
1 FOX TROT 1
2 COP CAR 2
3 TAXI CAB 3
6 WASHINGTON MONUMENT 6
7 DELL PC 7
NULL NULL MICROSOFT 8
NULL NULL APPLE 9
NULL NULL SCOTCH 11
5 ARIZONA NULL NULL
4 LINCOLN NULL NULL
10 LUCENT NULL NULL
(11 row(s) affected)
-- LEFT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
4 LINCOLN NULL NULL
5 ARIZONA NULL NULL
10 LUCENT NULL NULL
(3 row(s) affected)
-- RIGHT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
NULL NULL MICROSOFT 8
NULL NULL APPLE 9
NULL NULL SCOTCH 11
(3 row(s) affected)
-- OUTER EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL
A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
NULL NULL MICROSOFT 8
NULL NULL APPLE 9
NULL NULL SCOTCH 11
5 ARIZONA NULL NULL
4 LINCOLN NULL NULL
10 LUCENT NULL NULL
(6 row(s) affected)
SQL объединения данных из нескольких таблиц
Primary Key представляет собой столбец, который служит как уникальный идентификатор для строки в таблице. Значения в этом столбце должны быть уникальными и не может быть NULL.
Foreign Key представляет собой столбец, который содержит первичный ключ другой таблицы в базе данных. Он используется для идентификации конкретной строки в указанной таблице.
JOIN используются в SQL для объединения данных из нескольких таблиц.
INNER JOIN результатом будет объединения строк из разных таблиц, если условие соединения верно.
LEFT OUTER JOIN вернется каждую строку в левой таблице, и если условие соединения не выполняется, NULL значения используются для заполнения столбцов из правой таблицы.
AS это ключевое слово в SQL, что позволяет переименовать столбец или таблицу в наборе результатов, используя псевдоним.
Примеры запросов:
SELECT * FROM albums JOIN artists ON albums.artist_id = artists.id;
SELECT * FROM albums LEFT JOIN artists ON albums.artist_id = artists.id;
SELECT
albums.name AS 'Album',
albums.year,
artists.name AS 'Artist'
FROM albums JOIN artists ON albums.artist_id = artists.id WHERE albums.year > 2010;
Основы запросов SQL
Итак, самые основные команды в SQL:
CREATE TABLE — Создать таблицу
INSERT INTO — добавить поле в таблицу
// Вставить в таблицу, если её там до сих пор нет, поле login - уникальный
INSERT IGNORE INTO `users` SET `login` = 'myname', `password` = 'mypassword';
// Вставить, а если уже есть - изменить.
INSERT INTO users(login, password) VALUES('login', 'password') ON DUPLICATE KEY UPDATE password='password';
REPLACE INTO users (`login`, `password`) VALUES('login', 'password');
SELECT — запросить информацию с таблицы
UPDATE — редактировать записи в таблице
UPDATE `tbl_name` SET `items1` = 1, `items2` = 2 WHERE `published` = 1 AND `id` = id;
ALTER TABLE — внести изменения в существующую таблицу
DELETE FROM — удалить поля с таблицы.
Остановимся более подробно на следующих командах:
SELECT — является основным инструментом, когда вы хотите, запросить информацию из базы данных.
SELECT DISTINCT — выбрать уникальные значения
WHERE — команда, которая позволяет фильтровать результаты запроса в зависимости от условий, которые вы укажете.
LIKE и BETWEEN специальные операторы, которые могут быть использованы в предложении WHERE
AND и OR специальные операторы, которые можно использовать с тем, где для фильтрации запроса на двух или более условий.
ORDER BY — позволяет сортировать результаты запроса в восходящем или нисходящем порядке.
LIMIT позволяет указать максимальное число строк, которые вернет запрос. Это особенно важно в больших таблиц, которые имеют тысячи или даже миллионы строк.
Примеры запросов:
SELECT * FROM movies WHERE imdb_rating >= 8;
= равно
!= не равно
> больше чем
< меньше чем
>= больше или равно
<= меньше или равно
<br>
SELECT * FROM movies WHERE name LIKE 'Se_en';
_ означает любой 1 элемент
SELECT * FROM movies WHERE name LIKE 'a%';
% — групповой символ, который соответствует нулю или другим недостающим букв в шаблоне.
%a или %А регистр-независим
SELECT * FROM movies WHERE name BETWEEN 'A' AND 'J';
BETWEEN — Между буквами, цифрами, датами
SELECT * FROM movies WHERE genre = 'comedy' OR year < 1980;
SELECT * FROM movies WHERE genre = 'comedy' AND year < 1980;
OR и AND логические «или» и «и»
SELECT * FROM movies ORDER BY imdb_rating DESC;
ORDER BY — ASC или DESC — вывод от А до Я или от Я до А.
SELECT COUNT(*) FROM apps;
COUNT () — функция, что принимает имя столбца в качестве аргумента и подсчитывает количество строк, в которых столбец NOT NULL.
SELECT price, COUNT(*) FROM apps GROUP BY price;
SELECT category, SUM(downloads) FROM apps GROUP BY category;
GROUP BY — фича в SQL, которую используют только с агрегатных функциях. Она используется в сотрудничестве с функцией SELECT, чтобы организовать одинаковые данные в группах. В результате получим набор, что состоит из двух колонок. По каждой цене будет выведено количество приложений.
SELECT SUM(downloads) FROM apps;
SUM(downloads) — функция в SQL выводит сумму всех значений для указанной колонки
SELECT MAX(downloads) FROM apps;
SELECT MIN(downloads) FROM apps;
MAX () функция, которая принимает имя столбца в качестве аргумента и возвращает наибольшее значение в этом столбце.
MIN () аналогичная функция, только возвращает наименьшее значение в этом столобце
SELECT AVG(downloads) FROM apps;
AVG() — функция, которая высчитывает среднее число.
SELECT price, ROUND(AVG(downloads), 2) FROM apps GROUP BY price;
ROUND() — функция округляет значение.
SELECT * FROM table WHERE CHAR_LENGTH(phone) < 10
CHAR_LENGTH — функция, что возвращает длину строки, измеренную в символах.
Детально в документации