Добавлен: 06.07.2023
Просмотров: 129
Скачиваний: 5
Введение
SQL — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.
SQL является прежде всего информационно-логическим языком, предназначенным для описания, изменения и извлечения данных, хранимых в реляционных базах данных. SQL можно назвать языком программирования, при этом он не является тьюринг-полным, но вместе с тем стандарт языка спецификацией SQL/PSM предусматривает возможность его процедурных расширений.
Изначально SQL был основным способом работы пользователя с базой данных и позволял выполнять следующий набор операций:
- создание в базе данных новой таблицы;
- добавление в таблицу новых записей;
- изменение записей;
- удаление записей;
- выборка записей из одной или нескольких таблиц (в соответствии с заданным условием);
- изменение структур таблиц.
Со временем SQL усложнился — обогатился новыми конструкциями, обеспечил возможность описания и управления новыми хранимыми объектами (например, индексы, представления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.
При всех своих изменениях SQL остаётся единственным механизмом связи между прикладным программным обеспечением и базой данных. В то же время современные СУБД, а также информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов.
Язык SQL представляет собой совокупность
- операторов
- инструкций
- вычисляемых функций
Типы данных SQL разделяются на три группы:
— строковые;
— с плавающей точкой (дробные числа);
— целые числа, дата и время.
Типы данных SQL строковые
Типы данных SQL |
Описание |
CHAR(size) |
Строки фиксированной длиной (могут содержать буквы, цифры и специальные символы). Фиксированный размер указан в скобках. Можно записать до 255 символов |
VARCHAR(size) |
Может хранить не более 255 символов. |
TINYTEXT |
Может хранить не более 255 символов. |
TEXT |
Может хранить не более 65 535 символов. |
BLOB |
Может хранить не более 65 535 символов. |
MEDIUMTEXT |
Может хранить не более 16 777 215 символов. |
MEDIUMBLOB |
Может хранить не более 16 777 215 символов. |
LONGTEXT |
Может хранить не более 4 294 967 295 символов. |
LONGBLOB |
Может хранить не более 4 294 967 295 символов. |
ENUM(x,y,z,etc.) |
Позволяет вводить список допустимых значений. Можно ввести до 65535 значений в SQL Тип данных ENUM список. Если при вставке значения не будет присутствовать в списке ENUM, то мы получим пустое значение. |
SET |
SQL Тип данных SET напоминает ENUM за исключением того, что SET может содержать до 64 значений. |
Типы данных SQL с плавающей точкой (дробные числа) и целые числа
Типы данных SQL |
Описание |
TINYINT(size) |
Может хранить числа от -128 до 127 |
SMALLINT(size) |
Диапазон от -32 768 до 32 767 |
MEDIUMINT(size) |
Диапазон от -8 388 608 до 8 388 607 |
INT(size) |
Диапазон от -2 147 483 648 до 2 147 483 647 |
BIGINT(size) |
Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
FLOAT(size,d) |
Число с плавающей точкой небольшой точности. |
DOUBLE(size,d) |
Число с плавающей точкой двойной точности. |
DECIMAL(size,d) |
Дробное число, хранящееся в виде строки. |
Типы данных SQL — Дата и время
Типы данных SQL |
Описание |
DATE() |
Дата в формате ГГГГ-ММ-ДД |
DATETIME() |
Дата и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС |
TIMESTAMP() |
Дата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГ-ММ-ДД ЧЧ:ММ:СС |
TIME() |
Время в формате ЧЧ:ММ:СС |
YEAR() |
Год в двух значной или в четырехзначном формате. |
Большинство коммерческих СУБД поддерживают еще дополнительные типы данных, которые не специфицированы в стандарте. Так, например, практически все СУБД в том или ином виде поддерживают тип данных для представления неструктурированного текста большого объема. Этот тип аналогичен типу MEMO в настольных СУБД. Называются эти типы по-разному, например в ORACLE этот тип называется LONG, в DB2 - LONG VARCHAR, в SYBASE и MS SQL Server - TEXT.
Однако следует отметить, что специфика реализации отдельных типов данных серьезным образом влияет на результаты запросов к БД. Особенно это касается реализации типов данных DATE и TIMESTAMP. Поэтому при переносе приложений будьте внимательны, на разных платформах они могут работать по-разному, и одной из причин может быть различие в интерпретации типов данных.
В стандарте SQL1 не были определены встроенные функции, однако в большинстве коммерческих СУБД такие функции были реализованы, и в стандарт SQL2 уже введен ряд стандартных встроенных функций:
BIT_LENGTH(cтpoкa) — количество битов в строке;
САSТ(значение AS тип данных) — значение, преобразованное в заданный тип данных;
CHAR_LENGTH(cтpoкa) — длина строки символов;
CONVERT(cтpoкa USING функция) — строка, преобразованная в соответствии с указанной функцией;
CURRENT_DATE - текущая дата;
CURRENT_TIME(точность) — текущее время с указанной точностью;
CURRENT_TIMESTAMP(точность) — текущие дата и время с указанной точностью;
LOWER(cтpокa) — строка, преобразованная к верхнему регистру;
OCTED_LENGTH(строка) — число байтов в строке символов;
POSITION( первая строка IN вторая строка) — позиция, с которой начинается вхождение первой строки во вторую;
SUBSTRING(cтpoкa FROM n FOR длина) — часть строки, начинающаяся с n-го символа и имеющая указанную длину;
TRANSLATE(строка USING функция) — строка, преобразованная с использованием указанной функции;
TRIM(BOTH символ FROM строка) — строка, у которой удалены все первые и последние символы;
TRIM(LEADING символ FROM строка ) — строка, в которой удалены все первые указанные символы;
TRIM(TRAILING символ FROM строка) — строка, в которой удалены последние указанные символы;
UPPER(строка) — строка, преобразованная к верхнему регистру.
SQL Server предоставляет набор системных типов данных, определяющих все типы данных, которые могут использоваться в SQL Server. В Transact-SQL или Microsoft .NET Framework можно также определять собственные типы данных. Псевдонимы типов данных основываются на системных типах. Дополнительные сведения о псевдонимах типов данных см. в статье CREATE TYPE (Transact-SQL). Определяемые пользователем типы данных обладают свойствами, зависящими от методов и операторов класса, который создается для них на одном из языков программирования, которые поддерживаются .NET Framework.
При объединении одним оператором двух выражений с разными типами данных, параметрами сортировки, точностями, масштабами или длинами, результат определяется следующим образом.
- Тип данных результата определяется применением правил очередности типов данных к входным выражениям. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).
- Параметры сортировки результата определяются правилами очередности параметров сортировки, если тип данных результата — char, varchar, text, nchar, nvarchar или ntext. Дополнительные сведения см. в статье Очередность параметров сортировки (Transact-SQL).
- Точность, масштаб и длина результата зависят от точности, масштаба и длины входных выражений. Дополнительные сведения см. в разделе Точность, масштаб и длина (Transact-SQL).
Преимущества
Независимость от конкретной СУБД
Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально ориентировались на применение по меньшей мере нескольких СУБД (например: система электронного документооборота Documentum может работать как с Oracle Database, так и с Microsoft SQL Server и DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.
Наличие стандартов
Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах (например, базовая часть стандарта SQL:2003 состоит из более чем 1300 страниц текста).
Декларативность
С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип — программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как СУБД будет разбирать текст его запроса. Чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных.
Недостатки
Несоответствие реляционной модели данных
Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие дефекты SQL с точки зрения реляционной теории[8]:
- SQL разрешает в таблицах строки-дубликаты, что в рамках реляционной модели данных невозможно и недопустимо;
- SQL поддерживает неопределённые значения (NULL) и многозначную логику;
- SQL использует порядок колонок и ссылки на колонки по номерам;
- SQL разрешает колонки без имени и дублирующиеся имена колонок.
В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем манифесте[9] они излагают принципы СУБД следующего поколения и предлагают язык 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.