
Лаб. 3 СУБД
.docxЛабораторная работа 3
«Использование объединяющих и вложенных запросов языка SQL»
При * учитывается и NULL.
select s.surname, s.name, s.patronymic, s.student_id,
fc.mark, f.field_name
from student s
inner join field_comprehension fc on s.student_id = fc.student_id
inner join field f on fc.field = f.field_id
select s.surname, s.name, s.patronymic
--fc.mark, f.field_name
from student s
inner join field_comprehension fc on s.student_id = fc.student_id
inner join field f on fc.field = f.field_id
where fc.mark = 5 and f.field_name = 'Базы данных'
order by s.surname, s.name
select distinct sg.students_group_number
from students_group sg
inner join student s on s.students_group_number = sg.students_group_number
inner join field_comprehension fc on s.student_id = fc.student_id
inner join field f on fc.field = f.field_id
where fc.mark = 5 and f.field_name like '%Физика%'
order by sg.students_group_number
with great_mark as (
select s.student_id, count(fc.mark) as marks
from student s
inner join field_comprehension fc on s.student_id = fc.student_id
where fc.mark = 5
GROUP BY s.student_id
)
select distinct s.surname, s.name, s.patronymic
from students_group sg
inner join student s on s.students_group_number = sg.students_group_number
inner join great_mark gm on s.student_id = gm.student_id
where gm.marks > 10
and sg.students_group_number like 'ИВТ%'
--order by s.surname, s.name, s.patronymic;
select p.surname, s.surname
from professor p
left join student s on p.surname = s.surname
select students_group_number
from students_group
union
select full_title
from structural_unit
order by 1
select
'Семестр ' || zet as semester_name,
count(*) as discipline_count
from field
group by zet
union
select
p.surname,
count(*) as discipline_count
from field f
inner join professor p on f.professor_id = p.professor_id
where f.zet = 5
group by p.surname
select contract_number::text, wage_rate
from employment
where wage_rate > (
select avg(wage_rate)
from employment
)
union
select 'Средняя ставка', round(avg(wage_rate), 3)
from employment
order by 1
with count_great_mark as (
select f.field_name, count(*) as five_count
from field f
inner join field_comprehension fc on fc.field = f.field_id
where fc.mark = 5
group by f.field_name
),
best_subject as(
select field_name
from count_great_mark
where five_count = (select max(five_count) from count_great_mark)
)
select ' Дисциплина: ' || field_name
from best_subject
union
select s.surname || ' ' || s.name || ' ' || s.patronymic as full_name
from student s
inner join field_comprehension fc on fc.student_id = s.student_id
inner join field f on fc.field = f.field_id
where f.field_name in (select field_name from best_subject) and fc.mark = 5
order by 1
select surname, name, patronymic
from professor
where professor_id in (
select professor_id
from professor
except
select professor_id
from field
where field_name = 'Базы данных'
)
Вывести изучающиеся дисциплины каждой группы
select sg.students_group_number, f.field_name
from students_group sg
inner join structural_unit su
on su.structural_unit_id = sg.structural_unit_number
inner join field f
on su.structural_unit_id = f.structural_unit_id
Вывести дисциплины и преподавателей, которые их ведут
select f.field_name, p.surname, p.name, p.patronymic
from field f
left join professor p on p.professor_id = f.professor_id
order by f.field_name
Вывести ФИО всех людей, числящихся в ВУЗе
select surname, name, patronymic
from professor
union
select surname, name, patronymic
from student
order by 1
Контрольные вопросы
Существует ли отличие между использованием ключевых слов INNER JOIN или перечисления таблиц через запятую в предложении FROM?
Да. При перечислении через запятую фильтрация по условиям соединения осуществляется через where. При использовании inner join условие задаётся через on.
Для чего предназначено соединение LEFT JOIN?
Операция левого внешнего соединения (LEFT) возвращает все строки левой (первой) таблицы, включая те, для которых не нашлось парного значения в правой (второй) таблице. Вместо ненайденных значений атрибутов правой таблицы будет указано неопределенное значение NULL.
В чем отличие коррелированного от некоррелированного подзапроса?
Назовите отличие соединения таблиц от их объединения.
Соединение используется для комбинирования строк из двух или более таблиц на основе связанных между ними полей. Объединение используется для объединения результатов двух или более SELECT-запросов в один набор результатов. При этом количество столбцов и их типы данных должны совпадать.
В каких случаях используется ключевое слово INNER и OUTER?
Внутреннее соединение - INNER JOIN используется для отбора строк из двух таблиц, в которых совпадают значения поля, по которому происходит объединение.
Внешнее соединение - OUTER JOIN позволяет включить в вывод все строки из одной или обоих таблиц. Его можно разделить на правое (RIGHT), левое (LEFT) и полное (FULL).
Операция левого внешнего соединения (LEFT) возвращает все строки левой (первой) таблицы, включая те, для которых не нашлось парного значения в правой (второй) таблице. Вместо ненайденных значений атрибутов правой таблицы будет указано неопределенное значение NULL. Аналогично, операция правого внешнего соединения (RIGHT) возвращает все строки правой (второй) таблицы, включая те, для которых не нашлось пары в левой. Обратите внимание, операции правого и левого соединения не коммутативны: A LEFT JOIN B ≠ B LEFT JOIN A. Вывод A LEFT JOIN B совпадает с B RIGHT JOIN A.
Полное внешнее соединение (FULL) включает в себя все пересекающиеся строки и все непарные строки из обеих таблиц.
В чем разница использования конструкции CTE и вложенного запроса?
Для упрощения сложного запроса возможно использовать конструкцию CTE (Common table expression), позволяющую разбить его на несколько частей. Эта конструкция определяет временные таблицы, которые существуют только для одного запроса. CTE похожи на вложенные запросы, но более оптимизированы. Вложенный запрос в отличие от CTE повторяется для каждой строки, которую нашел основной запрос, что повышает ресурсоемкость и замедляет работу кода.
В чем отличие представления от обычного запроса?
Представление (View):
Представление — это виртуальная таблица, созданная на основе результата запроса. Оно не хранит данные самостоятельно, а отображает данные из одной или нескольких таблиц. Представления могут быть использованы как обычные таблицы в других запросах.
Обычный запрос:
Обычный запрос — это SQL-команда, которая извлекает данные из базы данных на основе определённых условий. Запрос выполняется каждый раз, когда он вызывается, и возвращает результат в виде набора строк.