SQL (Structured Query Language) — это язык для работы с базами данных. Позволяет выбирать данные и строить сложные отчеты. Сегодня SQL стал универсальным языком данных.
Алиасы (псевдонимы) столбцов и таблиц
Псевдонимы присваивают временные имена таблицам или столбцам в таблице.
cat.cat_id
cat.c_name
cat.mom_id
cat.own_id
1
Мурка
5
1
2
Снежка
1
2
3
Пушок
2
2
4
Барсик
1
NULL
owner.id
owner.name
1
Иван
2
Анна
Псевдоним столбца переименовывает столбец и / или таблицу в результате запроса. Если вы задали псевдоним таблицы, вы должны использовать его вместо оригинального имени таблицы во всех частях запроса.
SELECT o.name AS owner_name,
c.c_name AS cat_name
FROM cat AS c
JOIN owner AS o
ON c.owner_id = o.id
owner_name
cat_name
Иван
Мурка
Анна
Снежка
Анна
Пушок
Самосоединение SELF JOIN
Вы можете соединить таблицу с самой собой — например, чтобы отобразить отношения «родитель-потомок».
Каждому вхождению таблицы должен быть присвоен уникальный псевдоним. Обращение к любому столбцу должно содержать соответствующий псевдоним таблицы.
SELECT ch.c_name AS child_name,
mom.c_name AS mom_name
FROM cat AS ch
JOIN cat AS mom
ON ch.mom_id = mom.cat_id
child_name
mom_name
Мурзик
Мурка
Пушок
Снежка
Барсик
Мурка
Самосоединение NON-EQUI SELF JOIN
В условии ON можно использовать неравенства — например, чтобы вывести все уникальные пары строк.
cat.cat_id
cat.c_name
cat.mom_id
cat.own_id
1
Мурка
5
1
2
Снежка
1
2
3
Пушок
2
2
4
Барсик
1
NULL
toy.toy_id
toy.toy_name
toy.cat_id
3
игрушка
1
5
мячик
1
1
мячик
3
4
игрушка
4
2
бантик
NULL
SELECT a.cat_id AS cat_a_id,
a.toy_name AS toy_a,
b.cat_id AS cat_b_id,
b.toy_name AS toy_b
FROM toy AS a
JOIN toy AS b
ON a.cat_id < b.cat_id;
cat_a_id
toy_a
cat_b_id
toy_b
1
игрушка
3
мячик
1
мячик
3
мячик
1
игрушка
4
игрушка
1
мячик
4
игрушка
3
мячик
4
игрушка
Множественные соединения JOINS
Вы можете соединять более двух таблиц. Сначала соединяются две таблицы, затем третья таблица присоединяется к результату предыдущего соединения.
SELECT t.toy_name,
c.cat_name,
o.name AS owner_name
FROM toy AS t
JOIN cat AS c
ON t.cat_id = c.cat_id
JOIN owner AS o
ON c.owner_id = o.id;
toy_name
cat_name
owner_name
мячик
Мурка
Иван
игрушка
Мурка
Иван
мячик
Пушок
Анна
SELECT t.toy_name,
c.cat_name,
o.name AS owner_name
FROM toy AS t
JOIN cat AS c
ON t.cat_id = c.cat_id
LEFTJOIN owner AS o
ON c.owner_id = o.id;
toy_name
cat_name
owner_name
мячик
Мурка
Иван
игрушка
Мурка
Иван
мячик
Пушок
Анна
игрушка
Барсик
NULL
SELECT t.toy_name,
c.cat_name,
o.name AS owner_name
FROM toy AS t
LEFTJOIN cat AS c
ON t.cat_id = c.cat_id
LEFTJOIN owner AS o
ON c.owner_id = o.id;
toy_name
cat_name
owner_name
мячик
Мурка
Иван
игрушка
Мурка
Иван
мячик
Пушок
Анна
игрушка
Барсик
NULL
бантик
NULL
NULL
JOIN с несколькими условиями
Вы можете задать несколько условий соединения, используя ключевое слово ON один раз и добавляя AND / OR столько раз, сколько нужно.
cat_id
c_name
mom_id
own_id
age
1
Мурка
5
1
17
2
Снежка
1
2
10
3
Пушок
2
2
5
4
Барсик
1
NULL
11
owner.id
owner.name
owner.age
1
Иван
18
2
Анна
10
SELECT c.c_name AS cat_name,
o.name AS own_name,
c.age AS cat_age,
o.age AS own_age
FROM cat AS c
JOIN owner AS o
ONc.owner_id = o.idANDc.age < o.age;