среда, 31 июля 2013 г.

Стандартный синтаксис объединений ANSI

Нашел еще одну статью про базы данных в черновиках у себя (помнил что эта статья у меня была, но не мог найти). Теперь ее нашел, поэтому обязательно решил опубликовать ее сегодня, по традиции — в последние дни месяцев рассказываю про PL/SQL или про базы данных. Сегодня — рассказ про БД.

А решил я рассказать о стандартном синтаксисе объединений ANSI, который ввели в Oracle 9 (до этого использовали их внутренний оператор для объединений +). То, что будет описано ниже – должно поддерживаться во всех СУБД, которые поддерживают стандарт ANSI.

По стандарту необходимо в запросе явно указывать какой тип объединения вы планируете использовать. А также – обязательно нужно указывать поля, по которым произойдет объединение (если поля не указать – то будет выведена ошибка), поэтому программист избавляется от неявного декартова произведения. 

Внутренние объединения: 

Посмотрите пример здесь. Переделав его под ANSI-синтаксис, я получил следующий запрос: 

   SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.id1 = t2.id1 

Результат, естественно, такой же, как и был раньше. Если не указать ON – запрос не отработает и вы получите ошибку ORA-00905. То есть, тип соединения нужно указывать в блоке from. 

Последнее условие (начиная с ON) можно заменить на USING(id1), с помощью using мы говорим базе о том, что объединяться будут столбцы с одинаковыми именами. 

Внешние объединения: 

Левое соединение (left join), выведутся ВСЕ данные из первой (левой) таблицы и те данные, что есть из правой. Синтаксис следующий: 

   SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id1 = t2.id1 

Результат такой же, как если бы мы использовали плюсик около t2.id1. 

Правое соединение (right join), выведутся ВСЕ данные из, соответственно, правой таблицы. 

   SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id1 = t2.id1 

Полное соединение (full join) – его я уже рассматривал здесь

Декартово соединение (cross join) – если все-таки вам действительно надо создать декартово произведение – то это надо указать компилятору четко: 

   SELECT * FROM table1 t1 CROSS JOIN table2 t2 

Фильтрация where – при новом синтаксисе where нужно только для фильтрации данных. Например, если выполнить следующий запрос: 

   SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id1 = t2.id1 WHERE   t1.id1 < 4 

То в результате выведется только три строки (вместо пяти). Вот такие объединения и такой у них синтаксис. Сейчас на него потихоньку перехожу. Кстати, мне не только базы данных помогают по дому, но и специальное оборудование, например динамометр. Специально себе один такой купил через сайт НТЦ Спектр. По ссылке приведены самые разные динамоментры, можно выбрать такой, какой вам нужен. Помимо этого можете на сайте посмотреть другое измерительное оборудование (в левом меню все показано). Я уже себе все что нужно там купил.

Комментариев нет:

Отправить комментарий