Spec-Zone .ru
спецификации, руководства, описания, API
|
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr
[,select_expr
...] [FROMtable_references
[PARTITIONpartition_list
] [WHEREwhere_condition
] [GROUP BY {col_name
|expr
|position
} [ASC | DESC], ... [WITH ROLLUP]] [HAVINGwhere_condition
] [ORDER BY {col_name
|expr
|position
} [ASC | DESC], ...] [LIMIT {[offset
,]row_count
|row_count
OFFSEToffset
}] [PROCEDUREprocedure_name
(argument_list
)] [INTO OUTFILE 'file_name
' [CHARACTER SETcharset_name
]export_options
| INTO DUMPFILE 'file_name
' | INTOvar_name
[,var_name
]] [FOR UPDATE | LOCK IN SHARE MODE]]
SELECT
используется, чтобы получить строки, выбранные из одной или более таблиц,
и может включать UNION
операторы и подзапросы. См. Раздел
13.2.9.4,"UNION
Синтаксис", и Раздел
13.2.10, "Синтаксис Подзапроса".
Обычно используемые пункты SELECT
операторы - они:
Каждый select_expr
указывает на столбец,
который Вы хотите получить. Должен быть по крайней мере один select_expr
.
table_references
указывает на таблицу или
таблицы, от которых можно получить строки. Его синтаксис описывается в Разделе
13.2.9.2,"JOIN
Синтаксис".
SELECT
поддерживает явный выбор раздела, используя
PARTITION
со списком разделов или подразделов (или оба) после имени таблицы
в a table_reference
(см. Раздел
13.2.9.2,"JOIN
Синтаксис"). В этом случае строки
выбираются только из разделов, перечисленных, и любые другие разделы таблицы игнорируются. Для получения
дополнительной информации и примеры, см. Раздел 17.5, "Выбор
Раздела".
SELECT ... PARTITION
от таблиц, используя механизмы хранения такой как
MyISAM
это выполняет
блокировки на уровне таблицы (и таким образом блокировки раздела) блокируют только разделы или
подразделы, названные PARTITION
опция.
См. Раздел 17.6.4, "Деля и Блокируя", для получения дополнительной информации.
WHERE
пункт, если дано, указывает на условие или
условия, которые строки должны удовлетворить, чтобы быть выбранными. where_condition
выражение, которое оценивает к истине для каждой строки, которая будет выбрана. Оператор выбирает все
строки, если есть нет WHERE
пункт.
В WHERE
выражение, можно использовать любую из функций и операторов,
которые MySQL поддерживает, за исключением агрегата (сводка) функции. См. Раздел
9.5, "Синтаксис Выражения", и Глава
12, Функции и Операторы.
SELECT
может также использоваться, чтобы получить строки, вычисленные независимо
от любой таблицы.
Например:
mysql> SELECT 1 +
1;
-> 2
Вам разрешают определить DUAL
как
фиктивное имя таблицы в ситуациях, где ни на какие таблицы не ссылаются:
mysql> SELECT 1 + 1 FROM DUAL;
-> 2
DUAL
просто для удобства людей, которые требуют что все SELECT
операторы должны иметь FROM
и возможно другие
пункты. MySQL может проигнорировать пункты. MySQL не требует FROM DUAL
если ни на
какие таблицы не ссылаются.
Вообще, используемые пункты должны быть поданы точно порядок, показанный в описании синтаксиса. Например, a
HAVING
пункт должен прибыть после любого GROUP BY
пункт и перед любым ORDER BY
пункт. Исключение то, что INTO
пункт может появиться или как показано в описании синтаксиса или сразу после
select_expr
список. Для получения дополнительной информации о INTO
, см. Раздел 13.2.9.1,"SELECT ... INTO
Синтаксис".
Список select_expr
сроки включают список выборки, который указывает
который столбцы получить. Сроки определяют столбец или выражение или могут использовать *
- сокращение:
Список выборки, состоящий только из неполного сингла *
может использоваться в качестве сокращения, чтобы выбрать все столбцы из всех таблиц:
SELECT * FROM t1 INNER JOIN t2 ...
может использоваться в качестве квалифицированного сокращения, чтобы выбрать все столбцы из именованной
таблицы: tbl_name
.*
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
Использование неполного *
с другими элементами в
списке выборки может произвести ошибку синтаксического анализа. Чтобы избежать этой проблемы,
используйте квалифицированный
ссылкаtbl_name
.*
SELECT AVG(score), t1.* FROM t1 ...
Следующий список обеспечивает дополнительную информацию о другом SELECT
пункты:
A select_expr
может быть дан использование псевдонима AS
. Псевдоним
используется в качестве имени столбца выражения и может использоваться в alias_name
GROUP
BY
, ORDER BY
, или HAVING
пункты.
Например:
SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;
AS
ключевое слово является дополнительным, искажая a select_expr
с идентификатором. Предыдущий пример,
возможно, был записан как это:
SELECT CONCAT(last_name,', ',first_name) full_name FROM mytable ORDER BY full_name;
Однако, потому что AS
является дополнительным, тонкая проблема может
произойти, если Вы забываете запятую между два select_expr
выражения: MySQL интерпретирует второе как имя псевдонима. Например, в следующем операторе, columnb
обрабатывается как имя псевдонима:
SELECT columna columnb FROM mytable;
Поэтому это - хорошая практика, чтобы иметь привычку использовать AS
явно, определяя псевдонимы столбца.
Не допустимо обратиться к псевдониму столбца в a WHERE
пункт, потому
что значение столбца еще не могло бы быть определено когда WHERE
пункт
выполняется. См. Раздел C.5.5.4, "Проблемы с
Псевдонимами Столбца".
FROM
пункт
указывает на таблицу или таблицы, от которых можно получить строки. Если Вы называете больше чем одну
таблицу, Вы выполняете соединение. Для получения информации о синтаксисе соединения см. Раздел
13.2.9.2,"table_references
JOIN
Синтаксис". Для каждой определенной
таблицы можно дополнительно определить псевдоним.
tbl_name
[[AS]alias
] [index_hint
]
Использование индексирует подсказки, предоставляет оптимизатору информацию о том, как выбрать, индексирует во время обработки запроса. Для описания синтаксиса для того, чтобы определить эти подсказки, см. Раздел 13.2.9.3, "Индексируйте Синтаксис Подсказки".
Можно использовать SET max_seeks_for_key=
поскольку альтернативный способ вынудить
MySQL предпочесть ключ сканирует вместо сканирований таблицы. См. Раздел
5.1.4, "Системные Переменные Сервера". value
Можно обратиться к таблице в пределах базы данных значения по умолчанию как tbl_name
, или как db_name
.tbl_name
определить базу данных явно. Можно обратиться к
столбцу как col_name
, tbl_name
.col_name
, или db_name
.tbl_name
.col_name
. Вы не должны определить a tbl_name
или db_name
.tbl_name
префикс для ссылки столбца, если ссылка не была
бы неоднозначна. См. Раздел 9.2.1, "Спецификаторы
Идентификатора", для примеров неоднозначности, которые требуют более явных ссылочных форм
столбца.
Ссылка на
таблицу может быть искажена, используя
или tbl_name
AS alias_name
tbl_name
alias_name
:
SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name;
Столбцы, выбранные для вывода, могут
быть упомянуты в ORDER BY
и GROUP BY
пункты
используя имена столбцов, псевдонимы столбца, или позиции столбца. Позиции столбца являются целыми
числами и начинаются 1:
SELECT college, region, seed FROM tournament ORDER BY region, seed;SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;SELECT college, region, seed FROM tournament ORDER BY 2, 3;
К виду в обратном порядке, добавьте DESC
(убывающее) ключевое слово к
имени столбца в ORDER BY
пункт, которым Вы сортируете. Значение по
умолчанию является порядком по возрастанию; это может быть определено, явно используя ASC
ключевое слово.
Если ORDER BY
происходит в пределах подзапроса и также применяется во
внешнем запросе, наиболее удаленном ORDER BY
имеет приоритет. Например,
результаты для следующего оператора сортируются в порядке убывания, не порядок по возрастанию:
(SELECT ... ORDER BY a) ORDER BY a DESC;
Использование позиций столбца осуждается, потому что синтаксис был удален из стандарта SQL.
Если Вы
используете GROUP BY
, выходные строки сортируются согласно GROUP BY
столбцы, как будто Вы имели ORDER
BY
для тех же самых столбцов. Избегать издержек сортировки этого GROUP
BY
производит, добавить ORDER BY NULL
:
SELECT a, COUNT(b) FROM test_table GROUP BY a ORDER BY NULL;
Доверие неявному GROUP BY
сортировка в MySQL 5.7 осуждается. Чтобы
достигнуть определенного порядка сортировки сгруппированных результатов, предпочтительно
использовать явное ORDER BY
пункт. GROUP
BY
сортировка является расширением MySQL, которое может измениться в будущем выпуске;
например, чтобы позволить оптимизатору упорядочить группировки любым способом это считает самым
эффективным и избегать издержек сортировки.
MySQL расширяется GROUP BY
пункт так, чтобы можно было также определить ASC
и DESC
после того, как столбцы назвали в пункте:
SELECT a, COUNT(b) FROM test_table GROUP BY a DESC;
MySQL расширяет использование GROUP BY
разрешать
выбирать поля, которые не упоминаются в GROUP BY
пункт. Если Вы не
получаете результаты, которые Вы ожидаете от своего запроса, пожалуйста, считайте описание GROUP BY
найденный в Разделе
12.17, "Функции и Модификаторы для Использования с GROUP BY
Пункты"
.
GROUP BY
разрешения a WITH
ROLLUP
модификатор. См. Раздел 12.17.2,"GROUP BY
Модификаторы".
HAVING
пункт применяется почти последний, непосредственно перед тем, как элементы отправляются клиенту без
оптимизации. (LIMIT
применяется после HAVING
.)
Стандарт SQL требует этого HAVING
должен сослаться только на столбцы в
GROUP BY
пункт или столбцы используются в агрегатных функциях. Однако,
MySQL поддерживает расширение этого поведения, и разрешения HAVING
обратиться к столбцам в SELECT
список и столбцы во внешних подзапросах также.
Если HAVING
пункт относится к столбцу, который неоднозначен,
предупреждение происходит. В следующем операторе, col2
неоднозначно,
потому что это используется и в качестве псевдонима и в качестве имени столбца:
SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
Предпочтение дается стандартному поведению SQL, так если a HAVING
имя
столбца используется оба в GROUP BY
и как искаженный столбец в выходном
списке столбцов, предпочтение дается столбцу в GROUP BY
столбец.
Не использовать HAVING
для элементов, которые должны
быть в WHERE
пункт. Например, не пишите следующее:
SELECTcol_name
FROMtbl_name
HAVINGcol_name
> 0;
Запишите это вместо этого:
SELECTcol_name
FROMtbl_name
WHEREcol_name
> 0;
HAVING
пункт может отнестись к агрегатным функциям,
который WHERE
пункт не может:
SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary) > 10;
(Это не работало в некоторых более старых версиях MySQL.)
MySQL разрешает двойные имена столбцов. Таким образом, может быть больше чем один
select_expr
с тем же самым именем. Это - расширение
стандартного SQL. Поскольку MySQL также разрешает GROUP BY
и HAVING
обратиться к select_expr
значения, это может привести к неоднозначности:
SELECT 12 AS a, a FROM t GROUP BY a;
В том операторе у обоих столбцов есть имя a
. Чтобы гарантировать, что
корректный столбец используется для того, чтобы сгруппироваться, используйте различные имена для
каждого select_expr
.
MySQL разрешает неполный столбец или ссылки псевдонима в ORDER
BY
пункты, ища в select_expr
значения, затем в столбцах
таблиц в FROM
пункт. Для GROUP BY
или HAVING
пункты, это ищет FROM
пункт прежде,
чем искать в select_expr
значения. (Для GROUP
BY
и HAVING
, это отличается от поведения перед MySQL 5.0,
которое использовало те же самые правила что касается ORDER BY
.)
LIMIT
пункт может использоваться, чтобы ограничить число строк, возвращенных SELECT
оператор. LIMIT
берет один или
два числовых параметра, которые должны оба быть неотрицательными целочисленными константами с этими
исключениями:
В пределах готовых операторов, LIMIT
параметры могут быть определены, используя ?
маркеры
заполнителя.
В пределах сохраненных программ, LIMIT
параметры могут быть определены, используя оцененные целому числу стандартные параметры или
локальные переменные.
С двумя параметрами первый параметр определяет смещение первой строки, чтобы возвратиться, и второе определяет максимальное количество строк, чтобы возвратиться. Смещение начальной строки 0 (не 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Чтобы получить все строки от определенного смещения до конца набора результатов, можно использовать некоторое большое количество для второго параметра. Этот оператор получает все строки от 96-ой строки до последнего:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
С одним параметром значение определяет число строк, чтобы возвратиться с начала набора результатов:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Другими словами, LIMIT
эквивалентно row_count
LIMIT
0,
. row_count
Для готовых операторов можно использовать заполнителей. Следующие операторы возвратят одну строку из
tbl
таблица:
SET @a=1;PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?';EXECUTE STMT USING @a;
Следующие операторы возвратят второе в шестую строку от tbl
таблица:
SET @skip=1; SET @numrows=5;PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?, ?';EXECUTE STMT USING @skip, @numrows;
Для совместимости с PostgreSQL MySQL также поддерживает LIMIT
синтаксис. row_count
OFFSET offset
Если LIMIT
происходит в пределах подзапроса и также применяется во
внешнем запросе, наиболее удаленном LIMIT
имеет приоритет. Например,
следующий оператор производит две строки, не один:
(SELECT ... LIMIT 1) LIMIT 2;
A PROCEDURE
пункт называет процедуру, которая должна обработать данные в наборе
результатов. Для примера см. Раздел 8.4.2.4, "Используя
PROCEDURE ANALYSE
", который описывает ANALYSE
,
процедура, которая может использоваться, чтобы получить предложения для оптимальных типов данных
столбца, которые могут помочь уменьшить табличные размеры.
SELECT ...
INTO
форма SELECT
позволяет результату запроса быть записанным файлу или сохраненным
в переменных. Для получения дополнительной информации см. Раздел
13.2.9.1,"SELECT ... INTO
Синтаксис".
Если Вы
используете FOR UPDATE
с механизмом хранения, который использует страницу
или блокировки строки, строки, исследованные запросом, заблокированы записью до конца текущей
транзакции. Используя LOCK IN SHARE MODE
устанавливает коллективную
блокировку, которая разрешает другим транзакциям читать исследованные строки, но не обновлять или
удалять их. См. Раздел
14.2.3.4, "Блокируя Чтения (SELECT ... FOR UPDATE
и SELECT ... LOCK IN SHARE MODE
)".
Кроме того, невозможно использовать FOR UPDATE
как часть SELECT
в операторе такой как CREATE
TABLE
. (Если Вы пытаетесь
сделать так, оператор отклоняется с ошибкой, не Может обновить таблицу'new_table
SELECT ... FROM old_table
...old_table
'в то время как'new_table
'создается.) Это - изменение в
поведении от MySQL 5.5 и ранее, который разрешал CREATE TABLE ... SELECT
операторы, чтобы произвести изменения в
таблицах кроме составленной таблицы.
После SELECT
ключевое слово, можно использовать много опций, которые влияют на работу
оператора. HIGH_PRIORITY
, STRAIGHT_JOIN
, и
начинающиеся опции SQL_
расширения MySQL стандартного SQL.
ALL
и DISTINCT
опции определяют, должны ли дублирующиеся строки быть возвращены. ALL
(значение по умолчанию), определяет, что все строки соответствия должны быть возвращены, включая копии.
DISTINCT
определяет удаление дублирующихся строк от набора результатов. Это
- ошибка определить обе опции. DISTINCTROW
синоним для DISTINCT
.
HIGH_PRIORITY
дает SELECT
более высокий приоритет чем оператор, который обновляет таблицу. Следует использовать это только для
запросов, которые очень быстры и должны быть сделаны сразу. A SELECT
HIGH_PRIORITY
запрос, который выпускается, в то время как таблица блокируется для того, чтобы
считать выполнения, даже если есть оператор обновления, ожидающий таблицы, чтобы быть свободным. Это
влияет только на механизмы хранения, которые используют только блокировку на уровне таблицы (такой как
MyISAM
, MEMORY
, и MERGE
).
HIGH_PRIORITY
не может использоваться с SELECT
операторы, которые являются частью a UNION
.
STRAIGHT_JOIN
вынуждает оптимизатор присоединиться к таблицам в порядке, в
котором они перечисляются в FROM
пункт. Можно использовать это, чтобы
ускорить запрос, если оптимизатор присоединяется к таблицам в неоптимальном порядке. STRAIGHT_JOIN
также может использоваться в table_references
список. См. Раздел 13.2.9.2,"JOIN
Синтаксис".
STRAIGHT_JOIN
не применяется ни к какой таблице, которую оптимизатор
обрабатывает как a const
или system
таблица. Такая таблица производит единственную строку, читается во время фазы оптимизации выполнения
запроса, и ссылки на его столбцы заменяются соответствующими значениями столбцов прежде, чем
выполнение запроса продолжится. Эти таблицы будут казаться первыми в плане запроса, выведенном на
экран EXPLAIN
. См. Раздел
8.8.1, "Оптимизируя Запросы с EXPLAIN
". Это
исключение, возможно, не применяется к const
или system
таблицы, которые используются на NULL
-
дополненная сторона внешнего объединения (то есть, таблица правой стороны a LEFT
JOIN
или таблица левой стороны a RIGHT JOIN
.
SQL_BIG_RESULT
или SQL_SMALL_RESULT
может
использоваться с GROUP BY
или DISTINCT
сказать
оптимизатор, что набор результатов имеет много строк или является небольшим, соответственно. Для SQL_BIG_RESULT
, MySQL непосредственно использует находящиеся на диске
временные таблицы если нужно, и предпочитает сортировать к использованию временной таблицы с ключом
GROUP BY
элементы. Для SQL_SMALL_RESULT
, MySQL
использует быстрые временные таблицы, чтобы сохранить получающуюся таблицу вместо того, чтобы
использовать сортировку. Это не должно обычно быть необходимо.
SQL_BUFFER_RESULT
вынуждает результат быть помещенным во временную таблицу.
Это помогает MySQL освободить блокировки таблицы рано и помогает в случаях, где требуется много времени,
чтобы отправить набор результатов клиенту. Эта опция может использоваться только для верхнего уровня SELECT
операторы, не для подзапросов или после UNION
.
SQL_CALC_FOUND_ROWS
говорит MySQL вычислять сколько строк, там был бы в наборе результатов, игнорируя любого LIMIT
пункт. Число строк может тогда быть получено с SELECT FOUND_ROWS()
. См. Раздел
12.14, "информационные Функции".
SQL_CACHE
и SQL_NO_CACHE
опции влияют на
кэширование результатов запроса в кэше запроса (см. Раздел
8.9.3, "MySQL Query Cache"). SQL_CACHE
говорит MySQL
хранить результат в кэше запроса, если это кэшируемо и значение query_cache_type
системная переменная 2
или DEMAND
. С SQL_NO_CACHE
, сервер не
использует кэш запроса. Это ни не проверяет кэш запроса, чтобы видеть, кэшируется ли результат уже, и
при этом это не кэширует результат запроса.
Для представлений, SQL_NO_CACHE
применяется, если это появляется в
ком-либо SELECT
в запросе. Для кэшируемого запроса, SQL_CACHE
применяется, если это появляется в первом SELECT
из представления, упомянутого запросом.
В MySQL 5.7 эти две опции являются взаимоисключающими, и ошибка происходит, если они оба
определяются. Кроме того, эти опции не разрешаются в подзапросах (включая подзапросы в FROM
пункт), и SELECT
операторы в объединениях кроме первого SELECT
.
В MySQL 5.7, a SELECT
из разделенной таблицы, используя механизм хранения такой как
MyISAM
это использует блокировки блокировок на уровне таблицы только те
разделы, содержащие строки, которые соответствуют SELECT
оператор WHERE
пункт. (Это не происходит с механизмами хранения такой как InnoDB
та работа блокировка на уровне строки.) Для получения дополнительной
информации, см. Раздел 17.6.4, "Деля и Блокируя".