Оператор SELECT. Простые запросы на выборку.




Лабораторная работа № 11

 

Язык SQL. Работа с представлениями

Часа

 

Цель работы:

1) получение навыков создания простых запросов на выборку данных;

2) научиться создавать представления в СУБД MS SQL Server 2008. Реализовать необходимые представления в базе данных разрабатываемой информационной системы.

Оператор SELECT. Простые запросы на выборку.

 

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

SELECT select_list

[INTO new_table]

FROM table_source

[WHERE search_conditions]

[GROUP BY group_by_expression]

[HAVING search_condition]

[ORDER BY order_expression [ASC | DESC] ]

Раздел SELECT имеет следующий синтаксис:

SELECT [ ALL | DISTINCT ]

TOP n [PERCENT]

<select_list>

Рассмотрим более подробно назначение аргументов:

ALL - при указании этого ключевого слова в результат запроса разрешается включение дублирующихся строк. Параметр ALL используется по умолча­нию.

DISTINCT - это ключевое слово запрещает появление в результате дублирующихся строк.

TOP n PERCENT - использование этой конструкции предписывает серверу выбирать не все строки, а только n первых. Можно также выбирать не фиксированное количество строк, а определенный процент от всех строк, удовлетворяющих условию.

Конструкция <select_list> определяет список и происхождение колонок, которые будут включены в результат.

Аргумент table_name должен содержать имя таблицы, из которой необходимо выбрать все колонки. Имя таблицы необходимо указы­вать, если в запрос включено несколько таблиц. Если же в запросе участвует только одна таблица, то проще применить символ * без указания имени таблицы.

Аргумент view_name указывает имя представления, из которого необходимо выбрать все колонки.

Аргумент table_alias указывает псевдоним таблицы, из которой необходимо выбрать все колонки.

Аргумент column_name указывает имя колонки, которое необходимо включить в результат. Колонка должна принадлежать одной из таблиц, указанных в конструкции FROM.

Синтаксис команды SELECT позволяет изменять имена колонок, которые они будут иметь в результате. Для этого используются псевдонимы. Псевдоним задается с помощью аргумента column_alias, он должен быть уникален в пределах результата. Использование псевдонимов обязательно, если исходные таблицы имеют колонки с одинаковыми именами и эти колонки необходимо включить в результат.

Раздел INTO предназначен для сохранения результата, выполнения запроса в заданной таблице.

Аргумент new_table определяет имя таблицы, в которой будет размещен результат. Сервер автоматически создает таблицу с указанной структурой.

Синтаксис table_source:

Рассмотрим использование каждого из параметров:

table_name [ [AS] table_alias ]. Имя связанной таблицы. При необходимости для этой таблицы можно указать псевдоним. Использование псевдонимов необходимо, если в конструкции FROM указано имя изменяемой таблицы. Это требуется, чтобы сервер различал, когда имя таблицы нужно рассматривать как имя изменяемой таблицы, а когда — как имя связанной таблицы.

view_name [ [AS] table_alias]. Имя представления, определяющего критерии выполнения команды UPDATE. При необходимости для представления можно указать псевдоним, который будет использоваться в дальнейшем для ссылки на это представление.

rowset_function [ [AS] table_alias]. Этот блок предполагает использование функций ROWSET (CONTAINSTABLE, FREETEXTTABLE, OPENQUERY и OPENROWSET). С помощью этих функций можно подготовить набор данных, который может быть использован вместо таблицы или представления. Дополнительно можно указать псевдоним, позволяющий обращаться к данным.

derived_table [AS] table_alias [(column_alias [..n]). Определяет имя таблицы, которая может быть использована для построения подзапросов при выполнении обновления. Дополнительно можно указать псевдоним, как для всей таблицы, так и для каждой конкретной колонки. При указании псевдонима для колонок необходимо указывать их в соответствии с физическим порядком колонок в исходной таблице. Кроме того, требуется указание псевдонима для каждой колонки, созданной в исходной таблице.

joined_table. Эта конструкция является наиболее сложным методом задания критериев обновления таблицы и используется для связывания при выполнении обновления нескольких таблиц.

С помощью конструкции WHERE можно сузить количество обрабатываемых строк данных, определив одно или несколько логических условий. В результат будут включены только те строки, которые соответствуют наложенным условиям. Условие может включать константы, переменные и любые выражения, возвра­щающие булево значение (TRUE или FALSE). Можно указать несколько условий, объединив их с помощью логических операндов OR, AND и NOT. Синтаксис раздела WHERE следующий:

WHERE <search_condition> | column_name { *= | =* } column_name

В конструкции <search_condition> можно определить любое логическое усло­вие, при выполнении которого строка будет включена в результат. Логическое условие может быть произвольным, в том числе и не связанным с данными.

ALL. Если в запросе было определено условие, сужающее диапазон группировки выбираемых строк, то при указании в разделе GROUP BY ключевого слова ALL сервер будет выводить список всех групп, но не будет выполнять для них функции агрегирования.

Раздел HAVING имеет следующую структуру:

HAVING <search_condition>.

Этот раздел в основном используется для указания условий поиска при выполнении группирования данных с помощью раздела GROUP BY. Конструкция <search_condition> содержит логические условия, определяющие диапазон строк, обрабатываемых запросом. Правила работы с этой конструкцией были рассмотрены при описании раздела WHERE.

Создание представлений

 

Представление (View) для конечных пользователей выглядит как таблица, но при этом само не содержит данных, а лишь представляет данные, расположенные в таблице. Физически представление реализовано в виде SQL-запроса, на основе которого производится выборка данных из одной или нескольких таблиц или представлений.

Представление может выбирать данные из других представлений, которые, в свою очередь, могут также основываться на представлениях или таблицах. Вложенность представлений не должна превышать 32. Представление часто применяется для ограничения доступа пользователей к конфиденциальным данным в таблице.

При обращении к представлению сервер проверяет правильность всех ссылок в запросе. Проверяется, существуют ли объекты, требующиеся для выполнения запроса, определяющего представление. Если одна из таблиц, на которые ссылается запрос, была уничтожена, то представление будет нельзя использовать и при попытке обратиться к нему пользователи получат сообщение об ошибке.

Создание представлений с использованием Transact-SQL

CREATE VIEW view_name [(column [,...n])]

[WITH ENCRYPTION]

AS

select_statement

[WITH CHECK OPTION]

view_name — имя представления. При указании имени необходимо придерживаться тех же правил и ограничений, что и при создании таблицы.

column — имя колонки, которое будет использоваться в представлении. Максимальная длина имени составляет 128 символов. По умолчанию имена колонок в представлении соответствуют именам колонок в исходных таблицах. Явное указание имени колонки требуется при использовании вычисляемых колонок или при объединении нескольких таблиц, имеющих колонки с одинаковыми именами. Имена колонок перечисляются через запятую в соответствии с их порядком в представлении. Имена колонок можно указывать в команде SELECT, определяющей представление.

WITH ENCRYPTION - использование этого параметра предписывает серверу шифровать код SQL-запроса. Это гарантирует, что пользователи не смогут просмотреть код запроса и использовать его. Если при определении представления необходимо скрыть имена исходных таблиц и колонок, а также алгоритм объединения данных, то необходимо использовать эту опцию.

select_statement — код запроса SELECT, выполняющий выборку, объединение и фильтрацию строк из исходных таблиц и представлений. Можно использовать команду SELECT любой сложности со следующими ограничениями:

1) Нельзя создавать новую таблицу на основе результатов, полученных в ходе выполнения запроса, то есть запрещается использование параметра INTO.

2) Нельзя проводить выборку данных из временных таблиц, то есть нельзя использовать имена таблиц, начинающихся на # или ##.

WITH CHECK OPTION – обеспечивает соответствие всех выполняемых для представления инструкций модификации данных критериям, заданным при помощи аргумента select_statement. Если строка изменяется посредством представления, предложение WITH CHECK OPTION гарантирует, что после фиксации изменений доступ к данным из представления сохранится.

В запрос нельзя включать операции вычисления и группировки, то есть запрещается указание параметров ORDER BY, COMPUTE и COMPUTE BY.

Для удаления представления используется команда Transact SQL DROP VIEW{view […n]}. За один раз можно удалить несколько представлений.

 

Примеры

1.Вывод ограниченной информации о студентах с фамилией, оканчивающейся на «ов».

CREATE VIEW infoStudent /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Студенты.Имя, Студенты.Фамилия, Студенты.факультет, Студенты.специальность

FROM Студенты /*Из какой таблицы*/

WHERE Студенты.Фамилия LIKE ‘[]ов’

2. Информация о замене экземпляров по программированию на С++.

CREATE VIEW infoZamena

AS

SELECT /*Указываем, какие поля, из каких таблиц будут выведены*/

Книга.Автор, Книга.Название, Экземпляр.Шифр, Замена_экземпляров.Но-мер_акта_замены

FROM /*Указываем таблицу, и связанные с ней при помощи оператора INNER JOIN таблицы, из которых выбираются связанные данные. После операнда ON указываем, по каким полям связаны две таблицы*/

(Книга INNER JOIN Экземпляр ON Книга.ISBN =Экземпляр.ISBN)

INNER JOIN Замена_экземпляров ON Экземпляр.Шифр = Замена_экземпляров.Шифр

WHERE Книга.Название LIKE '%C++' /*Выбираются только те книги, в названии которых присутствует “C++” */

3. Информация о списанных экземплярах по программированию на Delphi.

CREATE VIEW infoCpicanie

AS

SELECT /*Указываем, какие поля, из каких таблиц будут выведены*/

Книга.Автор, Книга.Название, Экземпляр.Шифр, Списанные_книги.причина_списания, Списанные_книги.номер_протокола_списания, Списанные_книги.Табельный_номер_списавшего

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN (Экземпляр INNER JOIN Списанные_книги ON Экземпляр.Шифр = Списанные_книги.Шифр) ON Книга.ISBN = Экземпляр.ISBN

WHERE Книга.Название LIKE '%Delphi' /*Выбираются толькоте книги, в названии которых присутствует “ Delphi */

 

4. Информация о преподавателях и их заказах на литературу, количество книг должно быть от 10 до 20 или от 25 до 30.

CREATE VIEW infoZakazi /*Объявляем имя представления*/

AS

SELECT /* Указываем, какие поля таблиц будут выведены*/

Преподаватели.Фамилия,Преподаватели.Имя, Преподаватели.Отчество, Книга.Автор, Книга.Название,Заказы.Количество

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN (Преподаватели INNER JOIN Заказы ON Преподаватели.Читательский_номер = Заказы.Читательский_номер)

ON Книга.ISBN = Заказы.ISBN

WHERE (Заказы.Количество BETWEEN 10 AND 20) OR (Заказы.Количество BETWEEN 25 AND 30) /* 10<количество заказов<20 или 25<количество заказов<30 */

5. Информация о книгах, которыми пользуется студент, и табельный номер сотрудника отдела обслуживания выдавшего книги. Номер отдела обслуживания 11.

CREATE VIEW infoOPolzovaniiStudentov

AS

SELECT /* Указываем, какие поля таблиц будут выведены*/

Студенты.Имя, Студенты.Фамилия, Книга.Автор, Книга.Название, Сотрудники_библиотеки.табельный_номер

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой2 ON Экземпляр.Шифр = Пользование_библиотекой2.Шифр) INNER JOIN

Студенты ON Пользование_библиотекой2.Читательский_номер = Студенты.Читательский_номер) INNER JOIN

Сотрудники_библиотеки ON Пользование_библиотекой2.Табельный_номер = Сотрудники_библиотеки.табельный_номер

WHERE Сотрудники_библиотеки.табельный_номер LIKE '11[]' /*Табельный номер сотрудников должен начинаться с «11»*/

 

6. Информация о книгах, которыми пользуется преподаватель и табельный номер сотрудника отдела обслуживания выдавшего книги. Номер отдела обслуживания 11.

CREATE VIEW infoOPolzovaniiPrepodovatelej

AS

SELECT /* Указываем, какие поля таблиц будут выведены*/

Преподаватели.Имя, Преподаватели.Фамилия, Книга.Автор, Книга.Название,Сотрудники_библиотеки.табельный_номер

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(((Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой3 ON Экземпляр.Шифр = Пользование_библиотекой3.Шифр) INNER JOIN

Преподаватели ON Пользование_библиотекой3.Читательский_номер = Преподаватели.Читательский_номер) INNER JOIN

Сотрудники_библиотеки ON Пользование_библиоте-кой3.Табельный_номер = Сотрудники_библиотеки.табельный_номер

WHERE Сотрудники_библиотеки.табельный_номер LIKE '11[]' /*Табельный номер сотрудников должен начинаться с «11»*/

 

7.Информация о отделах 11 и 12 и работающих в них сотрудниках.

CREATE VIEW Otdeli

AS

SELECT /*Указываем какие поля будут выбраны*/

Отделы.номер_отдела, Отделы.название_отдела, Сотрудники_библиотеки.фамилия,

Сотрудники_библиотеки.имя,Сотрудники_библиотеки.отчество

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Отделы INNER JOIN Сотрудники_библиотеки ON Отделы.Номер_отдела = Сотрудники_библиотеки.Номер_отдела

GROUP BY номер.отдела /*По какому полю будут сгруппированы поля*/

WHERE Отделы.номер_отдела BETWEEN 10 AND 13 /*Выбираются отделы, номер которых находится между 10 и 13*/

 

8.Информация о месте хранения периодических изданий название которых содержит в себе слово «вестник», но при этом д.б. исключены периодические издания, первое слово которых начинается на «Э», например «Экономический вестник».

CREATE VIEW INFOPeriodika

AS

SELECT /*Указываем какие поля будут выбраны*/

Периодические_издания.Название, Периодические_издания.Дата_издания, Отделы.Название_отдела, Отделы.Номер_отдела

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Отделы INNER JOIN Периодические_издания ON Отделы.Номер_отдела = Периодические_издания.Номер_отдела

WHERE Периодические_издания.Название LIKE '[^Э] %вестник%'

/*[^Э] запрещает начинаться первому слову на «Э», % вестник% – указывает на то, что оставшаяся часть названия должна содержать слово «вестник»*/

 

9. Полная информация об экземпляре, который был издан с 2000 до текущего года

CREATE VIEW FullInfoEkzemplar

AS

SELECT /*Указываем какие поля будут выбраны*/

Экземпляр.шифр,Книга.Автор,Книга.Название,Книга.Год_издания,Книга.Издательство,Экземпляр.Предметная_область, Экземпляр.Номер_отдела, Экземпляр.Отметка_о_списании, Экземпляр.Отметка_о_замене

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN

WHERE Книга.Год_издания BETWEEN 2000 AND YEAR (GETDATE())

/*GETDATE() возвращает текущую дату, YEAR (<дата>) – год <даты>*/

 

10. Информация о наличии книги в библиотеке

CREATE VIEW InfoAboutBook

AS

SELECT /*Указываем какие поля будут выбраны*/

Книга.ISBN, Экземпляр.Шифр, Экземпляр.Номер_отдела,

Пользование_библиотекой2.Дата_выдачи,Пользование_библиотекой2.Дата_приема

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

(Книга INNER JOIN Экземпляр ON Книга.ISBN = Экземпляр.ISBN) INNER JOIN

Пользование_библиотекой2 ON Экземпляр.Шифр = Пользование_библиотекой2.Шифр

WHERE Пользование_библиотекой2.Дата_приема BETWEEN Пользование_библиотекой2.Дата_выдачи AND GETDATE() /*Если книгу сдали,т.е. она в наличии в библиотеке, то дата приема будет между датой выдачи и текущей датой*/

Группы основных функций

 

SQL Server содержит множество встроенных функций, перечисленных ниже, а также поддерживает создание определяемых пользователем функций.

 

Функция Описание
Функции работы с наборами строк Возвращают объект, который можно использовать так же, как табличные ссылки в SQL-инструкции.
Статистические функции Обрабатывают коллекцию значений и возвращают одно результирующее значение.
Ранжирующие функции Возвращают ранжирующее значение для каждой строки в секции.
Скалярные функции (описаны ниже) Обрабатывают и возвращают одиночное значение. Скалярные функции можно применять везде, где выражение допустимо.

Скалярные функции

Категория функции Описание
Конфигурационные функции Возвращают сведения о текущей конфигурации.
Функции работы с курсорами Возвращают сведения о курсорах.
Функции и типы данных даты и времени Выполняют операции над исходными значениями даты и времени, возвращают строковые и числовые значения, а также значения даты и времени.
Математические функции Выполняют вычисления, основанные на числовых значениях, переданных функции в виде аргументов, и возвращают числовые значения.
Функции метаданных Возвращают сведения о базах данных и объектах баз данных.
Функции безопасности Возвращают данные о пользователях и ролях.
Строковые функции Выполняют операции со строковым (char или varchar) исходным значением и возвращают строковое или числовое значение.
Системные функции Выполняют операции над значениями, объектами и параметрами экземпляра SQL Server и возвращают сведения о них.
Системные статистические функции Возвращают статистические сведения о системе.
Функции обработки текста и изображений Выполняют операции над текстовыми или графическими исходными значениями или столбцами и возвращают сведения о значении.

 

Задание

 

В разрабатываемой базе данных необходимо реализовать 15 представлений с использованием стандартных функций SQL.

 

 

Контрольные вопросы

1. Дайте определение представлению.

2. Поясните, в каких случаях целесообразно использовать представление.

3. Перечислите операторы SQL, с помощью которых представления создаются, удаляются и изменяются.

4. Перечислите способы создания представлений.

5. Перечислите существующие ограничения при создании представлений.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: