SELECT
JOIN
UNION
HANDLER
INSERT
INSERT DELAYED
UPDATE
DELETE
TRUNCATE
REPLACE
LOAD DATA INFILE
DO
Buy this Reference Manual in softcover from Barnes & Noble!
SELECT
Оператор 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] [PROCEDURE procedure_name] [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 section A.5.4 Проблемы с alias
.FROM table_references
задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Информацию о синтаксисе объединения можно найти в разделе section 6.4.1.1 Синтаксис оператора JOIN
. Для каждой заданной таблицы по желанию можно указать псевдоним.
table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]В версии MySQL 3.23.12 можно указывать, какие именно индексы (ключи) MySQL должен применять для извлечения информации из таблицы. Это полезно, если оператор
EXPLAIN
(выводящий информацию о структуре и порядке выполнения запроса SELECT
), показывает, что MySQL использует ошибочный индекс. Если нужно. чтобы для поиска записи в таблице применялся только один из указанных индексов, следует задать значение этого индекса в USE INDEX
(key_list
). Альтернативное выражение IGNORE INDEX (key_list)
запрещает использование в MySQL данного конкретного индекса. Выражения USE/IGNORE KEY
являются синонимами для USE/IGNORE INDEX
.
col_name
, tbl_name.col_name
или db_name.tbl_name.col_name
. В выражениях tbl_name
или db_name.tbl_name
нет необходимости указывать префикс для ссылок на столбцы в команде SELECT
, если эти ссылки нельзя истолковать неоднозначно. See section 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 section 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
возвращает количество строк, которые вернул бы оператор SELECT
, если бы не был указан LIMIT
. Искомое количество строк можно получить при помощи SELECT FOUND_ROWS()
. See section 6.3.6.2 Разные функции.SQL_CACHE
предписывает MySQL сохранять результат запроса в кэше запросов при использовании SQL_QUERY_CACHE_TYPE=2
(DEMAND
). See section 6.9 Кэш запросов в MySQL.SQL_NO_CACHE
запрещает MySQL хранить результат запроса в кэше запросов. See section 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 section 6.3.7 Функции, используемые в операторах GROUP BY
.STRAIGHT_JOIN
оптимизатор будет объединять таблицы в том порядке, в котором они перечислены в выражении FROM
. Применение данного параметра позволяет увеличить скорость выполнения запроса, если оптимизатор производит объединение таблиц неоптимальным образом. See section 5.2.1 Синтаксис оператора EXPLAIN
(получение информации о SELECT
).LIMIT
может использоваться для ограничения количества строк, возвращенных командой SELECT
. LIMIT
принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0
(не 1
):
mysql> SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15Если задан один аргумент, то он показывает максимальное количество возвращаемых строк:
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 OUTFIL
E является дополнительной по отношению к LOAD DATA INFIL
E; синтаксис части export_options этой команды содержит те же выражения FIELDS
и LINES
, которые используются в команде LOAD DATA INFIL
E. See section 6.4.9 Синтаксис оператора LOAD DATA INFILE
. Следует учитывать, что в результирующем текстовом файле оператор ESCAPED BY
экранирует только следующие символы:
ESCAPED BY
FIELDS TERMINATED BY
LINES TERMINATED BY
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
с обработчиком таблиц, поддерживающим блокировку страниц/строк, выбранные строки будут заблокированы для записи.JOIN
UNION
Posted by [name withheld] on Friday July 5 2002, @5:17am | [Delete] [Edit] |
An example of an inner join on more than two tables
would be useful here. And maybe an explanation of
why the following is important.
If the order is not correct you'll get a syntax error. If
you have a FROM clause with the following pattern:
FROM table1 INNER JOIN (some other join) ON (join
condition).
Change it to:
FROM (some other join) INNER JOIN table1 ON (join
condition).
Posted by on Wednesday December 18 2002, @5:27pm | [Delete] [Edit] |
The join_condition is used for winnowing the
rows of the "right half" that you want to use for
the cross, whereas the WHERE clause is used for
winnowing the composite.
blah blah
For example, suppose we have a table Men (Man
varchar(15), Lover(15)) and we want to find all
men who had Daisy as a Lover, but not Petunia.
Then we might use:
SELECT M1.Man FROM Men AS M1 LEFT JOIN
Men AS
M2
ON M1.Man=M2.Man AND M2.Lover='Petunia'
WHERE M1.Lover='Daisy' AND M2.Lover IS NULL;
The second part on the ON ensures that we get
NULLs on the right side when Petunia is missing
while the second part of the where picks out
those rows where we actually did get the NULL.
Posted by Phytia King on Thursday August 15 2002, @6:51pm | [Delete] [Edit] |
i used the LIMIT statement and it prompted
Microsoft OLE DB Provider for ODBC Drivers
(0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Syntax
error in FROM clause
why?
Posted by on Tuesday October 1 2002, @11:47pm | [Delete] [Edit] |
What is equivalent stmt in MySQL?
select * from table1 where col1 in (select col1 from
table2)
Posted by Jay on Monday October 21 2002, @6:12pm | [Delete] [Edit] |
How the DISTINCT keyword works:
Rows that are
completely identical *in the end result* are trimmed down to
one.
(Not "rows that are completely identical in all selected tables
are trimmed down to one" or something else)
Posted by Cameron Junge on Wednesday November 13 2002, @4:02pm | [Delete] [Edit] |
Phytia King: Change the Query Type to pass-
through. (SQL Specific from the Query menu in
Access). LIMIT isn't supported by Access, changing
to pass-through turns off Access's interpretation.
Posted by on Thursday November 21 2002, @1:47am | [Delete] [Edit] |
MySQL does not support subselects. You can in some
cases get around that with joins (and when you
can, inner joins will give much better performance).
Posted by [name withheld] on Monday January 6 2003, @7:27pm | [Delete] [Edit] |
I would like to write field names into a outfile
with SELECT command.
SELECT zip,address,name into outfile "/user.txt"
fileds terminated by ',' lines terminated by '\r\n'
from user where name='John'
MySQL 3.23.x is running on my server.
Does it support or not?
J.C. Kim
Posted by on Thursday February 20 2003, @2:44am | [Delete] [Edit] |
Unfortunately, 'ORDER BY' doesn't seem to enable you to do a natural order (i.e. 1,2,3,4,5,6,7,8,9,10,11,12 etc. instead of 1,10,11,2,3,....)
A possible quick fix is using "ORDER BY LPAD(str,5,"0");"
Instead of the original values, '00010', '00001' and the likes will be sorted, thus giving you a natural order result (original values displayed, since only te values used for the sort operation are LPADded and these are not shown)
Posted by noel darlow darlow on Thursday February 20 2003, @6:51pm | [Delete] [Edit] |
Re can't sort 1,2, 3, 11, 21, etc: were you sorting on an integer column?
Posted by on Wednesday February 26 2003, @2:10am | [Delete] [Edit] |
You can simulate a CROSSTAB by the following method:-
Use IF function to select the key value of the sub table as in:
SELECT
SUM(IF(beta_idx=1, beta_value,0)) as beta1_value,
SUM(IF(beta_idx=2, beta_value,0)) as beta2_value,
SUM(IF(beta_idx=3, beta_value,0)) as beta3_value
FROM alpha JOIN beta WHERE alpha_id = beta_alpha_id;
where alpha table has the form alpha_id, alpha_blah, alpha_blah_blah
and beta table has the form beta_alpha_id, beta_other stuff,
beta_idx, beta_value
This will create 3 columns with totals of beta values according to their idx field
Add your own comment.