MySQL Server supports some extensions that you probably won't find in other SQL DBMSs. Be warned that if you use them, your code won't be portable to other SQL servers. In some cases, you can write code that includes MySQL extensions, but is still portable, by using comments of the following form:
/*! MySQL-specific code */
In this case, MySQL Server parses and executes the code within
the comment as it would any other SQL statement, but other SQL
servers will ignore the extensions. For example, MySQL Server
recognizes the STRAIGHT_JOIN keyword in the
following statement, but other servers will not:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
If you add a version number after the
“!” character, the syntax within
the comment is executed only if the MySQL version is greater
than or equal to the specified version number. The
TEMPORARY keyword in the following comment is
executed only by servers from MySQL 3.23.02 or higher:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
The following descriptions list MySQL extensions, organized by category.
Organization of data on disk
MySQL Server maps each database to a directory under the MySQL data directory, and maps tables within a database to file names in the database directory. This has a few implications:
Database and table names are case sensitive in MySQL Server on operating systems that have case-sensitive file names (such as most Unix systems). See Section 8.2.2, “Identifier Case Sensitivity”.
You can use standard system commands to back up, rename, move, delete, and copy tables that are managed by the
MyISAMstorage engine. For example, it is possible to rename aMyISAMtable by renaming the.MYD,.MYI, and.frmfiles to which the table corresponds. (Nevertheless, it is preferable to useRENAME TABLEorALTER TABLE ... RENAMEand let the server rename the files.)
General language syntax
By default, strings can be enclosed by either “
"” or “'”, not just by “'”. (If theANSI_QUOTESSQL mode is enabled, strings can be enclosed only by “'” and the server interprets strings enclosed by “"” as identifiers.)“
\” is the escape character in strings.In SQL statements, you can access tables from different databases with the
db_name.tbl_namesyntax. Some SQL servers provide the same functionality but call thisUser space. MySQL Server doesn't support tablespaces such as used in statements like this:CREATE TABLE ralph.my_table ... IN my_tablespace.
SQL statement syntax
The
ANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLE, andREPAIR TABLEstatements.The
CREATE DATABASE,DROP DATABASE, andALTER DATABASEstatements. See Section 12.1.8, “CREATE DATABASESyntax”, Section 12.1.17, “DROP DATABASESyntax”, and Section 12.1.1, “ALTER DATABASESyntax”.The
DOstatement.EXPLAIN SELECTto obtain a description of how tables are processed by the query optimizer.The
SETstatement. See Section 12.4.4, “SETSyntax”.The
SHOWstatement. See Section 12.4.5, “SHOWSyntax”. The information produced by many of the MySQL-specificSHOWstatements can be obtained in more standard fashion by usingSELECTto queryINFORMATION_SCHEMA. See Chapter 20,INFORMATION_SCHEMATables.Use of
LOAD DATA INFILE. In many cases, this syntax is compatible with Oracle'sLOAD DATA INFILE. See Section 12.2.6, “LOAD DATA INFILESyntax”.Use of
RENAME TABLE. See Section 12.1.26, “RENAME TABLESyntax”.Use of
REPLACEinstead ofDELETEplusINSERT. See Section 12.2.8, “REPLACESyntax”.Use of
CHANGE,col_nameDROP, orcol_nameDROP INDEX,IGNOREorRENAMEinALTER TABLEstatements. Use of multipleADD,ALTER,DROP, orCHANGEclauses in anALTER TABLEstatement. See Section 12.1.6, “ALTER TABLESyntax”.Use of index names, indexes on a prefix of a column, and use of
INDEXorKEYinCREATE TABLEstatements. See Section 12.1.14, “CREATE TABLESyntax”.Use of
TEMPORARYorIF NOT EXISTSwithCREATE TABLE.Use of
IF EXISTSwithDROP TABLEandDROP DATABASE.The capability of dropping multiple tables with a single
DROP TABLEstatement.The
ORDER BYandLIMITclauses of theUPDATEandDELETEstatements.INSERT INTOsyntax.tbl_nameSETcol_name= ...The
LOW_PRIORITYclause of theINSERT,REPLACE,DELETE, andUPDATEstatements.Use of
INTO OUTFILEorINTO DUMPFILEinSELECTstatements. See Section 12.2.9, “SELECTSyntax”.Options such as
STRAIGHT_JOINorSQL_SMALL_RESULTinSELECTstatements.You don't need to name all selected columns in the
GROUP BYclause. This gives better performance for some very specific, but quite normal queries. See Section 11.16, “Functions and Modifiers for Use withGROUP BYClauses”.You can specify
ASCandDESCwithGROUP BY, not just withORDER BY.The ability to set variables in a statement with the
:=assignment operator:mysql>
SELECT @a:=SUM(total),@b:=COUNT(*),@a/@b AS avg->FROM test_table;mysql>SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Data types
Functions and operators
To make it easier for users who migrate from other SQL environments, MySQL Server supports aliases for many functions. For example, all string functions support both standard SQL syntax and ODBC syntax.
MySQL Server understands the
||and&&operators to mean logical OR and AND, as in the C programming language. In MySQL Server,||andORare synonyms, as are&&andAND. Because of this nice syntax, MySQL Server doesn't support the standard SQL||operator for string concatenation; useCONCAT()instead. BecauseCONCAT()takes any number of arguments, it is easy to convert use of the||operator to MySQL Server.Use of
COUNT(DISTINCTwherevalue_list)value_listhas more than one element.String comparisons are case-insensitive by default, with sort ordering determined by the collation of the current character set, which is
latin1(cp1252 West European) by default. If you don't like this, you should declare your columns with theBINARYattribute or use theBINARYcast, which causes comparisons to be done using the underlying character code values rather then a lexical ordering.The
%operator is a synonym forMOD(). That is,is equivalent toN%MMOD(.N,M)%is supported for C programmers and for compatibility with PostgreSQL.The
=,<>,<=,<,>=,>,<<,>>,<=>,AND,OR, orLIKEoperators may be used in expressions in the output column list (to the left of theFROM) inSELECTstatements. For example:mysql>
SELECT col1=1 AND col2=2 FROM my_table;The
LAST_INSERT_ID()function returns the most recentAUTO_INCREMENTvalue. See Section 11.14, “Information Functions”.LIKEis permitted on numeric values.The
REGEXPandNOT REGEXPextended regular expression operators.CONCAT()orCHAR()with one argument or more than two arguments. (In MySQL Server, these functions can take a variable number of arguments.)The
BIT_COUNT(),CASE,ELT(),FROM_DAYS(),FORMAT(),IF(),PASSWORD(),ENCRYPT(),MD5(),ENCODE(),DECODE(),PERIOD_ADD(),PERIOD_DIFF(),TO_DAYS(), andWEEKDAY()functions.Use of
TRIM()to trim substrings. Standard SQL supports removal of single characters only.The
GROUP BYfunctionsSTD(),BIT_OR(),BIT_AND(),BIT_XOR(), andGROUP_CONCAT(). See Section 11.16, “Functions and Modifiers for Use withGROUP BYClauses”.