Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 06 2016 22:52:10
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Работа с базой данных. Объединение данных в результатах SQL запросов (Часть 2)


Предыдущий цикл: Объединение данных (Часть 1)
Шаг 13. Другие виды объединений JOIN
Шаг 14. Объединение “по вертикали” или операция UNION
Следующий цикл: Функции
[Содержание курса]

[Выполнять SQL запросы on-line]

Шаг 13. Другие виды объединений JOIN

Этот шаг чисто теоретический, поскольку описанные в нем виды объединений не поддерживаются MS Access явно. MS Access является “настольной” СУБД, в то время как, например MS SQL Server или Oracle являются промышленными СУБД, и, помимо того, что они поддерживают практически все стандарты SQL, они также реализуют собственные процедурные расширения SQL: Transact-SQL и PL/SQL. Что значит, не поддерживает явно? Это означает, что аналогичных результатов можно достичь, комбинируя поддерживаемые MS Access другие виды объединений. Как это сделать будет показано на следующем шаге. Это единственный шаг в процессе изучения SQL запросов в рамках текущего курса, который не подкреплен практическим примером, но, тем не менее, знать о том, что существуют и другие виды объединений (соединений) вида JOIN желательно.

SQL вычитание или операция MINUS

Результат операции MINUS.
Результат вычитания.

Пример SQL запроса:

SELECT D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF LEFT JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
MINUS
SELECT D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF INNER JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID

или еще такой пример:

SELECT S_NAME FROM D_STAFF
MINUS
SELECT S_NAME FROM D_STAFF WHERE S_NAME LIKE 'М%'

Полное объединение или операция FULL [OUTER] JOIN

Результат операции FULL JOIN.
Результат операции полного объединения.

Пример SQL запроса:

SELECT D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF OUTER JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID 
ORDER BY D_STAFF.S_EXPERIENCE DESC
AFF INNER JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID

Эквивалент этому запросу будет представлен на следующем шаге.

“Каждый с каждым” или операция декартова произведения CROSS JOIN

Результат – каждая строка из первого SELECT будет соединения с каждой строкой из SELECT, что идет после CROSS JOIN. Критерий после ON, по понятным причинам, нам уже ни к чему.

SELECT D_STAFF.S_NAME FROM D_STAFF CROSS JOIN (SELECT D_STAFF_PROFILE.PROFILE_ID FROM D_STAFF_PROFILE)

Мне лично мало понятно назначение этой "гениальной" конструкции, тем более что ее эквивалент очевиден:

SELECT D_STAFF.S_NAME, D_STAFF_PROFILE.PROFILE_ID FROM D_STAFF, D_STAFF_PROFILE

Шаг 14. Объединение “по вертикали” или операция UNION

На самом деле в английском языке слов JOIN больше соответствует русскому слову соединение, а слово объединение, в свою очередь, ближе к английскому UNION. Я надеюсь, что не смутил читателя тем, что на предыдущих этапах везде использовал слово “объединение”. Разница между операциями JOIN и UNION в SQL принципиальная. Лучше сказать, что обе эти операции ортогональны друг другу. Если JOIN всячески объединяла данные в ширину или “по горизонтали”: объединяла поля из разных таблиц (колонки из разных запросов) в один запрос, то UNION напротив: рост в ширину не приемлет и объединяет именно результаты различных запросов одинакового формата. Другими словами - объединяет данные “по вертикали”.

Пример простейшего объединения (псевдоним NAME здесь необязателен):

SELECT S_NAME AS NAME FROM D_STAFF UNION SELECT P_NAME AS NAME FROM D_PROFILE

Объединение UNION.
Объединение UNION в SQL запросе.

Естественно, что можно накладывать любые критерии отбора на объединяемые запросы:

SELECT S_NAME AS NAME FROM D_STAFF
WHERE S_NAME LIKE '%анд%'
UNION
SELECT P_NAME AS NAME FROM D_PROFILE
WHERE P_NAME LIKE 'фин%'

Объединение UNION с условием WHERE.
Объединение UNION с дополнительными условиями.

Ну и, наконец, обещанный на предыдущем шаге эквивалент FULL JOIN. Запрос построен на основании того факты, что пустые значения в результатах запросов LEFT JOIN и RIGH JOIN можно идентифицировать сравнением вида IS NULL. Противоположное выражение будет выглядеть как IS NOT NULL. Из примера, думаю, все станет ясно.

SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF LEFT JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
WHERE (D_STAFF_PROFILE.STAFF_ID IS NULL) 
ORDER BY D_STAFF.S_EXPERIENCE DESC

UNION ALL

SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF RIGHT JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
WHERE (D_STAFF.XD_IID IS NULL) 
ORDER BY D_STAFF.S_EXPERIENCE DESC

UNION ALL

SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID 
FROM D_STAFF INNER JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
ORDER BY D_STAFF.S_EXPERIENCE DESC

Реализация операции MINUS с помощью нескольких UNION.
Реализация операции вычитания с помощью нескольких объединений.

По умолчанию результат UNION содержит только уникальные строки. Ключевое слово ALL заставляет в отчет включать все, в том числе и повторяющиеся строки. Кстати, первые две части запроса соответствуют как раз результату операции MINUS:

LEFT JOIN MINUS INNER JOIN 

и 

RIGHT JOIN MINUS INNER JOIN.

Следующий цикл: Функции.



Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.