ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 03.04.2021
Просмотров: 412
Скачиваний: 1
1
3
300
Замечание. Если явно не указаны ключевые слова ASC или DESC, то по умолчанию
принимается упорядочение по возрастанию (ASC).
Отбор данных из нескольких таблиц
Пример 13. Естественное соединение таблиц (способ 1 - явное указание условий
соединения):
SELECT
P.PNUM,
P.PNAME,
PD.DNUM,
PD.VOLUME
FROM P, PD
WHERE P.PNUM = PD.PNUM;
В результате получим новую таблицу, в которой строки с данными о поставщиках
соединены со строками с данными о поставках деталей:
PNU
M
PNAM
E
DNU
M
VOLUM
E
1
Иванов
1
100
1
Иванов
2
200
1
Иванов
3
300
2
Петров
1
150
2
Петров
2
250
3
Сидоро
в
1
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
):
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
E
DNAM
E
VOLUM
E
Иванов
Болт
100
Иванов
Гайка
200
Иванов
Винт
300
Петров
Болт
150
Петров
Гайка
250
Сидоро
в
Болт
1000
Пример 17
. Прямое произведение таблиц:
SELECT
P.PNUM,
P.PNAME,
D.DNUM,
D.DNAME
FROM P, D;
В результате получим следующую таблицу:
PNU
M
PNAM
E
DNU
M
DNAM
E
1
Иванов
1
Болт
1
Иванов
2
Гайка
1
Иванов
3
Винт
2
Петров
1
Болт
2
Петров
2
Гайка
2
Петров
3
Винт
3
Сидоро
в
1
Болт
3
Сидоро
в
2
Гайка
3
Сидоро
в
3
Винт
Замечание. Т.к. не указано условие соединения таблиц, то
каждая
строка первой
таблицы соединится с
каждой
строкой второй таблицы.
Пример 18
. Соединение таблиц по произвольному условию. Рассмотрим таблицы
поставщиков и деталей, которыми присвоен некоторый статую (см. пример 8 из
предыдущей главы):
PNU
M
PNAM
E
PSTATUS
1
Иванов
4
2
Петров
1
3
Сидоро
в
2
Таблица 1 Отношение P (Поставщики)
DNU
M
DNAM
E
DSTATUS
1
Болт
3
2
Гайка
2
3
Винт
1
Таблица 2 Отношение D (Детали)
Ответ на вопрос "какие поставщики имеют право поставлять какие детали?" дает
следующий запрос:
SELECT
P.PNUM,
P.PNAME,
P.PSTATUS,
D.DNUM,
D.DNAME,
D.DSTATUS
FROM P, D
WHERE P.PSTATUS >= D.DSTATUS;
В результате получим следующую таблицу:
PNU
M
PNAM
E
PSTATUS DNU
M
DNAM
E
DSTATUS
1
Иванов
4
1
Болт
3
1
Иванов
4
2
Гайка
2
1
Иванов
4
3
Винт
1
2
Петров
1
3
Винт
1
3
Сидоро
2
2
Гайка
2
в
3
Сидоро
в
2
3
Винт
1
Использование имен корреляции (алиасов, псевдонимов)
Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой,
или одна таблица соединяется дважды с другой таблицей. При этом используются
имена
корреляции
(
алиасы
,
псевдонимы
), которые позволяют различать соединяемые копии
таблиц. Имена корреляции вводятся в разделе 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
1
PSTATUS1 PNAME
2
PSTATUS2
Иванов
4
Петров
1
Иванов
4
Сидоров
2
Сидоров
2
Петров
1
Пример 20
. Рассмотрим ситуацию, когда некоторые поставщики (назовем их
контрагенты) могут выступать как в качестве поставщиков деталей, так и в качестве
получателей. Таблицы, хранящие данные могут иметь следующий вид:
Номер контрагента
NUM
Наименование контрагента
NAME
1
Иванов
2
Петров
3
Сидоров
Таблица 3 Отношение CONTRAGENTS
Номер детали
DNUM
Наименование детали
DNAME
1
Болт
2
Гайка
3
Винт
Таблица 4 Отношение DETAILS (Детали)
Номер поставщика
PNUM
Номер получателя
CNUM
Номер детали
DNUM
Поставляемое
количество
VOLUME
1
2
1
100
1
3
2
200
1
3
3
300
2
3
1
150
2
3
2
250
3
1
1
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
Замечание. Этот же запрос может быть выражен очень большим количеством способов,