**SQL** - язык управления БД. Это непроцедурный язык **SQL** (Structured Query Language) - язык структурированных запросов **SQL = DDL + DML + DQL** **DDL** (Data Definition Language) - язык описания данных **DML** (Data Manipulation Language) - язык манипуляции данными **DQL** (Data Query Language) - язык запросов данных SQL появился в середине 70-х гг. в рамках **System-R** - тогда он назывался **SEQL**. Уже тогда он был полным языком БД. ## Стандартизация SQL Цель стандартизации - сделать едиными требования для участников процесса. Стандарты SQL: - **SQL-1 (SQL-89)** - **SQL-2 (SQL-92)** - **SQL-3 (SQL-99)** - ... ## SQL в прикладном программировании В SQL-89 определены способы взаимодействия БД и прикладных программ, написанных на традиционных ЯПВУ (Fortran, Cobol, PL/1, Pascal, C). Способы взаимодействия БД и программы: 1. **Операторы языка SQL собраны в модуль.** Используются как процедуры. Прикладная программа вызывает процедуру модуля, передает ей фактические параметры и получает в ответ еще какие-то параметры. Модуль компилируется отдельно от прикладной программы и при этом порождается набор хранимых процедур. - Достоинства: прикладная программа имеет меньший размер, взаимодействие с СУБД локализовано - Недостатки: для понимания смысла прикладной программы требуется чтение 2 текстов, синтаксис модулей бывает разным 2. **Встроенный SQL.** Непосредственно в программе на ЯПВУ имеются SQL-операторы. Обмен данными через переменные. SQL-операторы компилируются каждый раз при их использовании, точнее при каждом первом использовании оператора при данном запуске программы. - Достоинства: прикладная программа более самосодержащаяся (2 в 1), стандарт встраивания единообразен - Недостатки: синтаксис SQL-операторов контрастирует с синтаксисом базового языка ## Типы данных | Тип данных | Идентификатор ТД | Размер | Диапазон | | --------------------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | Целое число | **int** (**integer**) | 4 байта | $-2^{31}...2^{31}$ | | | **smallint** | 2 байта | $-32768...32768$ | | | **tinyint** | 1 байт | $0...255$ | | Упакованное десятичное число (точные числовые значения) | **numeric (p, s)** (**decimal**) | В зависимости от заданной точности $p$, которая может быть до 38 знаков, требуется от 2 до 17 байт | Целые, дробные числа | | Число с плавающей точкой (приближенные числовые значения) | **float** (**float (n)**) | 8 байт | Точность - 15 знаков, $n$ принимает значения от 8 до 15 | | | **real** (**float (n)**) | 4 байт | Точность 7 знаков, $n$ принимает значения от 1 до 7 | | Символьные данные фиксированной длины | **char \[(n)\]** (**character \[(n)\]**) | Занимает $n$ байт, даже если строка короче | $n$ принимает значения от 0 до 255, если $n$ не указать, то размерность - 1 | | Символьные данные переменной длины | **varchar (n)** (**character varying (n)**) | По одному байту на каждый символ, т. е. в соответствии с фактической длиной строки | $n$ принимает значения от 1 до 255 | | Дата и время | **datetime** | 8 байт | 01.01.1753 - 31.01.9999 | | | **smalldatetime** | 4 байта | 01.01.1900 - 06.06.2079 | | Денежные суммы | **money** | 8 байт | Точность - 4 знака после запятой, от -922 трлн до 922 трлн | | | **smallmoney** | 4 байта | Точность - 4 знака после запятой, от -214 тыс до 214 тыс | | Двоичные числа фиксированной длины | **binary (n)** | Требуется $n$ байт, даже если больше длина | Любые двоичные данные до 255 байт | | Двоичные числа переменной длины | **varbinary (n)** | В памяти фактическое число хранящихся байт | Любые двоичные данные до 255 байт | | Длинный текст | **text** (**image**) | Имеет переменную длину до 2 Гб | **text** - для хранения символьных данных, **image** - для хранения двоичных данных | | Булевы значения | **bit** | Значение такого поля размещается в 1 байте вместе с другими полями типа **bit** этой же таблицы | 0 и 1 | ## Имена полей В именовании полей раньше использовалась венгерская нотация. ## Операторы языка SQL - Команды группы **DDL** - `CREATE TABLE` ```sql CREATE TABLE имя_табл (имя_п1 тд, ..., имя_пN тд) ``` ```sql CREATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name } ( {} [, ... n] ) [ ; ] ``` - `ALTER TABLE` ```sql ALTER TABLE имя_табл (ADD | MODIFY | DROP имя_п1 [тд] [N/NN], ...) ``` - `DROP TABLE` ```sql DROP TABLE имя_табл ``` - Команды группы **DML** - `INSERT` - вставка новой записи ```sql INSERT INTO имя_табл [(список_полей)] VALUES (список_значений) ``` - Ввод записей из таблицы, отобранных через команду `SELECT` ```sql INSERT INTO имя_табл [(список_полей)] SELECT ... ``` - `UPDATE` - изменяет значения в полях, указанных операндом `SET`, для записей, удовлетворяющих условию ```sql UPDATE имя_табл SET имя_поля1 = выражение, SET имя_поля2 = выражение, ... WHERE условие ``` - `DELETE` ```sql DELETE FROM имя_табл [WHERE условие] ``` - Команды группы **DQL** - `SELECT` - производит выборку и вычисление над данными из списка таблиц. Результат выполнения - проекция таблицы, которая может иметь (`ALL`) или не иметь (`DISTINCT`) повторяющиеся строки. В отборе участвуют записи из таблиц, указанных после `FROM`. `список` содержит имена полей, участвующих в запросе, а также выражения над полями. В списке полей из разных таблиц перед именем поле указывается имя таблицы, отделяемое точкой (`имя_табл.имя_поля`) ```sql SELECT [ALL | DISTINCT] список FROM список_табл [WHERE условие] [GROUP BY имя_поля1, имя_поля2, ...] [HAVING условие_поиска] [ORDER BY спецификация] ``` Для обеспечения связи программы-редактора SQL'евских команд и БД какого-то формата обращаются к услугам **ODBC** (Open DataBase Connectivity - открытый интерфейс взаимодействия с БД)