Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 3 СУБД

.docx
Скачиваний:
2
Добавлен:
29.05.2025
Размер:
1.56 Mб
Скачать

Лабораторная работа 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 = 'Базы данных'

)

  1. Вывести изучающиеся дисциплины каждой группы

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

  1. Вывести дисциплины и преподавателей, которые их ведут

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

  1. Вывести ФИО всех людей, числящихся в ВУЗе

select surname, name, patronymic

from professor

union

select surname, name, patronymic

from student

order by 1

Контрольные вопросы

  1. Существует ли отличие между использованием ключевых слов INNER JOIN или перечисления таблиц через запятую в предложении FROM?

Да. При перечислении через запятую фильтрация по условиям соединения осуществляется через where. При использовании inner join условие задаётся через on.

  1. Для чего предназначено соединение LEFT JOIN?

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

  1. В чем отличие коррелированного от некоррелированного подзапроса?

  1. Назовите отличие соединения таблиц от их объединения.

Соединение используется для комбинирования строк из двух или более таблиц на основе связанных между ними полей. Объединение используется для объединения результатов двух или более SELECT-запросов в один набор результатов. При этом количество столбцов и их типы данных должны совпадать.

  1. В каких случаях используется ключевое слово 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) включает в себя все пересекающиеся строки и все непарные строки из обеих таблиц.

  1. В чем разница использования конструкции CTE и вложенного запроса?

Для упрощения сложного запроса возможно использовать конструкцию CTE (Common table expression), позволяющую разбить его на несколько частей. Эта конструкция   определяет временные таблицы, которые существуют только для одного запроса. CTE похожи на вложенные запросы, но более оптимизированы. Вложенный запрос в отличие от CTE повторяется для каждой строки, которую нашел основной запрос, что повышает ресурсоемкость и замедляет работу кода.

  1. В чем отличие представления от обычного запроса?

  • Представление (View):

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

  • Обычный запрос:

    • Обычный запрос — это SQL-команда, которая извлекает данные из базы данных на основе определённых условий. Запрос выполняется каждый раз, когда он вызывается, и возвращает результат в виде набора строк.

Соседние файлы в предмете Системы управления базами данных