SQL Query Language язык запросов)

advertisement
SQL – это аббревиатура от Structured
Query Language (структурированный
язык запросов)
Функции языка SQL
интерактивный язык запросов
язык программирования БД
язык администрирования БД
язык создания приложений клиент/сервер и программ для
персональных компьютеров
язык распределённых БД
язык шлюзов БД
Возможности языка SQL
 определение данных
 выбор данных
 модификация данных
 управление данными
 арифметические вычисления и сравнение
значений
 упорядочение строк и/или столбцов
 агрегатирование данных
Развитие языка SQL
 Начало 70-х годов – разработка экспериментальной






реляционной СУБД System R, для которой затем был
создан специальный язык SEQUEL
начало 80-х годов – разработка стандарта
1986 год – выход стандарта SQL1 (SQL86)
1989 год – расширение стандарта (SQL89)
1992 год – выход стандарта SQL2 (SQL92)
1999 год – выход стандарта SQL3 (SQL:1999)
2003 год – выход стандарта SQL:2003
Типы операторов языка SQL
1.
2.
3.
4.
5.
6.
Операторы языка определения данных
Операторы языка обработки данных
Оператор языка запросов данных
Операторы языка управления данных
Операторы языка обработки транзакций
Операторы языка управления курсором
Операторы языка определения данных
 CREATE TABLE – создать таблицу
 ALTER TABLE – модифицировать таблицу
 DROP TABLE – удалить таблицу
 CREATE INDEX – создать индекс
 ALTER INDEX – модифицировать индекс
 DROP INDEX – удалить индекс
Операторы языка обработки данных
 INSERT – вставить данные в таблицу
 UPDATE – обновить данные в таблице
 DELETE – удалить данные из таблицы
Оператор языка запросов данных
 SELECT
Операторы языка управления данных
 GRANT – предоставить привилегии
 REVOKE – отменить привилегии
Операторы языка обработки транзакций
 BEGIN TRANSACTION – начать транзакцию
 COMMIT TRANSACTION – завершить транзакцию
 SAVE TRANSACTION – создать точку сохранения
внутри транзакции
Операторы языка управления курсором
 DECLARE CURSOR – объявить курсор
 FETCH INTO – переместить курсор
 UPDATE WHERE CURRENT – изменить текущее
значение
Таблица. Сотрудники
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1001
Иванов С. П.
11.12.1969
майор
1002
Петров А.А.
07.08.1971
сержант
1003
Сидоров С.В.
23.03.1965
капитан
1004
Семенов В.А.
15.06.1973
сержант
1005
Кузьмин О.Н.
27.10.1965
майор
Таблица. Объекты
КОД_О
НАЗВАНИЕ
УЛИЦА
ДОМ
2001
АИСТ
Советская
115
2002
НАДЕЖДА
Коммунальная
10
2003
ДЕЛЬФА
Интернациональная
34
2004
ВАЛЕНТ
Советская
83
Таблица. Дежурство
КОД_Д
ДАТА_Д
КОД_С
КОД_О
3001
01.10.2011
1001
2003
3002
01.10.2011
1004
2004
3003
11.10.2011
1002
2001
3004
23.09.2011
1003
2001
3005
12.09.2011
1002
2004
3006
15.11.2011
1005
2002
3007
11.10.2011
1003
2001
3008
15.12.2011
1001
2003
3009
13.10.2011
1004
2002
3010
12.09.2011
1001
2001
Таблица. Зарплата
КОД_С
ОКЛАД
ПРЕМИЯ
1001
5000
2000
1002
3500
1500
1003
4000
1500
1004
3500
1500
1005
5000
1000
Синтаксис команды SELECT
SELECT [предикат] {*|таблица.*| [таблица.]поле_1
[,[таблица.] поле_2 [,…]]}
[AS псевдоним_1 [, псевдоним_2 [, …]]]
FROM таблица_1[, таблица_2, [,…]]] [IN внешняя_БД]
[WHERE выражение]
[GROUP BY …]
[HAVING …]
[ORDER BY …]
[WITH OWNERACCESS OPTION];
 простая форма команды SELECT инструктирует БД,
что извлечь из таблицы
SELECT КОД_С, ФИО, ЗВАНИЕ
FROM Сотрудники;
 вывод полного списка столбцов таблицы
SELECT *
FROM Сотрудники;
Результаты выполнения запросов
КОД_С
ФИО
ЗВАНИЕ
1001
Иванов С. П.
майор
1002
Петров А.А.
сержант
1003
Сидоров С.В.
капитан
1004
Семенов В.А.
сержант
1005
Кузьмин О.Н.
майор
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1001
Иванов С. П.
11.12.1969
майор
1002
Петров А.А.
07.08.1971
сержант
1003
Сидоров С.В.
23.03.1965
капитан
1004
Семенов В.А.
15.06.1973
сержант
1005
Кузьмин О.Н.
27.10.1965
майор
 изменение порядка вывода столбцов
SELECT КОД_С, ДАТА_Р, ФИО, ЗВАНИЕ
FROM Сотрудники;
 исключение дублирования данных
SELECT DISTINCT ЗВАНИЕ
FROM Сотрудники;
 вывод заданного количества записей
SELECT TOP 2 ЗВАНИЕ
FROM Сотрудники;
Результаты выполнения запросов
КОД_С
ДАТА_Р
ФИО
ЗВАНИЕ
1001
11.12.1969
Иванов С. П.
майор
1002
07.08.1971
Петров А.А.
сержант
1003
23.03.1965
Сидоров С.В.
капитан
1004
15.06.1973
Семенов В.А.
сержант
1005
27.10.1965
Кузьмин О.Н.
майор
ЗВАНИЕ
ЗВАНИЕ
майор
майор
сержант
сержант
капитан
Оператор WHERE команды SELECT
 WHERE позволяет устанавливать условия, команда
извлекает из таблицы только те строки, для
которых такое условие верно.
SELECT ФИО, ЗВАНИЕ
FROM Сотрудники
WHERE ЗВАНИЕ = 'сержант';
SELECT ДАТА_Д, КОД_С
FROM Дежурство
WHERE КОД_С = 1001;
Результаты выполнения запросов
ФИО
ЗВАНИЕ
Петров А.А.
сержант
Семенов В.А.
сержант
ДАТА_Д
КОД_С
01.10.2011
1001
15.12.2011
1001
12.09.2011
1001
Использование реляционных операторов в
условии
SELECT *
FROM Сотрудники
WHERE КОД_С>=1003;
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ>'м';
Результаты выполнения запросов
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1003
Сидоров С.В.
23.03.1965
капитан
1004
Семенов В.А.
15.06.1973
сержант
1005
Кузьмин О.Н.
27.10.1965
майор
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1001
Иванов С. П.
11.12.1969
майор
1002
Петров А.А.
07.08.1971
сержант
1004
Семенов В.А.
15.06.1973
сержант
1005
Кузьмин О.Н.
27.10.1965
майор
Использование булевых операторов в
условии
SELECT *
FROM Объекты
WHERE УЛИЦА = 'Советская' AND ДОМ > 100;
SELECT *
FROM Объекты
WHERE УЛИЦА = 'Советская' OR ДОМ <= 10;
SELECT *
FROM Сотрудники
WHERE NOT ЗВАНИЕ = 'майор';
Результаты выполнения запросов
КОД_О
2001
КОД_О
НАЗВАНИЕ
АИСТ
НАЗВАНИЕ
УЛИЦА
Советская
ДОМ
115
УЛИЦА
ДОМ
2001
АИСТ
Советская
115
2002
НАДЕЖДА
Коммунальная
10
2004
ВАЛЕНТ
Советская
83
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1002
Петров А.А.
07.08.1971
сержант
1003
Сидоров С.В.
23.03.1965
капитан
1004
Семенов В.А.
15.06.1973
сержант
Область действия оператора NOT
SELECT *
FROM Объекты
WHERE NOT УЛИЦА = 'Советская' OR ДОМ <= 10;
SELECT *
FROM Объекты
WHERE NOT (УЛИЦА = 'Советская' OR ДОМ <= 10);
Результаты выполнения запросов
КОД_О
НАЗВАНИЕ
УЛИЦА
ДОМ
2002
НАДЕЖДА
Коммунальная
10
2003
ДЕЛЬФА
Интернациональная
34
КОД_О
2003
НАЗВАНИЕ
ДЕЛЬФА
УЛИЦА
Интернациональная
ДОМ
34
Специальные операторы языка SQL
IN
BETWEEN
LIKE
IS NULL
• проверяет, содержится ли значение
в определённом наборе
• выполняет проверку на диапазон
значений
• используется для поиска строк,
совпадающих с заданным условием
• размещение значения NULL
Оператор IN
 Пример:
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ IN ('майор', 'капитан');
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1001
Иванов С. П.
11.12.1969
майор
1003
Сидоров С.В.
23.03.1965
капитан
1005
Кузьмин О.Н.
27.10.1965
майор
Оператор BETWEEN
 Синтаксис оператора:
BETWEEN начальное_значение AND конечное_значение
 Пример:
SELECT *
FROM Объекты
WHERE ДОМ BETWEEN 30 AND 100;
Результат выполнения запроса
КОД_О
НАЗВАНИЕ
УЛИЦА
ДОМ
2003
ДЕЛЬФА
Интернациональная
34
2004
ВАЛЕНТ
Советская
83
Оператор LIKE
 применим только к текстовым полям
 используется специальные символы
1. символ подчеркивания (_)
2. знак процента (%)
Использование специальных символов в
операторе LIKE
 символ подчеркивания
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ LIKE 'м_ _ _ _';
 знак процента
SELECT *
FROM Объекты
WHERE УЛИЦА LIKE 'С%';
Результат выполнения запроса
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1001
Иванов С. П.
11.12.1969
майор
1005
Кузьмин О.Н.
27.10.1965
майор
КОД_О
НАЗВАНИЕ
УЛИЦА
ДОМ
2001
АИСТ
Советская
115
2004
ВАЛЕНТ
Советская
83
Значение NULL
 поле не имеет никакого значения
SELECT *
FROM Объекты
WHERE УЛИЦА IS NULL;
Специальные операторы могут
использоваться вместе с оператором NOT
SELECT *
FROM Объекты
WHERE УЛИЦА NOT NULL;
SELECT *
FROM Объекты
WHERE NOT УЛИЦА IS NULL;
NOT с IN:
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ NOT IN ('майор', 'капитан');
SELECT *
FROM Сотрудники
WHERE NOT ЗВАНИЕ IN ('майор', 'капитан');
Результаты выполнения запросов
КОД_С
ФИО
ДАТА_Р
ЗВАНИЕ
1002
Петров А.А.
07.08.1971
сержант
1004
Семенов В.А.
15.06.1973
сержант
Агрегатные (групповые) функции
Агрегатные функции производят обобщенное
групповое значение полей. Они возвращают
одиночное значение для всей группы таблицы.
 COUNT – количество выделенных записей
 SUM – сумму всех выбранных значений
 AVG – среднее значение
 MAX – наибольшее значение
 MIN – наименьшее значение
Пример использования
агрегатных функций
Результат
SELECT SUM (ПРЕМИЯ)
FROM Зарплата;
 7500
SELECT AVG (ОКЛАД)
FROM Зарплата;
 4200
SELECT COUNT (*)
FROM Зарплата;
 5
SELECT MAX (ОКЛАД+ПРЕМИЯ)
FROM Зарплата;
 7000
Объединение значений в группы
 для объединения значений в группы используется
оператор GROUP BY
 для задания условий по группе используется
оператор HAVING
 HAVING должен ссылаться только на агрегаты и
поля, которые выбраны GROUP BY
Примеры работы с
групповыми значениями
SELECT COUNT (КОД_С)
FROM Дежурство
GROUP BY КОД_С;
SELECT КОД_С, COUNT (КОД_С)
FROM Дежурство
GROUP BY КОД_С
HAVING COUNT (КОД_С)>2;
SELECT КОД_С, MIN (ДАТА_Д)
FROM Дежурство
GROUP BY КОД_С
HAVING КОД_С IN (1002, 1004);
Результат
Формирование вывода запроса
 размещение скалярных выражений и констант
среди выбранных полей
SELECT КОД_С, ОКЛАД/25, ПРЕМИЯ/25
FROM Зарплата;
КОД_С
Expr1000
Expr1002
1001
200
80
1002
140
60
1003
160
60
1004
140
60
1005
200
40
 оператор AS позволяет давать наименование
столбцам вывода
SELECT КОД_C, ОКЛАД/25 AS ОКЛАД_Д,
ПРЕМИЯ/25 AS ПРЕМИЯ_Д
FROM Зарплата;
КОД_С
ОКЛАД_Д
ПРЕМИЯ_Д
1001
200
80
1002
140
60
1003
160
60
1004
140
60
1005
200
40
 вставка текста в выводимые данные
SELECT КОД_С, ОКЛАД, 'руб.', ПРЕМИЯ, 'руб.'
FROM Зарплата;
КОД_С
ОКЛАД
Expr1000
ПРЕМИЯ
Expr1001
1001
5000
руб.
2000
руб.
1002
3500
руб.
1500
руб.
1003
4000
руб.
1500
руб.
1004
3500
руб.
1500
руб.
1005
5000
руб.
1000
руб.
• оператор ORDER BY – упорядочивание вывода
 ASC – возрастание
 DESC – убывание
SELECT *
FROM Зарплата
ORDER BY ОКЛАД;
КОД_С
ОКЛАД
ПРЕМИЯ
1004
3500
1500
1002
3500
1500
1003
4000
1500
1005
5000
1000
1001
5000
2000
 ORDER BY может использоваться с GROUP BY для
упорядочения групп
SELECT КОД_С, COUNT (КОД_С)
FROM Дежурство
GROUP BY КОД_С
ORDER BY КОД_С DESC;
КОД_С
Expr1000
1005
1
1004
2
1003
2
1002
2
1001
3
Организация запросов к
нескольким таблицам
 таблицы перечисляются в операторе FROM запроса
через запятую
 используются полные имя столбцов таблицы
имя_таблицы.имя_столбца
Объекты.НАЗВАНИЕ
Запрос к двум таблицам
SELECT Сотрудники.ФИО,
Дежурство.ДАТА_Д
FROM Дежурство,
Сотрудники
WHERE
Сотрудники.КОД_С =
Дежурство.КОД_С;
можно опускать имена
таблиц, если столбцы
имеют различные имена
SELECT ФИО, ДАТА_Д
FROM Дежурство,
Сотрудники
WHERE
Сотрудники.КОД_С =
Дежурство.КОД_С;
Подзапросы
 Подзапрос – это запрос, который




размещается внутри другого
запроса
Подзапрос должен выбирать
подзапрос
только одно значение
Для создания подзапроса,
производящего несколько
значений, можно использовать
оператор IN
Операторы BETWEEN, LIKE и IS
NULL не могут использоваться с
подзапросами
Можно использовать подзапросы
в нутрии предложения HAVING
основной
запрос
SELECT *
FROM Дежурство
WHERE КОД_С = (SELECT КОД_С
FROM Сотрудники
WHERE ФИО = 'Иванов С.П.');
КОД_Д
ДАТА_Д
КОД_С
КОД_О
3001
01.10.2011
1001
2003
3008
15.12.2011
1001
2003
3010
12.09.2011
1001
2001
SELECT *
FROM Дежурство
WHERE КОД_С IN (SELECT КОД_С
FROM Сотрудники
WHERE звание = 'майор');
КОД_Д
ДАТА_Д
КОД_С
КОД_О
3001
01.10.2011
1001
2003
3006
15.11.2011
1005
2002
3008
15.12.2011
1001
2003
3010
12.09.2011
1001
2001
SELECT КОД_С, COUNT (КОД_С) FROM Дежурство
GROUP BY КОД_С
HAVING КОД_С = (SELECT КОД_С
FROM Зарплата
WHERE Премия = 2000);
КОД_С
1001
Expr1000
3
Работа со значениями полей
 INSERT – вставить
 UPDATE – модифицировать
 DELETE – удалить
 Эти команды не производят никакого вывода,
но программа должна дать подтверждение того,
что она была выполнена
Сообщения выводимые СУБД MS Access
при вставки новой строки
Вставка строк
 синтаксис:
INSERT INTO <TABLE Имя > 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/2011#;
Изменение значений
 команда UPDATE содержит:
 имя используемой таблицы
 оператор SET, который указывает на
изменение, которое нужно сделать для
определённого столбца
 можно использовать скалярные выражения в
операторе SET
UPDATE Зарплата
SET ПРЕМИЯ = 1000;
 использование скалярных выражений
UPDATE Зарплата
SET ПРЕМИЯ = ПРЕМИЯ+500;
 в командах INSERT, DELETE и UPDATE возможно
использовать подзапросы
UPDATE Зарплата
SET ПРЕМИЯ = ПРЕМИЯ+50
WHERE КОД_С IN (SELECT КОД_С
FROM Сотрудники
WHERE звание = 'сержант');
Работа с таблицами
команда
CREATE
TABLE
Пустая
таблица
команда
INSERT
Синтаксис команды CREATE TABLE
CREATE TABLE <имя_таблицы>
(<имя_столбца1> <тип_данных> [(<размер>)],
<имя_столбца2> <тип_данных> [(<размер>)], …);
 Выбор имени:
 не желательно использовать русские буквы
 не желательно использовать пробел
 нельзя использовать специальные символы
 если используется пробел: [Имя таблицы]
Типы данных
 Символьные типы данных
 CHAR – символьные строки фиксированной длины
 VARCHAR – символьная строка переменной длины
 Целые типы данных
 INTEGER или INT – целое (4 байта)
 SMALLINT – короткое целое (2 байта)
 Вещественные типы данных
 FLOAT – числа с плавающей точкой (8 байт )
 SMALLFLOAT – числа с плавающей точкой (4 байта)
 DECIMAL – десятичное число
 REAL
 DOUBLE
 Дата и время
 DATE – тип данных для хранения даты
 TIME – тип данных для хранения времени
 INTERVAL – тип данных для хранения
временного интервала
 DATETIME – тип данных для хранения моментов
времени (год + месяц + день + часы + минуты +
секунды + доли секунд).
Пример
CREATE TABLE Служащие
(КОД_С Integer,
ФИО Char (30),
ДАТА_Р Date,
ЗВАНИЕ Char (10));
Изменение таблицы
ALTER TABLE <имя_таблицы>
ADD <имя_поля> <тип_данных> <размер>;
 Например:
ALTER TABLE Служащие ADD Стаж_работы INTEGER;
Удаление столбцов из таблицы
ALTER TABLE <имя_таблицы> DROP <имя_поля>;
 Например:
ALTER TABLE Служащие DROP Стаж_работы;
Удаление всей таблицы
Очистить
таблицу
 Синтаксис для удаления
таблицы:
DROP TABLE <имя_таблицы>;
 Например:
Удалить
таблицу
DROP TABLE Служащие;
Настройка таблиц
 Язык SQL позволяет при создании таблиц
накладывать ограничения на создаваемые поля
CREATE TABLE <имя_таблицы>
(<имя_столбца1> <тип_данных> [(<размер>)] [ограничения],
<имя_столбца2> <тип_данных> [(<размер>)] [ограничения],
…);
Пример
CREATE TABLE Служащие
(КОД_С Integer NOT NULL PRIMARY KEY,
ФИО Char (30) UNIQUE,
ДАТА_Р Date NOT NULL,
ЗВАНИЕ Char (10));
 NOT NULL – не может содержать пустых полей
 PRIMARY KEY – первичный ключ
 UNIQUE - уникальное
Ограничение уникальности на сочетание
полей
CREATE TABLE Служащие
(КОД_С Integer NOT NULL PRIMARY KEY,
ФИО Char (30) NOT NULL,
ДАТА_Р Date NOT NULL,
ЗВАНИЕ Char (10),
UNIQUE (ФИО, ДАТА_Р ));
 аналогично можно делать составной первичный
ключ, только первые и подряд идущие поля могут
входить в такой ключ
Диапазон допустимых значений
CREATE TABLE Служащие
(КОД_С Integer PRIMARY KEY,
ФИО Char (30),
ДАТА_Р Date,
ЗВАНИЕ Char (10),
ВОЗРАСТ Integer CHECK (ВОЗРАСТ <110));
Условие ограничения может содержать
логические операторы
CREATE TABLE Служащие
(КОД_С Integer PRIMARY KEY,
ФИО Char (30),
ДАТА_Р Date,
ЗВАНИЕ Char (10),
ВОЗРАСТ Integer CHECK (ВОЗРАСТ <110 AND ВОЗРАСТ >0));
Использование оператора IN в условиях
CREATE TABLE Служащие
(КОД_С Integer PRIMARY KEY,
ФИО Char (30),
ДАТА_Р Date,
ЗВАНИЕ Char (10),
ВОЗРАСТ Integer CHECK (ВОЗРАСТ <110 AND ВОЗРАСТ >0)
ГОРОД Char (15) CHECK (ГОРОД IN ('Москва', 'Воронеж',
'Липецк', 'Тамбов')));
Можно использовать знаки множественного выбора
(маски), такие как подчёркивание (_) и процент (%)
CREATE TABLE Служащие
(КОД_С Integer PRIMARY KEY,
ФИО Char (30),
ДАТА_Р Date CHECK (ДАТА_Р LIKE '_ _/_ _/_ _ _ _'),
ЗВАНИЕ Char (10),
ВОЗРАСТ Integer CHECK (ВОЗРАСТ <110 AND ВОЗРАСТ >0)
ГОРОД Char (15) CHECK (ГОРОД IN ('Москва', 'Воронеж',
'Липецк', 'Тамбов')),
ПАРОЛЬ Char (10) CHECK (ПАРОЛЬ LIKE 'RTY%'));
Установка значений по умолчанию
CREATE TABLE Служащие
(КОД_С Integer PRIMARY KEY,
ФИО Char (30),
ДАТА_Р Date,
ЗВАНИЕ Char (10),
ВОЗРАСТ Integer CHECK (ВОЗРАСТ <110 AND ВОЗРАСТ >0)
ГОРОД Char (15) DEFAULT = 'Тамбов’));
Download