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 = 'Тамбов’));