МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE ТЕМА 3 ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 3. СТРУКТУРИРОВАННЫЙ ЯЗЫК ЗАПРОСОВ SQL К РЕЛЯЦИОННОЙ БАЗЕ ДАННЫХ. Цель: изучить изменения в синтаксисе SQL-запросов в стандарте SQL92 и методы их реализации на сервере MS SQL Server 2000. Для достижения поставленной цели необходимо решить следующие задачи: Познакомиться с новой учебной базой данных Bank. Изучить принципы анализа неопределенных значений. Изучить новые квалификаторы ANY и ALL и принципы построения запросов с многократным сравнением. Изучить понятие внешнего объединения и отличие внешнего объединения от внутреннего при реализации SQL-запросов в стандарте SQL92; Изучить синтаксис оператора SELECT в новом стандарте. Выполнить все учебные запросы к новой учебной базе данных. Оглавление. Задание 1.....................................................................................................................................1 Задание 2.Изучить принципы анализа неопределенных значений. .....................................4 Задание 3.Работа с новыми ключевыми словами ALL и ANY. ...........................................6 Задание 4. Изучить понятие внешнего объединения и реализацию данного понятия в MS SQL Server 2000. ........................................................................................................................7 Задание 1 Для рассмотрения примеров запросов в данном практическом занятии мы будем использовать новую БД, которая называется Bank и она моделирует учет операций вкладывания и изъятия денег с лицевых счетов физических лиц. Инфологическая модель БД приведена на рис. 1 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Conceptual Data Model Model: Банк Package: Diagram: Diagram_1 Author: Карпова Т.С. Date : 16.09.2003 Version : 1.0 Клиенты ID_ckients I Фамилия Пас порт с ерия Пас порт номер Код организации Улица Корпус Дом VA20 VA5 LI VA7 VA30 SI SI Identifier_1 Город а код Проживает I Ф илиалы Название VA20 Номер филиала SI Identifier_1 Район Адрес A20 VA30 Identifier_1 имеет Счета с озданы Номер счета LI Дата открытие D Дата закрытия D Типы счетов Код типа SI Название типа VA20 Identifier_1 Операции Relationship_5 ID_Oper I Type_oper VA20 SUM_Oper DC7,2 Date_oper D относ итс я Identifier_1 Identifier_1 Рис. 1 Инфологическая модель БД Bank Описание атрибутов приведено в табл. 1. Таблица 1. Описание атрибутов Инфологической модели БД Bank Имя в модели ID_ckients Фамилия Паспорт серия Паспорт номер Код организации Улица Корпус Дом Код Code ID_ckients Name Pasport_ser Описание уникальный код клиента Pasport_n Kod_org Street korpus Dom kod Уникальный код организации выдавшей паспорт Название улицы Корпус Номер дома Код города МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Название Номер счета Дата открытие Дата закрытия Номер филиала Район Адрес Код типа Название типа city N_BILL Название города Номер счета Data_begin Дата открытия счета Data_close Дата N_filial Уникальный номер филиала Ragion Adress KOD_Type Name_type Название района города Адрес Код типа счета Название типа счета Краткое описание БД Bank. Каждый клиент может иметь несколько счетов. Каждый счет открывается в конкретном филиале банка. Код счета клиента уникален в пределах филиала банка. Поэтому в таблице счета первичным ключом является составной ключ, который состоит из двух атрибутов номера счета и номера филиала. По каждому счету могут выполняться множество операций. В нашей системе допустимо всего 2 операции: ‘занесение’ и ‘снятие’. Занесение – это занесение на счет денег, снятие – это снятие со счета денег. Если счет не закрыт, то его дата закрытия не определена (NULL). Физическая модель БД на сервере MS SQL Server приведена на рис.2 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 2 Схема БД на сервере MS SQL Server 2000. Задание 2.Изучить принципы анализа неопределенных значений. В новой схеме мы впервые столкнулись с неопределенными значениями. Эти значения имеют специальное обозначение (NULL) и для них не применимы стандартные операции сравнения. Т.е. нельзя написать в условии A=NULL. Для выяснения того, является ли рассматриваемое значение неопределенным используются специальные предикаты: IS NULL и IS NOT NULL. Первый из них истинен тогда, когда сравниваемое значение неопределенно. Второй – тогда, когда сравниваемое значение наоборот, задано. Например, рассмотрим запрос следующего содержания: «Вывести список счетов, которые на настоящий момент не закрыты». Select N_BILL,N_filial from Bills Where Data_close is Null При использовании агрегатных функций интерпретация неопределенных значений подчиняется следующим правилам. Правила обработки значений NULL в агрегатных функциях МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Если какие-либо значения в столбце равны NULL при вычислении результата функции они исключаются Если все значения в столбце равны NULL то Max Min Sum Avg = NULL, count = 0 (ноль) Если таблица пуста count(*) = 0 Например, у нас есть некоторая тестовая таблица T1. Ее содержимое приведено на рис. 3. Пустые строки соответствуют неопределенным значениям.Тогда результат выполнения запроса с суммированием будет выглядеть следующим образом. Рис. 3. Содержимое Таблицы T1 и результат выполнения суммирования ее столбцов. Если я хочу узнать, сколько счетов на настоящий момент закрыто в каждом филиале, то я могу применить функцию COUNT(), но считать не количество строк в группе, а количество определенных значений атрибута Data_close. Результат выполнения запроса приведен на рис. 4. Рис.4 Результат выполнения запроса с анализом определенных значений. Полученные результаты позволяют нам утверждать, что в филиале номер 2 нет закрытых счетов. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Задание 3.Работа с новыми ключевыми словами ALL и ANY. В стандарте SQL92 операторы сравнения расширены до многократных сравнений с использованием ключевых слов ANY и ALL. Это расширение используется при сравнении значения определенного столбца со столбцом данных, возвращаемым вложенным запросом. Операция ANY и операция ALL применяются только совместно с одной из допустимых операций сравнения (=, <>, >=, <=, >, <). Ключевое слово ANY, поставленное в любом предикате сравнения, означает, что предикат будет истинен, если хотя бы для одного значения из подзапроса предикат сравнения истинен. Ключевое слово ALL требует, чтобы предикат сравнения был бы истинен при сравнении со всеми строками подзапроса. Эти предикаты используются при реализации запросов, в которых ищется объект, обладающий наименьшим или наибольшим значением какой-либо характеристики. Например, вернемся к нашей первой учебной базе данных – «Сессия», допустим, нам требуется найти группу, в которой на экзамен вынесено минимальное количество экзаменов, то никаким другим способом кроме многократного сравнения в рамках одного запроса нам эту задачу не решить. И в этом случае мы должны сосчитать для каждой группы количество экзаменов, которое выносится на сессию и сравнить это значение с подобными значениями для всех остальных групп, и если оно окажется меньше всех, то тогда эта группа и должна попасть в результирующий список. Для такого много кратного сравнения мы и будем использовать ключевое слово ALL (потому что нам надо, чтобы для всех сравнений условие было бы истинным ). Однако когда мы будем строить основной запрос и подчиненный, то должны учитывать, что в подчиненном будут количества экзаменов для всех групп, в том числе и для той, с которой последовательно будут сравниваться все эти количества. Следовательно, в операции сравнения необходимо поставить знак не строго меньше, а меньше или равно, т.к. при сравнении со своим количеством возможно только равенство. Запрос будет выглядеть следующим образом: select N_groop from Groops,uch_plan where Groops.kod_spec=uch_plan.kod_spec group BY N_groop having count(distinct Discipline) <= ALL (Select count(distinct Discipline) from Groops,uch_plan where Groops.kod_spec=uch_plan.kod_spec МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE group BY N_groop ) Выполнить следующие запросы: 1. Вывести список районов, в которых находится больше всего филиалов нашего банка. 2. Вывести список филиалов, в которых больше всего открыто счетов клиентов. 3. Вывести список филиалов, в которых больше всего клиентов нашего банка. Заметьте, запросы 2 и 3 дадут разные результаты, потому что наши клиенты могут открывать несколько счетов. 4. Вывести список клиентов нашего банка, которые имеют меньше всего счетов в нашем банке. 5. Вывести список счетов, по которым было произведено меньше всего операций. 6. Вывести список счетов, по которым поступило максимальное количество денежных средств. Задание 4. Изучить понятие внешнего объединения и реализацию данного понятия в MS SQL Server 2000. Стандарт SQL2 расширил понятие условного объединения. В стандарте SQL1 при объединении отношений использовались только условия, задаваемые в части WHERE оператора SELECT, и в этом случае в результирующее отношение попадали только сцепленные по заданным условиям кортежи исходных отношений, для которых эти условия были определены и истинны. Однако в действительности часто необходимо объединять таблицы таким образом, чтобы в результат попали все строки из первой таблицы, а вместо тех строк второй таблицы, для которых не выполнено условие соединения, в результат попадали бы неопределенные значения. Или наоборот, включаются все строки из правой (второй) таблицы, а отсутствующие части строк из первой таблицы дополняются неопределенными значениями. Такие объединения были названы внешними в противоположность объединениям, определенным стандартом SQL1, которые стали называться внутренними. В общем случае синтаксис части FROM в стандарте SQL2 выглядит следующим образом: FROM <список исходных таблиц> | < выражение естественного объединения > | < выражение объединения > | < выражение перекрестного объединения > | < выражение запроса на объединение > МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Расшифруем эти понятия. Первая опция соответствует фактически предыдущему стандарту SQL1. Здесь в разделе FROM задается просто список исходных таблиц возможно с указанием псевдонимов. <список исходных таблиц>::= <имя_таблицы_1> [ имя псевдонима таблицы_1] [ …] [,<имя_таблицы_n>[ <имя псевдонима таблицы_n> ] ] Выражение естественного объединения – это уже расширение стандарта SQL1. Однако на MS SQL Server 2000 естественное объединение не реализовано. Выражение перекрестного объединения соответствует фактически операции расширенного декартова произведения. <выражение перекрестного объединения>:: = <имя_таблицы_1> CROSS JOIN <имя_таблицы_2> Выражение запроса на объединение позволяет промоделировать операцию теоретико-множественного объединения из реляционной алгебры. <выражение запроса на объединение>::= <имя_таблицы_1> UNION JOIN <имя_таблицы_2> И, наконец – выражение объединения и соотвествует полной операции произвольного объединения двух таблиц. <выражение объединения>::= <имя_таблицы_1> { INNER | FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]} JOIN {ON условие | [USING (список столбцов)]} <имя_таблицы_2> В этих определениях INNER — означает внутреннее объединение, LEFT — левое объединение, то есть в результат входят все строки таблицы 1, а части результирующих кортежей, для которых не было соответствующих значений в таблице 2, дополняются значениями NULL (не определено). Ключевое слово RIGHT означает правое внешнее объединение, и в отличие от левого объединения в этом случае в результирующее отношение включаются все строки таблицы 2, а недостающие части из таблицы 1 дополняются неопределенными значениями, Ключевое слово FULL определяет полное внешнее объединение: и левое и правое. При полном внешнем объединении выполняются и правое и левое внешние объединения и в результирующее отношение включаются все строки из таблицы 1, дополненные неопределенными значениями, и все строки из таблицы 2, также дополненные неопределенными значениями. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Ключевое слово OUTER означает внешнее, но если заданы ключевые слова FULL, LEFT, RIGHT, то объединение всегда считается внешним. Выполним запрос левого внешнего объединения на первой БД «Сессия» и получим список студентов в каждой группе. Но список групп возьмем из таблицы Groops. Результат выполнения запроса приведен на рис. 5 Рис. 5 Пример левого внешнего объединения. Мы видим, что у нас есть группа, в которой нет ни одного студента. Однако если мы сделаем подсчет количества строк в результирующем левом объединении, то получим парадоксальный результат (см. рис.6.). Рис. 6 Пример выполнения левого внешнего объединения с последующей группировкой. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Для того, чтобы нам получить число студентов в каждой группе необходимо выполнить агрегатную функцию Count(), указав ей в качестве параметра имя атрибута Номер зачетной книжки (N_zach) (см. рис. 7). Рис. 7 Подсчет количества студентов в каждой группе с учетом левого внешнего объединения. Хорошие возможности дает операция запроса на объединения, которая так же является расширением стандарта SQL1. Решим с использованием этого запроса следующую проблему, найдем список филиалов с указанием счета, по которому была проведена только одна операция, или по одной операции каждого типа. Сам текст запроса и результат его исполнения приведен на рис. 8. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 8 Пример запроса на объединение. Если мы в запросе на объединение добавим ключевое слово ALL, то в результат попадут все строки, включая дубликаты. Действительно результат с дублированием дает 13 строк вместо 8 в предыдущем запросе. (см. рис. 9). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 9. Выполнения запроса на объединение с опцией ALL. Выполнить следующие запросы к учебной базе Bank. 1. Вывести список филиалов, в которых открыто максимальное количество счетов типа ‘пенсионный’ 2. Вывести список клиентов, которые имеют только один счет в нашем банке. 3. Вывести список районов, в которых расположено больше всего филиалов нашего банка. 4. Вывести список городов, в которых проживает более всего клиентов нашего банка. 5. Вывести по каждому счету в филиале 3 сумму всех поступлений. 6. Вывести сумму вкладов на всех счетах филиала № 3 7. Вывести остаток на всех счетах господина Крылова П.В. 8. Вывести сумму поступлений на счета госпожи Степановой И.М. 9. Вывести список филиалов, в которых не открыто счетов типа «срочный депозит на 3» 10. Вывести список филиалов, в которых не открыто счетов типа «пенсионный». МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 11. Вывести количество операций занесения денег на счет, которые были проведены с каждым счетом. 12. Вывести для каждого счета количество операций занесения денег и общую сумму занесения денег и количество операций снятия денег и общую сумму снятия денег. Применяйте операцию полного внешнего объединения. 13. Для каждого счета, открытого в филиале 3 вывести сумму снятий со счетов. (Т.е вывести таблицу <Номер счета, сумма >) 14. Вывести список счетов, по которым было выполнено только 2 операции, одна занесения и одна – снятия. 15. Вывести список счетов, по которым были только операции занесения денег, но не было ни одной операции снятия денег. Зафиксировать выполнение всех запросов соответствующими скриншотами и сохранить в виде электронного отчета по практической работе. Предъявить выполненную работу преподавателю и получить зачет по данному занятию.