| 1.9.2 Запуск MySQL в режиме ANSI | Оглавление | 1.9.4 Отличия 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.
BINARY или использовать явное приведение
типов BINARY, в результате чего сравнение будет выполняться в
соответствии с порядком ASCII, используемом на хосте сервера MySQL.
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 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 (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.
|| и && для обозначения логических ИЛИ
(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;
| 1.9.2 Запуск MySQL в режиме ANSI | Оглавление | 1.9.4 Отличия MySQL от ANSI SQL92 |