Оператор SQL SELECT: введение в язык запросов

Vovan_ST

Vovan_ST

ИТ специалист со стажем. Автор статьи. Профиль

Сердцем языка SQL являются запросы. Инструкция SELECT, которая исполь­зуется для создания SQL-запросов, является наиболее мощной и сложной из всех инструкций SQL. Несмотря на богатство возможностей этой инст­рукции, ее изучение можно начать с создания простейших запросов, а затем по­степенно увеличивать их сложность. В этой главе рассказывается о самых простых SQL-запросах — запросах на чтение данных из отдельных строк одной таблицы базы данных. Если вам не приходилось заниматься этим раньше, то изучение ма­териала будет более эффективно, если вы создадите учебную базу данных в своей системе и будете пытаться выполнить все рассматриваемые здесь запросы. Руково­дство по созданию учебной базы данных можно найти по ссылке "Учебная база данных".



Инструкция SELECT

Инструкция SELECT извлекает информацию из базы данных и возвращает ее в виде результатов запроса. Точный вид результатов зависит от конкретной ис­пользуемой СУБД. В кратком введении в SQL в статье "Краткий обзор SQL", уже приводились примеры инструкций SELECT. Вот еще несколько образцов запросов, извлекающих данные об офисах.

Вывести список офисов с их плановыми и фактическими объемами продаж.

SELECT CITY, TARGET, SALES
    FROM OFFICES
  WHERE REGION = 'Eastern';

CITY             TARGET           SALES
------------     ------------     ------------
New York         $575,000.00      $692,637.00
Chicago          $800,000.00      $735,042.00
Atlanta          $350,000.00      $367,911.00

Вывести список офисов, расположенных в восточном регионе, с их плановыми и фак­тическими объемами продаж.

SELECT CITY, TARGET, SALES
    FROM OFFICES
  WHERE REGION = 'Eastern'
      AND SALES > TARGET
  ORDER BY CITY;

CITY             TARGET           SALES
------------     ------------     ------------
Atlanta          $350,000.00      $367,911.00
New York         $575,000.00      $692,637.00

 

В случае простых запросов инструкция SELECT очень похожа на предложение на английском языке. Когда запросы становятся сложнее, требуется использовать большее количество возможностей инструкции SELECT, чтобы точно указать, что именно запрашивается.

На рис. 1 приведена синтаксическая диаграмма инструкции SELECT. Инст­рукция состоит из шести предложений. Предложения SELECT и FROM являются обязательными; четыре остальные включаются в инструкцию только при необхо­димости. Ниже перечислены функции каждого из предложений.

  • В предложении SELECT перечисляются элементы данных, которые долж­ны быть выбраны инструкцией SELECT. Это могут быть либо столбцы ба­зы данных, либо столбцы, вычисляемые при выполнении запроса. Пред­ложение SELECT описано далее в настоящей главе.
  • В предложении FROM указывается список таблиц и представлений, кото­рые содержат элементы данных, извлекаемые запросом (представления) - Запросы, извлекающие данные из одной таблицы, описаны в настоящей статье. Более сложные запросы, извлекающие данные из двух или более таблиц, будут рассматриваться в другой статье, посвященной многотабличным запросам.
  • Предложение WHERE указывает, что в результаты запроса следует вклю­чать только некоторые строки. Для отбора строк, включаемых в резуль­таты запроса, используется условие отбора. Основные возможности этого предложения описаны ниже в настоящей статье. Использование в пред­ложении WHERE вложенных подзапросов рассматривается в статье, посвященной подзапросам и выражениям с запросами.


Синтаксическая диаграмма инструкции select

 

Рис. 1. Синтаксическая диаграмма инструкции select

  • Предложение GROUP BY позволяет создать итоговый запрос. Вместо ге­нерации одной строки результата для каждой строки данных в базе дан­ных, итоговый запрос вначале группирует строки базы данных по опре­деленному признаку, а затем включает в результаты запроса одну итого­вую строку для каждой группы.
  • Предложение having указывает, что в результаты запроса следует вклю­чать только некоторые из групп, созданных с помощью предложения GROUP BY. В этом предложении, как и в предложении WHERE, для отбора включаемых групп используется условие отбора.
  • Предложение order by сортирует результаты запроса на основании данных, содержащихся в одном или нескольких столбцах. Если это пред­ложение отсутствует, результаты запроса не будут отсортированы. Пред­ложение ORDER BY рассматривается далее в настоящей статье.

Предложение SELECT

В предложении SELECT, с которого начинаются все инструкции SELECT, необ­ходимо указать элементы данных, которые будут возвращены запросом. Эти эле­менты задаются в виде списка выбора, состоящего из выбираемых элементов, разде­ленных запятыми. Для каждого элемента из этого списка в таблице результатов запроса будет создан один столбец; при этом столбцы в таблице результатов будут расположены в том же порядке слева направо, что и элементы списка возвращае­мых столбцов. Возвращаемый элемент может представлять собой следующее.

  • Имя столбца, идентифицирующее один из столбцов, содержащихся в таблицах, которые перечислены в предложении from. СУБД просто бе­рет значение этого столбца для каждой из строк таблицы и помещает его в соответствующую строку таблицы результатов запроса.
  • Константу, показывающую, что в каждой строке результатов запроса должно содержаться одно и то же значение.
  • Выражение, указывающее, что SQL должен вычислить значение, поме­щаемое в результаты запроса, по формуле, определенной в выражении.

Все типы возвращаемых столбцов описаны далее в настоящей статье.

Предложение FROM

Предложение FROM состоит из ключевого слова from, за которым следует спи­сок спецификаций таблиц, разделенных запятыми. Каждая спецификация табли­цы идентифицирует таблицу или представление, содержащие данные, которые извлекает запрос. Эти таблицы называются исходными таблицами запроса (и ин­струкции SELECT), поскольку они являются источниками всех данных, содержа­щихся в таблице результатов запроса. Во всех запросах, рассматриваемых в на­стоящей главе, в предложении from указана одна таблица.

Результаты запроса

Результатом SQL-запроса на выборку всегда является таблица, содержащая данные и ничем не отличающаяся от таблиц базы данных. Если пользователь на­бирает инструкцию SQL в интерактивном режиме, СУБД выводит результаты за­проса (которые некоторые производители именуют результирующим набором (result set)) на экран в табличной форме. Если программа посылает запрос СУБД с помощью программного SQL, то СУБД возвращает таблицу результатов запроса программе. В любом случае результаты запроса всегда имеют такой же формат, как и обычные таблицы, содержащиеся в базе данных, как показано на рис. 2. Обычно результаты запроса представляют собой таблицу с несколькими строками и столбцами. Например, запрос, приведенный ниже, возвращает таблицу из трех столбцов (поскольку запрашиваются три элемента данных) и десяти строк (по ко­личеству служащих).

Вывести список имен, офисов и дат приема на работу всех служащих.

SELECT NAME, REP_OFFICE, HIRE_DATE
    FROM SALESREPS;


NAME               REP_OFFICE      HIRE_DATE
--------------     -----------     ----------
Bill Adams                  13     2006-02-12
Mary Jones                  11     2007-10-12
Sue Smith                   21     2004-12-10
Sam Clark                   11     2006-06-14
Bob Smith                   12     2005-05-19
Dan Roberts                 12     2004-10-20
Tom Snyder                NULL     2008-01-13
Larry Fitch                 21     2007-10-12
Paul Cruz                   12     2005-03-01
Nancy Angelli               22     2006-11-14

Табличная структура результатов SQL-запроса

Рис. 2. Табличная структура результатов SQL-запроса

В отличие от запроса, показанного выше, следующий запрос возвращает толь­ко одну строку, так как есть всего один служащий, имеющий указанный иденти­фикатор. Хотя результаты этого запроса, содержащие всего одну строку, имеют не такой "табличный" вид, как результаты, содержащие несколько строк, SQL все равно считает их таблицей, состоящей из трех столбцов и одной строки.

Имя, плановый и фактический объемы продаж служащего с идентификатором 107.

SELECT NAME, QUOTA, SALES
    FROM SALESREPS
  WHERE EMPL_NUM = 107;

NAME                QUOTA             SALES
--------------      ------------      ------------
Nancy Angelli       $300,000.00       $186,042.00

В некоторых случаях результатом запроса может быть единственное значение, как в следующем примере.

Среднее значение фактических объемов продаж по всем служащим компании.

SELECT AVG(SALES)
    FROM SALESREPS;

AVG(SALES)
------------
$289,353.20

Эти результаты запроса также являются таблицей, которая состоит из одного столбца и одной строки.

И наконец, запрос может вернуть результаты, содержащие нуль строк, как в следующем примере.

Список имен и дат приема на работу всех служащих, фактический объем продаж которых превышает $500 000.

SELECT NAME, HIRE_DATE
    FROM SALESREPS
  WHERE SALES > 500000.00;

NAME             HIRE_DATE
------------     ----------

Даже в таком случае результаты запроса считаются таблицей. Пустая таблица, приведенная выше, содержит два столбца и нуль строк.

Обратите внимание на то, что поддержка отсутствующих данных в SQL рас­пространяется и на результаты запроса. Если один из элементов данных в таблице имеет значение NULL, то оно попадет в результаты запроса при извлечении этого элемента. Например, в таблице SALESREPS значение NULL содержится в столбцах QUOTA и MANAGER. Приведенный далее запрос возвращает эти значения во втором и третьем столбцах таблицы результатов запроса. Заметим, что не все SQL- продукты выводят значения NULL таким образом — Oracle и DB2, например, встретив значение NULL, не выводят ничего.

Список служащих с их плановыми объемами продаж и менеджерами.

SELECT NAME, QUOTA, MANAGER
    FROM SALESREPS;

NAME                     QUOTA       MANAGER
--------------     ------------     --------
Bill Adams          $350,000.00          104
Mary Jones          $300,000.00          106
Sue Smith           $350,000.00          108
Sam Clark           $275,000.00         NULL
Bob Smith           $200,000.00          106
Dan Roberts         $300,000.00          104
Tom Snyder                 NULL          101
Larry Fitch         $350,000.00          106
Paul Cruz           $275,000.00          104
Nancy Angelli       $300,000.00          108

To, что SQL-запрос всегда возвращает таблицу данных, очень важно. Это озна­чает, что результаты запроса можно сохранить в базе данных в виде таблицы. Это означает также, что результаты двух подобных запросов можно объединить в одну таблицу. И наконец, это говорит о том, что результаты запроса сами могут стать предметом дальнейших запросов. Таким образом, табличная структура реляцион­ной базы данных тесно связана с реляционными запросами SQL. Таблицам можно посылать запросы, а запросы возвращают таблицы.

Простые SQL запросы

Наиболее простые запросы извлекают данные из столбцов, расположенных в одной таблице базы данных. Например, следующий запрос извлекает из таблицы OFFICES три столбца.

Вывести для каждого из офисов список городов, регионов и объемов продаж.

SELECT CITY, REGION, SALES
    FROM OFFICES;

CITY               REGION            SALES
------------     --------     ------------
Denver            Western      $186,042.00
New York          Eastern      $692,637.00
Chicago           Eastern      $735,042.00
Atlanta           Eastern      $367,911.00
Los Angeles       Western      $835,915.00

Инструкция SELECT для простых запросов, таких как показанный выше, состо­ит только из двух обязательных предложений. В предложении SELECT перечисля­ются имена требуемых столбцов; в предложении FROM указываются имена таблиц и представлений, содержащих эти столбцы.

Концептуально SQL обрабатывает запрос путем построчного просмотра табли­цы, указанной в предложении FROM. Для каждой строки таблицы берутся значе­ния из указанных в запросе столбцов и создается одна строка результатов запроса. Таким образом, таблица результатов простого запроса на выборку содержит одну строку данных для каждой строки исходной таблицы базы данных.

Теперь давайте рассмотрим, как работают арифметические операции (вычисляемые столбцы) в SQL запросах SELECT, а также выборку всех данных из таблицы.

Вас заинтересует / Intresting for you:

SQL: Правила выполнения однота...
SQL: Правила выполнения однота... 49 просмотров Дэйзи ак-Макарова Sat, 31 Jul 2021, 06:47:05
Операции SQL в базе данных Ora...
Операции SQL в базе данных Ora... 4441 просмотров Antoni Wed, 11 Apr 2018, 12:22:28
Значения NULL в языке SQL: отс...
Значения NULL в языке SQL: отс... 318 просмотров Antoni Mon, 21 Jun 2021, 19:57:18
Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 3413 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Войдите чтобы комментировать

apv аватар
apv ответил в теме #10069 24 июнь 2021 20:07
Статья отличная. Незаменимый материал для новичков!
Vovan_ST аватар
Vovan_ST ответил в теме #10059 24 июнь 2021 19:37
Коллеги, ну как вас статья?