![]() |
![]() |
![]() |
Выборка данных командой SELECT Центральное место в SQL занимает команда SELECT, предназначенная для построения запросов и выборки данных из таблиц и представлений. Данные, возвращаемые в результате запроса, называются итоговым набором; как и таблицы, они состоят из записей и полей. Данные итогового набора не хранятся на диске в какой-либо постоянной форме. Итоговый набор является лишь временным представлением данных, полученных в результате запроса. Структура полей итогового набора может соответствовать структуре исходной таблицы, но может и радикально отличаться от нее. Итоговые наборы даже могут содержать поля, выбранные из других таблиц. Из-за своей особой роли в PostgreSQL команда SELECT также является самой сложной командой, обладающей многочисленными секциями и параметрами. Ниже приведено общее определение синтаксиса SELECT, а отдельные компоненты рассматриваются в следующих разделах. Термин выражение соответствует имени поля или общему выражению (например, результату операции, в которой участвует значение поля и константа или значения двух полей). SELECT [ ALL | DISTINCT [ ON ( выражение [. ...] ) ] ] цель [ AS имя ] [. ...] [ FROM источник [. ... ] ] [ [ NATURAL ] тип_обьединения источник [ ON условие \ USING ( список_полей ) ] ] [. ...] [ WHERE условие ] [ GROUP BY критерий [. ...] ] [ HAVING условие [. ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] подзапрос ] [ ORDER BY выражение [ ASC | DESC | USING оператор ] [. ...] ] [ FOR UPDATE [ OF таблица [. ...]]] [ LIMIT { число | ALL } [ { OFFSET | . } начало ] ] В этом описании источник представляет собой имя таблицы или подзапрос. Эти общие формы имеют следующий синтаксис: FROM { [ ONLY ] таблица [ [ AS ] синоним [ ( синоним_поля
[....])]]] ( запрос )
Простая команда SELECT В простейшем случае команда SELECT выбирает из заданной таблицы все данные (то есть все записи и все поля). Полная выборка данных производится командой SELECT * FROM имя таблицы; Как упоминалось при описании синтаксиса SELECT, звездочка (*) является сокращенным обозначением всех несистемных полей. Таким образом, команда SELECT * выбирает из указанной таблицы все поля и все записи, поскольку количество записей в итоговом наборе не ограничивается. В листинге 4.23 приведен пример выборки всех записей (*) из таблицы books базы данных booktown. Листинг 4.23. Выборка всех записей из таблицы books 300ktown=# SELECT * FROM books; id | title | author_id | subject_id 7808 | The Shining | 4156 | 9 4513 | Dune | 1866 | 15 4267 | 2001: A Space Odyssey | 2001 | 15 1608 | The Cat in the Hat | 1809 | 2 1590 | Bartholomew and the Oobleck | 1809 | 2 25908 | Franklin in the Dark | 15990 | 2 1501 | Goodnight Moon | 2031 | 2 190 | Little Women | 16 | 6 1234 | The Velveteen Rabbit | 25041 | 3 2038 | Dynamic Anatomy | 1644 | 0 156 | The Tell-Tale Heart | 115 | 9 41472 | Practical PostgreSQL | 1212 | 4 41473 | Programming Python | 7805 | 4 41477 | Learning Python 7805 | 4 41478 | Perl Cookbook | 7806 | 4 (15 rows) Выбор полей Команда SELECT * является хорошим примером простейшего запроса, но на прак-гике необходимая информация нередко ограничивается несколькими полями габлицы. Чтобы повысить эффективность выборки и сделать запрос более наглядным, рекомендуется явно перечислить все необходимые поля вместо полной вы-эорки с символом *. В частности, ограничение выборки особенно актуально при использовании секции JOIN, подробно рассматриваемой ниже в подразделе «Объединение наборов данных». Поля, включаемые в итоговый набор, перечисляются после ключевого слова SELECT. Запрос возвращает данные только для полей, входящих в этот список. По-эядок перечисления полей не обязан совпадать с их порядком в структуре табли-ды; допускается как многократное вхождение, так и отсутствие некоторых полей в :писке. Пример приведен в листинге 4.24. Листинг 4.24. Изменение порядка следования полей при выборке booktown=# SELECT Id, author_id, title, id booktown-# FROM books; id | authorjd | title | id 7808 | 4156 | The Shining | 7808 4513 | 1866 | Dune | 4513 4267 | 2001 | 2001: A Space Odyssey | 4267 1608 | 1809 | The Cat in the Hat | 1608 1590 | 1809 | Bartholomew and the Oobleck | 1590 25908 | 15990 | Franklin in the Dark | 25908 1501 | 2031 | Goodnight Moon | 1501 190 | 16 | Little Women | 190 1234 | 25041 | The Velveteen Rabbit | 1234 2038 | 1644 | Dynamic Anatomy | 2038 156 | 115 | The Tell-Tale Heart | 156 41472 | 1212 | Practical PostgreSQL | 41472 41473 | 7805 | Programming Python | 41473 41477 | 7805 | Learning Python | 41477 41478 | 7806 | Perl Cookbook | 41478 (15 rows) Как нетрудно убедиться, команды SELECT в листингах 4.23 и 4.24 возвращают одинаковые наборы данных. Во втором наборе используется другой порядок следования полей (поле subject_id отсутствует, а поле id встречается дважды), что связано с явным перечислением полей после ключевого слова SELECT. Выражения, константы и синонимы Целями команды SELECT могут быть не только простые поля, но и произвольные выражения (включающие вызовы функций или различные операции с идентификаторами) и константы. Синтаксис команды практически не изменяется, появляется лишь одно дополнительное требование — все самостоятельные выражения, , идентификаторы и константы должны разделяться запятыми. В списке разрешены произвольные комбинации разнотипных целей. Команда SELECT также может использоваться для простого вычисления и вывода результатов выражений и констант. В этом случае она не содержит секции FROM или имен столбцов (листинг 4.25). Листинг 4.25. Выражения и константы testdb=# SELECT 2+2, testdb-# pi (), testdb-# 'PostgreSQL is more than a calculator!'; ?column?| pi | ?column? 4 | 3.14159265358979 | PostgreSQL is more than a calculator! (1 row) Для каждой цели в списке может задаваться необязательная секция AS, которая назначает синоним (новое произвольное имя) для каждого поля в итоговом наборе. Имена синонимов подчиняются тем же правилам, что и имена обычных идентификаторов (в частности, они могут содержать внутренние пробелы или совпадать с ключевыми словами при условии заключения их в апострофы и т. д.) Назначение синонима не влияет на исходное поле и действует лишь в контексте итогового набора, возвращаемого запросом. Секция AS особенно удобна при «выборке» выражений и констант, поскольку синонимы позволяют уточнить смысл неочевидных выражений или констант. В листинге 4.26 приведены те же результаты, что и в листинге 4.25, но с другими названиями полей. Листинг 4.26. Секция AS с выражениями и константами booktown=# SELECT 2 + 2 AS "2 plus 2", booktown-# pi() AS "the pi fnction", booktown-# 'PostgreSQL is more than a calculator!' AS comments; 2 plus 2 | the pi function | comments 4 | 3.14159265358979 | PostgreSQL is more than a calculator! (1 row) |
![]() |
![]() |
![]() |