1.9.3 Расширения MySQL к ANSI SQL92
Сервер MySQL включает в себя ряд расширений, которые могут отсутствовать в
других базах данных SQL. Если вы их используете, то следует иметь в виду,
что такой код не будет переносимым на другие SQL-серверы. В некоторых
случаях можно написать код, включающий расширения MySQL, но, тем не менее,
являющийся переносимым, воспользовавшись комментариями вида /*! ... */
. В
этом случае сервер MySQL будет анализировать и выполнять данный код внутри
этого комментария как обычную команду MySQL, в то время как другие
SQL-серверы будут игнорировать данное расширение. Например:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
При добавлении номера версии после '!'
это выражение будет исполняться
только в случае, если номер данной версии MySQL равен указанному номеру
или больше:
CREATE /*!32302 TEMPORARY */ TABLE t (a int);
Это означает, что при наличии версии 3.23.02 или выше сервер MySQL будет
использовать ключевое слово TEMPORARY
.
Ниже приводится перечень расширений MySQL:
-
Типы полей
MEDIUMINT
, SET
, ENUM
и различные типы BLOB
и TEXT
.
-
Атрибуты полей
AUTO_INCREMENT
, BINARY
, NULL
, UNSIGNED
и ZEROFILL
.
-
Все сравнения строк по умолчанию являются независимыми от регистра
символов с порядком сортировки, заданным текущей кодировкой
(ISO-8859-1 Latin1 по умолчанию). Если вас это не устраивает, то можно
объявить столбцы с атрибутом
BINARY
или использовать явное приведение
типов BINARY
, в результате чего сравнение будет выполняться в
соответствии с порядком ASCII, используемом на хосте сервера MySQL.
-
Сервер MySQL сопоставляет каждую базу данных с подкаталогом в каталоге
данных MySQL, а таблицы внутри базы данных - с именами файлов в этом
подкаталоге базы данных.
Это правило имеет несколько следствий:
-
В сервере MySQL, работающем под операционными системами с
зависимыми от регистра символов именами файлов (таковыми являются
большинство Unix-систем), имена баз данных и имена таблиц
являются зависимыми от регистра символов (see section 6.1.3 Чувствительность имен к регистру).
-
Имена базы данных, таблицы, индекса, столбца или псевдонимы могут
начинаться с цифры (но не должны содержать только цифры).
-
Можно использовать стандартную систему команд выполнения
резервного копирования, переименования, перемещения, удаления и
копирования таблиц. Например, для переименования таблицы
необходимо переименовать соответствующие этой таблице файлы `.MYD',
`.MYI' и `.frm'.
-
В командах SQL можно обращаться к таблицам из разных баз данных с
помощью выражения
db_name.tbl_name
. В некоторых SQL-серверах
обеспечивается точно такая же функциональная возможность, но она
называется User space
. Сервер MySQL не поддерживает табличные
пространства (как в выражении: CREATE TABLE ralph.my_table...IN
my_tablespace
).
-
LIKE
разрешается на числовых столбцах.
-
Использование
INTO OUTFILE
и STRAIGHT_JOIN
в команде SELECT
(see section 6.4.1 Синтаксис оператора SELECT
).
-
Опция
SQL_SMALL_RESULT
в команде SELECT
.
-
Использование
EXPLAIN SELECT
для получения описаний объединения
таблиц.
-
Использование индексных имен, индексов на префиксах полей, а также
INDEX
или KEY
в команде CREATE
TABLE (see section 6.5.3 Синтаксис оператора CREATE TABLE
).
-
Использование
TEMPORARY
или IF NOT EXISTS
с CREATE TABLE
.
-
Использование
COUNT(DISTINCT list)
, где list
представляет собой более
чем один элемент.
-
Использование
CHANGE col_name
, DROP col_name
или DROP INDEX,
IGNORE
или RENAME
в команде ALTER TABLE
(see section 6.5.4 Синтаксис оператора ALTER TABLE
).
-
Использование
RENAME TABLE
. See section 6.5.5 Синтаксис оператора RENAME TABL
E.
-
Использование нескольких выражений
ADD
, ALTER
, DROP
или CHANGE
в
команде ALTER TABLE
.
-
Использование
DROP TABLE
с ключевыми словами IF EXISTS
.
-
Возможность удаления нескольких таблиц одной командой
DROP TABLE
.
-
Условие
LIMIT
в команде DELETE
.
-
Условие
DELAYED
в командах INSERT
и REPLACE
.
-
Условие
LOW_PRIORITY
в командах INSERT
, REPLACE
, DELETE
и UPDATE
.
-
Использование
LOAD DATA INFILE
. Во многих случаях этот синтаксис
совместим с применяющимся в Oracle LOAD DATA INFILE
(see section 6.4.9 Синтаксис оператора LOAD DATA INFILE
).
-
Команды
ANALYZE TABLE
, CHECK TABLE
, OPTIMIZE TABLE
и REPAIR TABLE
.
-
Команда
SHOW
(see section 4.5.6 Синтаксис команды SHOW
).
-
Строки могут быть заключены в кавычки с помощью или `"', или `'', но
не просто `''.
-
Использование символа экранирования `\'.
-
Команда
SET
(see section 5.5.6 Синтаксис команды SET
).
-
Нет необходимости называть имена всех выбранных столбцов в части
GROUP
BY
. Это дает лучшую производительность для некоторых очень
специфических, но вполне нормальных запросов (see section 6.3.7 Функции, используемые в операторах GROUP BY
).
-
Можно указывать
ASC
и DESC
с GROUP BY
.
-
Чтобы упростить работу для пользователей, привыкших к иным условиям
среды SQL, в сервере MySQL поддерживаются псевдонимы для многих
функций. Например, для всех строковых функций поддерживается синтаксис
как ANSI SQL, так и ODBC.
-
Сервер MySQL понимает операторы
||
и &&
для обозначения логических ИЛИ
(OR
) и И (AND
), как это принято в языке программирования C. В сервере
MySQL ||
и ИЛИ (OR
) являются синонимами, так же, как &&
и И (AND
).
Благодаря этому удобному синтаксису, в сервере MySQL не поддерживается
оператор ANSI SQL ||
для конкатенации строк: вместо него используется
функция CONCAT()
. Поскольку функция CONCAT()
принимает любое
количество аргументов, то в сервере MySQL можно легко модифицировать
использование оператора ||
.
-
CREATE DATABASE
или DROP DATABASE
(see section 6.5.1 Синтаксис оператора CREATE DATABASE
).
-
Оператор
%
является синонимом для MOD()
. Т.е. N % M
эквивалентно
MOD(N,M)
. Оператор %
поддерживается для программистов на C и для
совместимости с PostgreSQL.
-
Операторы
=
, <>
, <=
,<
, >=
,>
, <<
, >>
, <=>
, AND
, OR
или LIKE
могут
использоваться при сравнении столбцов слева от FROM
в командах SELECT
.
Например:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
-
Функция
LAST_INSERT_ID()
(see section 8.4.3.126 mysql_insert_id()
).
-
Операторы
REGEXP
и NOT REGEXP
расширенных регулярных выражений.
-
CONCAT()
или CHAR()
с одним аргументом или более чем с двумя
аргументами (в сервере MySQL эти функции могут принимать любое
количество аргументов).
-
Функции
BIT_COUNT()
, CASE
, ELT()
, FROM_DAYS()
, FORMAT()
, IF()
,
PASSWORD()
, ENCRYPT()
, MD5()
, ENCODE()
, DECODE()
, PERIOD_ADD()
,
PERIOD_DIFF()
, TO_DAYS()
или WEEKDAY()
.
-
Использование функции
TRIM()
для усечения подстрок. В ANSI SQL
поддерживается только удаление единичных символов.
-
Операция
GROUP BY
для функций STD()
, BIT_OR()
и BIT_AND()
.
-
Использование
REPLACE
вместо DELETE
+ INSERT
(see section 6.4.8 Синтаксис оператора REPLACE
).
-
Команды
FLUSH
, RESET
и DO
.
-
Возможность устанавливать переменные в команде с помощью
:=
:
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Add your own comment.