Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
604 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]