3 заметки с тегом

SQL

Детально о JOIN в SQL

23 августа 2016, 15:56

Рассмотрим 7 типов join:

  1. INNER JOIN
  2. LEFT JOIN
  3. RIGHT JOIN
  4. FULL OUTER JOIN (в MySQL UNION)
  5. LEFT JOIN EXCLUDING INNER JOIN
  6. RIGHT JOIN EXCLUDING INNER JOIN
  7. 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 объединения данных из нескольких таблиц

5 октября 2015, 21:07

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;
JOIN   MySQL   SQL

Основы запросов SQL

4 октября 2015, 14:23

Итак, самые основные команды в 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 — функция, что возвращает длину строки, измеренную в символах.
Детально в документации

DISTINCT   MySQL   SELECT   SQL