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