Оператор SELECT имеет следующую структуру:
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [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 | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT применяется для извлечения строк, выбранных из одной или нескольких
таблиц. Выражение select_expression задает столбцы, в которых необходимо
проводить выборку. Кроме того, оператор SELECT можно использовать для
извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например:
mysql> SELECT 1 + 1;
-> 2
При указании ключевых слов следует точно соблюдать порядок, указанный
выше. Например, выражение HAVING должно располагаться после всех выражений
GROUP BY и перед всеми выражениями ORDER BY.
-
Используя ключевое слово
AS, выражению вSELECTможно присвоить псевдоним. Псевдоним используется в качестве имени столбца в данном выражении и может применяться вORDER BYилиHAVING. Например:mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name; Псевдонимы столбцов нельзя использовать в выражении
WHERE, поскольку находящиеся в столбцах величины на момент выполненияWHEREмогут быть еще не определены. See Раздел A.5.4, «Проблемы сalias».-
Выражение
FROM table_referencesзадает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Информацию о синтаксисе объединения можно найти в разделе Раздел 6.4.1.1, «Синтаксис оператораJOIN». Для каждой заданной таблицы по желанию можно указать псевдоним.table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
В версии MySQL 3.23.12 можно указывать, какие именно индексы (ключи) MySQL должен применять для извлечения информации из таблицы. Это полезно, если оператор
EXPLAIN(выводящий информацию о структуре и порядке выполнения запросаSELECT), показывает, что MySQL из списка возможных индексов выбрал неправильный. Если нужно. чтобы для поиска записи в таблице применялся только один из возможных индексов, следует задать значение этого индекса вUSE INDEX(key_list). Альтернативное выражениеIGNORE INDEX (key_list)запрещает использование в MySQL данного конкретного индекса.В MySQL 4.0.9 можно также указывать
FORCE INDEX. Это работает также, как иUSE INDEX (key_list)но в дополнение дает понять серверу что полное сканирование таблицы будет ОЧЕНЬ дорогостоящей операцией. Другими словами, в этом случае сканирование таблицы будет использовано только тогда, когда не будет найдено другого способа использовать один из данных индексов для поиска записей в таблице.Выражения
USE/IGNORE KEYявляются синонимами дляUSE/IGNORE INDEX. -
Ссылки на таблицы могут даваться как
tbl_name(в рамках текущей базы данных), или какdbname.tbl_nameс тем, чтобы четко указать базу данных.Ссылки на столбцы могут задаваться в виде
col_name,tbl_name.col_nameилиdb_name.tbl_name.col_name. В выраженияхtbl_nameилиdb_name.tbl_nameнет необходимости указывать префикс для ссылок на столбцы в командеSELECT, если эти ссылки нельзя истолковать неоднозначно. See Раздел 6.1.2, «Имена баз данных, таблиц, столбцов, индексы псевдонимы», где приведены примеры неоднозначных случаев, для которых требуются более четкие определения ссылок на столбцы. -
Ссылку на таблицу можно заменить псевдонимом, используя
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; -
В выражениях
ORDER BYиGROUP BYдля ссылок на столбцы, выбранные для вывода информации, можно использовать либо имена столбцов, либо их псевдонимы, либо их позиции (местоположения). Нумерация позиций столбцов начинается с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;Для того чтобы сортировка производилась в обратном порядке, в утверждении
ORDER BYк имени заданного столбца, в котором производится сортировка, следует добавить ключевое словоDESC(убывающий). По умолчанию принята сортировка в возрастающем порядке, который можно задать явно при помощи ключевого словаASC. -
В выражении
WHEREможно использовать любую из функций, которая поддерживается в MySQL. See Раздел 6.3, «Функции, используемые в операторахSELECTиWHERE».Выражение
HAVINGможет ссылаться на любой столбец или псевдоним, упомянутый в выраженииselect_expression.HAVINGотрабатывается последним, непосредственно перед отсылкой данных клиенту, и без какой бы то ни было оптимизации. Не используйте это выражение для определения того, что должно быть определено вWHERE. Например, нельзя задать следующий оператор:mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
Вместо этого следует задавать:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
В версии MySQL 3.22.5 или более поздней можно также писать запросы, как показано ниже:
mysql> SELECT user,MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;В более старых версиях MySQL вместо этого можно указывать:
mysql> SELECT user,MAX(salary) AS sum FROM users GROUP BY user HAVING sum>10; Параметры (опции)
DISTINCT,DISTINCTROWиALLуказывают, должны ли возвращаться дублирующиеся записи. По умолчанию установлен параметр (ALL), т.е. возвращаются все встречающиеся строки.DISTINCTиDISTINCTROWявляются синонимами и указывают, что дублирующиеся строки в результирующем наборе данных должны быть удалены.Все параметры, начинающиеся с
SQL_,STRAIGHT_JOINиHIGH_PRIORITY, представляют собой расширение MySQL для ANSI SQL.При указании параметра
HIGH_PRIORITYсодержащий его операторSELECTбудет иметь более высокий приоритет, чем команда обновления таблицы. Нужно только использовать этот параметр с запросами, которые должны выполняться очень быстро и сразу. Если таблица заблокирована для чтения, то запросSELECT HIGH_PRIORITYбудет выполняться даже при наличии команды обновления, ожидающей, пока таблица освободится.Параметр
SQL_BIG_RESULTможно использовать сGROUP BYилиDISTINCT, чтобы сообщить оптимизатору, что результат будет содержать большое количество строк. Если указан этот параметр, MySQL при необходимости будет непосредственно использовать временные таблицы на диске, однако предпочтение будет отдаваться не созданию временной таблицы с ключом по элементамGROUP BY, а сортировке данных.При указании параметра
SQL_BUFFER_RESULTMySQL будет заносить результат во временную таблицу. Таким образом MySQL получает возможность раньше снять блокировку таблицы; это полезно также для случаев, когда для посылки результата клиенту требуется значительное время.Параметр
SQL_SMALL_RESULTявляется опцией, специфической для MySQL. Данный параметр можно использовать сGROUP BYилиDISTINCT, чтобы сообщить оптимизатору, что результирующий набор данных будет небольшим. В этом случае MySQL для хранения результирующей таблицы вместо сортировки будет использовать быстрые временные таблицы. В версии MySQL 3.23 указывать данный параметр обычно нет необходимости.-
Параметр
SQL_CALC_FOUND_ROWS(MySQL 4.0.0 и более новый) возвращает количество строк, которые вернул бы операторSELECT, если бы не был указанLIMIT. Искомое количество строк можно получить при помощиSELECT FOUND_ROWS(). See Раздел 6.3.6.2, «Разные функции».Заметьте, что в версиях MySQL до 4.1.0 это не работает с
LIMIT 0, который оптимизирован для того, чтобы немедленно вернуть нулевой результат. See Раздел 5.2.8, «Как MySQL оптимизируетLIMIT». Параметр
SQL_CACHEпредписывает MySQL сохранять результат запроса в кэше запросов при использованииQUERY_CACHE_TYPE=2(DEMAND). See Раздел 6.9, «Кэш запросов в MySQL».Параметр
SQL_NO_CACHEзапрещает MySQL хранить результат запроса в кэше запросов. See Раздел 6.9, «Кэш запросов в MySQL».-
При использовании выражения
GROUP BYстроки вывода будут сортироваться в соответствии с порядком, заданным вGROUP BY, - так, как если бы применялось выражениеORDER BYдля всех полей, указанных вGROUP BY. В MySQL выражениеGROUP BYрасширено таким образом, что для него можно также указывать параметрыASCиDESC:SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
Расширенный оператор
GROUP BYв MySQL обеспечивает, в частности, возможность выбора полей, не упомянутых в выраженииGROUP BY. Если ваш запрос не приносит ожидаемых результатов, прочтите, пожалуйста, описаниеGROUP BY. See Раздел 6.3.7, «Функции, используемые в операторахGROUP BY».При указании параметра
STRAIGHT_JOINоптимизатор будет объединять таблицы в том порядке, в котором они перечислены в выраженииFROM. Применение данного параметра позволяет увеличить скорость выполнения запроса, если оптимизатор производит объединение таблиц неоптимальным образом. See Раздел 5.2.1, «Синтаксис оператораEXPLAIN(получение информации оSELECT)».-
Выражение
LIMITможет использоваться для ограничения количества строк, возвращенных командойSELECT.LIMITпринимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно0(не1):Для совместимости с PostgreSQL MySQL также поддерживает синтаксис
LIMIT # OFFSET #.mysql> SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15
Для того, чтобы выбрать все строки с определенного смещения и до конца результата, вы можете использовать значение
-1в качестве второго параметра:mysql> SELECT * FROM table LIMIT 95,-1; # Retrieve rows 96-last.
Если задан один аргумент, то он показывает максимальное количество возвращаемых строк:
mysql> SELECT * FROM table LIMIT 5; # возвращает первых 5 строк
Другими словами,
LIMIT nэквивалентноLIMIT 0,n. -
Оператор
SELECTможет быть представлен в формеSELECT ... INTO OUTFILE 'file_name'. Эта разновидность команды осуществляет запись выбранных строк в файл, указанный вfile_name. Данный файл создается на сервере и до этого не должен существовать (таким образом, помимо прочего, предотвращается разрушение таблиц и файлов, таких как/etc/passwd). Для использования этой формы командыSELECTнеобходимы привилегииFILE. ФормаSELECT ... INTO OUTFILEглавным образом предназначена для выполнения очень быстрого дампа таблицы на серверном компьютере. КомандуSELECT ... INTO OUTFILEнельзя применять, если необходимо создать результирующий файл на ином хосте, отличном от серверного. В таком случае для генерации нужного файла вместо этой команды следует использовать некоторую клиентскую программу наподобиеmysqldump --tabилиmysql -e "SELECT ..." > outfile. КомандаSELECT ... INTO OUTFILEявляется дополнительной по отношению кLOAD DATA INFILE; синтаксис части export_options этой команды содержит те же выраженияFIELDSиLINES, которые используются в командеLOAD DATA INFILE. See Раздел 6.4.9, «Синтаксис оператораLOAD DATA INFILE». Следует учитывать, что в результирующем текстовом файле операторESCAPED BYэкранирует только следующие символы:Символ оператора
ESCAPED BYПервый символ оператора
FIELDS TERMINATED BYПервый символ оператора
LINES TERMINATED BY
Помимо этого ASCII-символ
0конвертируется вESCAPED BY, за которым следует символ '0' (ASCII 48). Это делается потому, что необходимо экранировать любые символы операторовFIELDS TERMINATED BY,ESCAPED BYилиLINES TERMINATED BY, чтобы иметь надежную возможность повторить чтение этого файла. ASCII0экранируется, чтобы облегчить просмотр файла с помощью программ вывода типа pager. Поскольку результирующий файл не должен удовлетворять синтаксису SQL, нет необходимости экранировать что-либо еще. Ниже приведен пример того, как получить файл в формате, который используется многими старыми программами.SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM test_table;
-
Если вместо
INTO OUTFILEиспользоватьINTO DUMPFILE, то MySQL запишет в файл только одну строку без символов завершения столбцов или строк и без какого бы то ни было экранирования. Это полезно для хранения данных типаBLOBв файле. -
Следует учитывать, что любой файл, созданный с помощью
INTO OUTFILEиINTO DUMPFILE, будет доступен для записи всем пользователям! Причина этого заключается в следующем: сервер MySQL не может создавать файл, принадлежащий только какому-либо текущему пользователю (вы никогда не можете запуститьmysqldот пользователяroot), соответственно, файл должен быть доступен для записи всем пользователям.При использовании
FOR UPDATEс обработчиком таблиц, поддерживающим блокировку страниц/строк, выбранные строки будут заблокированы для записи.