Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретические основы реляционных баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
936 Кб
Скачать

- 31 -

stgroup

| max

| min

|

avg

| count

---------

+------

+------

+

--------------------

+

------

345

| 4.87

| 4.87 |

4.8700000000000000 |

1

349

| 4.38

| 4.38 |

4.3800000000000000 |

1

342

| 5.00

| 4.12

|

4.6250000000000000

|

4

344

| 4.31

| 4.31

|

4.3100000000000000

|

1

(4 rows)

 

 

 

 

 

 

Кроме этого, существует еще одна агрегатная функция SUM(), которая может просуммировать числовое значение столбца в каждой группе.

2.6. Запросы к нескольким таблицам

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

Для этого нам понадобится еще одна таблица stgroups, в которой хранится информация о принадлежности к кафедре студенческой группы и о ее кураторе:

stgroup

| department

| curator

---------

+------------

+-----------

340

| ЭВМ

| Логинов

341

| ЭВМ

| Кузьмин

342

| ЭВМ

| Гринченко

344

| САПР

| Бабаев

345

| ВПМ

| Макаров

349

| АСУ

| Маркин

Поскольку в двух таблицах могут быть столбцы с одинаковыми именами, то их следует записывать в точечной нотации: имя_таблицы.имя_столбца. Рассмотрим простой пример объединения двух таблиц по общему столбцу stgroup.

SELECT s.family,s.name,s.stgroup,

 

g.department, g.curator

 

 

FROM students s, stgroups g

 

WHERE s.stgroup = g.stgroup;

 

family

| name |stgroup |

department| curator

------------

+------

+--------

+-----------

 

+---------

Фахрудинова

|Тамара| 342

|

ЭВМ

| Гринченко

Никулкин

|Сергей| 342

|

ЭВМ

| Гринченко

Катеринченко|Андрей| 342

|

ЭВМ

| Гринченко

Балашов

|Андрей| 342

|

ЭВМ

| Гринченко

Чертков

|Максим| 344

|

САПР

| Бабаев

Малин

|Сергей| 345

|

ВПМ

| Макаров

Колычева

|Лия

| 349

|

АСУ

| Маркин

(7 rows)

 

 

 

 

 

- 32 -

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

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

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

SELECT s.family,g.family,s.stgroup FROM students s,

students g WHERE

s.stgroup =

g.stgroup;

family

|

family

| stgroup

--------------

+--------------

 

+---------

Балашов

| Фахрудинова

| 342

Балашов

| Никулкин

| 342

Балашов

| Катеринченко

| 342

Балашов

| Балашов

| 342

Катеринченко

| Фахрудинова

| 342

Катеринченко

| Никулкин

| 342

Катеринченко

| Катеринченко

| 342

Катеринченко

| Балашов

| 342

Колычева

| Колычева

| 349

Малин

| Малин

| 345

Никулкин

| Фахрудинова

| 342

Никулкин

| Никулкин

| 342

Никулкин

| Катеринченко

| 342

Никулкин

| Балашов

| 342

Фахрудинова

| Фахрудинова

| 342

Фахрудинова

| Никулкин

| 342

Фахрудинова

| Катеринченко

| 342

Фахрудинова

| Балашов

| 342

Чертков

| Чертков

| 344

(19 rows)

 

 

 

Для демонстрации соединения трех таблиц используем еще одну

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

department

| faculty

| head

------------

+---------

+----------

ЭВМ

| ФВТ

| Костров

САПР

| ФВТ

| Корячко

ВПМ

| ФВТ

| Овечкин

АСУ

| ФАИТУ

| Одиноков

-33 -

Асам запрос по трем таблицам и его результат будут выглядеть следующим образом:

SELECT s.family,d.faculty

FROM students s, stgroups g, departments d WHERE s.stgroup = g.stgroup

AND g.department=d.department;

family

| faculty

--------------

+---------

Фахрудинова

| ФВТ

Никулкин

| ФВТ

Катеринченко

| ФВТ

Балашов

| ФВТ

Чертков

| ФВТ

Малин

| ФВТ

Колычева

| ФАИТУ

(7 rows)

 

2.6.1. Подзапросы

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

В примере мы попытаемся выбрать студентов, которые обучаются на ФВТ и у которых куратор Гринченко.

SELECT * FROM students

 

 

 

 

 

WHERE stgroup =

 

 

 

 

 

(SELECT stgroup FROM stgroups g,

departments d

WHERE g.department=d.department

 

 

 

AND faculty='ФВТ' AND curator='Гринченко' );

family

| name

|

stgroup |

gpa

| sex

--------------

+--------

+

---------

+

------

+-----

Балашов

| Андрей |

342

|

5.00

| м

Катеринченко

| Андрей |

342

|

4.59

| м

Никулкин

| Сергей |

342

|

4.79

| м

Фахрудинова

| Тамара |

342

|

4.12

| ж

(4 rows)

 

 

 

 

 

 

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

-34 -

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

SELECT * FROM students

WHERE gpa > (SELECT AVG(g ) FROM students);

family

| name

|

stgroup |

gpa

| sex

--------------

+--------

+

---------

+

------

+-----

Балашов

| Андрей |

342

|

5.00

| м

Катеринченко

| Андрей |

342

|

4.59

| м

Малин

| Сергей |

345

|

4.87

| м

Никулкин

| Сергей |

342

|

4.79

| м

(4 rows)

 

 

 

 

 

 

Можно использовать подзапросы, которые производят любое число строк, если применяется специальный оператор IN (операторы BETWEEN, LIKE и IS NULL не могут использоваться с подзапросами). IN определяет набор значений, одно из которых должно совпадать с другим термином уравнения предиката, чтобы предикат был верным.

Когда используется IN с подзапросом, SQL просто формирует этот набор из вывода подзапроса. Мы можем, следовательно, использовать IN, чтобы выполнить такой подзапрос, который не будет работать с реляционным оператором, и найти все атрибуты таблицы students для факультета вычислительной техники.

SELECT * FROM

students WHERE stgroup IN

 

(SELECT g.stgroup

 

 

 

 

FROM stgroups g, departments d

 

WHERE g.department=d.department

 

AND d.faculty='ФВТ');

 

 

 

family

| name

|

stgroup |

gpa

| sex

--------------

+--------

+

---------

+

------

+-----

Балашов

| Андрей |

342

|

5.00

| м

Катеринченко

| Андрей |

342

|

4.59

| м

Малин

| Сергей |

345

|

4.87

| м

Никулкин

| Сергей |

342

|

4.79

| м

Фахрудинова

| Тамара |

342

|

4.12

| ж

Чертков

| Максим |

344

|

4.31

| м

(6 rows)

 

 

 

 

 

 

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]