БАЗЫ ДАННЫХ ЗАНЯТИЕ 7 Создание сложных запросов. Запросы на нескольких таблицах. ПУГАЧЁВ Ю.В. Учитель информатики Харьковская общеобразовательная школа І-ІІІ ступеней № 60 Харьковского городского совета Харьковской области 1 Цель: Изучить возможности обращаться с запросами к нескольким таблицам; возможности использования подзапросов и операторов EXISTS, ANY, SOME и UNION для построения сложных запросов. Содержание: Соединение таблиц. Эквивалентные и другие виды соединений. Соединения таблицы самой с собой. Использование подзапросов. Операторы EXISTS, ALL, ANY, SOME и UNION. Интерактивный и вложенный SQL 2 Задание: напишите следующие запросы Запрос № 32: по каждому городу посчитать количество клиентов с рейтингом выше 150. SELECT City, COUNT (SNum) FROM C WHERE Rating>150 GROUP BY City; Запрос № 33: по каждому размеру комиссионных посчитать количество служащих и вывести, если это количество больше 3. SELECT Comm, COUNT (SNum) FROM S GROUP BY Comm HAVING COUNT (SNum)>3; 3 Соединение таблиц /запросы из нескольких таблиц/ SELECT имена полей FROM имена таблиц WHERE условие соединения таблиц; Запрос № 34: вывести имена служащих и клиентов, которых они обслуживают. SELECT SName, CName FROM S, C WHERE S.SNum=C.SNum; Результат: 4 Примеры построения сложных запросов Запрос № 36: вывести имена служащих и клиентов, проживающих в одном городе. SELECT S.City, S.Snum, S.SName, C.CNum, C.CName FROM S, C WHERE S.City=C.City; Запрос № 37: для каждого служащего посчитать количество клиентов, которых он обслуживает. Результат: SELECT S.SNum, S.SName, COUNT (*) FROM S, C WHERE S.SNum=C.SNum GROUP BY S.SNum, S.SName; Запрос № 38: вывести имена служащих, клиентов и суммы операций, которые были осуществлены. SELECT S.SNum, S.SName, C.CNum, C.CName, Summa FROM S,C,O WHERE S.SNum=C.SNum AND C.CNum=O.CNum; Результат: 5 Соединение таблицы самой с собой Запрос № 35: вывести пары имен служащих, имеющих одинаковые комиссионные. S S1 S2 a) SELECT S1.SNum, S1.SName, S2.SNum, S2.SName FROM S S1, S S2 WHERE S1.Comm=S2.Comm; b) SELECT S1.SNum, S1.SName, S2.SNum, S2.SName FROM S S1, S S2 WHERE S1.Comm=S2.Comm AND S1.SNum<S2.SNum; Результат: 6 Использование подзапросов SELECT Внешний запрос … (SELECT … ); Подзапрос (внутренний запрос) в предложении WHERE: SELECT … WHERE <поле><оператор> (SELECT … ); Запрос № 39: вывести информацию о служащих, комиссионные которых выше среднего. SELECT * FROM S WHERE Comm>(Select AVG (Comm) From S); Результат: Comm>0.12222222 7 Примеры запросов с подзапросами Запрос № 40: вывести информацию о клиентах, рейтинг которых выше максимального рейтинга по городу Харькову. SELECT * FROM C WHERE Rating> (SELECT MAX(Rating) FROM C WHERE City=‘Харьков’); Запрос № 41: вывести имена клиентов, которые живут в тех городах, которые обслуживает служащий номер 101. SELECT C.CNum, C.CName FROM C WHERE City IN (SELECT City From S WHERE SNum=101); в предложении HAVING: Запрос № 42: вывести города, максимальные комиссионные в которых выше средних комиссионных в городе Москва. SELECT City, MAX(Comm) FROM S GROUP BY City HAVING MAX(Comm)> (SELECT AVG(Comm) FROM S WHERE City=‘Москва’); 8 Использование операторов EXISTS и ALL EXISTS (использует результат подзапроса, чтобы указать, нужно ли выполнять главный запрос); Запрос № 43: вывести информацию о служащих, если хотя бы один из них проживает в городе Харькове. SELECT * FROM S WHERE EXISTS (SELECT * From S WHERE City=‘Харьков’); ALL (предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса ): Запрос № 44: вывести информацию о клиентах, которые имеют рейтинг выше, чем рейтинг любого клиента из города Киева. SELECT * FROM C WHERE Rating > ALL (SELECT Rating FROM C WHERE City=‘Киев’); 9 Использование операторов ANY/SOME ANY / SOME (похожий на EXISTS, но используются с реляционными операторами); Запрос № 45: вывести информацию о клиентах, которые имеют рейтинг выше рейтинга хотя бы одного клиента из города Киева. SELECT * FROM C WHERE Rating > ANY (SELECT Rating FROM C WHERE City=‘Киев’); SELECT * FROM C WHERE Rating > SOME (SELECT Rating FROM C WHERE City=‘Киев’); Запрос № 46: найти служащих, проживающих в городах, где есть клиенты. SELECT Sname, City FROM S WHERE City=ANY (SELECT DISTINCT City FROM C); 10 Оператор UNION Оператор UNION – позволяет объединить результаты нескольких запросов. SELECT … UNION SELECT …. UNION … Правила объединения запросов: -Объединяемые запросы должны возвращать одинаковое количество полей; -Объединяемые запросы должны возвращать однотипные соответствующие поля. SELECT …; 11 Пример использования оператора UNION В (Ведомость по «ОБД») Запрос № 48: получить статистику о сдаче эксамена по дисциплине в форме: FIO Mark Иванов И.И. Отлично Петров П.П. Хорошо Петрова С.С. Отлично Оценку 5 имеет 3 человека Сидоров С.С. Отлично Оценку 4 имеет 2 человека Федорова Ф.Ф. Удовлетворительно Оценку 3 имеет 1 человека Яшин Я.Я. Хорошо SELECT ‘Оценку 5 имеет’, COUNT(*), ‘человека’ FROM B WHERE Mark = ‘отлично’ UNION SELECT ‘Оценку 4 имеет’, COUNT(*), ‘человека’ FROM B WHERE Mark = ‘хорошо’ UNION SELECT ‘Оценку 3 имеет’, COUNT(*), ‘человека’ FROM B WHERE Mark = ‘удовлетворительно’; 12 Интерактивный и вложенный SQL Различают: -интерактивный SQL (используется для функционирования непосредственно в БД); -вложенный SQL (помещается внутри программ, написанных на другом языке /в Delphi (Pascal), Builder(C++), Oracle(PL/SQL)/. 13