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

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
ТЕМА 3
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 1.
СТРУКТУРИРОВАННЫЙ ЯЗЫК ЗАПРОСОВ SQL К РЕЛЯЦИОННОЙ
БАЗЕ ДАННЫХ.
Цель: изучить реализацию стандартного языка запросов в сервере
MS SQL Server 2000 в части разработки простых запросов.
Для достижения поставленной цели необходимо решить следующие
задачи:
 познакомиться со структурой и содержимым учебной базы
данных Sessia (Сессия).
 изучить интерфейс интерактивного средства выполнения
запросов Query Analyzer в MS SQL Server 2000
 научиться писать и исполнять простые запросы на языке SQL к
учебной базе данных.
Оглавление.
Задание 1. Познакомиться со структурой учебной БД Sessia. ..............................................1
Задание 2.Познакомиться с интерфейсом интерактивного исполнителя запросов SQL. ..5
Задание 3. Выполнить следующие запросы к учебной БД «Сессия.....................................8
Задание 1. Познакомиться со структурой учебной БД Sessia.
Учебная база “Сессия”
отражает результаты сдачи текущей
сессии в некотором виртуальной учебном заведении. Большинство из
вас учились либо в настоящий момент учитесь в институтах,
университетах или колледжах, поэтому для вас данная предметная
область интуитивно понятна. Именно поэтому данная база будет
первой для нашего изучения. Она состоит из пяти таблиц. Схема
базы данных изображена на рис. 1
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис.1. Схема учебной базы данных «Сессия»
Будем считать, что термин отношение и таблица для нас
являются синонимами, и мы можем ими пользоваться в равной
степени, не забывая особенности реляционных таблиц. Рассмотрим
содержание отдельных таблиц в нашей базе данных.
Таблица Uch_plan
содержит перечень специальностей, по
которым обучаются студенты нашего виртуального учебного
заведения с указанием дисциплин, по которым студенты каждой
специальности должны сдавать экзамены в текущую сессию. В данной
таблице 2 поля:
 kod_spec
- код специальности. В соответствии с новым
перечнем специальносей и направлений подготовки в сфере высшего
образования в нашей стране код специальности или направления
это целое число в пределах 100 000. Поэтому в нашей базе данных
код специальности – это целое число, тип данных integer, под который
отводится 4 байта.
 discipline - наименование дисциплин, по которым надо сдавать
экзамен студентам данной специальности.
Так как в нашем учебном заведении множество специальностей и
по каждой специальности читается множество дисциплин, по которым
надо сдавать экзамен, то первичным ключом отношения Uch_plan
является набор из двух атрибутов: kod_spec, discipline.
Таблица spec – содержит перечень специальностей, по которым
ведется подготовка в нашем учебном заведении.
Для каждой
специальности кроме
кода указано полное наименование
специальности. Таблица состоит из двух полей:
 kod_spec – код специальности, мы уже знаем, что это целое
число.
 Spec – наименование специальности – это набор слов.
Например
Специальность
с
кодом
220100
–название
«Вычислительные машины, комплексы системы и сети», поэтому в
нашем случае данному полю присвоен символьный тип данных
varchar с ограничением по длине 256 символов.
Первичным ключом таблицы является атрибут код специальности
(kod_spec), потому что в нашем списке каждая специальность
повторяется только один раз и код специальности однозначно
идентифицирует всю строку в таблице. Но ведь и наименование
специальностей разные, почему же выбран ключом код специальности
– потому что он короче, а доступ по первичному ключу должен быть
самый быстрый.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Таблица groops – содержит перечень учебных групп, в которых
учатся студенты с указанием специальностей, к которым относится
каждая группа. Таблица состоит из двух полей:
 N_groop – номер группы. Это поле имеет символьный тип
данных, потому что в некоторых учебных заведениях к числовому
номеру группы часто добавляют и одни или несколько символов.
Поэтому для более общей картины будем считать это поле
символьным.
 kod_spec – уже известный код специальности.
Первичным ключом отношения является номер группы (N_groop),
потому что номера групп не повторяются и это закон предметной
области. Ни в одном учебном заведении нет двух одинаковых учебных
групп, которые учатся одновременно. Раньше или позднее могли быть
синонимы, но одновременно одинаковых групп не существует.
По одной специальности могут обучаться студенты нескольких
групп.
Таблица Students – содержит список студентов. Эта таблица
содержит следующие поля:
 N_groop – номер группы;
 Last_name – фамилия;
 First_name – имя;
 Middl_name – отчество;
 N_zach – номер зачетки. Это символьное поле. Номер зачетки
однозначно идентифицирует студента. Поэтому даже если среди
студентов есть однофамильцы – они должны иметь разный номер
зачетки. Данное поле является первичным ключом таблицы.
Последняя таблица – это таблица Sessia – она содержит результаты
текущей сессии. Данная таблица содержит следующие поля:
 N_zach – номер зачетки;
 Discipline – дисциплина;
 Data_ex – дата экзамена;
 Mark – оценка, полученная на экзамене.
Студенты могут сдавать экзамены по одной дисциплине несколько
раз, если первый раз они сдали экзамен на неудовлетворительную
оценку, то они могут повторно сдавать экзамен до тех пор, пока не
получат положительную оценку.
Каждая попытка сдачи экзамена фиксируется и имеет конкретную
дату сдачи. Первичным ключом в данной таблице является набор из
трех атрибутов:
<N_zach , Discipline , Data_ex >.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Наличие такого ключа означает, что мы запрещаем одному
студенту в один день сдавать экзамен по одному предмету более
одного раза.
Однако, мы не запрещаем сдавать несколько экзаменов в один
день, но в этом случае экзамены должны сдаваться по разным
дисциплинам.
Для подключения к БД Sessia необходимо выполнить следующую
последовательность действий:
1. Подключиться к серверу MS SQL Server – запустить Enterprise
Manager
2. Открыть SQLServer Group
3. Открыть папку Databases
4. Установить курсор на БД sessia – сделав ее текущей.
Устанавливаем курсор
на БД Sessia
5. Переходим в верхнее меню и выбираем Tools->SQL Query
Analyzer
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
- после выбора данного пункта меню мы попадаем в режим
интерактивного выполнения SQL-запросов.
Задание 2.Познакомиться с интерфейсом интерактивного
исполнителя запросов SQL.
Внешний вид Query Analyzer представлен на рис. 2
Имя текущей БД
Список таблиц
выбранной БД (sessia)
Место написания текста
запроса.
Рис. 2 Внешний вид экрана интерпретатора SQL запросов.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
После написания текста запроса его необходимо выполнить, для
этого надо нажать на зеленый треугольник в верхнем меню окна.В
нижней части правого окошка появляются результаты запроса.
Вид предъявления
результата
При переключении закладки на
на «Message» в качестве
результата выполнения запроса Вы получите просто сообщение
следующего типа «(5 row(s) affected)».
Если продолжите написание запросов, то при нажатии
пиктограммы «Выполнить» у Вас будут выполняться последовательно
все запросы, которые находятся в верхнем окне, а результаты будут
также появляться последовательно в нижней части окна (см.рис. 3).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис.3 Результат выполнения нескольких запросов.
При отладке запросов Вам желательно выполнять только один
последний запрос, а все остальные тем не менее оставить в тексте.
Для этого надо выделить мышкой требуемый запрос и нажать
пиктограмму «Выполнить» или нажать функциональную клавишу F5. В
этом случае области результат появится только результат
выполнения выделенного запроса.
Тексты запросов можно снабдить комментарием. Комментарий
может быть однострочный и многострочный. Однострочный
комментарий начинается с двух последовательных знаков дэфис,
стоящих в начале комментария (см. рис. 4).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 4 Представление комментариев при выполнении запросов в Query Analyzer
Набранные запросы можно сохранить в текстовом файле. Для
этого необходимо нажать пикограмму «Сохранить» (Дискета) и задать
имя файла и место его сохранения. По умолчанию файлу
присваивается расширение .sql, однако вы можете задать
произвольное расширение в момент сохранения.
При продолжении работы сохраненный файл загружается в Query
Analyzer, для этого используется команда «Открыть файл»
(пиктограмма открытая папка). После открытия Вы можете
продолжать работу с того места, где Вы остановились.
Задание 3. Выполнить следующие запросы к учебной БД
«Сессия.
При выполнении простых запросом придерживаться следующего
стандартного синтаксиса SQL1.
Запрос состоит из следующих составных частей:
 Список вывода, т.е. список имен столбцов возможно с указанием
их синонимов, или выражений, которые являются заголовками
столбцов результирующего отношения.
 Список исходных таблиц.
 Условия соединения исходных таблиц и условия фильтрации
при выводе результата.
Запрос начинается с ключевого слова Select. При вводе запроса
транслятор сразу окрашивает ключевые слова в голубой цвет,
поэтому Вы легко можете визуально контролировать правильность
написания стандартных ключевых слов в запросе. После слова Select
формируется список вывода. В самом простом варианте вместо
списка вывода можно использовать символ * (звездочка), который
означает, что выводятся все столбцы, которые сформированы по
результатам запроса.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Например, для того, чтобы вывести содержимое таблицы Groops
надо написать следующий текст запроса:
Select * from Groops.
Символ звездочка необходимо обязательно отделить пробелами
от ключевых слов, окружающих его.
Мы получим следующий вид запроса (см. рис. 5).
Рис. 5 Выделение ключевых слов в запросе.
Ключевые слова Select и from выделены голубым цветом.
Запрос можно писать структурировано, например так
Select *
From Groops.
Кроме того, MS SQL Server не критичен к регистру, поэтому
можно писать запросы можно в любом регистре.
Чтобы результат имел более читаемый вид можно снабдить
выводимые результаты заголовками на русском языке. Заголовки
отделяются от имен столбцов результата по крайней мере одним
пробелом и заключаются в двойные кавычки. Заголовки могут
содержать внутри себя любые символы кроме двойных кавычек.
Например, предыдущий запрос может быть записан с
использованием заголовков столбцов в следующем виде:
Select N_groop “Номер группы”, kod_spec “Код специальности”
From groops
Мы получим следующий результат (см. рис.6):
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 6. Использование заголовков столбцов результата при выполнении запроса.
Если в запросе используется несколько исходных таблиц, то Вам
необходимо задать корректно условия соединения этих таблиц.
Условия соединения задаются в части Where запроса Select. При
указании условий соединения таблиц Вы должны применять полные
или расширенные имена столбцов, которые предваряются именем
таблицы, из которой этот столбец взят и отделяются от него точкой,
аналогично
свойству объекта в объектно-ориентированном
программировании. Например, Students.N_zach – обозначает столбец
N_zach из таблицы Students. Достаточно распространенной ошибкой
является в списке выводимых столбцов указание простого имени без
указания имени таблицы, при этом сервер указывает вам на ошибку,
замечая, что столбец определен неоднозначно. Например, при
выполнении следующего запроса,
select N_zach, Last_Name
from students, sessia
Where Students.N_zach = Sessia.N_zach and mark =2
Вы получите сообщение:
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'N_zach'.
Все сообщения об ошибках начинаются фразой, выделенной
красным цветом и далее содержать текст, поясняющий найденную
ошибку.
В нашем случае нам сообщантся, что выводимый столбец N_zach
определен необнозначно, потому что такой столбец присутствует в 2-х
используемых таблицах, и не смотря на то, что практически
безразлично имя какой из таблиц будет предшествовать имени
столбца в результате, по правилам синтаксиса нам необходимо
написать например так.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
select Students.N_zach, Last_Name
from students, sessia
Where Students.N_zach = Sessia.N_zach and mark =2
И мы получим следующий результат (см. рис. 7):
Рис. 7 Использование полных имен атрибутов при выводе.
А почему мы получили две одинаковые стоки? Это определяется
смыслом запроса, значит господин Петров получил несколько двоек,
ведь запрос наш как раз и состоял в выводе студентов, получивших во
время сессии двойки. Для того чтобы, строки результата не
повторялись, нам необходимо включить в запрос ключевое слово
DISTINCT – различные, при этом слово должно предшествовать
полному списку результирующих столбцов.
При построении простых запросов мы можем использовать
полный перечень операций сравнения
 Равно =
 Не равно <> (или !=)
 Больше или равно >=
 Меньше или равно <=
 Больше >
 Меньше <
При
построении
условий
отбора
(фильтрации)
можно
использовать логические операции AND (И) и OR (ИЛИ). Кроме того
мы можем использовать предикат between (между). Он записывается
в следующем виде:
Between n1 and n2 ,
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
здесь n1 и n2 – числовые границы.
При написании запросов
символьные константы должны
ограничиваться одинарными простыми кавычками и значения этих
констант всегда регистро зависимы. Поэтому написание условия
сравнения с названием дисциплины будет иметь следующий вид:
select Students.N_zach, Last_Name
from students, sessia
Where Students.N_zach = Sessia.N_zach and Discipline= 'Сети'
Вы можете использовать предикат сравнения Like – подобный. Этот
предикат позволяет использовать некоторые шаблоны при отборе
строк.
При использовании данного предиката
 символ % означает любая последовательность символов.
 Символ _ (одиночное подчеркивание) – любой одиночный
символ.
 Квадратные скобки […] – последовательность символов.
Предикат like допускает форму NOT Like – что означает «не подобно».
Поэтому для написания запроса «Вывести список студентов, у
которых фамилии заканчиваются на “ов”» необходимо написать
следующую операцию сравнения:
select Students.N_zach, Last_Name
from students
Where Last_Name like '%ов'
Если мне необходимо отобрать все коды специальностей, которые
начинаются символами 220, то я запишу следующий запрос
select *
from spec
where kod_spec like '220%'
И получу результат (рис.8):
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 8. Сравнение с шаблоном.
1. Вывести содержимое таблицы uch_plan (учебные планы)
2. Вывести содержимое таблицы spec (специальности)
3. Вывести содержимое таблицы Groop (группы)
4. .Вывести содержимое таблицы Students (список студентов),
дав дополнительные названия столбцов по русски.
5. .Вывести содержимое таблицы sessia (результаты сессии)
6. .Вывести список названий специальностей, по которым
ведется подготовка в нашем виртуальном Вузе, указав в заголовке
«Название специальности».
7. Вывести перечень дисциплин, которые каждая группа
должна сдавать в текущую сессию. Перечень дисциплин
определяется учебным планом по специальности. В результирующий
набор включить два столбца «Номер группы», «Название
дисциплины».
8. Перечень дисциплин, которые должен сдавать каждый
студент в текущую сесcию
9. Список студентов, которые получили на текущей сессии
хотя бы одну двойку. Список выводить без повторений.
10. Список студентов, которые получили двойку по дисциплине
БД
11. Список студентов, которые по дисциплинам БухУчет и сети
получили пятерки.
12. Перечень студентов группы 2921 (тоже для группы 3952к,
тоже для группы 4841)
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
13. Список студентов, фамилии которых начинаются на букву
“Б”
14. Вывести список студентов, фамилии которых заканчиваются
на букву «а»
15. Вывести список студентов, которые сдали экзамен по
дисциплине БД на отлично
Предъявите все выполненные запросы
получите ЗАЧЕТ по результатам работы.
преподавателю
и
Download