Язык, который умудрен знаниями, не будет запинаться.
Менандр
Что такое SQL?
SQL (англ. structured query language) — язык структурированных запросов, применяемый для создания, модификации и управления данными в реляционной базе данных.
SQL является информационно-логическим языком, предназначенным для описания, изменения и извлечения данных, хранимых в реляционных базах данных. SQL считается языком программирования, так как некоторые из его расширений позволяют писать процедуры и функции для обработки данных на стороне СУБД.
Изначально SQL был основным способом работы пользователя с базой данных и позволял выполнять следующий набор операций:
- создание в базе данных новой таблицы;
- добавление в таблицу новых записей;
- изменение записей;
- удаление записей;
- выборка записей из одной или нескольких таблиц (в соответствии с заданным условием);
- изменение структур таблиц.
Со временем SQL усложнился — обогатился новыми конструкциями, обеспечил возможность описания и управления новыми хранимыми объектами (например, индексы, представления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.
При всех своих изменениях SQL остаётся самым распространённым лингвистическим средством для взаимодействия прикладного программного обеспечения с базами данных. В то же время современные СУБД, а также информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов. В частности, My Visual Database (MVDB) скрывает от конечного пользователя механизмы построения запросов для извлечения и модификации данных, в тоже время позволяя использовать SQL для повышения эффективности работы или добавления дополнительной функциональности.
Язык SQL представляет собой совокупность операторов, инструкций, вычисляемых функций.
Таблица 1. Операторы SQL
Группа | Подраздел языка | Операторы |
Операторы определения данных | Data Definition Language, DDL | CREATE создаёт объект базы данных (саму базу, таблицу, представление, пользователя и так далее),ALTER изменяет объект,DROP удаляет объект; |
Операторы манипуляции данными | Data Manipulation Language, DML | SELECT выбирает данные, удовлетворяющие заданным условиям,INSERT добавляет новые данные,UPDATE изменяет существующие данные,DELETE удаляет данные; |
Операторы определения доступа к данным | Data Control Language, DCL | GRANT предоставляет пользователю (группе) разрешения на определённые операции с объектом,REVOKE отзывает ранее выданные разрешения,DENY задаёт запрет, имеющий приоритет над разрешением; |
Операторы управления транзакциями | Transaction Control Language, TCL | COMMIT применяет транзакцию,ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции,SAVEPOINT делит транзакцию на более мелкие участки. |
Реляционные базы данных
Реляционная (англ. relation – связь, отношение, зависимость) база данных — это совокупность взаимосвязанных таблиц, каждая из которых содержит информацию об объектах определенного типа. Строка таблицы содержит данные об одном объекте (например, товаре, клиенте), а столбцы таблицы описывают различные характеристики этих объектов — атрибутов (например, наименование, код товара, сведения о клиенте). Записи (строки таблицы, картежи) имеют одинаковую структуру — они состоят из полей, хранящих атрибуты объекта. Каждое поле, т. е. столбец, описывает только одну характеристику объекта и имеет строго определенный тип данных.
Подробно реляционные БД данных рассматриваются в разделе “Реляционные базы данных“, где объясняются такие понятия как:
- первичный ключ;
- внешний ключ;
- отношения “один-к-одному”, “один-ко-многим”, “многие-ко-многим”;
- поддержка целостности данных;
- порядок строк;
- нормализация;
- первая, вторая и третья нормальные формы;
- операции над табличными данными;
- реляционная модель данных.
Диалекты языка. SQLite
Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
Одной из популярных СУБД является SQLite, у которой также имеется свой диалект SQL.

Полную информацию о данном диалекте можно получить на сайте https://sqlite.org/lang.html Частично данная информация доступна и на русском языке: https://oracleplsql.ru/sqlite-manual.html
Типы данных
SQLite имеет динамическую типизацию. Это означает, что тип данных привязывается не к полю таблицы, а к хранимому значению.
Таблица 2. Классы хранения
Класс | Описание |
---|---|
NULL | Пустое значение в таблице базы. |
INTEGER | Целочисленное значение, хранящееся в 1, 2, 3, 4, 6 или 8 байтах, в зависимости от величины самого значения. |
REAL | Числовое значение с плавающей точкой. Хранится в формате 8-байтного числа IEEE с плавающей точкой. |
TEXT | Значение строки текста. Хранится с использованием кодировки 1 базы данных (UTF-8, UTF-16BE или UTF-16LE). |
BLOB | Значение бинарных данных, хранящихся точно в том же виде, в каком были введены. |
📝 В базах, созданных My Visual Database, используется кодировка UTF-8.
☝ Если в ходе любой операции один из операндов принимает значение NULL, то все выражение принимает значение NULL
SQLite не имеет отдельного логического класса хранения. Вместо этого, логические значения хранятся как целые числа 0 (false) и 1 (true).
SQLite не имеют классов, предназначенных для хранения дат и/или времени. Вместо этого, встроенные функции даты и времени в SQLite способны работать с датами и временем, сохраненными в виде значений TEXT, REAL и INTEGER в следующих форматах:
Таблица 3. Форматы хранения даты/времени
Формат | Описание |
---|---|
TEXT | Строка формата ISO8601 “YYYY-MM-DD HH:MM:SS.NNN”, гдеYYYY – год, MM – месяц, DD – день, HH – часы, MM – минуты, SS – секунды, NNN – тысячные доли секунды |
REAL | Числа юлианского календаря. То есть число дней с полудня 24 ноября 4714 г. до н.э. по Гринвичу в соответствии с ранним григорианским календарём. |
INTEGER | Время Unix, — количество секунд с 1970-01-01 00:00:00 UTC. |
📝 В My Visual Database используется текстовый формат хранения даты/времени по шаблону “YYYY-MM-DD HH:MM:SS.SSS”
📝 В My Visual Database имеется тип данных “ДЕНЬГИ”, который реализуется на уровне визуальных компонентов. Для хранения значений в базе данных используется класс REAL.
Для полей указывается аффинированный тип – то есть рекомендуемый для хранения в данном поле. Таким образом, в любом столбце можно хранить данные любого типа.
Таблица 4. Аффинированные типы
Тип | Хранимые классы | Описание |
---|---|---|
TEXT | NULL, TEXT, BLOB | Если в столбец с аффинированным TEXT вставляются числовые данные, они перед сохранением конвертируются в текстовую форму. |
NUMERIC | NULL, INTEGER, REAL, TEXT, BLOB | Текст конвертируется в INTEGER или REAL, если такое преобразование возможно без потерь и имеет обратимый характер (если можно восстановить первые 15 значащих десятичных цифр числа). Иначе значение сохраняется с помощью класса хранения TEXT. Попытки конвертирования в NULL или BLOB не предпринимаются. |
INTEGER | NULL, INTEGER, REAL, TEXT, BLOB | Аналогичен NUMERIC. Разница между аффинированными INTEGER и NUMERIC проявляется только в выражении CAST. |
REAL | NULL, INTEGER, REAL, TEXT, BLOB | Аналогичен NUMERIC, за исключением того, что целочисленные значения принудительно преобразуются в значения с плавающей точкой. |
NONE | NULL, INTEGER, REAL, TEXT, BLOB | Не предпочитает какой-либо определённый класс хранения и не предпринимает никаких попыток принудительного преобразования данных из одного класса в другой. |
В SQLite нет строго перечня допустимых типов при создании таблиц или в функции приведения CAST. Вместо этого используются правила:
1. Если объявление типа содержит строку “INT”, то столбец ассоциируется с аффинированным INTEGER.
2. Если объявление типа столбца содержит любую из строк “CHAR”, “CLOB”, или “TEXT”, то аффинированность определяется как TEXT.
3. Если объявление типа столбца содержит строку “BLOB” или если тип не указан, то столбец аффинируется с NONE.
4. Если объявление типа столбца содержит любую из строк “REAL”, “FLOA” или “DOUB”, аффинированность определяется как REAL.
5. В остальных случаях столбцу сопоставляется аффинированный NUMERIC.
☝ Последовательность правил для определения родства столбца имеет важное значение. Столбец с заявленным типом “CHARINT” будет соответствовать как правилу 1, так и правилу 2, но первое правило имеет преимущество, и поэтому родство столбца определится как INTEGER.
При использовании встроенных механизмов MVDB для доступа к данным никакой путаницы не возникнет, а вот при использовании SQL-запросов для записи данных вам нужно быть внимательным и следить за используемыми типами.
Таблица 4. Соответствие типов данных MVD и классов хранения SQLite
MVD | SQLite | Примечание |
---|---|---|
ТЕКСТ | TEXT | |
ЦЕЛОЕ ЧИСЛО | INTEGER | |
ВЕЩЕСТВ. ЧИСЛО | REAL | |
ДЕНЬГИ | REAL | |
ДА / НЕТ | INTEGER | |
ДАТА/ВРЕМЯ | TEXT | |
ДАТА | TEXT | |
ВРЕМЯ | TEXT | |
ИЗОБРАЖЕНИЕ | BLOB | При добавлении поля <name> с типом “ИЗОБРАЖЕНИЕ” автоматически создается поле <name>_filename с типом TEXT, которое не отображается в конструкторе таблиц MVD, но доступно через SQL-запросы |
ФАЙЛ | BLOB | При добавлении поля <name> с типом “ФАЙЛ” автоматически создается поле <name>_filename с типом TEXT, которое не отображается в конструкторе таблиц MVD, но доступно через SQL-запросы |
СЧЁТЧИК | INTEGER | Поле называется record_count, доступно через SQL-запросы |
СВЯЗЬ | INTEGER | Совпадает с типом первичного ключевого поля – INTEGER |
Литералы
Строковые литералы всегда заключаются в одинарные кавычки (‘) или двойные кавычки (”).
‘Строка’
“Тоже строка”
Числовые литералы могут быть как положительными, так и отрицательными числами, которые являются точными или значениями с плавающей запятой.
43
-43
4.3
0.43E01
Code language: CSS (css)
Для обозначения даты и времени используются строковые литералы, отформатированные по шаблону “YYYY-MM-DD” или “YYYY-MM-DD HH:MM:SS”
‘2020-03-12’
“2020-02-21 12:34:18”
Code language: CSS (css)
Экранирование
Если литерал должен включать в себя кавычки, то необходимо удвоить их количество, например:
‘Кот-д’’Ивуар’
‘ООО “”Рога и копыта””’
Алиасы
Псевдонимы (алиасы) SQLite можно использовать для создания временного имени для столбцов или таблиц.
Псевдонимы столбцов используются для облегчения чтения заголовков столбцов в результирующем наборе.
<выражение> AS <имя>
Code language: HTML, XML (xml)
Псевдонимы таблиц используются для сокращения вашего SQL-кода, чтобы его было легче читать или когда вы выполняете self join (т.е. перечисляете одну и ту же таблицу более одного раза в операторе FROM).
<источник данных> AS <имя>
Code language: HTML, XML (xml)
Сравните две записи SQL запроса, без использования алиасов
SELECT
PrimaryTarget.Coord_X,
SecondaryTarget.Coord_X,
(PrimaryTarget.Coord_X - SecondaryTarget.Coord_X)
FROM PrimaryTarget
LEFT JOIN SecondaryTarget on SecondaryTarget.ID = PrimaryTarget.ID
и с алиасами
SELECT
pt.Coord_X as Prim_X,
st.Coord_X as Sec_X,
(pt.Coord_X - st.Coord_X) as Distance
FROM PrimaryTarget pt
LEFT JOIN SecondaryTarget st on st.ID = pt.ID
Code language: JavaScript (javascript)
Комментарии
Для того, чтобы добавить примечания или пояснения к тексту SQL-запроса, можно использовать комментарий. Комментарии бывают двух типов: идущий до конца строки и многострочный. Два знака “минус” подряд превращают весь последующий текст до окончания строки в комментарий. А парные ограничители “/*” и “*/” позволяют комментировать любой текст.
-- это комментарий, который идет до конца строки
/* а этот комментарий ограничивается специальными символами и может занимать несколько строк */
Code language: JavaScript (javascript)
Выборка данных. SELECT
Для получения набора данных из базы служит команда SELECT. Рассмотрим упрощенный вариант синтаксиса данной команды, который позволит нам решать большинство практических задач (полный синтаксис данной команды можно получить по ссылке в главе 1.3.).
SELECT <данные> FROM <источник> [ <условие отбора> ] [ <условие группировки> ] [ <условие сортировки> ] [ <ограничение выборки> ]
После ключевого слова SELECT идет список данных, которые нужно извлечь из базы данных. Потом следует ключевое слово FROM, за которым следует указание, откуда именно необходимо извлекать данные. Остальные составляющие запроса являются необязательными и подробно будут рассмотрены в главе 3. Анатомия запроса SELECT.
В качестве данных обычно используют поля таблиц. В некоторых случаях данными могут быть конкретные значения, выражения, функции или вложенные подзапросы.
Допустим, у нас есть таблица nameList, состоящая из четырёх колонок и содержащая имена людей и дату их рождения:
id, name, surname, birthday
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1, Вася, Иванов, 21.02.1986
2, Коля, Петров, 17.08.1989
3, Наташа, Сидорова, 31.03.1990
4, Света, Кузнецова, 02.12.1986
5, Петя, Михайлов, 08.07.1981
Code language: CSS (css)
тогда запрос
SELECT name FROM nameList
вернет следующий набор данных:
Вася
Коля
Наташа
Света
Петя