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

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

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

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

Работа с базой данных. Сложные SQL запросы


Предыдущий цикл: Функции
Шаг 20. Суперпозиция SELECT
Шаг 21. Работа с множествами. Операции IN и NOT IN
Шаг 22: SELECT. Summary…
Следующий цикл: Изменение набора данных
[Содержание курса]

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

Шаг 20. Суперпозиция SELECT

20-й шаг этого "курса программирования на SQL" является одним из наиболее важных. Именно сейчас (по расчетам автора) должно прийти понимание следующих тонкостей организации сложных SQL запросов:

  1. Каждая выборка, организованная командой SELECT, является отдельным запросом (подзапросом), к результату которого можно обращаться, как к таблице с использованием присвоенного ему имени. Имя запроса определяется точно так же, как псевдоним таблицы - посредством ключевого слова AS.

  2. Псевдонимы колонок нужны не только для отображения “читаемых” подписей в отчетных формах, но и для обращения к полям таблиц, результатам функций и другим элементам набора данных подзапроса из контекста SQL запроса более высокого порядка.

Ниже приведен пример запроса, который выводит список сотрудников с наименованиями ассоциированных профилей пользователя. В этом запросе впервые задействованы все 3 таблицы тестового набора данных. Операция INNER JOIN на этот раз объединяет не записи таблиц, а строки наборов данных, организованных внутренними операциями SELECT. Это называется суперпозицией SQL запроса SELECT.

SELECT S.NAME AS [СОТРУДНИК], P.NAME AS [ПРОФИЛЬ] 
FROM 
(D_STAFF_PROFILE AS SP INNER JOIN (SELECT XD_IID AS ID, S_NAME AS NAME FROM D_STAFF) S ON SP.STAFF_ID=S.ID) 
INNER JOIN (SELECT XD_IID AS ID, P_NAME AS NAME FROM D_PROFILE) P ON SP.PROFILE_ID=P.ID

Вот, что мы видим в результате работы этого запроса:

Суперпозиция запросов SELECT.
Суперпозиция запросов SELECT.

Шаг 21. Работа с множествами. Операции IN и NOT IN

Операторы IN и NOT IN – это два SQL оператора для работы с множествами. Это еще один способ организовать критерии отбора записей с использованием конструкции WHERE. Ниже два простейших примера их использования, взятых из шага 18.

Этот с операцией IN:

SELECT S_POSITION,  COUNT(S_POSITION) AS [КОЛИЧЕСТВО S_POSITION]
FROM D_STAFF
WHERE S_POSITION IN (22,24)
GROUP BY S_POSITION
HAVING COUNT(S_POSITION)>1

А этот с операцией NOT IN>:

SELECT S_POSITION,  COUNT(S_POSITION) AS [КОЛИЧЕСТВО S_POSITION]
FROM D_STAFF
WHERE S_POSITION NOT IN (23)
GROUP BY S_POSITION
HAVING COUNT(S_POSITION)>1

Глядя на результат, представленный на шаге 18, можно догадаться, что оба запроса возвращают одни и те же данные. Но цель этого шага не просто представить вам эти операторы, поскольку в таком виде их место в самом начале этого курса, а продемонстрировать их использование вместе с суперпозицией операции SELECT, показанной ранее. Ну, вот как-то так:

SELECT PROFILE_ID, COUNT(PROFILE_ID) AS [КОЛИЧЕСТВО S_POSITION]
FROM D_STAFF_PROFILE
WHERE PROFILE_ID NOT IN (SELECT XD_IID FROM D_PROFILE WHERE P_NAME LIKE'Ф%')
GROUP BY PROFILE_ID

Множество, с которым имеет дело оператор NOT IN, формируется из значений XD_IID, отобранных внутренним SELECT. Здесь мы получим список идентификаторов профилей с количеством их связей в таблице D_STAFF_PROFILE. Наименования профилей не должны начинаться на букву ‘Ф’. Таким образом, мы не увидим в списке значения 21, 22, 23, которые соответствуют профилям, связанным с Финансами.

Работа со множествами.
SQL запросы. Работа со множествами.

Шаг 22: SELECT. Summary…

Это последний шаг, демонстрирующий возможности оператора SELECT. Комментарии здесь излишни, поскольку никаких новых (не рассмотренных ранее) конструкций в нем не использовано. Запрос выводит список профилей с количеством связанных с ними сотрудников, причем количество этих сотрудников должно быть более одного.

SELECT D_PROFILE.P_NAME AS [ПРОФИЛЬ], F.STAFF_COUNT AS [КОЛИЧЕСТВО СОТРУДНИКОВ] 
FROM D_PROFILE, 

(SELECT PROFILE_ID, COUNT(PROFILE_ID) AS STAFF_COUNT
FROM D_STAFF_PROFILE
GROUP BY PROFILE_ID
HAVING COUNT(PROFILE_ID)>1) F

WHERE D_PROFILE.XD_IID = F.PROFILE_ID

Сложный SQL запрос.
Сложный SQL запрос.

Следующий цикл: Изменение набора данных.



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

Курс для начинающих программистов на 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. Проект Инициативного Народного Фронта Образования - ИНФО-проект.