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(Смотри раздел 6.4.1 Синтаксис оператораSELECT). - Опция
SQL_SMALL_RESULTв командеSELECT. - Использование
EXPLAIN SELECTдля получения описаний объединения таблиц. - Использование индексных имен, индексов на префиксах полей, а также
INDEXилиKEYв командеCREATETABLE (Смотри раздел 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(Смотри раздел 6.5.4 Синтаксис оператораALTER TABLE). - Использование
RENAME TABLE. Смотри раздед 6.5.5 Синтаксис оператора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. Во многих случаях этот синтаксис совместим с применяющимся в OracleLOAD DATA INFILE(Смотри раздел 6.4.9 Синтаксис оператораLOAD DATA INFILE). - Команды
ANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLEиREPAIR TABLE. - Команда
SHOW(see section 4.5.6 Синтаксис командыSHOW). - Строки могут быть заключены в кавычки с помощью или ", или ', но не просто '.
- Использование символа экранирования \.
- Команда
SET(Смотри раздел 5.5.6 Синтаксис командыSET). - Нет необходимости называть имена всех выбранных столбцов в части
GROUP BY. Это дает лучшую производительность для некоторых очень специфических, но вполне нормальных запросов (Смотри раздел 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(Смотри раздел 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()(Смотри раздел 8.4.3.31mysql_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(Смотри раздел 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;
