Файл: Практика - Элементы языка SQL.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.04.2021

Просмотров: 411

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

совместимы, т.е. иметь одинаковое количество столбцов и одинаковые типы столбцов в 
порядке  их  перечисления. 

Не  требуется

,  чтобы  объединяемые  таблицы  имели  бы 

одинаковые  имена  колонок.  Это  отличает  операцию  объединения  запросов  в  SQL  от 
операции  объединения  в  реляционной  алгебре.  Наименования  колонок  в 
результатирующем запросе будут автоматически взяты из результата первого запроса в 
объединении. 

Пример 31

. Получить имена поставщиков, имеющих статус, больший 3 и одновременно 

поставляющих хотя бы одну деталь номер 2 (пересечение двух подзапросов  - ключевое 
слово 

INTERSECT

): 

SELECT P.PNAME 
  FROM P 
  WHERE P.STATUS > 3 
  INTERSECT 
  SELECT P.PNAME 
    FROM P, PD 
    WHERE P.PNUM = PD.PNUM AND 
        PD.DNUM = 2; 

Пример 32

. Получить имена поставщиков, имеющих статус, больший 3, за исключением 

тех, кто поставляет хотя бы одну деталь номер 2 (разность двух подзапросов - ключевое 
слово 

EXCEPT

): 

SELECT P.PNAME 
  FROM P 
  WHERE P.STATUS > 3 
EXCEPT 
  SELECT P.PNAME 
    FROM P, PD 
    WHERE P.PNUM = PD.PNUM AND 
        PD.DNUM = 2; 

Синтаксис оператора выборки данных (SELECT) 

BNF-

нотация 

Опишем  синтаксис  оператора  выборки  данных  (оператора  SELECT)  более  точно.  При 
описании  синтаксиса  операторов  обычно  используются  условные  обозначения, 
известные как 

стандартные формы Бэкуса-Наура 

(

BNF

). 

В BNF обозначениях используются следующие элементы: 

 

Символ "::=" означает равенство по определению. Слева от знака стоит определяемое 

понятие, справа - собственно определение понятия. 

 

Ключевые  слова  записываются  прописными  буквами.  Они  зарезервированы  и 

составляют часть оператора. 

 

Метки-заполнители  конкретных  значений  элементов  и  переменных  записываются 

курсивом. 

 

Необязательные элементы оператора заключены в квадратные скобки []. 


background image

 

Вертикальная  черта  |  указывает  на  то,  что  все  предшествующие  ей  элементы  списка 

являются  необязательными  и  могут  быть  заменены  любым  другим  элементом 
списка после этой черты. 

 

Фигурные  скобки  {}  указывают  на  то,  что  все  находящееся  внутри  них  является 

единым целым. 

 

Троеточие "…" означает, что предшествующая часть оператора может быть повторена 

любое количество раз. 

 

Многоточие, внутри которого находится запятая ".,.." указывает, что предшествующая 

часть  оператора,  состоящая  из  нескольких  элементов,  разделенных  запятыми, 
может  иметь  произвольное  число  повторений.  Запятую  нельзя  ставить  после 
последнего элемента. Замечание: данное соглашение не входит в стандарт BNF, но 
позволяет более точно описать синтаксис операторов SQL. 

 

Круглые скобки являются элементом оператора. 

Синтаксис оператора выборки 

В  довольно  сильно  упрощенном  виде  оператор  выборки  данных  имеет  следующий 
синтаксис  (для  некоторых  элементов  мы  дадим  не  BNF-определения,  а  словесное 
описание): 

Оператор  выборки 

::=

Табличное  выражение

[

ORDER  BY

{{

Имя  столбца-

результата 

[

ASC

 | 

DESC

]} | {

Положительное целое 

[

ASC

 | 

DESC

]}}.,..]; 

Табличное  выражение 

::=

Select-выражение

[

{

UNION

  | 

INTERSECT

  | 

EXCEPT

[

ALL

]

{

Select-выражение

 | 

TABLE

Имя таблицы

 | 

Конструктор значений таблицы

}

Select-выражение

  ::=

SELECT

  [

ALL

  | 

DISTINCT

]

{{{

Скалярное  выражение

  | 

Функция  агрегирования

  | 

Select-выражение

}  [

AS

Имя  столбца

]}.,..}

|  {{

Имя 

таблицы

|

Имя  корреляции

}.*}

|  *

FROM

  {

{

Имя  таблицы

  [

AS

]  [

Имя  корреляции

[(

Имя  столбца

.,..)]}

|  {

Select-выражение

  [

AS

Имя  корреляции

  [(

Имя  столбца

.,..)]}

Соединенная  таблица

  }.,..

[

WHERE

Условное  выражение

]

[

GROUP  BY

  {[{

Имя 

таблицы

|

Имя корреляции

}.]

Имя столбца

}.,..]

[

HAVING

Условное выражение

Замечание. Select-выражение в разделе SELECT, используемое в качестве значения для 
отбираемого столбца, должно возвращать таблицу, состоящую из одной строки и одного 
столбца, т.е. скалярное выражение. 

Замечание.  Условное  выражение  в  разделе  WHERE  должно  вычисляться  для  каждой 
строки, являющейся кандидатом в результатирующее множество строк. В этом условном 
выражении  можно  использовать  подзапросы.  Синтаксис  условных  выражений, 
допустимых в разделе WHERE рассматривается ниже. 

Замечание.  Раздел  HAVING  содержит  условное  выражение,  вычисляемое  для  каждой 
группы,  определяемой  списком  группировки  в  разделе  GROUP  BY.  Это  условное 
выражение может содержать функции агрегирования, вычисляемые для каждой группы. 
Условное  выражение,  сформулированное  в  разделе  WHERE,  может  быть  перенесено  в 
раздел  HAVING.  Перенос  условий  из  раздела  HAVING  в  раздел  WHERE  невозможен, 
если  условное  выражение  содержит  агрегатные  функции.  Перенос  условий  из  раздела 
WHERE  в  раздел  HAVING  является  плохим  стилем  программирования  -  эти  разделы 


background image

предназначены  для  различных  по  смыслу  условий  (условия  для  строк  и  условия  для 
групп строк). 

Замечание.  Если  в  разделе  SELECT  присутствуют  агрегатные  функции,  то  они 
вычисляются  по-разному  в  зависимости  от  наличия  раздела  GROUP  BY.  Если  раздел 
GROUP  BY  отсутствует,  то  результат  запроса  возвращает  не  более  одной  строки. 
Агрегатные  функции  вычисляются  по  всем  строкам,  удовлетворяющим  условному 
выражению  в  разделе  WHERE.  Если  раздел  GROUP  BY  присутствует,  то  агрегатные 
функции  вычисляются  по  отдельности  для  каждой  группы,  определенной  в  разделе 
GROUP BY. 

Скалярное  выражение

  -  в  качестве  скалярных  выражений  в  разделе  SELECT  могут 

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

Функция  агрегирования

  ::= 

COUNT

  (*)  |

{

{

COUNT

  | 

MAX

  | 

MIN

  | 

SUM

  | 

AVG

([

ALL

 | 

DISTINCT

Скалярное выражение

)

Конструктор значений таблицы

 ::=

VALUES

Конструктор значений строки

.,.. 

Конструктор 

значений 

строки

 

::=

Элемент 

конструктора

 

(

Элемент 

конструктора

.,..) | 

Select-выражение

 

Замечание.  Select-выражение,  используемое  в  конструкторе  значений  строки,  обязано 
возвращать ровно одну строку. 

Элемент конструктора

 ::= 

Выражение для вычисления значения

 | 

NULL

 | 

DEFAULT

 

Синтаксис соединенных таблиц 

В разделе FROM оператора SELECT можно использовать соединенные таблицы. Пусть в 
результате некоторых операций мы получаем таблицы A и B. Такими операциями могут 
быть,  например,  оператор  SELECT  или  другая  соединенная  таблица.  Тогда  синтаксис 
соединенной таблицы имеет следующий вид: 

Соединенная  таблица

  ::=

Перекрестное  соединение

Естественное  соединение

Соединение  посредством  предиката

Соединение  посредством  имен  столбцов

Соединение объединения

 

Тип соединения

 ::=

INNER

LEFT

 [

OUTER

]

RIGTH

 [

OUTER

]

FULL 

[

OUTER

Перекрестное соединение

 ::=

Таблица А

CROSS JOIN

Таблица В

 

Естественное соединение

 ::=

Таблица А

 [

NATURAL

] [

Тип соединения

JOIN

Таблица В

 

Соединение посредством предиката

 ::=

Таблица А

 [

Тип соединения

JOIN

Таблица В

ON

 

Предикат 


background image

Соединение посредством имен столбцов

 ::=

Таблица А

 [

Тип соединения

JOIN

Таблица 

В

USING

 (Имя столбца.,..) 

Соединение объединения

 ::=

Таблица А

UNION JOIN

Таблица В

 

Опишем используемые термины. 

CROSS  JOIN  -  Перекрестное  соединение  возвращает  просто  декартово  произведение 
таблиц. Такое соединение в разделе FROM может быть заменено списком таблиц через 
запятую. 

NATURAL JOIN - Естественное соединение производится по всем столбцам таблиц А и 
В,  имеющим  одинаковые  имена.  В  результатирующую  таблицу  одинаковые  столбцы 
вставляются только один раз. 

JOIN  …  ON  -  Соединение  посредством  предиката  соединяет  строки  таблиц  А  и  В 
посредством указанного предиката. 

JOIN … USING - Соединение посредством имен столбцов соединяет отношения подобно 
естественному  соединению  по  тем  общим  столбцам  таблиц  А  и  Б,  которые  указаны  в 
списке USING. 

OUTER  -  Ключевое  слово  OUTER  (внешний)  не  является  обязательными,  оно  не 
используется ни в каких операциях с данными. 

INNER  -  Тип  соединения  "внутреннее".  Внутренний  тип  соединения  используется  по 
умолчанию, когда тип явно не задан. В таблицах А и В соединяются только те строки, 
для которых найдено совпадение. 

LEFT  (OUTER)  -  Тип  соединения  "левое  (внешнее)".  Левое  соединение  таблиц  А  и  В 
включает в себя все строки из левой таблицы А и те строки из правой таблицы В, для 
которых  обнаружено  совпадение.  Для  строк  из  таблицы  А,  для  которых  не  найдено 
соответствия  в  таблице  В,  в  столбцы,  извлекаемые  из  таблицы  В,  заносятся  значения 
NULL. 

RIGHT (OUTER) - Тип соединения "правое (внешнее)". Правое соединение таблиц А и В 
включает в себя все строки из правой таблицы В и те строки из левой таблицы А, для 
которых  обнаружено  совпадение.  Для  строк  из  таблицы  В,  для  которых  не  найдено 
соответствия  в  таблице  А,  в  столбцы,  извлекаемые  из  таблицы  А  заносятся  значения 
NULL. 

FULL (OUTER) - Тип соединения "полное (внешнее)". Это комбинация левого и правого 
соединений.  В  полное  соединение  включаются  все  строки  из  обеих  таблиц.  Для 
совпадающих строк поля заполняются реальными значениями, для несовпадающих строк 
поля заполняются в соответствии с правилами левого и правого соединений. 

UNION  JOIN  -  Соединение  объединения  является  обратным  по  отношению  к 
внутреннему соединению. Оно включает только те строки из таблиц А и В, для которых 


background image

не найдено совпадений. В них используются значения NULL для столбцов, полученных 
из  другой  таблицы.  Если  взять  полное  внешнее  соединение  и  удалить  из  него  строки, 
полученные  в  результате  внутреннего  соединения,  то  получится  соединение 
объединения. 

Использование  соединенных  таблиц  часто  облегчает  восприятие  оператора  SELECT, 
особенно,  когда  используется  естественное  соединение.  Если  не  использовать 
соединенные  таблицы,  то  при  выборе  данных  из  нескольких  таблиц  необходимо  явно 
указывать условия соединения в разделе WHERE. Если при этом пользователь указывает 
сложные  критерии  отбора  строк,  то  в  разделе  WHERE  смешиваются  семантически 
различные понятия - как условия связи таблиц, так и условия отбора строк (см. примеры 
13, 14, 15 данной главы). 

Синтаксис условных выражений раздела WHERE 

Условное  выражение,  используемое  в  разделе  WHERE  оператора  SELECT  должно 
вычисляться для каждой  строки-кандидата, отбираемой оператором  SELECT.  Условное 
выражение  может  возвращать  одно  из  трех  значений  истинности:  TRUE,  FALSE  или 
UNKNOUN. Строка-кандидат отбирается в результатирующее множество строк только в 
том случае, если для нее условное выражение вернуло значение TRUE. 

Условные  выражения  имеют  следующий  синтаксис  (в  целях  упрощения  изложения 
приведены не все возможные предикаты): 

Условное  выражение

  ::=

[  (  ]  [

NOT

]

{

Предикат  сравнения

Предикат  between

Предикат  in

Предикат  like

Предикат  null

Предикат  количественного 

сравнения

Предикат  exist

Предикат  unique

Предикат  match

Предикат 

overlaps

}

[{

AND

  | 

OR

Условное  выражение

]  [  )  ]

[

IS

  [

NOT

]  {

TRUE

  | 

FALSE

  | 

UNKNOWN

}] 

Предикат  сравнения

  ::=

Конструктор  значений  строки

  {=  |  <  |  >  |  <=  |  >=  |  <>} 

Конструктор значений строки

 

Пример 33

. Сравнение поля таблицы и скалярного значения: 

POSTAV.VOLUME > 100 

Пример 34

. Сравнение двух сконструированных строк: 

(PD.PNUM, PD.DNUM) = (1, 25) 

Этот пример эквивалентен условному выражению 

PD.PNUM = 1 AND PD.DNUM = 25 

Предикат 

between

 

::=

Конструктор 

значений 

строки

 

[

NOT

BETWEEN

Конструктор значений строки

AND

Конструктор значений строки

 

Пример 35

. PD.VOLUME BETWEEN 10 AND 100 

Предикат  in

  ::=

Конструктор  значений  строки

  [

NOT

IN

{(

Select-выражение

)  |