Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных проектирование и реализация. Учебное пособие
.pdf
целочисленными типами, в которых отображается десятичная точка.
Синтаксис объявления типа с фиксированной запятой следующий:
DECIMAL (n, m),
где n – точность (общая длина числового значения); m – масштаб (коли-
чество знаков, расположенных справа от десятичной точки).
Вещественные типы с плавающей точкой обычно используются
в научных и инженерных расчетах. Наиболее часто используются два
вещественных типа с плавающей точкой:
FLOAT – числа с одинарной точностью;
DOUBLE – числа с двойной точностью.
Типы для представления даты и времени используются для хра-
нения информации, относящейся к датам и времени. Иногда типы данных, предназначенные для хранения времени и даты, называются темпоральными. В стандарте SQL92 определены следующие типы данных
для хранения информации о дате и времени:
DATE – используется для хранения даты;
TIME – используется для хранения времени;
TIMESTAMP – хранит дату и время;
INTERVAL –
хранит промежуток времени между двумя датами (мо-
ментами времени).
5.2.2. СОЗДАНИЕ, ИЗМЕНЕНИЕ И УДАЛЕНИЕ ТАБЛИЦ
Таблицы создаются с помощью команды CREATE TABLE. Она
формирует пустую таблицу, не содержащую строк. Таблицы, как и другие объекты БД, принадлежат пользователю, который их создал.
Команда CREATE TABLE определяет таблицу как набор поименованных столбцов, расположенных в указанном порядке, а также задает
типы данных и размеры столбцов. Каждая таблица должна иметь хотя
бы один столбец. Синтаксис команды CREATE TABLE:
CREATE TABLE <имя
таблицы>
( {<имя поля> <тип данных> [(<размер>)]
[<ограничения целостности поля>…]}.,..
[, <ограничения целостности таблицы>.,..] );
Поскольку пробелы используются для разделения отдельных частей
команд в SQL, их нельзя использовать как часть имени таблицы (либо
61

другого объекта, например индекса). Символ подчеркивания (_) наиболее часто используется для разделения слов в именах таблиц.
В качестве ограничений могут использоваться следующие:
PRIMARY KEY – первичный ключ;
UNIQUE – уникальное значение поля в пределах столбца таб-
лицы;
NULL или NOT NULL – соответственно разрешение или запрет
оставлять значение поля незаполненным;
CHECK (<условие>) – проверка условия для поля (полей);
DEFAULT <выражение> – задание значения поля по умолчанию;
REFERENCES <имя таблицы> [(<имя столбца>)] – внешний
ключ:
FOREIGN KEY [(<список полей>.,..)] REFERENCES<имя таб-
лицы> [(<список полей>)] – внешний ключ (это ограничение применяется к таблице, а не к столбцу).
Для изменения определений существующих таблиц служит опера-
тор
ALTER TABLE. С его помощью можно добавлять и удалять
столбцы и ограничения к таблице, а также добавлять и удалять из
столбца значение по умолчанию. Синтаксис оператора ALTER TABLE:
ALTER TABLE <имя таблицы>
{ADD [COLUMN] <определение столбца>}
| {ALTER [COLUMN] <имя столбца>
{SET DEFAULT <значение по умолчанию>} | {DROP DEFAULT}}
Для удаления существующих таблиц служит оператор
TABLE.
Синтаксис оператора удаления таблицы:
DROP
DROP TABLE <имя таблицы> [RESTRICT | CASCADE];
Предложения RESTRICT и CASCADE определяют, что произойдет
с объектами (такими, как представления), зависящими от этой таблицы.
Ключевое слово RESTRICT запрещает применение к ним операции
DROP. При указании CASCADE все зависимые объекты будут автоматически удалены.
5.2.3. ВВОД, УДАЛЕНИЕ И ИЗМЕНЕНИЕ ДАННЫХ В ТАБЛИЦАХ
Добавление записей в таблицы выполняется оператором INSERT,
синтаксис которого:
INSERT INTO <имя таблицы> [(<имя поля>.,..)]
VALUES (<список выражений>) | <запрос>;
62

Список выражений должен соответствовать порядку и типам полей.
Если все поля таблицы должны получить значения, имена столбцов
можно не указывать.
Если значения задаются не для всех полей, а также при вставке дан-
ных в произвольной последовательности, необходимо явным образом
указывать имена полей. Те поля, которые не получают значения, при
описании
таблицы должны быть определены как NULL или иметь зна-
чение по умолчанию (DEFAULT).
Оператор INSERT позволяет выполнять вставку значений, вы-
бранных из другой таблицы или представления. Для этого вместо
фразы VALUES со списком выражений указывается запрос – команда
SELECT. Этот запрос должен возвращать записи, соответствующие
списку полей.
Удаления записей из таблицы выполняется оператором
DELETE:
DELETE FROM <имя таблицы> [WHERE <условие>];
Если условие не задано (фраза WHERE отсутствует), то будут уда-
лены все записи таблицы.
Изменение (обновление) значений полей в существующих записях
выполняется с помощью оператора
UPDATE, синтаксис которого:
UPDATE <имя таблицы> SET {<имя поля> = <выражение>}.,..
[WHERE <условие>];
Условие определяет множество записей, в которых будет выполнено
обновление.
Если фраза WHERE отсутствует, то изменение значений произойдет
во всех записях.
5.2.4. ВЫБОРКА (ИЗВЛЕЧЕНИЕ) ДАННЫХ ИЗ ТАБЛИЦ
Извлечение данных из таблиц выполняется с помощью оператора
SELECT:
SELECT * | { [ ALL | DISTINCT ] <список выбора>.,..}
FROM {<имя таблицы> [<алиас>] }.,..
[ WHERE <условие>]
[ GROUP BY {<имя поля> | <целое>}.,.. [ HAVING <условие>] ]
[ ORDER BY {<имя поля> | <целое> [ ASC | DESC ] }.,..];
Здесь
SELECT – ключевое слово, которое сообщает СУБД (интер-
претатору запросов), что команда является запросом. Все запросы начинаются с этого ключевого слова, за которым следует пробел.
63

<список выбора> – список полей таблиц, которые должны быть
представлены в результате выполнения запроса. Поля, имена которых
не представлены в списке, не включаются в состав выходных данных
команды. Команда никаким образом не влияет на таблицы, она только
извлекает данные. В списке выбора могут присутствовать константы и
выражения. Для их именования используются синонимы (алиасы),
торые указываются после константы или выражения: <имя поля
станта
|выражение> AS <синоним>. Чтобы различить одноимённые поля
ко-
|кон-
разных таблиц, используют конструкцию <имя таблицы>.<имя поля>.
Символ * вместо списка полей означает, что будут выбраны все поля
из таблиц, указанных в запросе.
Фраза ALL (по умолчанию) означает, что в результате запроса могут
присутствовать дубликаты записей, а DISTINCT означает уникальность
записей.
FROM – еще одно обязательное ключевое слово, которое должно
быть представлено в каждом запросе. За ним следует пробел, а затем –
список имен таблиц, которые используются как источник данных для
запроса. Если в запросе несколько раз упоминается одна и та же таблица, то для устранения неоднозначности используются синонимы таблиц (алиасы), которые указываются после имени таблицы
: <имя таб-
лицы> AS <синоним>.
Команда SELECT не гарантирует определенного порядка записей
в результате. Чтобы установить требуемую упорядоченность записей,
используют ключевую фразу ORDER BY.
ORDER BY позволяет внести некоторый порядок в выходные дан-
ные запроса в соответствии со значениями одного или нескольких выбранных полей. Поля упорядочиваются один внутри другого, и можно
задать возрастающую (<имя поля> ASC) или убывающую (<имя поля>
DESC) последовательность сортировки для каждого из полей. По умолчанию принята возрастающая последовательность сортировки.
Очень часто нет
необходимости выбирать все записи из таблиц, упомянутых в запросе. Чтобы ограничить результат запроса только записями, представляющими интерес, используют ключевую фразу WHERE.
WHERE позволяет определить предикат
1
– логическое выражение
(условие выборки), которое может быть либо истинным, либо ложным
1
Предикат – любое математическое высказывание, в котором есть, по
меньшей мере, одна переменная. Другими словами, предикат – это функция
64

для каждой записи таблицы. В результат запроса попадают только те
записи из таблиц, для которых предикат имеет значение «истина».
Предикат (условие выборки) строится с использованием реляцион-
ных и логических операторов
Реляционный оператор – это математический символ, который задает определенный тип сравнения между двумя значениями. SQL распознает следующие операторы сравнения:
= Равно > Больше < Меньше >= Не меньше <= Не больше <> Не равно.
Логические операторы связывают одно выражение или несколько
логических выражений, в результате получается сложный предикат.
Стандартные
логические операторы, распознаваемые SQL, – это AND,
OR, NОТ:
AND (И) связывает два логических выражения (Выражение1 AND
Выражение2) и дает в результате истину, если оба выражения истинны;
OR (ИЛИ) связывает два логических выражения (Выражение1 OR
Выражение2) и дает в результате истину, если хотя бы одно из них истинно;
NOT(НЕ) берет единственное логическое выражение (NOT Выра-
жение) и изменяет его значение на противоположное (с истинного на
ложное или с ложного на истинное).
Приоритет логических операций в порядке убывания:
1) выражение в скобках;
2) отрицание (NOT);
3) конъюнкция (AND);
4) дизъюнкция
(OR).
Пример условия: Оклад>15000 OR Отдел=’АСУ’.
Поля, используемые в предложении WHERE, должны присутствовать в схемах, упомянутых в запросе таблиц, но не обязательно, чтобы
эти поля были в списке полей выбора.
Кроме логических операторов и операторов
ных выше, SQL использует
специальные операторы IN, BETWEEN,
сравнения, рассмотрен-
LIKE и IS NULL.
с множеством значений {0,1} (или «ложь» и «истина»), определенная на некотором множестве аргументов. Предикаты принимают два значения: истинное
и ложное, поэтому к ним применимы все логические операции алгебры Буля.
Результатом этих операций также является предикат.
65

IN оператор проверки принадлежности к множеству, которому зна-
чение аргумента может принадлежать или
не принадлежать: Аргумент
IN (Значение1, Значение2,.,..). Если значение аргумента совпадает с од-
ним из перечисленных в списке значений (требуется точное совпадение), то предикат считается истинным.
BETWEEN задает границы, в которые должно попадать значение
аргумента:
(Аргумент BETWEEN Значение1 AND Значение 2). Если значение
аргумента >=Значение1 и <=Значение2, то предикат считается истинным.
LIKE используется для определения вхождения заданной под-
строки в указанное поле, поэтому применяется только к полям типа
CHAR или VARCHAR для реализации алгоритма нечеткого совпадения.
С этой целью используются шаблоны – специальные символы:
символ «подчеркивание» (_) заменяет один любой символ;
символ «процент» (%) заменяет последовательность символов
произвольной длины, в том числе и нулевой.
Если исследуемая строка может содержать специальные символы
(
_, %), то, чтобы найти в строке символ подчеркивания или процента,
в предикате LIKE любой символ можно определить как Еsсаре-символ.
Он используется в предикате непосредственно перед символом процента или подчеркивания и означает, что следующий за ним символ интерпретируется именно как обычный символ, а не как символ шаблона:
LIKE '
%/_%' ESCAPE '/'.
В этом шаблоне указывается, что символ подчеркивания не является
символом шаблона, а слэш (/) определяется как Еsсаре-символ.
Учет NULL-значений
Нередки ситуации, когда значения некоторых полей могут быть временно неизвестны. В таких случаях эти поля получают NULL-значение,
т. е. СУБД отмечает, что эти поля не имеют никакого значения. Поскольку NULL не является значением как таковым, он не имеет типа
данных и может размещаться в поле любого типа. Естественно, при со
здании таблиц такие поля не должны описываться как NOT NULL.
Результат сравнения NULL с любым допустимым значением, в том
числе и NULL-значением, не определен, но эквивалентен значению
FALSE, однако, если NOT FALSE=TRUE, то NOT NULL не найдено,
66
-

поэтому для проверки поля на NULL-значение используется оператор
IS NULL или IS NOT NULL.
Агрегатные функции
Агрегатные функции – это математические функции, применяемые
к набору входных данных и возвращающие одно результирующее значение для целой группы записей таблицы:
COUNT(*) определяет количество записей;
COUNT([DISTINCT|ALL]<имя поля>) определяет количество
уникальных значений поля, не являющихся NULL-значениями. Аргументы
DISTINCT и ALL позволяют соответственно исключать и учи-
тывать дубликаты значений, при этом необходимо знать, что при использовании аргумента
ALL NULL-значения все равно не войдут
в число подсчитываемых значений;
SUM(<имя поля>) вычисляет арифметическую сумму всех вы-
бранных значений данного поля;
АVG(<имя поля>) вычисляет среднее значение для всех выбран-
ных значений данного поля;
МАХ(<имя поля>) вычисляет наибольшее из всех выбранных зна-
чений данного поля;
MIN(<имя поля>) вычисляет наименьшее из всех выбранных зна-
чений данного поля.
Имена функции агрегирования используются как имена полей в предложении SELECT, и, как правило, для них назначаются синонимы.
Особенности использования агрегатных функций
SUM и AVG применимы только для числовых полей. COUNT, МАХ
и MIN – для всех типов полей. При использовании с символьными полями МАХ и MIN предполагается сравнение строк в алфавитном порядке.
Агрегатные функции и поля не могут выбираться одновременно,
если только не используется предложение GROUP ВУ.
Влияние NULL-значений на агрегатные функции
1. Если аргумент функции COUNT является константой или именем
поля, в котором нет NULL-значений, то функция возвращает количество записей в выборке, полученной по определенному условию или
группированию.
67

2. Если аргументом функции COUNT является имя поля, в котором
есть NULL-значения, то функция
вернет количество записей, не содер-
жащих NULL-значений, в выборке, полученной по определенному
условию или группированию.
3. Функция COUNT
(*) не зависит от NULL-значений и всегда воз-
вращает общее количество записей в выборке, полученной по определенному условию или группированию.
4. Функции SUM и AVG игнорируют NULL-значения. Если поле содержит только NULL-значения, то функции возвращают
NULL.
Для анализа данных в разрезе значений одного или нескольких по-
лей используется оператор GROUP ВУ.
GROUP ВУ
позволяет группировать записи в подмножества, определяемые значениями одного или нескольких полей, перечисленных
в списке группирования, и применять агрегатные функции раздельно
к каждому подмножества (группе).
Если группировка происходит по нескольким полям, то записи сначала группируются по значениям первого поля, а внутри этих групп –
по значениям других полей.
Следует иметь
в виду, что во фразе GROUP BY должны быть указаны все выбираемые поля, приведенные в списке полей выбора после
фразы SELECT,
кроме полей, указанных в качестве аргумента в агрегат-
ной функции.
В тех случаях, когда требуется исключить некоторые группы из ре-
зультирующей выборки, используется фраза НАVING.
НАVING определяет критерий, согласно которому определенные
группы исключаются из числа выходных данных, так же как предложение WHERE делает это для отдельных записей. В условии, задаваемом
фразой
HAVING, указывают только поля или выражения, которые
имеют единственное значение для каждой выводимой группы.
Если при наличии предложения
GROUP BY в предложении
SELECT отсутствуют агрегатные функции, то запрос просто вернет по
одной строке из каждой группы. Эту возможность, наряду с ключевым
словом
DISTINCT, можно использовать для исключения дубликатов
строк в результирующем наборе.
68

5.2.5. СОЕДИНЕНИЕ ТАБЛИЦ
На практике базы данных всегда нормализованы и между таблицами
определены связи посредством пары Первичный ключ(PK) – Внешний
ключ(FK). Чтобы восстановить эти связи, используют операцию соединения. При операции соединения имена таблиц, участвующих в соединении, перечисляются через запятую после фразы FROM.
Предикат запроса обычно сравнивает значения в полях различных
таблиц для того, чтобы
определить, удовлетворяется ли условие
WHERE.
Если фраза WHERE не задана, то запрос возвращает декартово произведение перечисленных таблиц.
Соединение, использующее предикаты, основанные на равенствах,
называется естественным соединением (эквисоединением), но фактически в соединении можно использовать любой оператор сравнения.
Виды соединений
Использование фразы WHERE для обозначения соединения таблиц
визуально не отражает логику операции, поскольку WHERE обычно
трактуется как фильтрация записей.
Язык SQL предусматривает несколько типов соединения.
INNER JOIN – внутреннее соединение. В результате остаются
только те строки, для которых выполняется условие соединения.
LEFT JOIN – левое внешнее соединение. В результат включаются
записи, для которых выполняется условие соединения, но если для записи таблицы, находящейся по левую сторону ключевого слова LEFT
JOIN, не нашлось ни одной записи в таблице, находящейся по правую
сторону LEFT JOIN, то запись все равно добавляется в результат, а значения столбцов правой таблицы равны NULL.
RIGHT JOIN – правое внешнее соединение. В результат включа-
ются записи, для которых выполняется условие соединения, но если для
записи таблицы, находящейся по правую сторону ключевого слова
RIGHT JOIN, не нашлось ни одной записи в таблице, находящейся по
левую сторону RIGHT JOIN, то запись все равно добавляется в результат, а значения столбцов левой таблицы равны NULL.
FULL JOIN – полное внешнее соединение. Если для какой-либо из
таблиц не нашлось записи в другой таблице, то запись все равно попадает в результат, а значения столбцов другой таблицы равны NULL.
69

Соединение определяет способ связывания двух таблиц в запросе
следующим образом (структура условия соединения):
для каждой таблицы указываются поля, используемые в соедине-
нии. В типичном условии соединения указывается первичный ключ из
одной таблицы и связанный с ним внешний ключ из другой таблицы;
указывается логический оператор для сравнения значений полей.
Формат записи в операторе SELECT в этом случае выглядит следующим образом:
FROM <таблица1<тип соединения> <таблица2> ON (<условие соединения>)
[<тип соединения> <таблица2> ON (<условие соединения>)
…]
Такая запись полностью отражает логику операции соединения таблиц, оставляя фразе WHERE логику фильтрации записей.
5.2.6. СОЗДАНИЕ И УДАЛЕНИЕ ПРЕДСТАВЛЕНИЙ
Представление – это объект, который не содержит собственных данных (виртуальная таблица) или хранимый запрос. Данные в представлении извлекаются из реальных таблиц и/или других представлений. Все
изменения данных в реальных таблицах автоматически отражаются в
представлении. С представлениями можно обращаться как с реальными
таблицами: использовать в запросах, соединениях, определениях других
представлений.
Представления создаются с помощью команды
CREATE VIEW.
Представления, как и другие объекты БД, принадлежат пользователю,
который их создал.
Команда CREATE VIEW определяет представление как поименованный запрос (команду SELECT)^
Синтаксис команды CREATE VIEW:
CREATE VIEW <имя представления> AS
SELECT <параметры команды>
Переименование столбцов
Как правило, имена полей представлений совпадают с именами полей таблиц и представлений, лежащих в их основе. Однако иногда требуется задать новые имена для полей создаваемого представления:
когда некоторые поля являются вычисляемыми и, следовательно,
не поименованы;
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
