Что такое SQL?

Простые SQL запросы — короткая справка и примеры

Язык SQL или Struc­tured Query Lan­guage (язык структурированных запросов) предназначен для управления данными в системе реляционных баз данных (RDBMS). В этой статье будет рассказано о часто используемых командах SQL, с которыми должен быть знаком каждый программист. Этот материал идеально подойдёт для тех, кто хочет освежить свои знания об SQL перед собеседованием на работу. Для этого разберите приведённые в статье примеры и вспомните, что проходили на парах по базам данных.

Что такое SQL

За счет того, что информация в базе данных упорядочена, разделена на определённые сущности и представлена в виде таблиц, к ней легко обратиться и найти нужную нам информацию.

И тут возникает главный вопрос: а как к ней обратиться и получить необходимую нам информацию?

Для этого должен быть специальный инструмент, и здесь к нам на помощь как раз и приходит SQL, который является тем инструментом, с помощью которого происходит манипулирование данными (создание, извлечение, удаление и т.д.) в базе данных.

SQL (Struc­tured Query Lan­guage) — язык структурированных запросов, с помощью него пишутся специальные запросы (так называемые SQL инструкции) к базе данных с целью получения данных из базы данных или для манипулирования этими данными.

Также обязательно стоит отметить и то, что база данных, и в частности реляционная модель, основана на теории множеств, которая подразумевает объединение разных объектов в одно целое, под одним целым в базе данных как раз и имеется в виду таблица. Это важно, так как язык SQL работает именно со множеством, с набором данных, т.е. с таблицами.

Что такое СУБД

У Вас может возникнуть вопрос, если база данных это некая информация, которая хранится в таблицах, то как она выглядит физически? Как на нее посмотреть в целом?

Если очень коротко, то это просто файл, созданный в специальном формате, именно так и выглядит база данных (в большинстве случаев БД включает несколько файлов, но сейчас на этом уровне это не так важно).

Идем дальше, если база данных это файл в специальном формате, то как его создать или открыть? И тут возникает сложность, ведь просто так, без каких-либо инструментов создать такой файл, т.е. реляционную базу данных, нельзя, для этого нужен специальный инструмент, который мог бы создавать и управлять базой данных, иными словами, работать с этими файлами.

Таким инструментом как раз и выступает СУБД – это система управления базами данных, сокращенно СУБД.

Какие СУБД бывают

На самом деле, существует достаточно много различных СУБД, некоторые из них платные и стоят немалых денег, если говорить о полнофункциональных версиях, но даже у самых, так скажем, «крутых» есть бесплатные редакции, которые, кстати, отлично подходят для обучения.

Среди всех по своим возможностям и популярности можно выделить следующие системы:

  • Microsoft SQL Serv­er – это система управления базами данных от компании Microsoft. Она очень популярна в корпоративном секторе, особенно в крупных компаниях. И это не просто СУБД – это целый комплекс приложений, позволяющий хранить и модифицировать данные, анализировать их, осуществлять безопасность этих данных и многое другое;
  • Ora­cle Data­base – это система управления базами данных от компании Ora­cle. Это также очень популярная СУБД, и также среди крупных компаний. По своим возможностям и функциональности Ora­cle Data­base и Microsoft SQL Serv­er сопоставимы, поэтому являются серьезными конкурентами друг другу, и стоимость их полнофункциональных версий очень высока;
  • MySQL – это система управления базами данных также от компании Ora­cle, но только она распространяется бесплатно. MySQL получила очень широкую популярность в интернет сегменте, т.е. именно на MySQL работают чуть ли не все сайты в интернете, иными словами, большинство сайтов в интернете используют эту СУБД как средство хранения данных;
  • Post­greSQL – эта система управления базами данных также является бесплатной, и она очень популярна и функциональна.

Виды SQL запросов

DDL (Data Def­i­n­i­tion Lan­guage) — язык определения данных. Задачей DDL запросов является создание БД и описание ее структуры. Запросами такого вида устанавливаются правила того, в каком виде различные данные будут размещаться в БД.

DML (Data Manip­u­la­tion Lan­guage) — язык манипулирования данными. В число запросов этого типа входят различные команды, используя которые непосредственно производятся некоторые манипуляции с данными. DML-запросы нужны для добавления изменений в уже внесенные данные, для получения данных из БД, для их сохранения, для обновления различных записей и для их удаления из БД. В число элементов DML-обращений входит основная часть SQL операторов.

DCL (Data Con­trol Lan­guage) — язык управления данными. Включает в себя запросы и команды, касающиеся разрешений, прав и других настроек СУБД.

TCL (Trans­ac­tion Con­trol Lan­guage) — язык управления транзакциями. Конструкции такого типа применяют чтобы управлять изменениями, которые производятся с использованием DML запросов. Конструкции TCL позволяют нам производить объединение DML запросов в наборы транзакций.

Основные типы SQL запросов по их видам:

Простые SQL запросы

Создаём таблицу

Для того, чтобы создать таблицу в SQL, используется выражение CREATE TABLE. Он принимает в качестве параметров все колонки, которые мы хотим внести, а также их типы данных.

Давайте создадим табличку с названием “Months”, в которой будет три колонки:

  • id — иными словами, порядковый номер месяца (целочисленный тип или int)
  • name — название месяца (строка или varchar(10) (10 символов — максимальная длина строки))
  • days — число дней в конкретном месяце (целочисленный тип или int)

Код будет выглядеть вот так:

CREATE TABLE months (id int, name varchar(10), days int);

Также, когда создаются таблицы, принято добавлять так называемый pri­ma­ry key. Это колонка, значения в которой уникальны. Чаще всего pri­ma­ry key колонкой является id, но в нашем случае это может быть и name, так как имена всех месяцев уникальны.

Ввод данных

Теперь давайте добавим пару месяцев в нашу табличку. Сделать это можно с помощью команды INSERT. Есть два разных способа использовать INSERT:

Первый способ не подразумевает указания названий колонок, а лишь принимает значения в том порядке, в котором они указаны в таблице.

INSERT INTO months VALUES (1,‘January’,31);

Первый способ короче второго, однако если в будущем мы захотим добавить дополнительные колонки, все предыдущие запросы работать не будут. Для решения данной проблемы следует использовать второй способ. Его суть в том, что перед вводом данных мы указываем названия колонок.

INSERT INTO months (id,name,days) VALUES (2,‘February’,29);

В случае, если мы не укажем одну из колонок, на её место будет записано NULL или заданное значение по умолчанию, но это уже совсем другая история.

Данный запрос используется в случае, если нам нужно показать данные в таблице. Наверное, самым простым примером использования SELECT будет следующий запрос:

SELECT * FROM char­ac­ters

Результатом данного запроса будет таблица со всеми данными в таблице char­ac­ters. Знак звёздочки (*) означает то, что мы хотим показать все столбцы из таблицы без исключений. Так как в базе данных обычно больше одной таблицы, нам необходимо указывать название таблицы, данные из которой мы хотим посмотреть. Сделать это мы можем, используя ключевое слово FROM.

Когда вам нужны лишь некоторые столбцы из таблицы, то вы можете указать их имена через запятую вместо звёздочки.

SELECT name, weapon FROM char­ac­ters

Также иногда нам нужно отсортировать выводимые данные. Для этого мы используем ORDER BY “название столбца”. ORDER BY имеет два модификатора: ASC (по возрастанию) (по умолчанию) и DESC (по убыванию).

SELECT name, weapon FROM “char­ac­ters” ORDER BY name DESC

Теперь мы знаем, как показать только конкретные столбцы, но что если мы хотим включить в вывод лишь некоторые конкретные строки? Для этого мы используем WHERE. Данное ключевое слово позволяет нам фильтровать данные по определённому условию.

В следующем запросе мы выведем только тех персонажей, которые в качестве оружия используют пистолет.

SELECT *
FROM char­ac­ters
WHERE weapon = ‘pis­tol’;

И/или

К примеру, у нас есть табличка, в которой записаны данные о 4 самых продаваемых музыкальных альбомах всех времён. Давайте выведем только те, жанром которых является рок, а продажи были меньше, чем 50 миллионов копий.

SELECT *
FROM albums
WHERE genre = ‘rock’ AND sales_in_millions <= 50
ORDER BY released

Условия в WHERE могут быть записаны с использованием ещё нескольких команд, которыми являются:

  • IN — сравнивает значение в столбце с несколькими возможными значениями и возвращает true, если значение совпадает хотя бы с одним значением
  • BETWEEN — проверяет, находится ли значение в каком-то промежутке
  • LIKE — ищет по шаблону

К примеру, мы можем сделать запрос для вывода данных об альбомах в жанре pop или soul:

SELECT * FROM albums WHERE genre IN (‘pop’,‘soul’);

Если мы хотим вывести все альбомы, которые были выпущены в промежутке между 1975 и 1985 годом, мы можем использовать следующую запись:

SELECT * FROM albums WHERE released BETWEEN 1975 AND 1985;

Также, если мы хотим вывести все альбомы, в названии которых есть буква ‘R’, мы можем использовать следующую запись:

SELECT * FROM albums WHERE album LIKE ‘%R%’;

Знак % означает любую последовательность символов (0 символов тоже считается за последовательность).

Если мы хотим вывести все альбомы, первая буква в названии которых — ‘R’, то запись слегка изменится:

SELECT * FROM albums WHERE album LIKE ‘R%’;

В SQL также есть инверсия. Для примера, попробуйте самостоятельно написать NOT перед любым логическим выражением в условии (NOT BETWEEN и так далее).

Функции

В SQL полно встроенных функций для выполнения разных операций. Мы же покажем вам только наиболее часто используемые:

  • COUNT() — возвращает число строк
  • SUM() — возвращает сумму всех полей с числовыми значениями в них
  • AVG() — возвращает среднее значение среди строк
  • MIN()/MAX() — возвращает минимальное/максимальное значение среди строк

Чтобы вывести год выпуска самого старого альбома, в таблице можно использовать следующий запрос:

SELECT MAX(released) FROM albums;

Обратите внимание, что если вы напишете запрос, в котором вам, к примеру, нужно будет вывести имя и среднее значение чего-либо, то вы получите ошибку на выводе.

Допустим, вы пишете такой запрос:

SELECT name, avg(age) FROM stu­dents;

Чтобы избежать ошибки, вам следует добавить следующую строку:

GROUP BY name

Причиной тому является, что запись avg(age) является совокупной (aggre­gat­ed), и вам необходимо группировать значения по имени.

Вложенные Select

В предыдущих шагах мы изучили, как делать простые вычисления с данными. Если мы хотим использовать результат данных вычислений, то часто нам необходимо использовать так называемые вложенные запросы. Допустим, нам необходимо вывести артиста, альбом и год выпуска самого старого альбома в таблице.

Вывести эти столбцы можно, используя следующий запрос:

SELECT artist, album, released FROM albums;

Также мы знаем, как получить самый ранний год из имеющихся:

SELECT MIN(released) FROM album;

Объединить эти запросы можно в WHERE:

SELECT artist,album,released
FROM albums
WHERE released = (
SELECT MIN(released) FROM albums
);

Присоединение таблиц

В сложных базах данных чаще всего у нас есть несколько связанных таблиц. К примеру, у нас есть две таблицы: про видеоигры и про разработчиков.

В таблице video_games есть столбец developer_id, в данном случае он является так называемым foreign_key. Чтобы было проще понять, developer_id — это связывающее звено между двумя таблицами.

Если мы хотим вывести всю информацию об игре, включая информацию о её разработчике, нам необходимо подключить вторую таблицу. Чтобы это сделать, можно использовать INNER JOIN:

Это, наверное, самый простой пример использования JOIN. Есть ещё несколько вариантов его использования.

Псевдонимы

Если вы взгляните на предыдущий пример, то вы заметите, что есть два столбца, названных одинаково: “name”. Часто это может запутать. Решением данной проблемы являются псевдонимы. Они, к слову, помогают сделать название столбца красивее или понятнее в случае необходимости.

Чтобы присвоить столбцу псевдоним, можно использовать ключевое слово AS:

Зачастую нам нужно изменить данные в таблице. В SQL это делается с помощью UPDATE.

Использование UPDATE включает в себя:

  • выбор таблицы, в которой находится поле, которое мы хотим изменить
  • запись нового значения
  • использование WHERE, чтобы обозначить конкретное место в таблице

Предположим, у нас есть таблица с самыми высокооценёнными сериалами всех времён. Однако у нас есть проблема: «Игра Престолов» обозначена как комедия и нам определённо нужно это изменить:

UPDATE tv_series
SET genre = ‘dra­ma’
WHERE name = ‘Game of Thrones’;

Удаление записей из таблицы

Удаление записи из таблицы через SQL — очень простая операция. Всё, что нужно — это обозначить, что именно мы хотим удалить.

DELETE FROM tv_series
WHERE id = 4;

Примечание: убедитесь, что используете WHERE, когда удаляете запись из таблицы. Иначе вы удалите все записи из таблицы, сами того не желая.

Удаление таблиц

Если мы хотим удалить все данные из таблицы, но при этом оставить саму таблицу, нам следует использовать команду TRUNCATE:

Ниже предоставлен список наиболее полезных и часто используемых команд MySQL с примерами.

Это перевод статьи , с некоторыми незначительными изменениями и дополнениями.

mysql> в начале строки означает, что команда выполняется из MySQL-клиента.

Символ # или $ в начале строки означает, что команда выполняется из командной строки.

UPD 03.03.2019 Пост изначально был размещён в 2012-ом году, и стал самым читаемым в блоге — 198737 просмотров на данный момент. Сегодня его немного обновил — изменил форматирование текста команд, и разбил всё на разделы для простоты навигации по примерам.

Общие команды

Что бы проверить статус сервера MYSQL выполните:

systemctl status mysql

Что бы подключиться к серверу MySQL из консоли, если сервер MySQL находится на том же хосте:

mysql -u username -p

Что бы подключиться к серверу MySQL из консоли, если сервер MySQL находится на удаленном хосте db1.example.com:

mysql -u username -p -h db1.example.com

Работа с базами и таблицами

Работа с базами

Создать базу данных на MySQL сервере:

mysql> CREATE DATABASE ;

Показать список всех баз данных на сервере MySQL:

mysql> SHOW DATABASES;

Переключиться для работы с определенной базой данных:

mysql> USE ;

Удалить базу:

mysql> DROP DATABASE ;

Работа с таблицами

Отобразить все таблицы в базе данных:

mysql> SHOW TABLES;

Просмотреть формат таблицы в базе:

mysql> DESCRIBE ;

Показать все содержимое таблицы:

mysql> SELECT * FROM ;

Отобразить количество строк в таблице:

mysql> SELECT COUNT(*) FROM ;

Подсчитать количество колонок в таблице:

mysql> SELECT SUM(*) FROM ;

Удаление строки в таблице:

mysql> DELETE from where = ‘whatever’;

Удаление столбца из таблицы:

mysql> alter table DROP INDEX ;

Удалить таблицу из базы:

mysql> DROP TABLE ;

Работа с колонками

Добавить колонку в таблицу:

mysql> ALTER TABLE ADD COLUMN varchar (20);

Изменение имени колонки:

mysql> ALTER TABLE CHANGE varchar (50);

Создать колонку с уникальным именем, что бы избежать дубликатов в названиях:

mysql> ALTER TABLE ADD UNIQUE ();

Изменение размера колонки:

mysql> ALTER TABLE MODIFY VARCHAR(3);

Выборка данных

Показать все содержимое таблицы:

mysql> SELECT * FROM ;

Отобразить колонки и их содержимое в выбранной таблице:

mysql> SHOW COLUMNS FROM ;

Отобразить строки в определенной таблице, содержащие «whatever»:

mysql> SELECT * FROM WHERE = «whatever»;

Отобразить все записи в определенной таблице, содержащие «Bob» и телефонный номер «3444444:

mysql> SELECT * FROM WHERE name = «Bob» AND phone_number = ‘3444444’;

Отобразить все записи, НЕ содержащие имя «Bob» и телефонный номер «3444444», отсортированные по полю phone_number:

mysql> SELECT * FROM WHERE name != «Bob» AND phone_number = ‘3444444’ order by phone_number;

Показать все записи, начинающиеся с букв ‘bob» и телефонного номера «3444444» в определенной таблице:

mysql> SELECT * FROM WHERE name like «Bob%» AND phone_number = ‘3444444’;

Показать все записи, начинающиеся с букв ‘bob» и телефонного номера «3444444», ограничиваясь записями с 1-ой до 5-ой:

mysql> SELECT * FROM WHERE name like «Bob%» AND phone_number = ‘3444444’ limit 1,5;

Показать все уникальные записи:

mysql> SELECT DISTINCT FROM ;

Отобразить выбранные записи, отсортированные по возрастанию (asc) или убыванию (desc):

mysql> SELECT , FROM ORDER BY DESC;

Регулярные выражения

Использование регулярных выражений («REGEXP BINARY») для поиска записей. Например, для регистро-независимого поиска — найти все записи, начинающиеся с буквы А:

mysql> SELECT * FROM WHERE rec RLIKE «^a»;

Импорт и экспорт данных в/из файла

Загрузка файла CSV в таблицу:

mysql> LOAD DATA INFILE ‘/tmp/filename.csv’ replace INTO TABLE FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘n’ (field1,field2,field3);

Пользователи, пароли сервера MySQL:добавление, изменение пользователей и паролей

Создание нового пользователя — подключение к серверу MySQL под root, переключение к базе данных, добавление пользователя, обновление привилегий:

mysql -u root -p mysql> USE mysql; mysql> INSERT INTO user (Host,User,Password) VALUES(‘%’,’username’, PASSWORD(‘password’)); mysql> flush privileges;

Изменений пользовательского пароля из консоли на удаленном хосте db1.example.org:

mysqladmin -u username -h db1.example.org -p password ‘new-password’

Изменение пользовательского пароля из консоли MySQL — подключение под root, обновление пароля, обновление привилегий:

mysql> SET PASSWORD FOR ‘user’@’hostname’ = PASSWORD(‘passwordhere’); mysql> flush privileges;

Восстановление/изменение пароля root сервера MySQL — остановка MySQL, запуск без таблиц привилегий, подключение под root, установка нового пароля, выход и перезапуск MySQL.

Подробнее о восстановлении пароля root для MySQL написано .

systemctl stop mysql mysqld_safe —skip-grant-tables & mysql -u root mysql> use mysql; mysql> update user set password=PASSWORD(«newrootpassword») where User=’root’; mysql> flush privileges; mysql> quit systemctl start mysql

Обновление пароля root:

mysqladmin -u root -p oldpassword newpassword

Установка права на подключение к серверу с хоста localhost с паролем «passwd» — подключение под root, переключение к базе данных, установка привилегий, обновление привилегий:

mysql -u root -p mysql> use mysql; mysql> grant usage on *.* to bob@localhost identified by ‘passwd’; mysql> flush privileges;

Установка привилегий пользователю на использование базы данных — подключение под root, переключение к базе данных, установка привилегий, обновление привилегий:

mysql> use mysql; mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES (‘%’,’databasename’,’username’,’Y’,’Y’,’Y’,’Y’,’Y’,’N’); mysql> flush privileges;

Или:

mysql> grant all privileges on databasename.* to username@localhost; mysql> flush privileges;

Обновление информации в базе данных:

mysql> UPDATE SET Select_priv = ‘Y’,Insert_priv = ‘Y’,Update_priv = ‘Y’ where = ‘user’;

Обновление привилегий в базе данных:

mysql> flush privileges;

Резервные копии

Создание дампа

Создать резервную копию (dump) всех баз данных в файл alldatabases.sql:

mysqldump -u root -p password —opt >/tmp/alldatabases.sql

Создать резервную копию одной базы данных в файл databasename.sql:

mysqldump -u username -p password —databases databasename >/tmp/databasename.sql

Создать резервную копию одной таблицы в файл databasename.tablename.sql:

mysqldump -c -u username -p password databasename tablename > /tmp/databasename.tablename.sql

Восстановление из дампа

Восстановление базы данных (или таблицы) из резервной копии:

mysql -u username -p password databasename < /tmp/databasename.sql

Создание таблиц

курсивом указаны имена столбцов;
ЗАГЛАВНЫМИ буквами — типы и атрибуты столцов;
в (скобках) — значение типа столбца.

Создать таблицу, пример 1:

mysql> CREATE TABLE (firstname VARCHAR(20), middleinitial VARCHAR(3), lastname VARCHAR(35), suffix VARCHAR(3), officeid VARCHAR(10), userid VARCHAR(15), username VARCHAR(8), email VARCHAR(35), phone VARCHAR(25), groups VARCHAR(15), datestamp DATE, timestamp TIME, pgpemail VARCHAR(255));

Создать таблицу, пример 2:

mysql> create table (personid INT(50) NOT NULL AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(35), middlename VARCHAR(50), lastname VARCHAR(50) default ‘bato’);

Больше примеров можно найти в статьях Простая работа с MySQL в простых примерах #1 — работа с базами, создание таблиц и Простая работа с MySQL в простых примерах #2 — наполнение таблиц.

История языков программирования: SQL- стандартизация длиною в жизнь


По мнению аналитиков CodingDojo, SQL — самый важный и нужный язык запросов среди языков программирования, как бы странно это ни звучало. Рейтинг CodingDojo учитывает статистику востребованности языков программирования на рынке труда.
Ведь СУБД – MySQL, PostgreSQL и Microsoft SQL Server – распространены повсеместно: в крупном и малом бизнесе, в больницах, банках, университетах и так далее. В принципе, SQL не ограничивается только настольными девайсами: СУБД SQLite с успехом заняла свое место на Android-смартфонах и мобильных устройствах Apple. Соответственно, такие приложения, как Skype и Dropbox, постоянно к ней обращаются.

Однако были времена, когда не было смартфонов, а этот язык уже существовал. История SQL – это не годы, но десятилетия. Поверили в него не сразу.

System R и IBM

Первые упоминания об этом языке датируются 1974 годом. SQL создавался в рамках проекта экспериментальной реляционной СУБД System R. Занималась этим проектом компания IBM.
Первоначально язык назывался SEQUEL (Structured English Query Language), но потом слово «English» пропало из этого словосочетания, а аббревиатура приобрела тот вид, к которому мы давно уже привыкли. С одной стороны, SQL был ориентирован на удобную и понятную пользователям формулировку запросов к реляционным БД. С другой стороны, практически с самого начала он был так называемым «полным языком БД». Это означает, что SQL включал:
• средства определения и манипулирования схемой БД;
• средства определения ограничений целостности и триггеров;
• средства определения представлений БД;
• средства определения структур физического уровня, поддерживающих эффективное выполнение запросов;
• средства авторизации доступа к отношениям и их полям;
• средства определения точек сохранения транзакции и выполнения фиксации и откатов транзакций.
Правда, в нем не были реализованы средства синхронизации доступа к объектам БД со стороны параллельно выполняемых транзакций. Дело в том, что разработчики изначально рассчитывали, что необходимую синхронизацию неявно выполняет СУБД.
Язык реализован в подавляющем большинстве СУБД – как в реляционных, так и нереляционных. Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования.
Разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce).

SEQUEL был не единственным языком подобного назначения. В Калифорнийском Университете Беркли была разработана некоммерческая СУБД Ingres, которая являлась реляционной СУБД, но использовала свой собственный язык QUEL, который, однако, не выдержал конкуренции по количеству поддерживающих его СУБД по сравнению с языком SQL.В System R была реализована наиболее сложная и полная версия SQL. Чуть меньше функциональности было в SQL/DS и DB2 от той же IBM. Из SQL System R были удалены только те части, которые были недостаточно проработаны (например, точки сохранения) или реализация которых вызывала слишком большие технические трудности (например, ограничения целостности и триггеры).

Коммерческий успех

Поэтому путь к коммерческой реализации SQL, который прошла IBM, называют движением «сверху вниз».
Oracle, Informix и Sybase пошли по другому пути – «снизу вверх»: в первых версиях этих систем, выпущенных на рынок, использовалось существенно ограниченное подмножество SQL System R. А далее они начали постепенно расширяться. Однако в первой коммерческой реализации SQL в СУБД Oracle в операторах выборки не допускалось использование вложенных подзапросов и отсутствовала возможность формулировки запросов с соединениями нескольких отношений.

Распеределение рыночных долей по состоянию на 2011 год
Растущая заинтересованность рынка в скорейшем переходе к реляционным системам управления базами данных позволила разработчикам перечисленных выше компаний добиться коммерческого успеха. Это произошло, скорее, вопреки тому, что СУБД были тогда очень далеки от совершенства. Ну а теперь Oracle, Informix, Sybase и Microsoft SQL Server поддерживают достаточно мощные диалекты SQL.

Стандартизация

Появление многочисленных диалектов SQL и их разрастание должно было привести к проблемам совместимости и прочим противоречиям.
Однако деятельность по стандартизации языка SQL началась очень вовремя – практически одновременно с появлением его первых коммерческих реализаций. В 1982 году комитету по базам данных Американского национального института стандартов (ANSI) было поручено разработать спецификацию стандартного языка реляционных баз данных.

После отклонения ряда неудачных версий стандарта в 1986 году эксперты пришли к единому знаменателю. А в 1987 году стандарт SQL/86 был одобрен Международной организацией по стандартизации (ISO).
За основу стандарта нельзя было брать SQL System R. Во-первых, этот вариант языка был недостаточно проработан технически. Во-вторых, его слишком сложно было бы реализовать. Поэтому за основу был взят диалект языка SQL, сложившийся в IBM к началу 1980-х годов. В сущности, этот диалект представлял собой подмножество SQL System R.

Стандарт SQL1

К 1989 году стандарт SQL/86 был несколько расширен, после чего появился следующий стандарт, получивший название ANSI/ISO SQL/89.
SQL/89 стал первым всемирно принятым стандартом языка SQL. У этого языка имеется масса недостатков: многие важные понятия не определены, много отдано на откуп реализациям. В этом стандарте полностью отсутствуют такие важные разделы, как манипулирование схемой БД и динамический SQL.
Но тем не менее он сыграл свою роль в становлении действительно стандартизованных реляционных систем управления базами данных. Более того, с появлением стандарта SQL/89 стало возможно проектировать, разрабатывать и сопровождать информационные системы, не слишком привязанные к конкретному производителю СУБД. В некотором смысле появление SQL/89 явилось продвижением технологии баз данных в сторону открытых систем.
Возможно, наиболее важными достижениями стандарта SQL/89 являются четкая стандартизация синтаксиса, семантики операторов выборки данных и манипулирования данными, а также фиксация средств ограничения целостности БД.
В стандарте определяются два уровня языка и отдельное средство поддержания целостности. Уровень 2 — это полный язык баз данных SQL, не включающий средство поддержания целостности. Уровень 1 — это специфицированное подмножество уровня 2.
Средство поддержания целостности включает возможности определения:
• требуемых ограничений на ссылки между таблицами;
• проверочных ограничений на строки таблицы;
• значений столбца по умолчанию при занесении строки в таблицу.
Средства определения внешних ключей позволяют легко формулировать требования так называемой ссылочной целостности БД. Это распространенное в реляционных БД требование можно было сформулировать и на основе общего механизма ограничений целостности SQL System R, но формулировка на основе понятия внешнего ключа более проста и понятна.

Возможности операции Join в разных стандартах

Стандарт SQL2 и его дополнения

Осознавая неполноту стандарта SQL, специалисты различных компаний начали работу над очередным стандартом, который получил название SQL2. Эта работа также длилась несколько лет, было выпущено множество проектов стандарта, пока наконец в марте 1992 года не был принят окончательный проект стандарта (SQL/92). Этот стандарт существенно полнее стандарта SQL/89 и охватывает практически все аспекты, необходимые для реализации приложений: манипулирование схемой БД, управление транзакциями (появились точки сохранения) и сессиями (сессия – это последовательность транзакций, в пределах которой сохраняются временные отношения), подключения к БД, динамический SQL. Наконец, были стандартизованы отношения-каталоги БД, что вообще-то не связано непосредственно с языком, но очень сильно влияет на реализацию.
В 1995 году стандарт был дополнен спецификацией интерфейса уровня вызова (Call-Level Interface – SQL/CLI). SQL/CLI представляет собой набор спецификаций интерфейсов процедур, вызовы которых позволяют выполнять динамически задаваемые операторы SQL. По сути дела, SQL/CLI представляет собой альтернативу динамическому SQL.
Стандарт SQL/CLI послужил основой для создания повсеместно распространенных сегодня интерфейсов ODBC (Open Database Connectivity) и JDBC (Java Database Connectivity).
В 1996 году к стандарту SQL/92 был добавлен еще один компонент – SQL/PSM (Persistent Stored Modules). Основная цель этой спецификации – стандартизировать способы определения и использования хранимых процедур, то есть специальным образом оформленных программ, включающих операторы SQL, которые сохраняются в базе данных, могут вызываться приложениями и выполняются внутри СУБД.
Oracle является одной из наиболее популярных СУБД. Более того, именно там впервые была реализована совместимость со стандартом SQL/92.
А изначально первой СУБД, поддерживающей язык SQL, стала Oracle V2, разработанная для машин VAX. Это было еще в в 1979 году.Oracle поддерживает ряд различных платформ, включая Windows, Linux, Max OS X и Sun Solaris.
Процедурное расширение SQL, разработанное Oracle, называется PL/SQL (Procedural Language/Structured Query Language) и основано на синтаксисе языков Ada и Pascal. Третьим ключевым языком, использующийся в СУБД Oracle наравне с SQL и PL/SQL, является Java.
PL/SQL поддерживает программные блоки, а также разнообразные типы данных для хранения чисел, строк и дат, операторы управления потоком вычислений (в том числе условные переходы и циклы) и три типа контейнеров (коллекций) — массивы переменной длины, ассоциативные массивы и вложенные таблицы.

Стандарт SQL3

Первоначально планировалось закончить работу над новым стандартом в 1995 году. Реально работу над новым стандартом удалось частично завершить только в 1999 году, и по этой причине стандарт получил название SQL:1999.
Каждый новый вариант стандарта языка SQL был существенно объемнее предыдущих версий. Так, если стандарт SQL/89 занимал около 600 страниц, то объем SQL/92 составлял на 300 с лишним страниц больше. Самые первые проекты SQL3 занимали около 1500 страниц.

Однако разработчики SQL3 пришли к выводу, что при таких объемах стандарта вероятность его принятия и последующей успешной поддержки заметно уменьшается. Поэтому они решили разбить стандарт на относительно независимые части, которые можно было бы разрабатывать и поддерживать по отдельности.
В 1999 году были приняты пять частей стандарта SQL:1999.
Первая часть (SQL/Framework) посвящена описанию концептуальной структуры стандарта. В этой части приводится развернутая аннотация следующих четырех частей и формулируются требования к реализациям, претендующим на соответствие стандарту.
Вторая часть SQL:1999 (SQL/Foundation) образует базис стандарта. Вводится система типов языка, формулируются правила определения функциональных зависимостей и возможных ключей, определяются синтаксис и семантика основных операторов SQL:
• операторов определения и манипулирования схемой базы данных;
• операторов манипулирования данными;
• операторов управления транзакциями;
• операторов управления подключениями к базе данных и т. д.

Третью часть занимает уточненная по сравнению с SQL/92 спецификация SQL/CLI. В четвертой части специфицируется SQL/PSM – синтаксис и семантика языка определения хранимых процедур. Наконец, в пятой части – SQL/Bindings – определяются правила связывания SQL для стандартных версий языков программирования.
В стандарт SQL:1999 должны были войти еще несколько частей. Среди них спецификации следующих средств:
• управление распределенными транзакциями (SQL/Transaction);
• поддержка темпоральных свойств данных (SQL/Temporal);
• управление внешними данными (SQL/MED);
• связывание с объектно-ориентированными языками программирования (SQL/OLB);
• поддержка оперативной аналитической обработки (SQL/OLAP).

SQL в XXI веке

В конце 2003 года был принят и опубликован новый вариант международного стандарта SQL:2003. Многие специалисты считали, что в варианте стандарта, следующем за SQL:1999, будут всего лишь исправлены неточности SQL:1999. Но на самом деле, в SQL:2003 специфицирован ряд новых и важных свойств, с небольшими модификациями, внесёнными позже в 2008 году.
Наиболее серьезные изменения языка SQL, специфицированные в части 2 стандарта SQL:2003, касаются следующих аспектов:
• типы данных;
• подпрограммы, вызываемые из SQL;
• расширенные возможности оператора CREATE TABLE;
• новый объект схемы – генератор последовательностей;
• новые виды столбцов – идентифицирующие столбцы (identity column) и генерируемые столбцы (generated column);
• новый оператор MERGE;
Претерпела некоторые изменения общая организация стандарта. Стандарт SQL:2003 состоит из следующих частей:
• 9075-1, SQL/Framework;
• 9075-2, SQL/Foundation;
• 9075-3, SQL/CLI;
• 9075-4, SQL/PSM;
• 9075-9, SQL/MED;
• 9075-10, SQL/OLB;
• 9075-11, SQL/Schemata;
• 9075-13, SQL/JRT;
• 9075-14, SQL/XML.
Части 1-4 и 9-10 с необходимыми изменениями остались такими же, как и в SQL:1999. Часть 5 (SQL/Bindings) перестала существовать; соответствующие спецификации включены в часть 2.
Раздел части 2 SQL:1999, посвященный информационной схеме, выделен в отдельную часть 11. Появились две новые части – 13 и 14.
Часть 13 полностью называется «SQL Routines and Types Using the Java Programming Language» («Использование подпрограмм и типов SQL в языке программирования Java»). Появление такой части стандарта оправдано повышенным вниманием к языку Java со стороны ведущих производителей SQL-ориентированных СУБД.
Наконец, последняя часть SQL:2003 посвящена спецификациям языковых средств, позволяющих работать с XML-документами в среде SQL.
Несмотря на старания разработчиков, процесс стандартизации явно не поспевает за происходящими изменениями.

Основные моменты в истории SQL
Тем не менее, можно сказать, что базовый набор операторов SQL, включающий операторы определения схемы БД, выборки и манипулирования данными, авторизации доступа к данным, поддержки встраивания SQL в языки программирования и операторы динамического SQL, в коммерческих реализациях устоялся и более или менее соответствует стандарту.
P.S. SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных. Однако эти «недостатки» ему прощают, учитывая его место в истории ИТ.

Национальная библиотека им. Н. Э. Баумана Bauman National Library

SQL

Парадигма

Мультипарадигмальный

Спроектировано

Дональд Чемберлин
Рэймонд Бойс

Разработчики

Первый появившийся

Стабильная версия

SQL:2008 / 2008

Статическая, строгая

OS

Кроссплатформенный

Расширение файла

Главная реализация

Много

Диалект

SQL-86, SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2008

Под влиянием Влияние

Agena, CQL, LINQ, Windows PowerShell

SQL (Structured Query Language)

Разработчик

Начальная версия

Последний релиз

SQL:2008
(2008)

Тип формата

Базы данных

Стандарт

ISO/IEC 9075

Открытый формат?

Да

SQL — (Structured Query Language, произносится ˈstrʌkʧəd ˈkwɪəri ˈlæŋgwɪʤ) — язык программирования специального назначения, разработанный для управления данными в реляционных СУБД. В круг ответственности SQL входит добавлене данных, извлечение по запросу, обновление и их удаление, а также создание и изменение схемы реляционной БД, контроль прав доступа к данным. Несмотря на то, что в основном SQL описывают как декларативный язык, в него включены и процедурные элементы. Все крупнейшие реляционные СУБД поддерживают SQL в той или иной форме. В дополнение к этому, все программы, написанные на SQL, портируются между всеми реализациями SQL, подчиняющимися стандарту, либо с изменениями на любые другие реализации.

История

Первые разработки

В начале 1970-х годов в одной из исследовательских лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English QUEry Language — «структурированный английский язык запросов». Позже по юридическим соображениям язык SEQUEL был переименован в SQL. Когда в 1986 году первый стандарт языка SQL был принят ANSI, официальным произношением стало — эс-кью-эл. Несмотря на это, даже англоязычные специалисты зачастую продолжают читать SQL как сиквел (по-русски часто говорят «эс-ку-эль»).

C одной стороны, SQL был ориентирован на удобную и понятную пользователям формулировку запросов к реляционным БД. С другой стороны, практически с самого начала он был так называемым «полным языком БД». Это означает, что SQL включал:

  • средства определения и манипулирования схемой БД;
  • средства определения ограничений целостности и триггеров;
  • средства определения представлений БД;
  • средства определения структур физического уровня, поддерживающих эффективное выполнение запросов;
  • средства авторизации доступа к отношениям и их полям;
  • средства определения точек сохранения транзакции и выполнения фиксации и откатов транзакций.

Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Собственно разработкой языка запросов занимались Дональд Чэмбэрлин и Рэй Бойс (|Ray Boyce). Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (Шаблон:Lang-en2), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.

Стоит отметить, что SEQUEL был не единственным языком подобного назначения. В Калифорнийском Университете Беркли была разработана некоммерческая СУБД Ingres (являвшаяся, между прочим, дальним прародителем популярной сейчас некоммерческой СУБД PostgreSQL), которая являлась реляционной СУБД, но использовала свой собственный язык QUEL, который, однако, не выдержал конкуренции по количеству поддерживающих его СУБД по сравнению с языком SQL.

Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для машин VAX от компании Relational Software Inc. (впоследствии ставшей компанией Oracle) и System/38 от IBM, основанная на System/R.

Поскольку к началу 1980-х годов существовало несколько вариантов СУБД от разных производителей, причём каждый из них обладал собственной реализацией языка запросов, было принято решение разработать стандарт языка, который будет гарантировать переносимость ПО с одной СУБД на другую (при условии, что они будут поддерживать этот стандарт).

В 1983 году Международная организация по стандартизации (ISO) и Американский национальный институт стандартов (ANSI) приступили к разработке стандарта языка SQL. По прошествии множества консультаций и отклонения нескольких предварительных вариантов, в 1986 году ANSI представил свою первую версию стандарта, описанную в документе ANSI X3.135-1986 под названием «Database Language SQL» (Язык баз данных SQL). Неофициально этот стандарт SQL-86 получил название SQL1. Год спустя была завершена работа над версией стандарта ISO 9075-1987 под тем же названием. Разработка этого стандарта велась под патронажем Технического Комитета TC97 (Technical Committee TC97), областью деятельности которого являлись процессы вычисления и обработки информации (Computing and Information Processing). Именно его подразделение, именуемое как Подкомитет SC21 (Subcommittee SC21), курировало разработку стандарта, что стало залогом идентичности стандартов ISO и ANSI для SQL1 (SQL-86).

Стандарт SQL1 разделялся на два уровня. Первый уровень представлял собой подмножество второго уровня, описывавшего весь документ в целом. То есть, такая структура предусматривала, что не все спецификации стандарта SQL1 будут относиться к Уровню 1. Тем самым поставщик, заявлявший о поддержке данного стандарта, должен был заявлять об уровне, которому соответствует его реализация языка SQL. Это значительно облегчило принятие и поддержку стандарта, поскольку производители могли реализовывать его поддержку в два этапа.

Со временем к стандарту накопилось несколько замечаний и пожеланий, особенно с точки зрения обеспечения целостности и корректности данных, в результате чего в 1989 году данный стандарт был расширен, получив название SQL89. В частности, в него была добавлена концепция первичного и внешнего ключей. ISO-версия документа получила название ISO 9075:1989 «Database Language SQL with Integrity Enhancements» (Язык баз данных SQL с добавлением контроля целостности). Параллельно была закончена и ANSI-версия.

Сразу после завершения работы над стандартом SQL1 в 1987 году была начата работа над новой версией стандарта, который должен был заменить стандарт SQL89, получив название SQL2, поскольку дата принятия документа на тот момент была неизвестна. Таким образом, фактически SQL89 и SQL2 разрабатывались параллельно. Новая версия стандарта была принята в 1992 году, заменив стандарт SQL89. Новый стандарт, озаглавленный как SQL92, представлял собой по сути расширение стандарта SQL1, включив в себя множество дополнений, имевшихся в предыдущих версиях инструкций.

Как и SQL1, SQL92 также был разделён на несколько уровней, однако, во-первых, число уровней было увеличено с двух до трёх, а во-вторых, они получили названия вместо порядковых цифр: начальный (entry), средний (intermediate), полный (full). Уровень «полный», как и Уровень 2 в SQL1 подразумевал весь стандарт целиком. Уровень «начальный» представлял собой подмножество уровня «средний», в свою очередь, представлявшего собой подмножество уровня «полный». Уровень «начальный» был сравним с Уровнем 2 стандарта SQL1, но спецификации этого уровня были несколько расширены. Таким образом, цепочка включений уровней стандартов выглядела примерно следующим образом: SQL1 Уровень 1 → SQL1 Уровень 2 → SQL92 «Начальный» → SQL92 «Средний» → SQL92 «Полный».

После принятия стандарта SQL92 к нему были добавлены ещё несколько документов, расширявших функциональность языка. Так, в 1995 году был принят стандарт SQL/CLI (Call Level Interface, интерфейс уровня вызовов), впоследствии переименованный в CLI95. На следующий год был принят стандарт SQL/PSM (Persistent Stored Modules, постоянно хранимые модули), получивший название PSM-96.

Следующим стандартом стал SQL:1999 (SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже (SQL:2008). История версий стандарта:

Год Название Иное название Изменения
1986 SQL-86 SQL-87 Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году.
1989 SQL-89 FIPS 127-1 Немного доработанный вариант предыдущего стандарта.
1992 SQL-92 SQL2, FIPS 127-2 Значительные изменения (ISO 9075); уровень Entry Level стандарта SQL-92 был принят как стандарт FIPS 127-2.
1999 SQL:1999 SQL3 Добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности.
2003 SQL:2003 Введены расширения для работы с XML-данными, оконные функции (применяемые для работы с OLAP-базами данных), генераторы последовательностей и основанные на них типы данных.
2006 SQL:2006 Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL и XQuery.
2008 SQL:2008 Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003

Для поставщиков СУБД стандарт — это путеводная звезда, которая гарантирует правильное направление работ. А вот эффективность реализации стандарта — это гарантия успеха. SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных. Операторы SQL встраиваются в базовый язык программирования, которым может быть любой стандартный язык типа C++, PL, COBOL и т. д. Кроме того, операторы SQL могут выполняться непосредственно в интерактивном режиме.

Альтернатива

Следует различать альтернативы SQL как языка и как альтернативу самой реляционной модели. Ниже предлагаются реляционные альтернативы языку SQL. См. Навигационную базу данных и NoSQL для альтернатив реляционной модели.

  • .QL: Объектно-ориентированный Datalog
  • 4D Query Language (4D QL)
  • BQL: Надмножество, которое сводится к SQL
  • Datalog: Критики предполагают, что Datalog имеет два преимущества перед SQL: он имеет более понятную семантику, что облегчает понимание и обслуживание программ, и это более выразительно, в частности, для рекурсивных запросов.
  • HTSQL: Метод запросов на основе URL
  • IBM Business System 12 (IBM BS12): Одна из первых полностью реляционных систем управления базами данных, введенная в 1982 году
  • ISBL
  • jOOQ: SQL, реализованный на Java как внутренний язык, специфичный для домена
  • Java Persistence Query Language (JPQL): Язык запросов, используемый API Java Persistence и библиотеку персистентности вспящем режиме
  • LINQ: Запускает операторы SQL, написанные как языковые конструкции, для запроса коллекций непосредственно изнутри кода .Net.
  • Object Query Language
  • QBE (Query By Example), созданный Moshè Zloof, IBM в 1977
  • Quel Введенный в 1974 U.C. Berkeley.
  • Tutorial D
  • XQuery

Структура

SQL отошёл от своего теоретического основания, реляционной модели и исчисления кортежей. В SQL таблица — не набор кортежей, а список строк: в таблице возможны строки-дубликаты, неопределённые значения, порядок колонок определён и нумеруем, а сами колонки могут иметь одинаковые имена или не иметь имён вовсе. SQL — язык специального назначения, его цель — предоставить интерфейс к реляционной БД, а SQL программа — не что иное, как инструкция для СУБД.

SQL включает в себя выражения, решающие широкий круг задач:

  • Запросы к БД.
  • Вставка, обновление, удаление строк из таблиц.
  • Создание, замена, изменение и удаление таблиц и других объектов.
  • Управление доступом пользователей к объектам и услугам СУБД.
  • Средства гарантии целостности реляционной БД.

Команды языка SQL чатсо разделяют на наиболее крупные сегменты:

  • Data Definition Language — синтаксис объявления схем реляционных баз данных.
  • Data Manipulation Language — синтаксис запросов, команд добавления, изменения и удаления.
  • Data Control Language — команды управления доступом к данным и операциям над ними различных учётных записей.

Синтаксис

Структура программы

Программа на языке SQL — набор запросов и высказываний. Запросы в декларативной форме извлекают из базы данных необходимую информацию. Высказывания обычно имеют долгосрочный эффект на данные или на саму схему БД, а также управляют осуществлением транзакций, сессиями, диагностикой, соединением.

Data definition language

Data Definition Language используется для модификации схемы реляционной базы данных. Этот раздел языка состоит из четырёх типов утверждений: CREATE, ALTER, DROP, RENAME.

Create

Команда CREATE используется для создания новой базы данных, таблицы, индекса или хранимой процедуры.

CREATE TABLE employees ( id INTEGER PRIMARY KEY, first_name VARCHAR(50) not null, last_name VARCHAR(75) not null, fname VARCHAR(50) not null, dateofbirth DATE not null );

ALTER

Команда ALTER используется для модификации уже существующего в БД объекта.

ALTER TABLE sink ADD bubbles INTEGER; ALTER TABLE office ADD CONSTRAINT unique_name_and_description UNIQUE (name, description); ALTER TABLE office DROP CONSTRAINT unique_name_and_description;

DROP

Команда DROP уничтожает существующий объект (будь то база данных, таблица или иной объект).

DROP TABLE employees;

RENAME

Команда RENAME используется для переименования таблицы.

RENAME TABLE old_name TO new_name;

Data manipulation language

Data Manipulation Language используется для составления запросов к СУБД или модификации её содержимого. Раздел языка состоит из четырёх типов утверждений: SELECT, INSERT, UPDATE и DELETE.

SELECT

SELECT извлекает 0 или более строк из различных таблиц или отображений.

SELECT * FROM reunion WHERE (priority = ‘B’ AND NOT duration <= 60) OR date = ‘2008-05-12’;

Декларативное утверждение SELECT формулирует запрос с помощью условий FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER_BY, DISTINCT и др. Возможны вложенные запросы, хотя их производительность обычно уступает классическому подходу с применением JOIN. Вложенный запрос также называют подзапросом.

INSERT

INSERT используется для добавления новых строк в таблицу.

INSERT INTO reunion (id_reunion, name, description, priority, planned, date, hour, duration, id_office)

UPDATE

UPDATE используется для модификации уже существующей строки.

UPDATE reunion SET description = ‘Meeting with Ms. JOHNSON’, date = ‘2010-02-11′, hour = ’08:00:00′ WHERE id_reunion = ’14’;

DELETE

DELETE удаляет заданный условием набор строк.

DELETE FROM reunion WHERE duration = 120;

MERGE

MERGE объединяет элементы нескольких таблиц.

MERGE INTO table_name USING table_reference ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1 WHEN NOT MATCHED THEN INSERT (column1 ) VALUES (value1 );

Data control language

Синтаксис Data Control Language используется для ограничения прав пользователей базы данных. Содержит два основных утверждения: GRANT и REVOKE.

GRANT

GRANT предоставляет привилегии пользователю. Все команды SQL выполняются от имени определённого пользователя.

GRANT INSERT, UPDATE, DELETE ON office TO DEVELOPER_2 DEVELOPER_3;

REVOKE

REVOKE снимает привилегии с пользователя. Для полного снятия привилегии необходимо её снятие с понижаемого в полномочиях пользователя всеми пользователями, её давшими.

REVOKE INSERT, DELETE ON TABLE office FROM DEVELOPER_2, DEVELOPER_3;

Управление транзакциями

START TRANSACTION, COMMIT, SAVE TRANSACTION, ROLLBACK — набор команд, использующихся для организации транзакций и обеспечивающих надёжность и целостность реляционной БД.

START TRANSACTION; UPDATE Account SET amount=amount-200 WHERE account_number=1234; UPDATE Account SET amount=amount+200 WHERE account_number=2345; IF ERRORS=0 COMMIT; IF ERRORS<>0 ROLLBACK;

Преимущества и недостатки

Преимущества

Независимость от конкретной СУБД

Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально ориентировались на применение по меньшей мере нескольких СУБД (например: система электронного документооборота Documentum может работать как с Oracle Database, так и с Microsoft SQL Server и DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.

Наличие стандартов

Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах (например, базовая часть стандарта SQL:2003 состоит из более чем 1300 страниц текста).

Декларативность

С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип — программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как СУБД будет разбирать текст его запроса. Чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных.

Недостатки

Несоответствие реляционной модели данных

Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие дефекты SQL с точки зрения реляционной теории:

  • SQL разрешает в таблицах строки-дубликаты, что в рамках реляционной модели данных невозможно и недопустимо;
  • SQL поддерживает неопределённые значения (NULL) и многозначную логику;
  • SQL использует порядок колонок и ссылки на колонки по номерам;
  • SQL разрешает колонки без имени и дублирующиеся имена колонок.

В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем манифесте они излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.

Сложность

Хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.

Отступления от стандартов

Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.

Сложность работы с иерархическими структурами

Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения (например, в Oracle Database используется выражение CONNECT BY). В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2. В Microsoft SQL Server рекурсивные запросы (Recursive Common Table Expressions) появились лишь в версии 2005.

Распределенная обработка SQL

Архитектура распределенной реляционной базы данных (DRDA) была разработана рабочей группой в IBM в период с 1988 по 1994 год. DRDA позволяет связанным с сетью реляционным базам данных взаимодействовать для выполнения запросов SQL. Интерактивный пользователь или программа может выдавать SQL-запросы локальному RDB и получать таблицы данных и индикаторы состояния в ответ от удаленных RDB. Операторы SQL также могут быть скомпилированы и сохранены в удаленных RDB как пакеты, а затем вызваны именем этого пакета. Это важно для эффективной работы прикладных программ, которые вызывают сложные высокочастотные запросы. Это особенно важно, когда доступ к таблицам находится в удаленных системах. Сообщения, протоколы и структурные компоненты DRDA определяются архитектурой распределенного управления данными.

См. также

Ссылки

Источники

SQL — SQL

Эта статья о языке баз данных. Для кода ИАТА см San Carlos Airport (California) . «ПРОДОЛЖЕНИЕ» перенаправляется сюда. Для темы слова, увидеть продолжение . Для использования в других целях, см сиквел (значения) .

SQL

парадигма

Мульти-парадигма : декларативная

семья

Язык программирования

Разработано

Дональд Д. Чемберлин
Рэймонд Бойс

разработчик

ISO / IEC

Во-первых появился

1974 ; 45 лет назад

Typing дисциплины

Статический , сильный

Операционные системы

Кросс-платформенная

форматы файлов

подробнее Формат файла

Имя файла расширения

Интернет-тип носителя

Разработан

ISO / IEC

Первый выпуск

Последний релиз

SQL: 2016
(декабрь 2016 , 2 года назад )

Тип формата

База данных

стандарт

ISO / IEC 9075

Открытый формат ?

да

Основные реализации

Много

Диалекты

  • SQL-86
  • SQL-89
  • SQL-92
  • SQL: 1999
  • SQL: 2003
  • SQL: 2006
  • SQL: 2008
  • SQL: 2011
  • SQL: 2016

Под влиянием

Лог данных

Под влиянием

CQL , LINQ , SOQL, PowerShell , JPQL , jOOQ , N1QL

  • Структурированный язык запросов на Викиучебниках

SQL ( / ˌ ɛ s ˌ к Ju ɛ л / ( слушать ) SQL , / s я к ж əl / «сиквел», Structured Query Language ) является языком предметно-ориентированным , используемые в программировании и предназначена для управления данными , проводимых в реляционная система управления базами данных (СУБД), или для обработки потока в системе управления реляционного потока данных (RDSMS). Это особенно полезно при обработке структурированных данных , где Есть отношения между различными объектами / переменными данными. SQL предлагает два основных преимущества по сравнению с более старой чтения / записи API — интерфейсы , такие как ISAM или VSAM . Во- первых, он ввел понятие доступа много записей с одной командой; и во- вторых, избавляет от необходимости указывать , как достичь записи, например , с или без индекса .

Первоначально основанный на реляционной алгебре и кортежей исчисления , SQL состоит из многих типов заявлений, которые могут быть неофициально классифицируемых в качестве подъязыков , обычно: на язык запросов данных (DQL), а язык определения данных (DDL), А язык управления данными (DCL ) и язык манипулирования данными (DML). Объем SQL включает в себя запрос данных, обработки данных (вставка, обновление и удаление), определение данных ( схема создания и модификации), а также контроль доступа к данным. Хотя SQL часто описываются как, и в значительной степени есть, декларативный язык ( 4GL ), он также включает в себя процедурные элементы.

SQL был один из первых коммерческих языков для Кодд «s реляционной модели . Модель была описана в своей нашумевшей статье 1970, «Реляционная модель данных для больших Shared банков данных». Несмотря на не полностью придерживаясь реляционной модели , как описано Коддом , он стал самым широко используемым языком баз данных.

SQL стал стандартом в Американском национальном институте стандартов (ANSI) в 1986 году, и в Международных организациях по стандартизации (ИСО) в 1987 г. С тех пор стандарт был пересмотрен с целью включения более широкий набора функций. Несмотря на наличие таких стандартов, большинство SQL код не является полностью переносимыми между различными системами баз данных без изменений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *