tgoop.com/big_data_systems_analysis/77
Create:
Last Update:
Last Update:
Разгадка тайн соединения NULL-значений в SQL
Продолжим серию статей про особенности работы с #null
Одна из часто встречающихся проблем — непонимание как происходит JOIN таблиц с NULL-значениями. Давайте посмотрим на примерах.
Допустим у нас есть две таблицы:
user_names
us_id name
1 Илья
2 Ольга
3 Null
Null Null
user_roles
us_id role
1 admin
2 user
3 user
Null guest
Null Null
INNER JOIN
Строки, для которых нет совпадения в обеих таблицах, исключаются из результирующего набора. В том числе, если в столбце, по которому происходит соединение, встречаются значения с NULL, эти строки будут исключены из результата, так как два NULL нельзя сравнить между собой.
SELECT u.us_id, r.us_id, name, role
FROM user_names u
INNER JOIN user_roles r ON u.us_id = r.us_id;
Результат:
u.us_id r.ud_id name role
1 1 Илья admin
2 2 Ольга user
3 3 Null user
LEFT JOIN
Возвращает все записи из левой таблицы (users_name) и соответствующие записи из правой таблицы (users_role).
SELECT u.us_id, r.us_id, name, role
FROM user_names u
LEFT JOIN user_roles r ON u.us_id = r.us_id;
Результат:
u.us_id r.ud_id name role
1 1 Илья admin
2 2 Ольга user
3 3 Null user
Null Null Null Null
Здесь стоит отметить, что появившиеся Null в полях r.ud_id — не являются Null-значениями из таблицы users_role.
FULL JOIN
Возвращает все записи, включая совпадения в левой или правой таблице. Строки в любой из таблиц будут содержать NULL значения в столбцах из другой таблицы, в случае отсутствия совпадения по ключу.
SELECT u.us_id, r.us_id, name, role
FROM user_names u
FULL JOIN user_roles r ON u.us_id = r.us_id;
Результат:
u.us_id r.ud_id name role
1 1 Илья admin
2 2 Ольга user
3 3 Null user
Null Null Null Null
Null Null Null guest
Null Null Null Null
Обратим внимание, что строки с NULL NULL повторяются дважды, так как они не равны друг другу и их нельзя объединить.
#sql #null