Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 Практический раздел.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.18 Mб
Скачать

Лабораторная работа №10

Тема: Разработка вложенных SELECT-запросов. Объединение и соединение запросов.

Цель работы: Научится создавать вложенные SELECT-запросы к БД, изучить использование связей между таблицами.

Время работы: 2 учебных часа.

Правила по ТБ: Общие.

Оборудование рабочего места: Практикум, ПК.

Программное обеспечение: Windows, MS Office.

Вопросы входного контроля:

  1. Дайте определение понятию запрос.

  2. Напишите синтаксис SELECT-запроса.

  3. Назовите, что получается в результате выполнения запроса

  4. Дайте определение вложенного запроса.

  5. Расскажите, с какими условиями можно выполнять запросы.

  6. Расскажите для чего используют вложенные запросы.

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Подзапросы

Допустим нам необходимо найти сотрудников, которые получают больше чем сотрудник Smith. Решение данной задачи усложняется ввиду того, что для нахождения подобных сотрудников нам необходимо:

  1. Узнать зарплату сотрудника Smith

  2. Вытащить всех чья зарплата выше? чем зарплата полученная в предедущем шаге.

На языке SQL это решение будет выглядить ввиде двух запросов, при этом один из запросов будет вложен в другой запрос. Запрос находящийся внутри другого запроса называеться – подзапросом. Подзапрос возвращает значение, которое будет использоваться в основном запросе. Использования подзапросов, есть использования по очереди двух запросов, сперва получаем данные из подзапроса, а затем используем эти данные в качестве данных основного запроса.

  

Синтаксис и свойства подзапросов

Синтаксис простого подзапроса выглядит так:

SELECT select_list

FROM table

WHERE expr operator

(SELECT select_list

FROM table)

Здесь в качестве оператора может играть роль такие операторы сравнения как >;>=;<;<=;OR;IN при работе с запросами возравщающие ровно одно значение, а также для решения задач запросами возвращающие множество строк используйте в качестве операторов IN; ANY; ALL.

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

  • В разделе SELECT

  • В качестве таблицы в разделе FROM

  • В разделе WHERE

  • В условиях HAVING

  • В разделе ORDER BY

Рассмотрим список правил, которые необходимо соблюдать во время построение подзапроса:

  • Подзапрос должен быть включен внутрь круглых скобок

  • Подзапрос необходимо ставить правую часть от оператора сравнения

  • Необходимости в упорядочения вывода подзапроса нет необходимости за исключением случаев, когда необходимо получить запроса типа Топ – n

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

 

Типы подзапросов

Как уже вы наверное поняли из описания подзапросов существует два типа подзапросов:

  • Подзапросы, возражающие один результат

  • Подзапросы, возражающие множество строк в качестве результата.

Подзапросы возражающие один результат

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

 

Оператор

Значение

 

=

равно

>

больше

<

меньше

>=

больше или равно

<=

меньше или равно

<>

не равно

!=

не равно

 

Пример запроса – вывести всех сотрудников, чьи зарплаты больше зарплаты сотрудника SMITH :

SELECT *

FROM emp

WHERE sal > (SELECT sal

FROM emp

WHERE ename = 'SMITH');

 

Мы рассмотрели простой пример подзапроса, немного усложним логику запроса и получим:

SELECT *

FROM emp

WHERE job = (SELECT job

FROM emp

WHERE ename = 'SMITH')

AND   sal >  (SELECT MIN (sal)

FROM emp

);

 

Как можно заметить из примера, в запросе можно использовать несколько подзапросов. В таком случаи результат будет получен сперва из подзапросов по очереди, а затем все данные полученные из подзапросов будут проставлены в качестве значений в основной запрос.

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

До сих пор мы рассмотрели примеры подзапросов работающих в условии WHERE, но на практике бывает необходимость использования подзапросов в разделе HAVING. Подзапрос в этом случаи будет выполнен и результат будет направлен в условия HAVING.

Рассмотрим пример, где без подзапроса в разделе HAVING не обойтись. Допустим, нам необходимо вычислить какой из отделов получает самую низкую среднеарифметическую зарплату среди всех отделов компании.

SELECT job, avg(sal)

FROM emp

GROUP BY job

HAVING AVG(sal) = (SELECT MIN(AVG(sal))

FROM emp

GROUP BY job);