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

db / Лекции / 6 семестр / Языки запросов

.pdf
Скачиваний:
66
Добавлен:
23.03.2015
Размер:
1.14 Mб
Скачать

1.3.2 Простейшие условия

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

рами отношений, а вторые — логическими связками.

Хотя такие условия являются простейшими в смысле семантики конструк-

ций, они могут иметь довольно сложную структуру из многих операторов срав-

нений и вложенных друг в друга логических связок.

1.3.3 Операторы сравнения

Особенностью операторов сравнения является то, что независимо от типов операндов их результатом являются логические значения. Предположим,

вы хотите получить список всех профессоров.

Запрос. Вывести фамилии профессоров.

SELECT Name AS Список_профессоров

FROM TEACHER

WHERE Post = 'профессор';

СПИСОК ПРОФЕССОРОВ

Сидоров

Резван

Ахромеев

Это первый пример использования предиката над строковым типом дан-

ных. Здесь столбец строкового типа сравнивается со строковой константой. За-

прос выполнен правильно, однако нужно всегда помнить о том, что предикаты над строками являются чувствительными к регистру букв. Например, предикат

'ИВАНОВ' = 'Иванов' будет ложным. Поэтому, если для некоторого профессора его должность была введена в таблицу TEACHER как 'Профессор', он не будет найден по условию WHERE Post = 'профессор'. Чтобы на предикаты над стро-

ками не влиял регистр букв, нужно использовать обычно имеющиеся в СУБД функции преобразования букв в прописные и строчные. В стандарте SQL,

например, указаны функции UPPER и LOWER, выполняющие такие преобразо-

вания. Следовательно, для предыдущего запроса правильней будет записать условие фразы WHERE одним из следующих способов:

21

WHERE LOWER(Post) = 'профессор'

WHERE UPPER(Post) = 'ПРОФЕССОР'

Запрос. Найти названия кафедр с фондом финансирования, превышающим

15 000.

SELECT Name

FROM DEPARTMENT

WHERE Fund > 15000;

NAME

Прикладной математики

Экономики

В двух приведенных выше примерах для формулировки условия мы ис-

пользовали операторы сравнения. Для числовых и временных значений поря-

док имеет обычный смысл. Для строковых значений используется алфавитный порядок.

Примечание. Точнее, порядок символов определяется их кодировкой.

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

Запрос. Вывести фамилии и должности преподавателей, принятых на ра-

боту после 01.01.2002.

SELECT Name AS Фамилия. Post AS Должность

FROM TEACHER

WHERE HireDate > TO_DATE(01/01/2001', 'DD/MM/YYYY');

ФАМИЛИЯ

ДОЛЖНОСТЬ

 

 

Хоренко

преподаватель

Вибровский

ассистент

Воропаев

ассистент

Козлутин

ассистент

Мартынов

ассистент

Запрос. Вывести фамилии и должности преподавателей, фамилии которых в алфавитном порядке располагаются после фамилии Резван.

SELECT Name. Post

22

FROM TEACHER

WHERE UPPER(Name) > 'PEЗBAH';

ФАМИЛИЯ

ДОЛЖНОСТЬ

 

 

Сидоров

профессор

Хоренко

преподаватель

Запрос. Вывести фамилии преподавателей, у которых надбавка меньше

ставки в 2,5 и более раз.

1.3.4 Логические операторы

Операндами и результатом логических операторов (часто их называют ло-

гическими связками или булевыми операторами) являются логические значения.

Примечание. В связи с возможным отсутствием данных (их значение при этом считается неопределенным) в SQL используется трехзначная логика (с ло-

гическими значениями TRUE, FALSE, UNKNOWN).

Стандартными логическими операторами являются AND, OR и NOT.

Если обобщить, оператор AND истинен только в том случае, когда истин-

ны оба операнда, OR – когда истинен хотя бы один из операндов, a NOT дает противоположное операнду значение.

Использование операторов сравнения вместе с логическими операторами предоставляет возможность формулировать составные условия для отбора строк таблиц. В математике существуют и другие логические операторы, одна-

ко они не используются в SQL, так как все их можно выразить через AND, OR

и NOT.

Запрос. Вывести фамилии преподавателей, которые являются профессо-

рами и ставка которых превышает 1050.

SELECT Name AS "Проф. со ставкой > 1050"

FROM TEACHER

WHERE UPPER(Post) = 'ПРОФЕССОР' AND Salary > 1050;

Запрос. Вывести названия кафедр корпуса 3 с фондом финансирования в диапазоне 12 000-15 000.

SELECT Name

FROM DEPARTMENT

WHERE Building = '3' AND Fund >= 12000 AND Fund <= 15000;

23

Запрос. Вывести названия кафедр, фонд финансирования которых меньше

11 000 или больше 25 000.

SELECT Name, Fund

FROM DEPARTMENT

WHERE Fund < 11000 OR Fund > 25000;

Запрос. Вывести номера аудиторий, расположенных в корпусах 4 и 5.

SELECT Num, Building

FROM ROOM

WHERE Building = '4' OR Building = '5';

Запрос. Вывести названия всех факультетов, кроме факультета математики.

SELECT Name

FROM FACULTY

WHERE NOT LOWER(Name) = 'информатика';

Запрос. Вывести названия, корпуса и фонды финансирования кафедр, распо-

ложенных в корпусах 3 или 6 и имеющих фонд финансирования меньше 11 000

или больше 25 000.

SELECT Name, Post, Salary, Rise

FROM TEACHER

WHERE LOWER(PoSt) = 'ассистент' AND

(Salary < 550 OR Rise > 160);

1.3.5 Использование выражений над столбцами

До сих пор в выражениях фразы WHERE мы использовали в качестве зна-

чения одного или обоих аргументов имена столбцов. Однако аргументами мо-

гут быть и выражения над столбцами.

Запрос. Вывести фамилии преподавателей, чья зарплата (ставка плюс надбавка) превышает 1500.

SELECT

Name AS "Фамилия преподавателя",

Salary + Rise AS "Его зарплата"

FROM TEACHER

WHERE Salary + Rise > 1500;

Запрос. Вывести фамилии преподавателей, половина зарплаты которых

превышает троекратную надбавку.

SELECT Name

FROM TEACHER

WHERE (Salary + Rise) / 2 > 3 * Rise;

24

1.3.6 Специальные операторы

В SQL имеются операторы сравнения, позволяющие проверять значения

столбцов и выражений над ними на соответствие некоторым специальным

условиям:

принадлежность множеству;

принадлежность диапазону;

соответствие шаблону;

соответствие регулярному выражению (на самостоятельное изучение);

неопределенное значение.

Далее мы узнаем, как их использовать и как с их помощью создавать со-

ставные условия.

1.3.7 Проверка на принадлежность множеству

Оператор IN позволяет проверить, входит ли значение в указанное множе-

ство значений. В простейшем случае этот оператор имеет следующий синтак-

сис:

имя_столбца [NOT] IN (список_значений)

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

Запрос. Вывести типы занятий, проводимых на первой неделе в первые

три дня.

SELECT DISTINCT Type AS "Тип занятия"

FROM LECTURE

WHERE WEEK = 1 AND LOWER(Day) IN ('пнд', 'втр', 'срд');

Отметим, что оператор IN в варианте с константами в правой части имеет эквивалентное представление с использованием логической связки OR.

Запрос. Вывести названия и номер корпуса кафедр, расположенных в лю-

бых корпусах, кроме 1, 3, 8 или 10.

SELECT Name AS "Название кафедры", Building AS "Корпус"

FROM Department

WHERE Building NOT IN ('1', '3', '8', '10');

25

Примечание. Отметим, что, следуя общему принципу применения опера-

тора NOT, можно использовать и такую конструкцию:

NOT (имя_столбца IN (список_значений))

1.3.8 Проверка на принадлежность диапазону значений

Еще одной формой проверки вхождения элемента во множество является проверка на его принадлежность диапазону значений. Для этого применяется предикат BETWEEN, который определяет нахождение значения столбца между указанными минимальным и максимальным значениями. Синтаксис предиката следующий:

имя_столбца [NOT] BETWEEN минимум AND максимум

Проверять можно значения числовых, строковых и временных типов (для строк символов предполагается алфавитное упорядочение). Крайние значения диапазона включаются в допустимые.

Запрос. Вывести фамилии преподавателей со ставкой в диапазоне 600-800.

SELECT Name

FROM TEACHER

WHERE Salary BETWEEN 600 AND 800;

1.3.9 Проверка на соответствие шаблону

Когда необходимо отобрать строки таблицы, в которых значение некото-

рого столбца совпадает с заданной строкой символов, следует использовать обычное сравнение, как это показано выше. Однако во многих случаях можно не знать точное представление в базе данных интересующего значения. Назва-

ние одной и той же кафедры, например, может храниться в одном из следую-

щих вариантов:

“базы данных”, “организация баз данных”, “информационные системы и

базы данных”, “базы данных и знаний”.

Такая же ситуация возникает, когда не известно точное написание фами-

лии преподавателя, название дисциплины, факультета и т. п. Специально для таких случаев предназначен оператор сравнения LIKE, позволяющий отобрать из таблицы строки на основе частичного соответствия. Упрощенный синтаксис оператора следующий:

имя_столбца [NOT] LIKE шаблон [ESCAPE символ_пропуска]

26

Его можно использовать только с символьными значениями.

Оператор LIKE сравнивает значение столбца с множеством значений,

определяемых шаблоном. Он представляет собой строку, в которой помимо обычных символов, составляющих основу поискового выражения, можно ис-

пользовать так называемые подстановочные:

% – любая последовательность символов, включая их отсутствие; _ – один любой символ.

Подстановочные символы могут находиться в любом месте шаблона в лю-

бом наборе. Например, шаблону 'Иван' соответствуют строки 'Иван', 'Иванов', 'Иванченко', 'Петр Иванович', а шаблону 'л_с_' - 'лист', 'леса', 'лоск' (но не соот-

ветствуют: 'лес', 'листок', 'плес').

Оператор LIKE, как и все другие, работающие с символьными строками,

чувствителен к регистру букв.

Запрос. Найти фамилии преподавателей на букву «Н».

SELECT Name

FROM TEACHER

WHERE UPPER(Name) LIKE 'Н%';

Запрос. Вывести названия кафедр, в которых присутствует словосочетание

«база данных» (в различных грамматических формах).

SELECT Name

FROM DEPARTMENT

WHERE LOWER(Name) LIKE '%баз%данны';

В левой части оператора LIKE может находиться не только имя столбца,

но и любое допустимое над столбцами выражение, как это показано в следую-

щем примере.

Запрос. Указать преподавателей, в фамилию и название должности кото-

рых входит в сумме не меньше четырех букв «о».

SELECT Name, Post

FROM TEACHER

WHERE LOWERCName || Post) LIKE '%о%о%о%о%';

Name

POST

 

 

Сидоров

профессор

27

1.3.10 Проверка на неопределенное значение

Покажем, как обрабатывать значение NULL во фразе WHERE.

Чтобы проверить столбец на неопределенное значение, следует применить унарный оператор IS NULL, имеющий такой синтаксис:

имя_столбца IS [NOT] NULL

Этот оператор принимает истинностное значение TRUE, если столбец имеет неопределенное значение, и FALSE - в противном случае. В нотации IS NOT NULL его действие обратное.

Запрос. Вывести фамилии преподавателей, у которых задан номер телефо-

на или идентификационный код.

SELECT Name, IDCode, Tel

FROM TEACHER

WHERE Tel IS NOT NULL OR IDCode IS NULL;

1.3.11 Итоги лекции

Усвоив материал этого урока, студенты научились:

формулировать условия с использованием операторов сравнений;

использовать логические операторы;

строить условия с использованием выражений над столбцами;

использовать оператор IN для проверки принадлежности множеству;

использовать оператор BETWEEN для проверки принадлежности диапа-

зону значений;

использовать оператор LIKE для проверки на соответствие шаблону;

использовать оператор IS NULL для проверки на неопределенное значение.

1.4 Многотабличные запросы (7-8)

1.4.1 Аннотация к лекции

При проектировании стремятся создавать таблицы, в каждой из которых содержалась бы информация об одном и только одном типе сущности. Это об-

легчает модификацию базы данных и поддержку ее целостности. Именно так и поступили создатели учебной базы данных. Однако сущности могут быть взаи-

28

мосвязанными. Заказанные позиции связаны с заказами по принципу вхожде-

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

го столбца первичного ключа одной таблицы, которая называется родительской,

в другой таблице, которая называется дочерней. Столбец (или совокупность столбцов) дочерней таблицы, определенный для связи с родительской табли-

цей, называется внешним ключом. Так, например, таблица «Заказы» содержит поле «КодСотрудника», который имеет значение первичного ключа таблицы

«Сотрудники». Наличие внешних ключей является основной для инициирова-

ния поиска по многим таблицам.

Одна из наиболее важных особенностей предложения SELECT — это спо-

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

называется соединением таблиц. Для того чтобы указать соединяемые таблицы,

их следует перечислить через запятую во фразе FROM.

1.4.2 Декартово произведение таблиц

Соединение таблиц - это частный случай операции декартового произве-

дения (или просто произведения). Декартово произведение двух таблиц – это таблица, состоящая из всех возможных пар строк обеих таблиц. Это определе-

ние можно естественным образом расширить на любое количество таблиц.

В SQL декартово произведение выражается указанием имен перемножае-

мых таблиц во фразе FROM и указанием всех их столбцов во фразе SELECT.

Так, произведение таблиц FACULTY и DEPARTMENT выражается следующим образом:

SELECT *

FROM FACULTY, DEPARTMENT;

Так как результирующая таблица содержит много столбцов и они не по-

мещаются по ширине страницы, мы приведем только интересующие нас столб-

цы произведения этих таблиц.

29

Запрос. Декартово произведение таблиц.

SELECT

FACULTY.Name, FACULTY.FacPK,

DEPARTMENT.FacFK, DEPARTMENT.Name

FROM FACULTY, DEPARTMENT;

NAME

FACPK

FACFK

NAME

 

 

 

 

информатика

1

1

базы данных

информатика

1

1

программирование

информатика

1

1

интернет

информатика

1

2

базы данных

информатика

1

2

лингвистика

информатика

1

2

теория языков

кибернетика

2

1

базы данных

кибернетика

2

1

программирование

кибернетика

2

1

интернет

кибернетика

2

2

базы данных

кибернетика

2

2

лингвистика

кибернетика

2

2

теория языков

математика

3

1

базы данных

математика

3

1

программирование

математика

3

1

интернет

математика

3

2

базы данных

математика

3

2

лингвистика

математика

3

2

теория языков

Каждая строка таблицы факультетов оказалась соединенной с каждой строкой таблицы кафедр, в результате получилось 18 строк (3 факультета х 6

кафедр = 18 комбинаций).

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

SELECT *

FROM FACULTY, DEPARTMENT, TEACHER

Если предположить, что в вузе имеется 15 факультетов, 100 кафедр и 1500

преподавателей, то результирующая таблица будет содержать более двух миллионов строк (15 х 100 х 1500 - 2 250 000), и это при таких незначительных размерах исходных таблиц. Будьте внимательными, не используйте декартово-

30