Шпаргалка по SQL JOINs. Часть #2

SQL (Structured Query Language) — это язык для работы с базами данных. Позволяет выбирать данные и строить сложные отчеты. Сегодня SQL стал универсальным языком данных.

Алиасы (псевдонимы) столбцов и таблиц

Псевдонимы присваивают временные имена таблицам или столбцам в таблице.

cat.cat_idcat.c_namecat.mom_idcat.own_id
1Мурка51
2Снежка12
3Пушок22
4Барсик1NULL
owner.idowner.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_namecat_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_namemom_name
МурзикМурка
ПушокСнежка
БарсикМурка

Самосоединение NON-EQUI SELF JOIN

В условии ON можно использовать неравенства — например, чтобы вывести все уникальные пары строк.

cat.cat_idcat.c_namecat.mom_idcat.own_id
1Мурка51
2Снежка12
3Пушок22
4Барсик1NULL
toy.toy_idtoy.toy_nametoy.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_idtoy_acat_b_idtoy_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_namecat_nameowner_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
     LEFT JOIN owner AS o
     ON c.owner_id = o.id;
toy_namecat_nameowner_name
мячикМуркаИван
игрушкаМуркаИван
мячикПушокАнна
игрушкаБарсикNULL
SELECT t.toy_name,
       c.cat_name,
       o.name AS owner_name
FROM toy AS t
     LEFT JOIN cat AS c
     ON t.cat_id = c.cat_id
     LEFT JOIN owner AS o
     ON c.owner_id = o.id;
toy_namecat_nameowner_name
мячикМуркаИван
игрушкаМуркаИван
мячикПушокАнна
игрушкаБарсикNULL
бантикNULLNULL

JOIN с несколькими условиями

Вы можете задать несколько условий соединения, используя ключевое слово ON один раз и добавляя AND / OR столько раз, сколько нужно.

cat_idc_namemom_idown_idage
1Мурка5117
2Снежка1210
3Пушок225
4Барсик1NULL11
owner.idowner.nameowner.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
       ON c.owner_id = o.id
          AND c.age < o.age;
cat_nameown_namecat_ageown_age
МуркаИван1718
ПушокАнна510