Самоучитель по SQL-сервер в Linux



Выборка данных командой 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 ] синоним [ ( синоним_поля [....])]]] ( запрос )
[ AS ] синоним [ ( синоним_поля [. ...] ) ] }

  • ALL. Необязательное ключевое слово ALL указывает на то, что в выборку включаются все найденные записи.
  • DISTINCT [ ON ( выражение [, ...] ) ]. Секция DISTINCT определяет поле или выражение, значения которого должны входить в итоговый набор не более одного раза.
  • цель [ AS имя ] [, ...]. В качестве цели обычно указывается имя поля, хотя цель также может быть константой, идентификатором, функцией или общим выражением. Перечисляемые цели разделяются запятыми, существует возможность динамического назначения имен целей в секции AS. Звездочка (*) является сокращенным обозначением всех несистемных полей, вместе с ней в списке могут присутствовать и другие цели.
  • FROM источник [. ... ]. В секции FROM указывается источник, в котором PostgreSQL ищет заданные цели. В данном случае источник является именем таблицы или подзапроса. Допускается перечисление нескольких источников, разделенных запятыми (примерный аналог перекрестного запроса). Синтаксис секции FROM подробно описан ниже.
  • [ NATURAL ] тип_объединения источник [ ON условие \ USING ( список_полей ) ]. Источники FROM могут группироваться в секции JOIN с указанием типа объединения (INNER, FULL, OUTER, CROSS). В зависимости от типа объединения также может потребоваться уточняющее условие или список полей.
  • WHERE условие. Секция UHERE ограничивает итоговый набор заданными критериями. Условие должно возвращать простое логическое значение (true или false), но оно может состоять из нескольких внутренних условий, объединенных логическими операторами (например, AND или OR).
  • GROUP BY критерий [, ... ]. Секция GROUP BY обеспечивает группировку записей по заданному критерию. Причем критерий может быть простым именем поля или произвольным выражением, примененным к значениям итогового набора.
  • HAVING условие [. ... ]. Секция HAVING похожа на секцию WHERE, но условие проверяется на уровне целых групп, а не отдельных записей.
  • { UNION | INTERSECT | EXCEPT } [ ALL ] подзапрос. Выполнение одной из трех операций, в которых участвуют два запроса (исходный и дополнительный);
  • итоговые данные возвращаются в виде набора с обобщенной структурой, из которого удаляются дубликаты записей (если не было задано ключевое слово ALL):
    • UNION — объединение (записи, присутствующие в любом из двух наборов);
    • INTERSECT — пересечение (записи, присутствующие одновременно в двух наборах);
    • EXCEPT — исключение (записи, присутствующие в основном наборе SELECT, но не входящие в подзапрос).
  • ORDER BY выражение. Сортировка результатов команды SELECT по заданному выражению.
  • [ ASC | DESC | USING оператор ]. Порядок сортировки, определяемой секцией ORDER BY выражение: по возрастанию (ASC) или по убыванию (DESC). С ключевым словом USING может задаваться оператор, определяющий порядок сортировки (например, < или >).
  • FOR UPDATE [ OF таблица [. ... ] ]. Возможность монопольной блокировки возвращаемых записей. В транзакционных блоках FOR UPDATE блокирует записи указанной таблицы до завершения транзакции. Заблокированные записи не могут обновляться другими транзакциями.
  • LIMIT { число \ ALL }. Ограничение максимального количества возвращаемых записей или возвращение всей выборки (ALL).
  • { OFFSET | ,} начало. Точка отсчета записей для секции LIMIT. Например, если в секции LIMIT установлено ограничение в 100 записей, а в секции OFFSET — 50, запрос вернет записи с номерами 50-150 (если в итоговом наборе найдется столько записей).

    Ниже описаны компоненты секции FROM.

  • [ ONLY ] таблица. Имя таблицы, используемой в качестве источника для команды SELECT. Ключевое слово ONLY исключает из запроса записи всех таблиц-потомков.
  • [ AS ] синоним. Источникам FROM могут назначаться необязательные псевдонимы, упрощающие запрос (например, на таблицу books можно ссылаться по псевдониму Ь). Ключевое слово AS является необязательным.
  • ( запрос ) [ AS ] синоним. В круглых скобках находится любая синтаксически правильная команда SELECT. Итоговый набор, созданный запросом, используется в качестве источника FROM так, словно выборка производится из статической таблицы. При выборке из подзапроса обязательно должен назначаться синоним.
  • ( синоним_поля [. ...] ). Синонимы могут назначаться не только всему источнику, но и его отдельным полям. Перечисляемые синонимы полей разделяются запятыми и группируются в круглых скобках за синонимом источника FROM. Синонимы перечисляются в порядке следования полей в таблице, к которой они относятся.

Простая команда 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)




Книжный магазин