МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Цель: ТЕМА 3

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
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. Вывести список счетов, по которым были только операции
занесения денег, но не было ни одной операции снятия денег.
Зафиксировать
выполнение всех запросов соответствующими
скриншотами и сохранить в виде электронного отчета по практической
работе.
Предъявить выполненную работу преподавателю и получить зачет
по данному занятию.
Download