Каким стандартам соответствует MySQL ?
Начальный уровень SQL92. Для ODBC уровни 0-3.51.
Мы стремимся к полной поддержке стандарта ANSI SQL99, но без ущерба для скорости и качества кода.
Запуск MySQL в режиме ANSI
При запуске mysqld с опцией --ansi поведение сервера MySQL изменяется следующим образом:
|| представляет собой конкатенацию строк вместо ИЛИ (OR).
Допускается любое количество пробелов между именем функции и скобкой "(". Это заставляет MySQL интерпретировать все имена функций как зарезервированные слова.
""" будет интерпретироваться как символ кавычки идентификатора (как символ кавычки "'" сервера MySQL), а не как символ кавычки строки.
REAL будет синонимом для FLOAT , а не для DOUBLE .
Уровнем изоляции транзакций по умолчанию является SERIALIZABLE (см. раздел Синтаксис команды SET TRANSACTIO N).
Вы можете использовать столбец/выражение в GROUP BY , которое не перечислено в списке столбцов.
Использование данной опции равносильно применению
--sql mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY .
Расширения 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-систем), имена баз данных и имена таблиц являются зависимыми от регистра символов.
Имена базы данных, таблицы, индекса, столбца или псевдонимы могут начинаться с цифры (но не должны содержать только цифры).
Можно использовать стандартную систему команд выполнения резервного копирования, переименования, перемещения, удаления и копирования таблиц. Например, для переименования таблицы необходимо переименовать соответствующие этой таблице файлы ".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 .
Опция SQL_SMALL_RESULT в команде SELECT .
Использование EXPLAIN SELECT для получения описаний объединения таблиц.
Использование индексных имен, индексов на префиксах полей, а также INDEX или KEY в команде CREATE TABLE.
Использование TEMPORARY или IF NOT EXISTS с CREATE TABLE .
Использование COUNT(DISTINCT list) , где list представляет собой более чем один элемент.
Использование CHANGE col_name , DROP col_name или DROP INDEX, IGNORE или RENAME в команде ALTER TABLE .
Использование RENAME TABLE .
Использование нескольких выражений 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
Команды ANALYZE TABLE , CHECK TABLE , OPTIMIZE TABLE и REPAIR TABLE .
Команда SHOW .
Строки могут быть заключены в кавычки с помощью или """, или """, но не просто """.
Использование символа экранирования "\".
Команда SET .
Нет необходимости называть имена всех выбранных столбцов в части 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 .
Оператор % является синонимом для 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() .
Операторы 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 .
Команды 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;
1 2 3 4
8 8 8
| |