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

Особенности построения баз данных. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

КОД_С

ФИО

ДАТА_Р

ЗВАНИЕ

 

 

 

 

1001

Иванов С. П.

11.12.1969

майор

1003

Сидоров С.В.

23.03.1965

капитан

1005

Кузьмин О.Н.

27.10.1965

майор

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

Оператор BETWEEN

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

SELECT *

FROM Объекты

WHERE ДОМ Between 30 And 100;

КОД_О

НАЗВАНИЕ

УЛИЦА

ДОМ

 

 

 

 

2003

ДЕЛЬФА

Интернациональная

34

2004

ВАЛЕНТ

Советская

83

Для оператора BETWEEN, значение, совпадающее с любым из двух значений границы (в этом случае, 30 и 100), является верным.

Оператор LIKE

LIKE применим только к полям типа CHAR или VARCHAR, с которыми он используется, чтобы находить подстроки, т.е. он ищет поле символа, чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует групповые символы (wildkards) – специальные символы, которые могут соответствовать чему-нибудь. Имеются два типа групповых символов используемых с LIKE:

* символ подчеркивания (_) замещает любой одиночный символ. Например, 'b_t' будет соответствовать словам 'bat' или 'bit', но не будет соответствовать 'brat'.

SELECT *

FROM Сотрудники

WHERE ЗВАНИЕ LIKE 'м_ _ _ _';

61

* знак процента (%) замещает последовательность любого числа символов (включая символы нуля). Например '%p%t' будет соответство-

вать словам 'put', 'posit', или 'opt', но не 'spite'.

SELECT *

FROM Объекты

WHERE УЛИЦА LIKE 'С%';

Работа с нулевыми (NULL) значениями

В таблице будут часто встречаться записи, которые не имеют никаких значений для каждого поля, например, потому что информация не завершена, или потому что это поле просто не заполнялось. SQL учитывает такой вариант, позволяя вам вводить значение NULL (ПУСТОЙ) в поле, вместо значения. Когда значение поля равно NULL, это означает, что программа базы данных специально промаркировала это поле как не имеющее никакого значения для этой строки (или записи). Это отличается от простого назначения полю, значения нуля или пробела, которые база данных будет обрабатывать так же как и любое другое значение. Точно так же как NULL не является техническим значением, оно не имеет и типа данных. Оно может помещаться в любой тип поля.

NULL оператор

Так как NULL указывает на отсутствие значения, вы не можете знать, каков будет результат любого сравнения с использованием NULL. Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным, ни неверным, он – неизвестен. Часто вы должны делать различия между неверно и неизвестно – между строками, содержащими значения столбцов, которые не соответствуют условию выражения и которые содержат NULL в столбцах. По этой причине SQL предоставляет специальный оператор IS, который используется с ключевым словом NULL для размещения значения NULL.

SELECT * FROM Объекты

WHERE УЛИЦА IS NULL;

Использование NOT со специальными операторами

Специальные операторы, которые мы рассматривали выше, могут немедленно предшествовать Булеву NOT.

Он противоположен реляционным операторам, которые должны иметь оператор NOT – вводимым выражением. Например, если мы хотим устранить NULL из нашего вывода, мы будем использовать NOT, чтобы изменить на противоположное значение предиката:

62

SELECT *

FROM Объекты

WHERE УЛИЦА NOT NULL;

При отсутствии значений NULL (как в нашем случае), будет выведена вся таблица Заказчиков. Аналогично можно ввести следующее:

SELECT *

FROM Объекты

WHERE NOT УЛИЦА IS NULL;

Можно также использовать NOT с IN: SELECT *

FROM Сотрудники

WHERE ЗВАНИЕ NOT IN ('майор', 'капитан');

или

SELECT *

FROM Сотрудники

WHERE NOT ЗВАНИЕ IN ('майор', 'капитан');

Таким же способом можно использовать NOT BETWEEN и NOT LIKE.

Агрегатные (групповые) функции

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

COUNT – вычисляет количество выделенных записей в запросе;

SUM – возвращает сумму всех выбранных значений данного поля;

AVG – производит усреднение всех выбранных значений данного

поля;

MAX – возвращает наибольшее из всех выбранных значений данного поля;

MIN – возвращает наименьшее из всех выбранных значений данного поля.

Агрегатные функции используются подобно именам полей в предложении SELECT запроса, но они в качестве аргумента берут имя поля. Только числовые поля могут использоваться с SUM и AVG. С функциями, COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля. Когда они используются с символьными полями, MAX и MIN будут транслировать их в эквивалент ASCII, который должен сообщать, что MIN – первое, а MAX – последнее значение в алфавитном порядке.

63

Пример. Нахождение суммы всех значений поля.

SELECT SUM (ПРЕМИЯ)

Возвращает значение 7500

FROM Зарплата;

 

 

Пример. Нахождение среднего значения поля

 

 

 

SELECT AVG (ОКЛАД)

 

Возвращает значение 4200

FROM Зарплата;

 

 

Функция COUNT считает число строк в таблице.

Пример. Нахождение количества строк в таблице

SELECT COUNT (*)

Возвращает значение 5

FROM Зарплата;

 

(В MS Access не работает: Функция COUNT считает число значений в столбце или число строк в таблице. Когда она считает значения столбца, то используется с DISTINCT, чтобы производить счет чисел различных значений в данном поле. COUNT со звездочкой включает и NULL и дубликаты, поэтому в данном случае не может быть использован DISTINCT. Во многих реализациях языка SQL в агрегатных функциях может использоваться аргумент ALL, который помещается перед именем поля. При этом будут учитываться дубликаты. ALL не может подсчитать значения

NULL.)

Агрегатные функции можно использовать с аргументами, состоящими из скалярных выражений, включающих одно или более полей. (В этом случае применять DISTINCT нельзя).

SELECT MAX (ОКЛАД+ПРЕМИЯ)

Возвращает значение 7000

FROM Зарплата;

 

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

В предложении SELECT для объединения значений в группы используется предложение GROUP BY.

SELECT COUNT (КОД_С)

Возвращает значения:

FROM Дежурство

3

GROUP BY КОД_С;

2

 

2

 

2

 

1

64

GROUP BY может использоваться с несколькими полями (max – 10).

Для задания условий по группе при вычислении групповых значений используется оператор HAVING. Он определяет критерии, используемые, чтобы удалять определенные группы из вывода, точно так же как предложение WHERE делает это для индивидуальных строк.

SELECT КОД_С, COUNT (КОД_С)

Возвращает значения:

FROM Дежурство

1001

3

GROUP BY КОД_С

 

 

HAVING COUNT (КОД_С) > 2;

 

 

 

 

 

HAVING должен ссылаться только на агрегаты и поля, выбранные

GROUP BY.

SELECT КОД_С, MIN(ДАТА_Д)

Возвращает значения:

FROM Дежурство

1002

9/12/2004

GROUP BY КОД_С

1004

10/1/2004

HAVING КОД_С In (1002,1004);

 

 

В строгой интерпретации ANSI SQL не возможно использовать агрегат агрегата. Некоторые реализации языка SQL не имеют этих ограничений.

Формирование вывода запроса

Большинство основанных на SQL баз данных предоставляют специальные средства, позволяющие совершенствовать вывод ваших запросов. Конечно, они претерпевают значительные изменения от программы к программе, имеется несколько особенностей, созданных в стандарте SQL, которые позволяют делать больше, чем просто вывод значений полей и агрегатных данных.

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

SELECT КОД_С, ОКЛАД/29, ПРЕМИЯ/29

FROM Зарплата;

В этом примере два последних столбца без наименования (так называемые столбцы вывода). Столбцы вывода – это столбцы данных, созданные запросом (способом, иным, чем просто извлечение их из таблицы). Они создаются при использовании агрегатных функций, констант или выражений в предложении SELECT.

65

Использование оператора AS в предложении SELECT позволяет давать наименование столбцам в создаваемом запросе.

SELECT КОД_C, ОКЛАД/29 AS [ОКЛАД_Д],

ПРЕМИЯ/29 AS [ПРЕМИЯ_Д] FROM Зарплата;

Предложение SELECT позволяет вставлять текст в вывод запроса.

SELECT КОД_С, '$', ОКЛАД/29 AS [ОКЛАД_Д], '$',

ПРЕМИЯ/29 AS [ПРЕМИЯ_Д] FROM Зарплата;

Таблица – это неупорядоченные наборы данных и данные, которые выходят из них, необязательно появляются в какой-то определенной последовательности. SQL использует команду ORDER BY для упорядочивания вывода. Эта команда упорядочивает вывод запроса согласно значениям в том или ином количестве выбранных столбцов. Можно определить возрастание (ASC) или убывание (DESC) для каждого столбца. По умолчанию установлено возрастание.

SELECT *

FROM Зарплата

ORDER BY ОКЛАД;

Можно использовать ORDER BY сразу с любым числом столбцов. Столбцы, которые упорядочиваются, должны быть указаны в выборе SELECT.

SELECT *

FROM Зарплата

ORDER BY ОКЛАД, ПРЕМИЯ;

ORDER BY может использоваться с GROUP BY для упорядочения групп.

SELECT КОД_С, COUNT (КОД_С) FROM Дежурство

GROUP BY КОД_С ORDER BY КОД_С DESC;

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

66

SELECT КОД_С, COUNT (КОД_С)

FROM Дежурство

GROUP BY КОД_С

ORDER BY 1 DESC;

Запрашивание многочисленных таблиц

Одна из наиболее важных особенностей запросов SQL – это их способность определять связи между многочисленными таблицами и выводить информацию из них в терминах этих связей. Этот вид операции называется объединением. С помощью объединений информация непосредственно связывается с любой таблицей, и таким образом, создаются связи между сравнимыми фрагментами данных. При объединении, таблицы, представленные списком в предложении FROM запроса, отделяются запятыми. Предикат запроса может ссылаться к любому столбцу любой связанной таблицы и, следовательно, может использоваться для связи между ними. Обычно предикат сравнивает значения в столбцах различных таблиц, чтобы определить, удовлетворяет ли WHERE установленному условию.

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

Сотрудники.ФИО Объекты.НАЗВАНИЕ

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

SELECT Сотрудники.ФИО, Дежурство.ДАТА_Д FROM Дежурство, Сотрудники

WHERE Сотрудники.КОД_С = Дежурство.КОД_С; Этот же запрос можно записать:

SELECT ФИО, ДАТА_Д

FROM Дежурство, Сотрудники

WHERE Сотрудники.КОД_С = Дежурство.КОД_С;

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

SELECT Сотрудники.ФИО, Объекты.НАЗВАНИЕ, Дежурство.ДАТА_Д

FROM Дежурство, Сотрудники, Объекты

67

WHERE Сотрудники.КОД_С = Дежурство.КОД_С And Объекты.КОД_О = Дежурство.КОД_О;

Подзапросы

Подзапрос – это запрос, который размещается внутри другого запроса. С помощью SQL вы можете вкладывать запросы внутрь друг друга.

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

SELECT * FROM Дежурство

WHERE КОД_С = (SELECT КОД_С

FROM Сотрудники WHERE ФИО = 'Иванов С.П.');

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

Для создания подзапроса, производящего несколько значений, можно использовать оператор IN. IN определяет набор значений для сравнения. Когда IN используете с подзапросом, SQL формирует этот набор из вывода подзапроса.

SELECT * FROM Дежурство

WHERE КОД_С IN (SELECT КОД_С

FROM Сотрудники WHERE звание = 'майор');

Операторы BETWEEN, LIKE, и IS NULL не могут использоваться с подзапросами.

Можно использовать подзапросы внутри предложения HAVING.

SELECT КОД_С, COUNT (КОД_С) FROM Дежурство GROUP BY КОД_С

HAVING КОД_С = (SELECT КОД_С FROM Зарплата WHERE Премия = 2000);

Объединение многочисленных запросов в один

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

Два (или более) запроса подвергаются объединению, когда их столбцы вывода совместимы для объединения. Это означает, что каждый запрос должен указывать одинаковое число столбцов, в том же порядке, что и предыдущий, и каждый должен иметь тип, совместимый с соответствующим значением из другого запроса.

68

SELECT КОД_С FROM Сотрудники

UNION

SELECT КОД_С FROM Дежурство;

Введение, удаление и изменение значения поля

Значения могут быть помещены и удалены из полей тремя командами:

INSERT

(ВСТАВИТЬ),

UPDATE

(МОДИФИЦИРОВАТЬ),

DELETE

(УДАЛИТЬ)

Эти команды не производят никакого вывода, но программа должна дать подтверждение того, что она были выполнена.

Все строки в SQL вводятся с использованием команды модификации INSERT. В самой простой форме INSERT использует следующий синтаксис:

INSERT INTO <TABLE name > VALUES (. . . );

Например:

INSERT INTO Сотрудники

VALUES (1006, 'Павлов А.Б.', #9/22/1964#, 'капитан');

Пустое значение (NULL) вводите точно так же как и обычное значение.

INSERT INTO Сотрудники

VALUES (1006, 'Павлов А.Б.', #9/22/1964#, NULL);

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

INSERT INTO Сотрудники (КОД_С, ДАТА_Р, ФИО) VALUES (1006, #9/22/1964#, 'Павлов А.Б.');

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

DELETE FROM Дежурство WHERE ДАТА_Д = #9/12/2004#;

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

UPDATE Зарплата SET ПРЕМИЯ = 1000;

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

UPDATE Зарплата SET ПРЕМИЯ = ПРЕМИЯ+500;

69

Вставка результатов запроса

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

INSERT INTO Служащие SELECT *

FROM Сотрудники WHERE звание = 'майор';

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

Использование подзапросов с DELETE

Можно также использовать подзапросы в команде DELETE. Это дает возможность определять некоторые довольно сложные критерии, чтобы установить, какие строки будут удаляться.

Например: DELETE * FROM Дежурство

WHERE КОД_С = (SELECT КОД_С

FROM Сотрудники WHERE звание = 'капитан');

Использование подзапросов с UPDATE

UPDATE использует подзапросы тем же способом, что и DELETE. Например:

UPDATE Зарплата SET ПРЕМИЯ = ПРЕМИЯ+50 WHERE КОД_С IN

(SELECT КОД_С FROM Сотрудники WHERE звание = 'сержант');

Создание таблиц

Таблицы создаются командой CREATE TABLE. Эта команда создает пустую таблицу – таблицу без строк. Значения вводятся с помощью команды INSERT. Команда CREATE TABLE в основном определяет имя таблицы, в виде описания набора имен столбцов, указанных в определенном порядке. Она также определяет типы данных и размеры столбцов. Каждая таблица должна иметь, по крайней мере, один столбец.

Синтаксис команды CREATE TABLE:

CREATE TABLE <TABLE-NAME> (<COLUMN name> <DATA type> [(<SIZE>)], <COLUMN name> <DATA type> [(<SIZE>)] ..).;

Так как пробелы используются для разделения частей команды SQL, они не могут быть частью имени таблицы (или любого другого объекта). Подчеркивание(_) обычноиспользуетсядляразделениясловвименахтаблиц.

70

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