Ключевые слова:perl, example, sql, select, mysql, (найти похожие документы)
Date: Thu, 20 Jul 2000 17:13:33 +0400 (MSD)
From: MailList: Perl в примерах
Subject: SQL запросы выборки данных из таблиц (SELECT)
-----------------------------------------------------------
PERL В ПРИМЕРАХ
http://pl.agava.ru
N 9 (20.07.2000)
-----------------------------------------------------------
Запросы выборки данных из таблиц
В этой статье рассмотрены запросы типа SELECT, синаксис
этих запросов, а также синтаксис операции JOIN в MySQL.
Общий вид запроса SELECT таков:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
искомые_поля,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM список_таблиц
[WHERE условное_выражение]
[GROUP BY список_полей]
[HAVING условное_выражение]
[ORDER BY {натуральное_число | название_поля | формула} [ASC | DESC] ,...]
[LIMIT [отступ,] количество_строк]
[PROCEDURE название_процедуры] ]
где в квадратные скобки взяты те
параметры/инструкции/разделы, которые являются
необязательными.
SELECT-запросы служат для получения данных из таблиц по
заданным критериям. Также запросы SELECT могут
использоваться для вычисления без доступа к данным:
SELECT 1 + 1; (выведет 2)
Все элементы запроса должны быть представлены в запросе
именно в таком порядке, в котором они перечислены выше.
Вот главные замечания относительно построения запросов
SELECT.
Искомому выражению можно назначить псеводним (alias).
Этот псевдоним будет использоваться в названии колонки в
представлении результата и в разделах ORDER BY и HAVING.
SELECT person, MAX(items) as maximum
FROM persons
GROUP BY person
ORDER BY maximum
Также можно задавать псевдонимы для таблиц. Это довольно
полезно при выполнении операции JOIN (см. ниже).
SELECT * FROM table1 as a, table2 as b
WHERE a.field_name = b.field_name
В разделах ORDER BY и GROUP BY возможно использование не
только названий таблиц, но и их псевдонимов (alias) или их
порядковых номеров в перечислении их в разделе FROM.
Для задания направления сортировки при помощи ORDER BY
используются инструкции ASC (в порядке возростания) и DESC
(в порядке убывания).
SELECT person, MAX(items) as maximum
FROM persons
GROUP BY person
ORDER BY maximum DESC
Не следует путать конструкции WHERE и HAVING. Вторая
используется как правило для наложения условия на значения,
полученные вычислением агрегатных функций (MAX, SUM и пр.),
в то время как условия отсноительо значений полей следует
указывать в разделе WHERE.
SELECT * FROM table_name HAVING field_name = value
следует писать как
SELECT * FROM table_name WHERE field_name = value
Инструкция HIGH_PRIORITY обеспечивает запросу приоритет,
высший по сравнению с запросами на изменение таблицы, и
будет выполнен, даже если в очереди на заблокированную на
чтение таблицу стоит такой запрос.
Инструкция SQL_BIG_RESULT указывет MySQL, что результат
выполнения запроса включает большое количество строк, что
заставляет MySQL использовать для него временные таблицы,
расположенные на жестком диске. Это полезно в запросах,
использующих GROUP BY и DISTINCT, поскольку в таких
ситуациях MySQL произведет сортировку результата вместо
того, чтобы создавать таблицу с требуемым в GROUP BY
(DISTINCT) ключом.
Инструкция SQL_BUFFER_RESULT указывет MySQL, что результат
следует разместить во временных таблицах, что поможет MySQL
быстро снять блокировки с таблиц и работать более
эффективно в тех случаях, когда возвращение результата
может занимать много времени.
SQL_SMALL_RESULT указывет на то, что возвращаемый набор
включает небольшое количество данных, то есть MySQL следует
использовать быстрые временные тыблицы вместо того, чтобы
проделывать сортировку данных.
STRAIGHT_JOIN указывет на то, что таблицы должны быть
объединены в том порядку, в котором они перечислены. Это
ускоряет выполнение запросов в тех случаях, когдя
оптимизатор MySQL выполняет объединение неоптимальным образом.
Раздел LIMIT используется для того, чтобы ограничить
количество возвращаемых дынных.
SELECT * FROM table_name
LIMIT 5, 10;
Этот запрос выведет строки результата с 6-й по 15-ю
(параметр отступ отсчитывается с нуля). По умолчанию отступ
равен 0.
SELECT * FROM table_name
LIMIT 10;
В результате выполнения запроса
SELECT ... INTO OUTFILE 'название_файла'
возвращаемые данные будут записаны в указанный файл. Для
выполнения таких запросов необходимо, чтобы небыло файла с
таким именем, кроме того необходимы права на создание и
запись в файл.
MySQL поддерживает несколько видов операции JOIN -
объединения таблиц. Вот как может выглядеть раздел FROM:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
где table_reference - это описание таблицы (ее имя,
возможно с псевдонимом и пр.).
При указании псевдонима (alias) таблицы присутствие AS
необязательно.
INNER JOIN и запятая выполняют одно и то же действие -
полное объединение указанных таблиц.
Условие ON - это условие в той форме, в которой условия
могут встречаться в разделе WHERE.
Если при использовании LEFT JOIN в правой таблице не
найдено ни одной подходящей строки, вместо этой таблицы
используется строка со всеми значениями установлеными в
NULL.
Инструкция USING укзаывет на поля, которые должны
присутствовать в обеих таблицах.
A LEFT JOIN B USING (C1,C2,C3,...)
это то же самое, что и
A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
Использование NATURAL LEFT JOIN эквивалентно совместному
использованию LEFT JOIN и USING.
STRAIGHT_JOIN выполняет то же самое, что и JOIN, за
исключением того, что в даном случае левая таблица всегда
считывается перед правой. Это помогает устранить ошибки в
порядке выбора таблиц оптимизатором.
SELECT * FROM table1,table2 WHERE table1.id=table2.id;
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
SELECT * FROM table1 LEFT JOIN table2 USING (id);
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;
SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND
key3=3;
SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND
key3=3;
-----------------------------------------------------------
Эту и другие статьи можно прочитать на http://pl.agava.ru
-----------------------------------------------------------
В нашем форуме (http://pl.agava.ru/cgi-bin/forum/config.pl)
Вы можете получить ответы на интересующие Вас вопросы по
теме Perl, CGI и баз данных.
Наиболее активные участники форума будут отмечены на нашем
сайте. Участники, которые регулярно отвечают на вопросы
форума и делятся своим опытом, будут награждаться показами
в ведущих росийских и зарубежных рекламных сетях.
-----------------------------------------------------------
На нашем сервере открылся новый форум
"Работа для Web программистов и дизайнеров", который
расположен по адресу
http://pl.agava.ru/cgi-bin/forum/job.pl
Здесь Вы можете размещать свои резюме, предложения о
сотрудничестве, информацию о вакансиях для web программистов
и дизайнеров.
-----------------------------------------------------------
(c) Perl в примерах 2000