`SELECT' Syntax
---------------
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name]
[FOR UPDATE | LOCK IN SHARE MODE]]
`SELECT' is used to retrieve rows selected from one or more tables.
`select_expression' indicates the columns you want to retrieve.
`SELECT' may also be used to retrieve rows computed without reference to
any table. For example:
mysql> SELECT 1 + 1;
-> 2
All keywords used must be given in exactly the order shown above. For
example, a `HAVING' clause must come after any `GROUP BY' clause and
before any `ORDER BY' clause.
* A `SELECT' expression may be given an alias using `AS'. The alias
is used as the expression's column name and can be used with
`ORDER BY' or `HAVING' clauses. For example:
mysql> select concat(last_name,', ',first_name) AS full_name
from mytable ORDER BY full_name;
* The `FROM table_references' clause indicates the tables from which
to retrieve rows. If you name more than one table, you are
performing a join. For information on join syntax, see Note:`JOIN'.
* You can refer to a column as `col_name', `tbl_name.col_name', or
`db_name.tbl_name.col_name'. You need not specify a `tbl_name' or
`db_name.tbl_name' prefix for a column reference in a `SELECT'
statement unless the reference would be ambiguous. See Note:Legal names, for examples of ambiguity that require the more
explicit column reference forms.
* A table reference may be aliased using `tbl_name [AS] alias_name':
mysql> select t1.name, t2.salary from employee AS t1, info AS t2
where t1.name = t2.name;
mysql> select t1.name, t2.salary from employee t1, info t2
where t1.name = t2.name;
* Columns selected for output may be referred to in `ORDER BY' and
`GROUP BY' clauses using column names, column aliases, or column
positions. Column positions begin with 1:
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select college, region AS r, seed AS s from tournament
ORDER BY r, s;
mysql> select college, region, seed from tournament
ORDER BY 2, 3;
To sort in reverse order, add the `DESC' (descending) keyword to
the name of the column in the `ORDER BY' clause that you are
sorting by. The default is ascending order; this may be specified
explicitly using the `ASC' keyword.
* You can in the `WHERE' clause use any of the functions that MySQL
support. Note:Functions.
* The `HAVING' clause can refer to any column or alias named in the
`select_expression'. It is applied last, just before items are
sent to the client, with no optimization. Don't use `HAVING' for
items that should be in the `WHERE' clause. For example, do not
write this:
mysql> select col_name from tbl_name HAVING col_name > 0;
Write this instead:
mysql> select col_name from tbl_name WHERE col_name > 0;
In MySQL Version 3.22.5 or later, you can also write queries like
this:
mysql> select user,max(salary) from users
group by user HAVING max(salary)>10;
In older MySQL versions, you can write this instead:
mysql> select user,max(salary) AS sum from users
group by user HAVING sum>10;
* `SQL_SMALL_RESULT', `SQL_BIG_RESULT', `SQL_BUFFER_RESULT',
`STRAIGHT_JOIN', and `HIGH_PRIORITY' are MySQL extensions to ANSI
SQL92.
* `HIGH_PRIORITY' will give the `SELECT' higher priority than a
statement that updates a table. You should only use this for
queries that are very fast and must be done at once. A `SELECT
HIGH_PRIORITY' query will run if the table is locked for read even
if there is an update statement that is waiting for the table to
be free.
* `SQL_BIG_RESULT' can be used with `GROUP BY' or `DISTINCT' to tell
the optimizer that the result set will have many rows. In this
case, MySQL will directly use disk-based temporary tables if
needed. MySQL will also, in this case, prefer sorting to doing a
temporary table with a key on the `GROUP BY' elements.
* `SQL_BUFFER_RESULT' will force the result to be put into a
temporary table. This will help MySQL free the table locks early
and will help in cases where it takes a long time to send the
result set to the client.
* `SQL_SMALL_RESULT', a MySQL-specific option, can be used with
`GROUP BY' or `DISTINCT' to tell the optimizer that the result set
will be small. In this case, MySQL will use fast temporary tables
to store the resulting table instead of using sorting. In MySQL
Version 3.23 this shouldn't normally be needed.
* If you use `GROUP BY', the output rows will be sorted according to
the `GROUP BY' as if you would have had an `ORDER BY' over all the
fields in the `GROUP BY'. MySQL has extended the `GROUP BY' so that
you can also specify `ASC' and `DESC' to `GROUP BY':
SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
* MySQL has extended the use of `GROUP BY' to allow you to select
fields which are not mentioned in the `GROUP BY' clause. If you
are not getting the results you expect from your query, please
read the `GROUP BY' description. Note:Group by functions.
* `STRAIGHT_JOIN' forces the optimizer to join the tables in the
order in which they are listed in the `FROM' clause. You can use
this to speed up a query if the optimizer joins the tables in
non-optimal order. Note:`EXPLAIN'.
* The `LIMIT' clause can be used to constrain the number of rows
returned by the `SELECT' statement. `LIMIT' takes one or two
numeric arguments.
If two arguments are given, the first specifies the offset of the
first row to return, the second specifies the maximum number of
rows to return. The offset of the initial row is 0 (not 1):
mysql> select * from table LIMIT 5,10; # Retrieve rows 6-15
If one argument is given, it indicates the maximum number of rows
to return:
mysql> select * from table LIMIT 5; # Retrieve first 5 rows
In other words, `LIMIT n' is equivalent to `LIMIT 0,n'.
* The `SELECT ... INTO OUTFILE 'file_name'' form of `SELECT' writes
the selected rows to a file. The file is created on the server
host and cannot already exist (among other things, this prevents
database tables and files such as `/etc/passwd' from being
destroyed). You must have the *file* privilege on the server host
to use this form of `SELECT'.
`SELECT ... INTO OUTFILE' is mainly intended to let you very
quickly dump a table on the server machine. If you want to create
the resulting file on some other host than the server host you
can't use `SELECT ... INTO OUTFILE'. In this case you should
instead use some client program like `mysqldump --tab' or `mysql
-e "SELECT ..." > outfile' to generate the file.
`SELECT ... INTO OUTFILE' is the complement of `LOAD DATA
INFILE'; the syntax for the `export_options' part of the statement
consists of the same `FIELDS' and `LINES' clauses that are used
with the `LOAD DATA INFILE' statement. Note:`LOAD DATA'.
In the resulting text file, only the following characters are
escaped by the `ESCAPED BY' character:
* The `ESCAPED BY' character
* The first character in `FIELDS TERMINATED BY'
* The first character in `LINES TERMINATED BY'
Additionally, `ASCII 0' is converted to `ESCAPED BY' followed by 0
(`ASCII 48').
The reason for the above is that you MUST escape any `FIELDS
TERMINATED BY', `ESCAPED BY', or `LINES TERMINATED BY' characters
to reliably be able to read the file back. `ASCII 0' is escaped to
make it easier to view with some pagers.
As the resulting file doesn't have to conform to the SQL syntax,
nothing else need be escaped.
Here follows an example of getting a file in the format used by
many old programs.
SELECT a,b,a+b INTO OUTFILE "/tmp/result.text"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM test_table;
* If you use `INTO DUMPFILE' instead of `INTO OUTFILE', MySQL will
only write one row into the file, without any column or line
terminations and without any escaping. This is useful if you want
to store a blob in a file.
* Note that any file created by `INTO OUTFILE' and `INTO DUMPFILE'
is going to be readable for all users! The reason is that the
MySQL server can't create a file that is owned by anyone else than
the user it's running as (you should never run `mysqld' as root),
the file has to be word readable so that you can retrieve the rows.
* If you are using `FOR UPDATE' on a table handler with page/row
locks, the examined rows will be write locked.