**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 }
	( {<column_definition>} [, ... 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 - открытый интерфейс взаимодействия с БД)