Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример синтаксиса подзапроса используемого в WHERE




SELECT имена полей

FROM имена таблиц

WHERE поле сравнение (SELECT имя поля

FROM имена таблиц

WHERE условие

…………………….. )

 

 

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

 

 

Использование подзапросов возвращающих одно значение

Пример: Вывести фамилии сотрудников отдела, оклад которых ниже среднего в отделе.

 

 


 

Использование подзапросов возвращающих несколько значений

В этом случае необходимо использовать предикаты IN, ANY, ALL.

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

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

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

SELECT *

FROM Т1

Заказано
WHERE Х IN (SELECT Z FROM T2)

Адрес КодТовара
Париж  
Рим  
Лондон  
Париж  
Париж  
Париж  
Рим  
Лондон  
Рим  
Мадрид  
Лондон  
Рим  
Мадрид  

 

Если Х=10 а Z(3, 5, 7, 10, 8) то ИСТИНА

КодТовара Товар Цена
  Кока-кола  
  Пиво  
  Торт  
  Фанта  
  Шампанское  
  Морс  
  Сапоги  
  Валенки  
  Кефир  

 

Товары

Пример: Показать все товары заказанные Парижем:

Пример: Показать все товары ….?

 

2. Предикат ANY используется для отбора записей в главном запросе, которые удовлетворяют сравнению хотя бы с одним значением из всех отобранных в подчиненном запросе.

SELECT * FROM Т1 WHERE Х < ANY (SELECT Z FROM T2)

 

Если Х=6 а Z(3, 5, 7, 10, 8) то ИСТИНА

Если Х=16 а Z(3, 5, 7, 10, 8) то ЛОЖЬ

 

ПРИМЕР:

Показать фамилии студентов 1-й группы, балл которых больше хотя бы одного балла студентов 2-й группы.

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

3. Предикат ALL используется для отбора в главном запросе только тех записей, которые удовлетворяют сравнению со всеми записями, отобранными в подчиненном запросе.

SELECT * FROM Т1 WHERE Х > ALL (SELECT Z FROM T2)

Если Х=6 а Z(3, 5, 7, 10, 8) то ЛОЖЬ

Если Х=15 а Z(3, 5, 7, 10, 8) то ИСТИНА

 

 

ПРИМЕР:

Показать фамилии студентов 1-й группы, балл которых, больше всех из баллов, студентов 2-й группы.

 

 


Примеры с подзапросами

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

В мастер-таблице "Товары" представлены различные выпускаемые товары.

В мастер-таблице "Клиенты" перечислены фирмы покупающие различные товары.

В дочерней таблице "Заказы" представлены товары, проданные фирмам по определенной цене.

Структура базы данных представлена ниже.

           
   
Клиенты
 
Товары
 
Заказы
 
 
 

ВКТ Цена ВКК
     
     
     
     
     
     
     
     
     
     
     

 

ПКК Фирма
  Электрон
  Аргус
  Техно

 

 

 


 

 

Запрос 1.

Показать цены, по которым были проданы телевизоры.

 

Подзапрос в таблице "Товары" ищет товар Телевизор и возвращает его ключ (ПКТ). Далее, основной запрос, в таблице "Заказы", сравнивает ключ товара (ВКТ) с ключом телевизора, возвращенного подзапрорсом, и при их совпадении, возвращает цену товара.

 

Запрос 2.

Определить Фирмы, купившие более трех товаров.

 

 

Подзапрос,в таблице "Заказы",по ключам клиентов (ВКК), определяет количество заключенных контрактов с каждым клиентом, и возвращает ключи клиентов купивших более трех товаров.

Основной запрос сравнивает ключ клиента (ПКК) из таблицы "Клиенты", с ключами определенными подзапросом, и при их совпадении возвращает название фирмы.


Запрос 3.

Определить фирмы купившие телевизоры.

 

 

По названию товара определяется первичный ключ товара (ПТК). По ПТК определяются внешние ключи клиентов (ВКТ) купивших данный товар. При совпадении ПКТ и ВКТ возвращается название фирмы.

 

 

Запрос 4.

Определить количество товара купленного каждой фирмой.

 


Соединение таблиц

Соединение таблиц имеет смысл только для реляционных баз данных, когда таблицы, связаны между собой отношением подчиненности. Для соединения таблиц применяется оператор INNER JOIN (внутреннее соединение).

Оператор INNER JOIN записывается в предложении FROM и объединяет записи из двух таблиц, если связующие поля этих таблиц содержат одинаковые значения.

SELECT имена полей таблиц

FROM таблица1 INNER JOIN таблица2 ON таблица1.поле оператор таблица2.поле

 

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

 

Обратимся к базе данных, структура которой была приведена в разделе "Подзапросы" и выполним соединение таблиц.

           
   
Клиенты
 
Товары
 
Заказы
 
 
 

ВКТ Цена ВКК
     
     
     
     
     
     
     
     
     
     
     

 

ПКК Фирма
  Электрон
  Аргус
  Техно

 

 

 


 

Запрос 1. Соединить таблицы "Товары" и "Заказы"

 


Запрос 1. Соединить таблицы "Товары", "Заказы", "Клиенты"

 

 

 

 

 

 

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

 

Запрос 1.

Показать цены, по которым были проданы телевизоры.

 

 

Запрос 2.

Определить Фирмы, купившие более трех товаров.

 

 

 

 

 

Запрос 3.

Определить фирмы купившие телевизоры.

 

 

Запрос 4.

Определить количество товара купленного каждой фирмой.

 

 

Вывод:

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

 


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...