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

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

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

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

Добавлен: 03.04.2021

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

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

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

300 

Замечание.  Если  явно  не  указаны  ключевые  слова  ASC  или  DESC,  то  по  умолчанию 
принимается упорядочение по возрастанию (ASC). 

Отбор данных из нескольких таблиц 

Пример  13.  Естественное  соединение  таблиц  (способ  1  -  явное  указание  условий 
соединения): 

SELECT 
    P.PNUM, 
    P.PNAME, 
    PD.DNUM, 
    PD.VOLUME 
  FROM P, PD 
  WHERE P.PNUM = PD.PNUM; 

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

PNU

PNAM

DNU

VOLUM

Иванов 

100 

Иванов 

200 

Иванов 

300 

Петров 

150 

Петров 

250 

Сидоро

в 

1000 

Замечание.  Соединяемые  таблицы  перечислены  в  разделе  FROM  оператора,  условие 
соединения приведено в разделе WHERE. Раздел WHERE, помимо условия  соединения 
таблиц, может также содержать и условия отбора строк. 

Пример  14

.  Естественное  соединение  таблиц  (способ  2  -  ключевые  слова 

JOIN… 

USING…

): 

SELECT 
    P.PNUM, 
    P.PNAME, 
    PD.DNUM, 
    PD.VOLUME 
  FROM P JOIN PD USING PNUM; 

Замечание. Ключевое слово USING позволяет 

явно указать

, по каким из 

общих 

колонок 

таблиц будет производиться соединение. 

Пример  15

.  Естественное  соединение  таблиц  (способ  3  -  ключевое  слово 

NATURAL 

JOIN

): 


background image

SELECT 
    P.PNUM, 
    P.PNAME, 
    PD.DNUM, 
    PD.VOLUME 
  FROM P NATURAL JOIN PD; 

Замечание.  В  разделе  FROM  не  указано,  по  каким  полям  производится  соединение. 
NATURAL JOIN автоматически соединяет 

по всем одинаковым полям 

в таблицах. 

Пример 16

. Естественное соединение трех таблиц: 

SELECT 
    P.PNAME, 
    D.DNAME, 
    PD.VOLUME 
  FROM 
    P NATURAL JOIN PD NATURAL JOIN D; 

В результате получим следующую таблицу: 

PNAM

DNAM

VOLUM

Иванов 

Болт 

100 

Иванов 

Гайка 

200 

Иванов 

Винт 

300 

Петров 

Болт 

150 

Петров 

Гайка 

250 

Сидоро

в 

Болт 

1000 

Пример 17

. Прямое произведение таблиц: 

SELECT 
    P.PNUM, 
    P.PNAME, 
    D.DNUM, 
    D.DNAME 
  FROM P, D; 

В результате получим следующую таблицу: 

PNU

PNAM

DNU

DNAM

Иванов 

Болт 

Иванов 

Гайка 

Иванов 

Винт 

Петров 

Болт 

Петров 

Гайка 

Петров 

Винт 

Сидоро

в 

Болт 


background image

Сидоро

в 

Гайка 

Сидоро

в 

Винт 

Замечание.  Т.к.  не  указано  условие  соединения  таблиц,  то 

каждая 

строка  первой 

таблицы соединится с 

каждой 

строкой второй таблицы. 

Пример  18

.  Соединение  таблиц  по  произвольному  условию.  Рассмотрим  таблицы 

поставщиков  и  деталей,  которыми  присвоен  некоторый  статую  (см.  пример  8  из 
предыдущей главы): 

PNU

PNAM

PSTATUS 

Иванов 

Петров 

Сидоро

в 

Таблица 1 Отношение P (Поставщики)

 

DNU

DNAM

DSTATUS 

Болт 

Гайка 

Винт 

Таблица 2 Отношение D (Детали)

 

Ответ  на  вопрос  "какие  поставщики  имеют  право  поставлять  какие  детали?"  дает 
следующий запрос: 

SELECT 
    P.PNUM, 
    P.PNAME, 
    P.PSTATUS, 
    D.DNUM, 
    D.DNAME, 
    D.DSTATUS 
  FROM P, D 
  WHERE P.PSTATUS >= D.DSTATUS; 

В результате получим следующую таблицу: 

PNU

PNAM

PSTATUS  DNU

DNAM

DSTATUS 

Иванов 

Болт 

Иванов 

Гайка 

Иванов 

Винт 

Петров 

Винт 

Сидоро

Гайка 


background image

в 

Сидоро

в 

Винт 

Использование имен корреляции (алиасов, псевдонимов) 

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

имена 

корреляции 

(

алиасы

псевдонимы

),  которые  позволяют  различать  соединяемые  копии 

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

Пример 19

. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в 

паре имел статус, больший статуса второго поставщика: 

SELECT 
    P1.PNAME AS PNAME1, 
    P1.PSTATUS AS PSTATUS1, 
    P2.PNAME AS PNAME2, 
    P2.PSTATUS AS PSTATUS2 
  FROM 
    P P1, P P2 
  WHERE P1.PSTATUS1 > P2.PSTATUS2; 

В результате получим следующую таблицу: 

PNAME

PSTATUS1  PNAME

PSTATUS2 

Иванов 

Петров 

Иванов 

Сидоров 

Сидоров 

Петров 

Пример  20

.  Рассмотрим  ситуацию,  когда  некоторые  поставщики  (назовем  их 

контрагенты)  могут  выступать  как  в  качестве  поставщиков  деталей,  так  и  в  качестве 
получателей. Таблицы, хранящие данные могут иметь следующий вид: 

Номер контрагента 

NUM 

Наименование контрагента 

NAME 

Иванов 

Петров 

Сидоров 

Таблица 3 Отношение CONTRAGENTS

 

Номер детали 

DNUM 

Наименование детали 

DNAME 

Болт 


background image

Гайка 

Винт 

Таблица 4 Отношение DETAILS (Детали)

 

Номер поставщика 

PNUM 

Номер получателя 

CNUM 

Номер детали 

DNUM 

Поставляемое 

количество 

VOLUME 

100 

200 

300 

150 

250 

1000 

Таблица 5 Отношение CD (Поставки)

 

В  таблице  CD  (поставки)  поля  PNUM  и  CNUM  являются  внешними  ключами, 
ссылающимися на потенциальный ключ NUM в таблице CONTRAGENTS. 

Ответ  на  вопрос  "кто  кому  что  в  каком  количестве  поставляет"  дается  следующим 
запросом: 

SELECT 
    P.NAME AS PNAME, 
    C.NAME AS CNAME, 
    DETAILS.DNAME, 
    CD.VOLUME 
  FROM 
    CONTRAGENTS P, 
    CONTRAGENTS C, 
    DETAILS, 
    CD 
  WHERE 
    P.NUM = CD.PNUM AND 
    C.NUM = CD.CNUM AND 
    D.DNUM = CD.DNUM; 

В результате получим следующую таблицу: 

Наименование 

поставщика 

PNAME 

Наименование 

получателя 

CNAME 

Наименование 

детали 

DNAME 

Поставляемое 

количество 

VOLUME 

Иванов 

Петров 

Болт 

100 

Иванов 

Сидоров 

Гайка 

200 

Иванов 

Сидоров 

Винт 

300 

Петров 

Сидоров 

Болт 

150 

Петров 

Сидоров 

Гайка 

250 

Сидоров 

Иванов 

Болт 

1000 

Замечание. Этот же запрос может быть выражен очень большим количеством способов,