
- •Язык sql: манипулирование данными в этой лекции...
- •Введение в язык sql
- •Назначение языка sql
- •История языка sql
- •Особая роль языка sql
- •Используемая терминология
- •Запись операторов sql
- •Манипулирование данными
- •Литералы
- •Простые запросы
- •Выборка строк, конструкция where
- •Сортировка результатов, конструкция order by
- •5.3.3. Использование агрегирующих функций языка sql
- •Глава 5. Язык sql: манипулирование данными 183
- •5.3.5. Подзапросы
- •Глава 5. Язык sql: манипулирование данными 189
- •5.3.6. Ключевые слова any и all
- •5.3.8. Ключевые слова exists и not exist
- •Глава 5. Язык sql: манипулирование данными 203
Манипулирование данными
Рассмотрим следующие операторы языка SQL DML:
SELECT — выборка данных из базы;
INSERT — вставка данных в таблицу;
UPDATE — обновление данных в таблице;
DELETE — удаление данных из таблицы.
Ввиду сложности оператора SELECT и относительной простоты остальных операторов DML, большая часть данной части лекции посвящена обсуждению возможностей оператора SELECT и его различных форматов. Начнем с рассмотрения самых простых запросов, затем перейдем к более сложным вариантам выборки данных, использующим функции сортировки, группирования» агрегирования, а также выполнения запроса к нескольким таблицам. В конце данной главы описаны операторы INSERT, UPDATE и DELETE языка SQL.
Литералы
Прежде чем приступить к обсуждению операторов DML, необходимо выяснить, что означает такое понятие, как "литерал". Литералы представляют собой константы, которые используются в операторах SQL. Существуют различные формы литералов для каждого типа данных, которые поддерживаются SQL. Укажем различия между литералами, которые следует заключать в одинарные кавычки, и теми, которые не следует. Все нечисловые значения данных всегда должны заключаться в одинарные кавычки, а все числовые данные не должны.
Простые запросы
Назначение оператора SELECT состоит в выборке и отображении данных одной или более таблиц базы данных. Это исключительно мощный оператор, способный выполнять действия, эквивалентные операторам реляционной алгебры выборки, проекции и соединения, причем в пределах единственной выполняемой команды. Оператор SELECT является чаще всего используемой командой языка SQL.
Общий формат оператора SELECT имеет следующий вид:
SELECT [DISTINCT | ALL] { * | [ColumnExpression [AS NewName]] [,…] }
FROM TableName {alias] [ , . .]
[WHERE condition]
[GROUP BY ColumList] [HAVING Condition]
QRDER BY ColumnList];
В русском варианте:
SELECT [DISTINCT | ALL] { * | [Выражение из имён [AS Новое имя]] [,…] }
FROM Имя таблицы {псевдоним] [ , . .]
[WHERE предикат]
[GROUP BY Список столбцов] [HAVING предикат]
QRDER BY Список столбцов];
Здесь параметр СolumnExpression (Выражение из имён) представляет собой имя столбца или выражение из нескольких имен. Параметр TableName (Имя таблицы) является именем существующей в базе данных таблицы или её представления, к которой необходимо получить доступ.
Необязательный параметр alias (псевдоним) — это сокращение, устанавливаемое для имени таблицы TableName. Обработка элементов оператора SELECT выполняется в следующей последовательности:
FROM. Определяются имена используемой таблицы или нескольких таблиц.
WHERE. Выполняется фильтрация строк объекта в соответствии с заданными условиями.
GROUP BY. Образуются группы строк, имеющих одно и то же значение в указанном столбце.
HAVING. Фильтруются группы строк объекта в соответствии с указанным условием.
SELECT. Устанавливается, какие столбцы должны присутствовать в выходных данных.
ORDER BY. Определяется упорядоченность результатов выполнения оператора.
Порядок конструкций в операторе SELECT не может быть изменен. Только две конструкции оператора — SELECT и FROM — являются обязательными, все остальные конструкции могут быть опущены. Операция выборки с помощью оператора SELECT является замкнутой, в том смысле, что результат запроса к таблице также представляет собой новую таблицу. Существует множество вариантов использования данного оператора, что иллюстрируется приведенными ниже примерами.
Пример 1. Выборка всех столбцов и всех строк
Требуется предоставить полный список сотрудников предприятия.
SELECT [ID сотрудника], [Фамилия], [Имя], [Отчество], [Дата рождения], [Id пола]
FROM [Список сотрудников];
В примере используется формат MS Access. Поэтому названия полей и таблиц содержащие символы кириллицы, пробелы и некоторые допустимые специальные знаки псевдографики необходимо использовать в квадратных скобках, поэтому квадратные скобки в примерах имеют другое значение, чем при описании синтаксиса. В качестве примера используем стандартную таблицу со списком сотрудников некоторого предприятия, имеющего следующий набор полей: [ID сотрудника], [Фамилия], [Имя], [Отчество], [Дата рождения], [Id пола].
Поскольку выборка всех имеющихся в таблице столбцов выполнятся достаточно часто, в языке SQL определен упрощенный вариант записи значения "все столбцы" - вместо имен столбцов указывается символ звездочки «*». Приведенный ниже оператор полностью эквивалентен первому и представляет собой упрощенный вариант записи того же самого запроса:
SELECT *
FROM [Список сотрудников];
Результат выполнения этого запроса представлен в таблице 1. Оба варианта дадут одинаковый результат, при этом на экране, появятся разделительные линии, таково представление результирующих таблиц в MS SQL SERVER и во многих других СУБД. В формате MS Access 2003 результат представляется в виде стандартной таблицы, но по требованию пользователя эта таблица может быть приведена к типовой форме принятой на предприятии, то же самое можно реализовать и в других СУБД. Поэтому в примерах представление таблиц приведено без дополнительного форматирования, необходимого конечному пользователю.
Результат выполнения запроса из примера 1
Таблица 1.
-
ID сотрудника
Фамилия
Имя
Отчество
Дата рождения
Id пола
1
Иванов
Иван
Иванович
1.01.1970
Мужской
2
Петров
Евгений
Ильич
10.02.1940
Мужской
3
Варежкина
Наталья
Николаевна
1.04.1975
Женский
4
Сидоров
Иван
Петрович
15.05.1980
Мужской
5
Савельев
Евгений
Андреевич
24.07.1980
Мужской
Пример 2. Выборка конкретных столбцов и всех строк
В данном примере из исходной таблицы следует выбрать только часть столбцов таблицы. Результаты выполнения запроса приведены в таблице 2.
SELECT [Фамилия], [Имя], [Отчество]
[FROM [Список сотрудников];
Результат выполнения запроса из примера 2
Таблица 2.
-
Фамилия
Имя
Отчество
Иванов
Иван
Иванович
Петров
Евгений
Ильич
Варежкина
Наталья
Николаевна
Сидоров
Иван
Петрович
Савельев
Евгений
Андреевич
Пример З. Использование ключевого слова DISTINCT
Требуется предоставить имена всех сотрудников которые работают на предприятии, при этом совпадающие имена приводятся только один раз. Для этого можно использовать ключевое слово DISTINCT. Результат выполнения данного оператора приведен в таблице 3. Если исключить из примера запроса ключевое слово DISTINCT, то результат окажется иным (табл. 4.).
SELECT DISTINCT [Имя]
[FROM [Список сотрудников];
Результат выполнения запроса из примера 3
Таблица 3.
-
Имя
Иван
Евгений
Наталья
Результат выполнения запроса из примера 3 без использования ключевого слова DISTINCT
Таблица 4.
-
Имя
Иван
Евгений
Наталья
Иван
Евгений
Пример 4. Вычисляемые поля
Требуется показать список сотрудников и их прожитое ими количество дней на текущую дату. Если текущая дата 18 февраля 2010 года, то результаты будут выглядеть так как представлены в таблице 5.
SELECT [Фамилия], [Имя], [Отчество], Date() - [Дата рождения] AS [Количество дней]
FROM [Список сотрудников];
Результат выполнения запроса из примера 4
Таблица 5.
-
Фамилия
Имя
Отчество
Количество дней
Иванов
Иван
Иванович
14658
Петров
Евгений
Ильич
25567
Варежкина
Наталья
Николаевна
12742
Сидоров
Иван
Петрович
10871
Савельев
Евгений
Андреевич
10801
Это пример использования в запросе вычисляемого поля, которые иногда называют расчетными, или производными. В общем случае для создания вычисляемого поля в списке SELECT следует указать некоторое выражение языка SQL. В этих выражениях могут применяться операции сложения, вычитания, умножения и деления или даже возможно использование встроенных функций. Встроенная функция MS Access Date() возвращает текущую или системную дату. При построении сложных выражений могут использоваться круглые скобки. Для получения значения вычисляемого поля могут использоваться значения из нескольких столбцов таблицы, однако, тип данных тех столбцов, которые входят в арифметические выражения, обязательно должен быть цифровым.
В таблице, полученной в результате выполнения запроса, четвертый столбец называется «Количество дней». Чтобы задать ему это имя, использована конструкция AS. В противном случае его название выбирается по умолчанию и не несёт смысловую нагрузку, что для пользователя неприемлемо в большинстве случаев.