СХЕМЫ ПРЕОБРАЗОВАНИЯ SQL-ЗАПРОСОВ - Студенческий научный форум

X Международная студенческая научная конференция Студенческий научный форум - 2018

СХЕМЫ ПРЕОБРАЗОВАНИЯ SQL-ЗАПРОСОВ

Иванов В.Д. 1
1ГБПОУ Колледж автоматизации и информационных технологий 20
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
ВВЕДЕНИЕ

SQL-запросы являются основным средством манипулирования данными в реляционных БД. Очевидно, что сложность запросов, дающих один и тот же результат для одного состояния БД, может существенно различаться. В связи с этим интерес представляет задача получения полной системы схем преобразований запросов, позволяющих преобразовывать эквивалентные запросы друг в друга. Задача в первом приближении напоминает задачу построения полных схем преобразований для различных алгебраических систем, однако имеет и существенные отличия. В такой постановке – определения полной системы схем преобразований запросов в мировой практике задача не решалась . Поэтому интерес представляют любые результаты, полученные в этом направлении.

Целью работы является разработка преобразований SQL-запросов к Базе данных, а также создание унифицированных схем запросов, упрощающих процесс их разработки.

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

Для достижения поставленной цели в работе решались следующие задачи:

  • разработка разных запросов на языке SQL к базе данных;

  • разработка схем к составленным запросам;

  • преобразование SQL-запросов;

  • анализ запросов и схем к ним;

  • систематизация полученных результатов;

  • выводы.

В процессе данной работы создано 12 запросов (однотабличных и многотабличных) к БД. К каждому из запросов разработаны по несколько вариантов конструкций (от 3 до 6), дающих аналогичные результаты. Составлены схемы всех вариантов преобразований запросов и таблица с вариантами транскрипции для некоторых вариантов запросов.

Тем самым сделан шаг к решению задачи получения полной системы преобразований SQL-запросов, позволяющих преобразовывать эквивалетные запросы (т.е. получающие одинкаовые результаты на одной базе данных).

4

1.ПРАКТИЧЕСКАЯ ЧАСТЬ

1.1.Разработка запросов к базе данных

В процессе работы было сконструировано 12 типовых запросов к БД «Пансион»:

- запросы на выборку;

- на выборку с условиями отбора;

- на выборку с логическими операциями при условии отбора;

- на объединение записей в многотабличном запросе;

- на соединение таблиц с группировкой данных;

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

- простые вложенные подзапросы;

- многоступенчатые вложенные подзапросы;

- коррелированные вложенные подзапросы.

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

  • команда SELECT (выбрать),

  • предложения FROM (из),

  • предложения WHERE (где), содержащие условия отбора:

- предикаты сравнения с использованием реляционных операторов (= | | < | | >=),

5

- условия BETWEEN (между),

- IN (принадлежит),

- LIKE (похоже на),

- IS NULL (не определено),

- EXIST (существует),

  • логические операторы (AND, OR, NOT),

  • предложения ORDER BY (упорядочить),

  • GROUP BY (группировать),

  • модификатор DISTINCT (исключить),

  • соединения INNER JOIN.

Все разработанные запросы представлены в Приложениях (Приложения 1 – 12).

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

В качестве примера в этом разделе приведены все конструкции Запроса 1, которые приводят к одинаковому результату.

Запрос 1.

Выдать названия и статус поставщиков продуктов 7 (молоко) и 8 (творог).

Рисунок 1 Результат запросов

6

Вариант 1.

Запрос_Практика_Соединение_Продукт_7_8

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

FROM Поставщики INNER JOIN Поставки ON Поставщики.ПС=Поставки.ПС

WHERE ПР=7 OR ПР=8;

Вариант 2.

Запрос_Практика_Коррел_Продукт_7_8

SELECT X.Название, X.Статус, Y.ПР

FROM Поставки AS Y INNER JOIN Поставщики AS X ON Y.ПС=X.ПС

WHERE Y.ПР=7

OR Y.ПР=8;

Вариант 3.

Запрос_Практика_Коррелир_Продукт_7_8_копия

SELECT DISTINCT Y.Название, Y.Статус, X.ПР

FROM Поставки AS X, Поставщики AS Y

WHERE (((X.ПР)=7 Or (X.ПР)=8) AND ((X.ПС)=[Y].[ПС]));

Вариант 4.

Запрос_Практика_Простой_Вложенный_Продукт_7_8

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

FROM Поставщики

WHERE ПС IN

(SELECT ПС

FROM Поставки

WHERE ПР = 7 OR ПР = 8);

Вариант 5.

Запрос_Практика_Продукт_Молоко_Творог

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

7

FROM Поставщики, Поставки, Продукты

WHERE (((Поставщики.ПС)=[Поставки].[ПС])

AND ((Поставки.ПР)=[Продукты].[ПР])

AND ((Продукты.Продукт)='Молоко' Or (Продукты.Продукт)='Творог'));

Вариант 6.

Запрос_Практика_Вложенный_Продукт_7_8

SELECT Поставщики.Статус, Поставщики.Название, Поставки.ПР

FROM (Поставщики INNER JOIN Поставки ON Поставщики.ПС = Поставки.ПС) INNER JOIN Продукты ON Поставки.ПР = Продукты.ПР

WHERE (((Поставщики.[ПС]) In

(SELECT ПС

FROM Поставки

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Продукт = 'Молоко' OR Продукт = 'Творог'))) AND

((Поставки.ПР)=7 Or (Поставки.ПР)=8));

Как видно из представленных выше данных, существует вариативность конструкций запросов, созданных на языке SQL, которые приводят к одному и тому же результату. Точно также по несколько вариантов конструкций разработано для всех 12-ти представленных в работе запросов.

1.2Разработка схем к составленным запросам

В процессе работы все варианты конструкций запросов преобразованы в обезличенные схемы (Приложения 1-12). Это сделано с целью уменьшения громоздкости конструкций и их унификации.

8

Для этого в схемах конкретные имена таблиц заменены на “Тab1”, “Tab2”, «Tab3”, имена полей - буквами английского алфавита X, Y, Z , конкретное условие (условия) - REL.

В качестве примера в этом разделе приведены конструкции и схемы Запроса 2:

«Выдать блюда, основу которых составляют только овощи, их вес»

Рисунок 2 – результат запроса

Вариант 1

Запрос_Состав_1

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Блюда, Продукты, Состав

WHERE (((Состав.бл)=Блюда.БЛ)

And ((Состав.ПР)=Продукты.ПР)

And ((Блюда.Основа)='Овощи'));

Вариант 2

Запрос_Практика_Состав_2

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ=Состав.БЛ) ON Продукты.ПР=Состав.ПР

WHERE (((Блюда.Основа)='Овощи'));

Вариант 3

9

Запрос_Практика_Состав_3

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ = Состав.БЛ) ON Продукты.ПР = Состав.ПР

WHERE (((Блюда.[БЛ]) In

(SELECT БЛ

FROM Состав

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Основа = 'Овощи'))) AND ((Блюда.Основа)='Овощи'));

Как видно из рассмотрения схемы запроса 2, преобразования по обезличиванию параметров запроса дают возможность сделать транскрипцию более компактной и наглядной. Такие же унифицированные схемы составлены для всех двенадцати запросов, сконструированных в процессе проведения данной работы (Приложения 1 – 12).

10

1.3Разработка вариантов транскрипции запросов

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

Для эксперимента был использован прием замены отдельных элементов конструкции запроса 2 (всех трех вариантов) на заглавные буквы английского алфавита. Так, R1, R2, R3 - названия таблиц (отношений), А1, А2, А3 - названия атрибутов (столбцов), REL – конкретное условие. Результат представлен в таблице 1.3.1. Таблица 1.3.1

 

Варианты транскрипции запроса 2

Выдать блюда, основу которых составляют только овощи, их вес.

Вар.

запр.

1

2

3

1

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Блюда, Продукты, Состав

WHERE (((Состав.бл)=Блюда.БЛ)

And ((Состав.ПР)=Продукты.ПР)

And ((Блюда.Основа)='Овощи'));

SELECT A1, A2, A3 FROM R1, R2, R3

WHERE (((R1.A1 = R3.A1)

AND ((R3.A2) = R2.A2)

AND REL;

From Tab1 AS X, Tab2 AS Y, Tab3 AS Z

WHERE REL1(X, Y)

AND REL2(Y, Z)

AND REL3;

2

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ=Состав.БЛ) ON Продукты.ПР = Состав.ПР

WHERE (((Блюда.Основа)='Овощи'));

SELECT A1, A2, A3

FROM R2 INNER JOIN (R1 INNER JOIN R3 ON R1.A1 = R3.A1) ON R2.A2 = R3.A2

WHERE REL;

From Tab2 AS Y (Tab1 AS X INNER JOIN Tab3 AS Z ON REL1(X, Z)) ON REL2(Y, Z )

WHERE REL 3;

3

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ = Состав.БЛ) ON Продукты.ПР = Состав.ПР

WHERE (((Блюда.[БЛ]) In

(SELECT БЛ

FROM Состав

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Основа = 'Овощи'))) AND ((Блюда.Основа)='Овощи'));

SELECT A1, A2, A3

FROM R2 INNER JOIN (R1 INNER JOIN R3 ON R1.A1 = R3.A1) ON R2.A2 = R3.A2

WHERE (((R1.[A1] IN

(SELECT A1

FROM R3

WHERE A2 IN

(SELECT A2

FROM R2

WHERE REL1))) AND

REL2;

From Tab2 AS Y (Tab1 AS X INNER JOIN Tab3 AS Z ON REL1(X, Z)) ON REL2(Y, Z)

WHERE (((Tab1[AS X]) IN

(SELECT X

FROM Tab3

WHERE Y IN

(SELECT Y

FROM Tab2

WHERE REL3)))

AND REL4;

11

Как видно из данных, представленных в табл.1.3.1, введение символики при преобразовании (варианты транскрипции запроса 2 и 3) позволяет упростить конструкции запросов и сократить их громоздкость, а также привести SQL-запросы к общему виду, что позволит в дальнейшем использовать их для создания других подобных запросов.

12

2.АНАЛИЗ РЕЗУЛЬТАТОВ РАБОТЫ

В результате анализа созданных в процессе работы SQL-запросов доказана возможность получения одного и того же результата запроса при использовании разных типовых конструкций языка SQL. Это может быть соединение таблиц, объединение по равенству, внутреннее объединение, вложенные простые и вложенные многоступенчатые подзапросы, коррелированные подзапросы, запросы с применением копий, использованием функций – sum, count.

Так, получение результата, например, по запросу 1, возможно при использовании 6-ти разных вариантов конструкций запроса (Приложение 1), по запросам 4,9,10,12 – четырех вариантов (Приложения 4,9,10,12), по запросам 2,3,5,6,11 – трех вариантов (Приложения 2,3,5,6,11) , по запросам 7,8 – двух (Приложения 7,8). Такая вариативность дает возможность выбора наиболее целесообразной конструкции для конкретного запроса, а также является доказательством гибкости, универсальности и мощи языка запросов SQL.

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

В схеме 2.1 представлены взаимосвязи между запросами 1, 2, 3, 5, 6, 7, 9 и схемами (или алгоритмами 1, 2, 3, 4) их типовых конструкций.

Например, конструкции на объединение таблиц по равенству, созданные в запросах 1,2,3,6,7,9, идентичны и могут быть приведены к общему виду для создания любых запросов на операции такого вида (схема 2.1 алгоритм 1). То же самое можно сказать и о конструкции на внутреннее объединение таблиц, которая используется в запросах 1,2,6,7,9 (схема 2.1 алгоритм 2), и о конструкции простых вложенных подзапросов – в запросах 1,3,5,6,7 (схема2.1

13

алгоритм 3), и о конструкции вложенных многоступенчатых запросов– в запросах 1,2,5 (схема 2.1 алгоритм 4).

Схема 2.1

Связи между запросами и типовыми схемами.

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

14

ВЫВОДЫ

В процессе проделанной работы было сконструировано 12 типовых SQL-запросов к БД «Пансион».

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

Каждая конструкция SQL-запросов (41вариант) была преобразована в обезличенную схему, что позволило уменьшить их громоздкость и унифицировать эти конструкции с тем, чтобы применять их при составлении запросов, ориентированных на получение разных результатов.

Разработана схема взаимосвязей между разными запросами и схемами (или алгоритмами) их типовых конструкций.

Составлена сравнительная таблица с разными вариантами транскрипции одного из запросов.

В результате проделанной работы сделаны следующие выводы:

1.Показана возможность получения одного и того же результата запроса при использовании разных типовых конструкций языка SQL.

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

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

15

4.Показано, что преобразования SQL-запросов в обезличенные схемы дают возможность использования этих схем в качестве алгоритмов для создания других подобных запросов.

16

ПРИЛОЖЕНИЯ

Приложение 1

Запрос 1.

Выдать названия и статус поставщиков продуктов 7 (молоко) и 8 (творог).

Рисунок 1 Результат запросов

Вариант 1.

Запрос_Практика_Соединение_Продукт_7_8

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

FROM Поставщики INNER JOIN Поставки ON Поставщики.ПС=Поставки.ПС

WHERE ПР=7 OR ПР=8;

Вариант 2.

Запрос_Практика_Коррел_Продукт_7_8

SELECT X.Название, X.Статус, Y.ПР

FROM Поставки AS Y INNER JOIN Поставщики AS X ON Y.ПС=X.ПС

WHERE Y.ПР=7

OR Y.ПР=8;

Вариант 3.

Запрос_Практика_Коррелир_Продукт_7_8_копия

SELECT DISTINCT Y.Название, Y.Статус, X.ПР

FROM Поставки AS X, Поставщики AS Y

WHERE (((X.ПР)=7 Or (X.ПР)=8) AND ((X.ПС)=[Y].[ПС]));

Вариант 4.

Запрос_Практика_Простой_Вложенный_Продукт_7_8

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

FROM Поставщики

2

WHERE ПС IN

(SELECT ПС

FROM Поставки

WHERE ПР = 7 OR ПР = 8);

Вариант 5.

Запрос_Практика_Продукт_Молоко_Творог

SELECT Поставщики.Название, Поставщики.Статус, Поставки.ПР

FROM Поставщики, Поставки, Продукты

WHERE (((Поставщики.ПС)=[Поставки].[ПС])

AND ((Поставки.ПР)=[Продукты].[ПР])

AND ((Продукты.Продукт)='Молоко' Or (Продукты.Продукт)='Творог'));

Вариант 6.

Запрос_Практика_Вложенный_Продукт_7_8

SELECT Поставщики.Статус, Поставщики.Название, Поставки.ПР

FROM (Поставщики INNER JOIN Поставки ON Поставщики.ПС = Поставки.ПС) INNER JOIN Продукты ON Поставки.ПР = Продукты.ПР

WHERE (((Поставщики.[ПС]) In

(SELECT ПС

FROM Поставки

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Продукт = 'Молоко' OR Продукт = 'Творог'))) AND

((Поставки.ПР)=7 Or (Поставки.ПР)=8));

3

Схема запроса 1

 

SELECT Tab1 AS X, Tab1 AS Y, Tab2 AS Z

From Tab1 AS X INNER JOIN Tab2 AS Z ON REL1(X, Z)

WHERE REL 2 OR REL3;

 

 

SELECT L AS X, L AS Y, M AS Z

From Tab1 AS X INNER JOIN Tab2 AS Z ON REL1(L, M)

WHERE REL 2 OR REL 3;

 

 

SELECT DISTINCT M AS X, M AS Y, L AS Z

From Tab1 AS X, Tab2 AS Z

WHERE REL1 OR REL2 AND REL3 (L, M);

 

 

Запрос 1

 

 

From Tab1 AS X

WHERE X IN

(SELECT X

FROM Tab2

WHERE REL1 OR REL2);

 

 

From Tab1 AS X, Tab2 AS Y, Tab3 AS Z

WHERE REL1(X, Y) AND REL2(Y, Z) AND REL3 OR REL4;

 

 

From Tab1 AS X INNER JOIN Tab2 AS Z ON REL1(X, Z) INNER JOIN Tab3 AS F ON REL2 (Z, F)

WHERE ((([X] IN

(SELECT X

FROM Tab2

WHERE Z IN

(SELECT Z

FROM Tab3

WHERE REL3 OR REL4)))

AND REL5 OR REL6));

 

Приложение 2

Запрос 2

Выдать блюда, основу которых составляют только овощи, их вес.

Рисунок 2 – результат запроса

Вариант 1

Запрос_Состав_1

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Блюда, Продукты, Состав

WHERE (((Состав.бл)=Блюда.БЛ)

And ((Состав.ПР)=Продукты.ПР)

And ((Блюда.Основа)='Овощи'));

Вариант 2

Запрос_Практика_Состав_2

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ=Состав.БЛ) ON Продукты.ПР=Состав.ПР

WHERE (((Блюда.Основа)='Овощи'));

Вариант 3

Запрос_Практика_Состав_3

SELECT Блюда.Блюда, Продукты.Продукт, Состав.Вес

FROM Продукты INNER JOIN (Блюда INNER JOIN Состав ON Блюда.БЛ = Состав.БЛ) ON Продукты.ПР = Состав.ПР

WHERE (((Блюда.[БЛ]) In

(SELECT БЛ

FROM Состав

2

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Основа = 'Овощи'))) AND ((Блюда.Основа)='Овощи'));

Схема запроса 2

 

From Tab1 AS X, Tab2 AS Y, Tab3 AS Z

WHERE REL1(X, Y) AND REL2(Y, Z) AND REL3;

 

 

From Tab2 AS Y (Tab1 AS X INNER JOIN Tab3 AS Z ON REL1(X, Z)) ON REL2(Y, Z )

WHERE REL 3;

 

 

Запрос 2

 

 

From Tab2 AS Y (Tab1 AS X INNER JOIN Tab3 AS Z ON REL1(X, Z)) ON REL2(Y, Z)

WHERE (((Tab1[AS X]) IN

(SELECT X

FROM Tab3

WHERE Y IN

(SELECT Y

FROM Tab2

WHERE REL3))) AND REL4;

 

Приложение 3

Запрос 3

Выдать число всех блюд, в состав которых входят помидоры.

Рисунок 3 - Результат запроса

Вариант 1.

Запрос_Количество_Блюд_С_Помидорами.

SELECT COUNT(Блюда.Блюда) AS [Число Блюд С Помидорами]

FROM (Блюда INNER JOIN Состав ON Блюда.БЛ = Состав.БЛ) INNER JOIN Продукты ON Состав.ПР = Продукты.ПР

WHERE Продукты.Продукт = 'Помидоры';

Вариант 2.

Запрос_Практика_1_Количество_Блюд_С_Помидорами

SELECT COUNT(Блюда.Блюда) AS [Число Блюд С Помидорами]

FROM Блюда, Состав, Продукты

WHERE Блюда.БЛ=Состав.БЛ

AND Состав.ПР=Продукты.ПР

AND Продукты.Продукт='Помидоры';

Вариант 3.

Запрос_Практика_2_Количество_Блюд_С_Помидорами.

SELECT COUNT(Блюда.Блюда) AS [Число Блюд С Помидорами]

FROM Блюда

WHERE БЛ IN

(SELECT БЛ

FROM Состав

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE Продукт = 'Помидоры'));

2

Схема запроса 3

 

SELECT COUNT Tab1 AS X

From Tab1 AS X INNER JOIN Tab2 AS Y ON REL1(X, Y) INNER JOIN Tab3 AS Z On REL 2(Y, Z)

WHERE REL 3;

 

 

Запрос 3

SELECT COUNT Tab1 AS X

From Tab1 AS X, Tab2 AS Y, Tab3 AS Z

WHERE REL1(X, Y) AND REL2(Y, Z) AND REL3;

SELECT COUNT Tab1 AS X

From Tab1 AS X

WHERE X IN

(SELECT X

FROM Tab2

WHERE Y IN

(SELECT Y

FROM Tab3

WHERE REL1));

 

Приложение 4

Запрос 4

Выдать названия всех блюд, в основу которых входит мясо.

Рисунок 4 – Результат запроса

Вариант 1.

Запрос_Мясные_Блюда_1

SELECT X.БЛ, X.Блюда, X.Основа

FROM Блюда AS X

WHERE X.Основа = 'Мясо';

Вариант 2.

Запрос_Практика_Мясные_Блюда

SELECT Блюда.БЛ, Блюда.Блюда, Блюда.Основа

FROM Блюда

WHERE (((Блюда.Основа)='Мясо'));

Вариант 3.

Запрос_Практика_Мясные_Блюда_1

SELECT БЛ, Блюда, Основа

FROM Блюда

WHERE БЛ IN (2,6);

Вариант 4

Запрос_Практика_Мясные_Блюда_2

SELECT БЛ, Блюда, Основа

FROM Блюда

WHERE Основа = 'Мясо';

2

Схема запроса

 

Запрос 4

SELECT L AS X, L AS Y, L AS Z

FROM Tab1 AS L

WHERE REL;

SELECT Tab1 AS X, Tab2 AS Y, Tab3 AS Z

FROM Tab1

WHERE REL;

SELECT X, Y, Z

FROM Tab1

WHERE X IN (REL);

SELECT X, Y, Z

FROM Tab1

WHERE REL;

 

Приложение 5

Запрос 5

Выдать поставщиков продуктов для «Салата рыбного», которые поставляют продукты за минимальную цену.

Рисунок 5 – Результат запроса

Вариант 1.

Запрос_Соединение_Таблиц_2

SELECT Продукт, Цена, Название, Статус

FROM Продукты, Состав, Блюда, Поставки, Поставщики

WHERE Продукты.ПР = Состав.ПР

AND Состав.БЛ = Блюда.БЛ

AND Поставки.ПР = Состав.ПР

AND Поставки.ПС = Поставщики.ПС

AND Блюда = 'Салат рыбный'

AND Цена =

(SELECT MIN (Цена)

FROM Поставки X

WHERE X.ПР = Поставки.ПР );

Вариант 2.

Запрос_Практика_Соединение_Таблиц_Салат_Рыбный

SELECT Продукты.Продукт, Поставки.Цена, Поставщики.Название, Поставщики.Статус

FROM (((Продукты INNER JOIN Поставки ON Продукты.ПР=Поставки.ПР) INNER JOIN Поставщики ON Поставки.ПС=Поставщики.ПС) INNER JOIN Состав ON Продукты.ПР=Состав.ПР) INNER JOIN Блюда ON Состав.БЛ=Блюда.БЛ

WHERE (((Блюда.Блюда)='Салат рыбный') AND ((Поставки.[Цена])=

(SELECT MIN (Цена)

FROM Поставки X

2

WHERE X.ПР = Поставки.ПР )));

Схема запроса 5

 

From Tab_List

WHERE REL1(X, Y) AND REL2(Y,F) AND REL3(F,G) AND REL4 AND Цена =

(SELECT MIN (Цена)

FROM Tab4 As F

WHERE REL5);

 

 

Запрос 5

FROM (((Tab1 As X INNER JOIN Tab2 As Y ON REL1(X,Y)) INNER JOIN Tab3 As Z ON REL2(Y,Z)) INNER JOIN Tab4 As F ON REL3(X,F) INNER JOIN Tab5 As G ON REL4(F,G)

WHERE REL5 AND [Цена] =

(SELECT MIN (Цена)

FROM Tab2 As Y

WHERE REL6);

 

Приложение 6

Запрос 6

Выдать блюда, продукты для которых поставляются агрофирмой ЛЕТО.

Рисунок 6 – Результат запроса

Вариант 1.

Запрос_Поставки_Фирмы_Лето

SELECT DISTINCT Блюда.Блюда AS [Блюда от Фирмы Лето]

FROM (((Блюда INNER JOIN Состав ON Блюда.БЛ = Состав.БЛ)

INNER JOIN Продукты ON Состав.ПР = Продукты.ПР)

INNER JOIN Поставки ON Поставки.ПР = Продукты.ПР)

INNER JOIN Поставщики ON Поставки.ПС = Поставщики.ПС

WHERE Поставщики.Название = 'Лето';

Вариант 2.

Запрос_Практика_Поставки_Фирмы_Лето

SELECT DISTINCT Блюда.Блюда AS [Блюда от Фирмы Лето]

FROM Блюда, Состав, Продукты, Поставки, Поставщики

WHERE Блюда.БЛ = Состав.БЛ

AND Состав.ПР = Продукты.ПР

AND Продукты.ПР = Поставки.ПР

AND Поставки.ПС = Поставщики.ПС

AND Поставщики.Название = 'Лето';

Вариант 3.

SELECT Блюда.Блюда AS [Блюда от Фирмы Лето]

FROM Блюда

WHERE БЛ IN

(SELECT БЛ

FROM Состав

WHERE ПР IN

(SELECT ПР

FROM Продукты

WHERE ПР IN

(SELECT ПР

FROM Поставки

WHERE ПС IN

(SELECT ПС

FROM Поставщики

WHERE Поставщики.Название = 'Лето'))));

Схема запроса 6

 

SELECT DISTINCT Tab1 AS [X]

FROM (((Tab1 INNER JOIN Tab2 REL1 (X,Y)) INNER JOIN Tab3 REL2 (Y,Z)) INNER JOIN Tab4 REL3 (Z,F)) INNER JOIN Tab5 REL4 (F,G)

WHERE REL5;

 

 

SELECT DISTINCT Tab1 AS [X]

FROM Tab_List

WHERE REL1 (X, Y) AND REL2 (Y, Z) AND REL3 (Z, F) AND REL4 (F, G) AND REL5;

 

 

Запрос 6

 

 

SELECT DISTINCT Tab1 AS [X]

FROM Tab1

WHERE X IN

(SELECT X

FROM Tab2

WHERE Y IN

(SELECT Y

FROM Tab3

WHERE Z IN

(SELECT Z

FROM Tab4

WHERE F IN

(SELECT F

FROM Tab5

WHERE REL))));

 

Приложение 7

Запрос 7

Выдать перечень продуктов, поставляемых кооперативом Портос.

Рисунок 7 – Результат запроса

Вариант 1

Запрос_Практика_Продукты_Кооператива_Портос

SELECT Продукты.ПР, Продукты.Продукт

FROM (Продукты INNER JOIN Поставки ON Продукты.ПР = Поставки.ПР) INNER JOIN Поставщики ON Поставки.ПС = Поставщики.ПС

WHERE Поставщики.Название="Портос" AND Поставщики.Статус="кооператив";

Вариант 2

Запрос_Практика_Продукты_Кооператива_Портос_1

SELECT Продукты.ПР, Продукты.Продукт

FROM (Продукты INNER JOIN Поставки ON Продукты.ПР = Поставки.ПР) INNER JOIN Поставщики ON Поставки.ПС = Поставщики.ПС

WHERE Поставщики.ПС=2;

Вариант 3

Запрос_Практика_Продукты_Кооператива_Портос_2

SELECT Продукты.ПР, Продукты.Продукт

FROM Продукты, Поставки, Поставщики

WHERE Продукты.ПР = Поставки.ПР

AND Поставки.ПС = Поставщики.ПС

AND Поставщики.Название="Портос" AND Поставщики.Статус="кооператив";

Вариант 4

Запрос_Практика_Продукты_Кооператива_Портос_3

SELECT Продукты.ПР, Продукты.Продукт

2

FROM Продукты

WHERE ПР IN

(SELECT ПР

FROM Поставки

WHERE ПС IN

(SELECT ПС

FROM Поставщики

WHERE Поставщики.Название="Портос"));

Схема запроса 7

 

From Tab1 AS X INNER JOIN Tab2 AS Y ON REL1(X, Y) INNER JOIN Tab3 AS Z On REL 2(Y, Z)

WHERE REL3AND REL4;

 

 

Запрос 7

From Tab1 AS X INNER JOIN Tab2 AS Y ON REL1(X, Y) INNER

JOIN Tab3 AS Z On REL 2(Y, Z)

WHERE REL 3;

From Tab1 AS X, Tab2 AS Y, Tab3 AS Z

WHERE REL1(X, Y)

AND REL2(Y, Z)

AND REL3

AND REL4;

From Tab1 AS X

WHERE X IN

(SELECT X

FROM Tab2

WHERE Y IN

(SELECT Y

FROM Tab3

WHERE REL));

 

Приложение 8

Запрос 8

Выдать всех поставщиков, которые поставляют хотя бы один продукт, поставляемый поставщиком 2.

Рисунок 8 – Результат запроса

Вариант 1.

Запрос_Практика_1_Таблица_Во_Внешнем_И_Влож_Подзапросе

SELECT DISTINCT Поставки.ПС

FROM Поставки

WHERE (((Поставки.[ПР]) In

(SELECT ПР

FROM Поставки

WHERE ПС =2)));

Вариант 2

Запрос_Практика_1_Таблица_С_Псевдонимами

SELECT DISTINCT X.ПС

FROM Поставки AS X

WHERE (((X.ПР) In

(SELECT Y.ПР

FROM Поставки Y

WHERE Y.ПС = 2)));

Схема запроса 8

 

Запрос 8

SELECT DISTINCT Tab1 AS X

FROM Tab1

WHERE (((Tab1[Y]) IN

(SELECT X

FROM Tab1

WHERE REL)));

SELECT DISTINCT L.AS X

FROM Tab1 AS L

WHERE (((L [Y]) IN

(SELECT M.Y

FROM Tab1 Y

WHERE REL)));

 

Приложение 9

Запрос 9

Выдать блюда, где трапеза – завтрак.

Рисунок 9 – Результат запроса

Вариант 1

Запрос_Завтрак

SELECT DISTINCT Вид_блюд.Вид, Блюда.Блюда, Блюда.Основа, Блюда.Выход, Блюда.БЛ

FROM Трапезы, (Меню INNER JOIN Вид_блюд ON Меню.В =Вид_блюд.В) INNER JOIN Блюда ON (Вид_блюд.В = Блюда.В) AND (Меню.БЛ = Блюда.БЛ)

WHERE Трапезы.Трапеза ="завтрак";

Вариант 2

Запрос_Практика_Завтрак

SELECT DISTINCT Вид_блюд.Вид, Блюда.Блюда, Блюда.Основа, Блюда.Выход, Блюда.БЛ

FROM Вид_блюд, Блюда, Меню, Трапезы

WHERE Меню.В =Вид_блюд.В

AND Меню.БЛ = Блюда.БЛ

AND Вид_блюд.В = Блюда.В

AND Трапезы.Трапеза ="завтрак";

Схема запроса 9

 

Запрос 9

SELECT DISTINCT Tab1 AS X, Tab2 AS_List

FROM Tab4, (Tab1 INNER JOIN Tab2 ON REL1 (X, Y)) INNER JOIN Tab3 ON REL2 (Y, Z) AND REL3 (Z, X)

AND REL4;

SELECT DISTINCT Tab1 AS X, Tab2 AS_List

FROM Tab_List_1

WHERE REL1(X, Y) AND REL2(Y, Z) AND REL3(Z, X) AND REL4;

 

Приложение 10

Запрос 10

Выдать количество поставленной зелени и количество поставщиков, её поставляющих.

Рисунок 10 – Результат запроса

Вариант 1

Запрос_Практика_Поставки_Сумма_Зелень

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS [COUNT]

FROM Поставки

WHERE ПР=12;

Вариант 2

Запрос_Практика_Поставки_Сумма_Зелень_1

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS [COUNT]

FROM Поставки, Продукты

WHERE Поставки.ПР=12 AND Продукты.Продукт='зелень';

Вариант 3

Запрос_Практика_Поставки_Сумма_Зелень_2

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS [COUNT]

FROM Поставки INNER JOIN Продукты ON Поставки.ПР=Продукты.ПР

WHERE Продукты.Продукт='зелень';

Вариант 4

Запрос_Практика_Поставки_Сумма_Зелень_3

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS [COUNT]

FROM Поставки INNER JOIN Продукты ON Поставки.ПР = Продукты.ПР

WHERE Поставки.ПР=12;

Схема запроса 10

 

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS COUNT]

FROM Tab1

WHERE REL;

 

 

Запрос 10

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS COUNT]

FROM Tab1, Tab2

WHERE REL1 AND REL2;

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS COUNT]

FROM Tab1 AS X INNER JOIN Tab2 AS Y ON REL1 (X, Y)

WHERE REL2;

SELECT SUM(Количество) AS [SUM], COUNT(Количество) AS COUNT]

FROM Tab1 AS X INNER JOIN Tab2 AS Y ON REL1 (X, Y)

WHERE REL2_New;

 

Приложение 11

Запрос 11

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

Рисунок 11 – Результат запроса

Вариант 1

Запрос_Практика_Соединение_Копия

SELECT Блюда.Блюда AS Блюдо, X.Блюда, Блюда.Основа

FROM Блюда, Блюда AS X

WHERE Блюда.Основа=[X].[Основа]

AND Блюда.Блюда[X].[Блюда];

Вариант 2

Запрос_Практика_Соединение_2_Копии

SELECT pervaya.Блюда, vtoraya.Блюда, vtoraya.Основа

FROM Блюда AS pervaya , Блюда AS vtoraya

WHERE pervaya.Основа = vtoraya.Основа

AND pervaya.Блюдаvtoraya.Блюда;

Вариант 3

Запрос_Практика_Соединение_2_Копии_1

SELECT X.Блюда, Y.Блюда, Y.Основа

FROM Блюда AS X, Блюда AS Y

WHERE X.Основа=Y.Основа

AND X.БлюдаY.Блюда;

2

Схема запроса 11

 

FROM Tab1, Tab1 AS X

WHEREREL1 (f, z)

AND REL2 (x, y);

 

 

SELECT pervaya.AS X, vtoraya.AS Y, vtoraya.AS Z

FROM Tab1 AS pervaya, Tab1 AS vtoraya

WHERE REL1 (F, Z)

AND REL2 (X, Y);

 

 

Запрос 11

SELECT X.AS x, Y.AS y, Y.AS z

FROM Tab1 AS X, Tab2 AS Y

WHERE REL1 (f, z)

AND REL2 (x, y);

 

Приложение 12

Запрос 12

Выдать название и статус поставщиков, не поставляющих продукт 7 («Молоко»).

Рисунок 12 – Результат запроса

Вариант 1

Запрос_Практика_Not_Exists_7

SELECT Название, Статус

FROM Поставщики

WHERE NOT EXISTS

(SELECT *

FROM Поставки

WHERE ПС = Поставщики.ПС

AND ПР =7);

Вариант 2

Запрос_Практика_Exists_7

SELECT X.Название, X.Статус

FROM Поставщики AS X

WHERE (((EXISTS

(SELECT *

FROM Поставки

WHERE ПС = X.ПС

AND ПР = 7)) = False));

Вариант 3

Запрос_Практика_Not_In_7

SELECT X.Название, X.Статус

FROM Поставщики AS X

WHERE (((X.ПС) Not In

(SELECT DISTINCT Y.ПС

FROM Поставки AS Y

WHERE Y.ПР = 7)));

Вариант 4

Запрос_Практика_ Not_In_7_1

SELECT Название, Статус

FROM Поставщики

WHERE 7 Not IN

(SELECT ПР

FROM Поставки

WHERE ПС = Поставщики.ПС );

Схемазапроса 12

 

Запрос 12

SELECT X, Y

FROM Tab1

WHERE NOT EXISTS

(SELECT *

FROM Tab2

WHERE REL1 (F, Z)

AND REL2;

SELECT X. AS x, X.AS y

FROM Tab1 AS X

WHERE (((EXISTS

(SELECT*

FROM Tab2

WHERE REL1 (f, z)

AND REL2)) = False));

SELECT X. AS x, X.AS y

FROM Tab1 AS X

WHERE (((X.z) Not In

(SELECT DISTINCT Y.f

FROM Tab2 AS Y

WHERE REL)));

SELECT X, Y

FROM Tab1

WHERE REL1 Not In

(SELECT G

FROM Tab2

WHERE REL2 (F, Z);

 

Просмотров работы: 142