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

MySql вложенные запросы

Категория:

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

Дисциплина:

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

Город:

Беларусь, Минск

Учебное заведение:

БНТУ, ФИТР

Стоимость работы:

2 руб.

Оценка: 10
Объем страниц: 5
Год сдачи: 2020
Дата публикации: 22.10.2020

Фрагменты для ознакомления

Отчёт

По лабораторной работе

Вложенные запросы в MySql

Вложенный запрос — это подзапрос, заключенный в круглые скобки и вложенный в WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE фразу.

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

Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE (HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения (= | <> | < | <= | > | >=). 

Ссылка со вложенными запросами показана на рисунке 3.1:

Рисунок 3.1 – Вложенные запросы

 

3.1 Простой вложенный запрос

Простые вложенные запросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN, что иллюстрируется в следующем примере (рисунок 3.1.1).

Рисунок 3.1.1 – Некоррелированный (простой вложенный) запрос

create table `fakultety` (
  id int unsigned not null auto_increment,
  `nazvanie` varchar(4) default null,
  `kolichestvo_mest` tinyint(4) default null,
  primary key (id)
);

 

create table `kafedry` (
  id int unsigned not null auto_increment,
  `nazvanie` varchar(46) default null,
  `fakultety_id` int unsigned default null,
  primary key (id),
  foreign key (fakultety_id) references fakultety(id)
  on update cascade
  on delete cascade
);

 

create table `gruppy` (
  id int unsigned not null auto_increment,
  `nomer` int(11) default null,
  `kafedry_id` int unsigned default null,
  primary key (id),
  foreign key (kafedry_id) references kafedry(id)
  on update cascade
  on delete cascade
);

 

SELECT f.name AS fakultetyName, f.kolichestvo_mest 
        FROM fakultety f 
        WHERE f.id 
        IN (SELECT DISTINCT fakultety_id 
            FROM kafedry 
            INNER JOIN gruppy ON kafedry.id = gruppy.kafedry_id 
            GROUP BY gruppy.kafedry_id HAVING COUNT(gruppy.kafedry_id) >= 2) 
            ORDER BY f.name asc;

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

 

3.2 Запрос с коррелированным вложенным запросом

174