Оператор 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 t2WHERE t1.name = t2.name; mysql>SELECT t1.name, t2.salary FROM employee t1, info t2WHERE t1.name = t2.name;
В выражениях ORDER BY и
GROUP BY для ссылок на
столбцы, выбранные для вывода
информации, можно использовать
либо имена столбцов, либо их
псевдонимы, либо их позиции
(местоположения). Нумерация
позиций столбцов начинается с
1:
mysql>SELECT college, region, seed FROM tournamentORDER BY region, seed; mysql>SELECT college, region AS r, seed AS s FROM tournamentORDER BY r, s; mysql>SELECT college, region, seed FROM tournamentORDER 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_RESULT MySQL будет
заносить результат во временную
таблицу. Таким образом 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, чтобы
иметь надежную возможность
повторить чтение этого файла. ASCII
0 экранируется, чтобы
облегчить просмотр файла с
помощью программ вывода типа 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 с обработчиком таблиц,
поддерживающим блокировку
страниц/строк, выбранные строки
будут заблокированы для записи.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
© 1995-2005 MySQL AB. All rights reserved.
