Базы данных. Учебное пособие
.pdf
4.2.4.Защита данных Data Control Language (DCL)
Операторы Data Control Language (см. табл. 4.4), иногда называемые операторами Access Control Language, применя- ются для осуществления административных функций, при- сваивающих или отменяющих право (привилегию) использо- вать БД, таблицу базы данных, а также выполнять те или иные операторы SQL.
Таблица 4.4.
Оператор |
Описание |
|
|
GRANT |
Присвоение привилегии |
|
|
REVOKE |
Отмена привилегии |
|
|
Каждый оператор SQL начинается с ключевого слова, которое определяет, что делает этот оператор (SELECT, INSERT, DELETE). В операторе содержатся предложения, содержащие сведения о том, над какими данными произво- дятся операции. Каждое предложение начинается с ключевого слова, такого как FROM, WHERE и др. Структура предложе- ния зависит от его типа: ряд предложений содержит имена полей или таблиц, некоторые могут включать дополнитель- ные ключевые слова, константы или выражения.
Ключевое слово |
Имя таблицы |
Предложения
SELECT * FROM Orders
WHERE ORDER_id >270
Ключевое слово |
Имя столбца |
Рис.4.2. Структура оператора SQL
Все операторы SQL имеют вид, представленный на рис.4.2.
71
4.3. Работа с операторами SQL
4.3.1Выбор данных
Выбор данных представляет собой наиболее часто встречающуюся операцию, выполняемую с помощью языка SQL. Для извлечения записей из таблиц в SQL определен оператор SELECT. С помощью этой команды осуществляется не только операция "выборка" (горизонтальное подмножест- во), но и предварительное соединение двух и более таблиц. Это наиболее сложное и мощное средство SQL, полный син- таксис оператора SELECT имеет вид:
SELECT [ALL | DISTINCT] <список_столбцов >
FROM <имя_таблицы>, ...
[ WHERE <условие> ]
[ GROUP BY <имя_столбца>,... ] [ HAVING <условие> ]
[ORDER BY <имя_столбца> [ASC | DESC],... ]
Порядок предложений в операторе SELECT должен строго соблюдаться (например, GROUP BY должно всегда предшествовать ORDER BY), иначе это приведет к появле- нию ошибок.
Операторы SELECT должны содержать слова SELECT и FROM. Другие ключевые слова, такие как WHERE или ORDER, являются необязательными, что обозначено заклю- чением их в квадратные скобки.
В конструкции <список_столбцов> определяется стол- бец или столбцы, включаемые в результат. Он может состоять из имен одного или нескольких столбцов, или из одного сим- вола * (звездочка), определяющего все столбцы. Элементы списка разделяются запятыми.
Если выбор данных осуществляется из нескольких таб- лиц одновременно, и при этом выбираются одноименные по- ля, необходимо указывать полное имя столбца, то есть:
<имя таблицы> . <имя поля>. Пример: получить список всех авторов
SELECT автор FROM авторы;
72
получить список всех полей таблицы авторы:
SELECT * FROM авторы;
Предложение WHERE (где)
В том случае, когда нас интересуют не все записи, а только те, которые удовлетворяют некому условию, это усло- вие можно использовать предложение WHERE, синтаксис которого имеет вид:
WHERE <условие1> [{AND êOR} <условие2> […] ].
Например, найдем все книги, опубликованные после 2005
года:
SELECT title FROM titles WHERE год_публ >
2005;
Допустим теперь, что нам надо найти все публикации за интервал 20005 - 2011 гг. Это условие можно записать в виде:
SELECT title FROM titles WHERE год_публ >=2005 AND
год_публ <= 2011;
Другой вариант этой команды можно получить с ис-
пользованием логической операции проверки на вхождение в интервал:
SELECT title FROM titles WHERE год_публ BETWEEN
2005 AND 2011;
При использовании конструкции NOT BETWEEN нахо- дятся все строки, не входящие в указанный диапазон.
Еще один вариант этой команды можно построить с помощью логической операции проверки на вхождение в спи- сок:
SELECT title FROM titles WHERE год_публ IN
(2005,2006,2007);
Здесь мы задали в явном виде список интересующих нас значений. Конструкция NOT IN позволяет найти строки, не удовлетворяющие условиям, перечисленным в списке.
Или:
SELECT наименование, цена
FROM Товар
73
WHERE скидка IS NOT NULL
Выражение IS NOT NULL означает, что соответствую-
щая колонка результирующего набора данных не должна иметь пустых значений. В предложении WHERE могут ис- пользоваться как простые, так и специальные операторы сравнения (табл. 4.5).
|
Таблица 4.5 |
|
Оператор |
Описание |
|
|
|
|
>,<,=, <=,>=,<> |
Больше, меньше, меньше или рав- |
|
|
но, больше или равно, не равно |
|
ALL |
Применяется совместно с операто- |
|
|
рами сравнения при сравнении со |
|
|
списком значений |
|
|
Окончание табл. 4.5 |
|
Оператор |
Описание |
|
|
|
|
BETWEEN |
Применяется при поверке нахож- |
|
|
дения значения внутри заданного |
|
|
интервала (включая границы) |
|
IN |
Применяется для проверки нали- |
|
|
чия значения в списке |
|
LIKE |
Применяется при проверке соот- |
|
|
ветствия значений заданной маске |
|
Некоторые задачи нельзя решить с использованием только операторов сравнения. Например, мы хотим найти web-site издательства "Wiley", но не знаем его точного наиме- нования. Для решения этой задачи предназначено ключевое слово LIKE, его синтаксис имеет вид:
WHERE <имя_столбца> LIKE <’образец’> [ESCAPE <ключевой_символ> ]
Образец заключается в одиночные кавычки и должен содержать шаблон подстроки для поиска. Обычно в шаблонах используются два символа:
% (знак процента) - заменяет любое количество симво-
лов
_ (подчеркивание) - заменяет одиночный символ.
74
Попробуем найти все книги, название которых начина- ется со слова "SQL":
SELECT title FROM titles WHERE title LIKE
'SQL%';
В том случае, когда надо найти значение, которое само содержит один из символов шаблона, используют ключевое слово ESCAPE и <ключевой_символ>. Литерал, следующий в шаблоне после ключевого символа, рассматривается как обычный символ, все последующие символы имеют обычное значение. Например, нам надо найти ссылку на web-страницу, о которой известно, что в ее url содержится подстрока
"my_works":
SELECT site, url FROM wwwsites
WHERE url LIKE '%my@_works%' ESCAPE '@';
В заключение заметим, что при выполнении оператора SELECT результирующее отношение может иметь несколько записей с одинаковыми значениями всех полей. Чтобы ис-
ключить повторяющиеся записи из выборки используется ключевое слово DISTINCT. Ключевое слово ALL указывает, что в результат необходимо включать все строки.
Предложение ORDER BY (порядок)
Это предложение является необязательным и применя- ется для сортировки результирующего набора данных по од- ной или нескольким колонкам. Для определения направления сортировки используются ключевые слова ASC (по возраста- нию) или DESC (по убыванию). По умолчанию сортировки производится по возрастанию.
Синтаксис предложения имеет вид:
ORDER BY столбец 1 [{ASC êDESC}] [,столбец2 [{ASC
êDESC}] [,..]
SELECT наименование, цена
FROM Товар
WHERE наименование BETWEEN ‘К ‘AND ‘Н’
75
ORDER BY цена
4.3.2Вычисления внутри SELECT
SQL позволяет выполнять различные арифметические операции над столбцами результирующего отношения. В кон- струкции <список_столбцов> можно использовать константы,
функции и их комбинации с арифметическими операциями и скобками. Например, чтобы узнать сколько лет прошло с 1992 года (год принятия стандарта SQL-92) до публикации той или иной книги можно выполнить команду:
SELECT title, год_публ-1992 FROM titles
WHERE год_публ > 1992;
В арифметических выражениях допускаются операции сложения (+), вычитания (-), деления (/), умножения (*), а также различные функции (COS, SIN, ABS - абсолютное зна- чение и т.д.). Также в запрос можно добавить строковую кон- станту:
SELECT 'the title of the book is', title, год_публ -1992 FROM titles WHERE год_публ > 1992;
В SQL также определены так называемые агрегатные функции, которые совершают действия над совокупностью одинаковых полей в группе записей. Среди них:
AVG(<имя поля>) - среднее по всем значениям данного поля COUNT(<имя поля>) или COUNT (*) - число записей MAX(<имя поля>) - максимальное из всех значений данного
поля
MIN(<имя поля>) - минимальное из всех значений данного
поля
SUM(<имя поля>) - сумма всех значений данного поля Следует учитывать, что каждая агрегирующая функция
возвращает единственное значение. Примеры: определить дату публикации самой "древней" книги в нашей базе данных
SELECT MIN(год_публ) FROM titles;
Подсчитать количество книг в нашей базе данных:
SELECT COUNT(*) FROM titles;
76
Область действия данных функции можно ограничить с помощью логического условия. Например, количество книг, в названии которых есть слово "SQL":
SELECT COUNT(*) FROM titles WHERE title LIKE
'%SQL%';
4.3.3Связывание таблиц
При помощи операторов языка SQL можно извлекать данные более чем из одной таблицы. Одна из возможностей сделать это заключается в связывании таблиц по одному об- щему полю. Однако даже без связывания таблиц в результате оператора получится набор данных, содержащий все возмож- ные комбинации строк каждой из исходных таблиц (декарто- во произведение):
SELECT наименование_продукта, категория_продукта FROM Продукт, Категория
Запрос, показанный ниже, указывает, какой категории при- надлежит данный продукт:
SELECT наименование_продукта, категория_продукта FROM Продукт, Категория
WHERE Про-
дукт.категория_номер=Категория.категория_номер
Присутствующее в операторе ограничение указывает, что из связываемых таблиц извлекаются только те строки, в которых атрибуты «номер» имеют одинаковое значение. На- звание столбца указывается только вместе с названием табли- цы; в противном случае оператор будет неоднозначным.
Можно использовать другие типы связывания таблиц: оператор INNER JOIN (внутреннее соединение) обеспечивает присутствие в результирующем наборе записей, значения в связанных полях которых совпадают. Внешние соединения (OUTER JOIN) позволяют включить в результат запроса все
строки из одной таблицы и соответствующие им строки из другой, например:
SELECT наименование_продукта, категория_продукта
77
FROM Продукт LEFT OUTER JOIN Категория WHERE Про-
дукт.категория_номер=Категория.категория_номер Предложение GROUP BY
Группировка данных в операторе SELECT осуществля- ется с помощью ключевого слова GROUP BY(группа) и клю- чевого слова HAVING, с помощью которого задаются усло- вия разбиения записей на группы.
GROUP BY неразрывно связано с агрегирующими функциями (см. п. 4.3.2), без них оно практически не исполь- зуется. GROUP BY разделяет таблицу на группы, а агреги- рующая функция вычисляет для каждой из них итоговое зна- чение.
При использовании GROUP BY результаты будут сгруппированы по одинаковым значениям атрибута группи- ровки. Определим для примера количество книг каждого из- дательства в нашей базе данных:
SELECT публикации.публикация,
COUNT(titles.title)
FROM titles, публикации
WHERE titles.pub_id=публикации.pub_id
GROUP BY публикация;
Kлючевое слово HAVING работает следующим обра- зом: сначала GROUP BY разбивает строки на группы, затем на полученные наборы накладываются условия HAVING. На- пример, устраним из предыдущего запроса те издательства, которые имеют только одну книгу:
SELECT публикации.публикация, count(titles.title)
FROM titles, публикации
WHERE titles.pub_id=публикации.pub_id
GROUP BY публикация
HAVING COUNT(*)>1;
Другой вариант использования HAVING - включить в результат только те издательства, название которых оканчи- вается на подстроку "Press":
SELECT публикации.публикация, count(titles.title)
78
FROM titles, публикации
WHERE titles.pub_id=публикации.pub_id
GROUP BY публикация
HAVING публикация LIKE '%Press';
В чем различие между двумя этими вариантами исполь- зования HAVING? Во втором варианте условие отбора запи- сей мы могли поместить в раздел ключевого слова WHERE, в первом же варианте этого сделать не удастся, поскольку WHERE не допускает использования агрегирующих функций.
Еще пример. Найдем сумму баллов, полученных абиту- риентом на экзамене:
SELECT DISTINCTROW Оценки. номер абитуриента, Sum(Оценки. полученный балл) AS Sum Полученный_балл
FROM Оценки
GROUP BY Оценки. номер абитуриента;
Предложение GROUP BY (группа) сообщает системе, что надо разбить отношение «Оценки» на группы кортежей с одинаковыми значениями атрибута «номер абитуриента». В результате для каждой группы будет возвращена строка,
представляющая суммарный балл с определенным значением номера абитуриента. В первой строке необходимо указывать атрибут, по которому будет производиться группировка. При использовании функций не разрешается (!) в верхней строке оператора (в предложении SELECT) указывать имена атрибу- тов, не входящих в предложение GROUP BY. В одном опера- торе можно указывать несколько функций.
На создаваемые подгруппы можно накладывать ограни- чения с помощью предложения HAVING (иметь) в следую- щем примере оператор возвратит только строки, у которых суммарный балл больше 12.
SELECT DISTINCTROW Оценки. номер абитуриента, Sum(Оценки. полученный балл) AS Sum_Полученный
балл
FROM Оценки
GROUP BY Оценки.номер абитуриента; HAVING Sum(Оценки.полученный балл)>12
79
Ключевые слова ALL и DISTINCT
Эти ключевые слова управляют выводом дублирующих строк результирующего набора записей. Ключевое слово DISTINCT указывает, что строки результирующего набора должны быть уникальны, в то время как ключевое слово ALL указывает, что возвращать необходимо все строки.
4.3.4Вложенные последовательности запросов
ВSQL можно создавать вложенные последовательности запросов. Например, в результате выполнения следующего запроса будут перечислены все номера клиентов, имеющих счета в филиале «Бауманский»:
SELECT номер_клиента FROM Счета_клиентов WHERE номер_счета IN
(SELECT номер_счета
FROM Счета
WHERE филиал= «Бауманский»)
Вданном случае подзапрос возвращает множество кор- тежей, состоящих из номеров_счетов отношения Счета, кото- рые обрабатывает филиал «Бауманский». Он вложен во внешний запрос, который сравнивает номера-счетов каждого кортежа отношения Счета_клиентов с возвращенным внут- ренним запросом множеством номеров счетов. Если рассмат- риваемый номер счета есть в указанном множестве, будет возвращен номер_клиента этого кортежа. Для проверки при- надлежности к множеству используется оператор IN.
Существуют определенные типы запросов, которые лучше реализовывать с помощью подзапросов; преимущест- венно это так называемые проверки существования. Предпо- ложим, что требуется получить данные о клиентах, которые не имеют счетов. Можно создать следующий запрос с вло- женным подзапросом:
SELECT *
FROM Клиенты
WHERE номер_клиента NOT IN
80
