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

Багатотабличні і вкладені запити




 

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

При об'єднанні відношень використовуються умови, що задаються в частині WHERE. Таке об'єднання таблиць називається внутрішнім. У цьому випадку в результуюче відношення попадають тільки зчеплені по заданих умовах кортежі вихідних відношень, для яких ці умови були визначені і правильні.

 

Запрос: Вивести прізвища студентів, що учаться на третьому курсі.
SELECT Табл.Група.ПІБ, ТаблКурс.Курс FROM Табл.Група, ТаблКурс WHERE ТаблГрупа.Група= ТаблКурс.Група AND(ТаблКурс.Курс)=3; Тут об'єднані дві таблиці по збігу значень у стовпці Група.
ПІБ Курс
Стєпанова К. Е.  
Владіміров В. А.  
Крилова Т. С.  
Міронов А. В.  
Сідоров К. А.  
Петров Ф. І.  

Результат:

Запит: Вивести прізвища студентів з 104 групи, що здавали іспити.
SELECT ТаблСтудент.ПІБ, ТаблСтудент.Дисципліна, ТаблСтудент.Оцінка FROM ТаблСтудент, ТаблГрупа WHERE ТаблСтудент.ПІБ = ТаблГруппа.ПІБ AND((ТаблГрупа.Група)=104); Результат:
ПІБ Дисципліна Оцінка
Уткіна Н.В. Мережі  
Іванова Е.А. Мережі  
Трофімов П.А. Мережі  

 

     

Цей запит складений не чітко, тому що якби в групі були студенти, що за якимись причинами не здавали іспити, то вони також були б відібрані. По-цьому запит необхідно доповнити ще умовою на відсутність порожніх значень у полі Оцінка.

Запит: Вивести прізвища студентів з 103 групи, що здавали іспити.
SELECT ТаблСтудент.ПІБ, ТаблСтудент.Дисципліна, ТаблСтудент.Оцінка FROM ТаблСтудент, ТаблГрупа WHERE ТаблСтудент.ПІБ = ТаблГруппа.ПІБ AND((ТаблГруппа.Група)=103) AND((ТаблСтудент.Оцінка)<> NULL); Тут об'єднані дві таблиці по збігу значень у стовпці Група.

Результат:

ПІБ Дисципліна Оцінка
Стєпанова К.Е. Англійська мова  
Крилова Т.С. Англійська мова  
Міронов А.В. Англійська мова  
Петров Ф.І. Англійська мова  
Владіміров В.А. Інформатика  
Стєпанова К.Е. Інформатика  
Крилова Т.С. Інформатика  
Сідоров К.А. Інформатика  
Петров Ф.І. Інформатика  
Владіміров В.А. Бази даних  
Стєпанова К.Е. Бази даних  
Крилова Т.С. Бази даних  
Міронов А.В. Бази даних  
Сідоров К.А. Бази даних  
Петров Ф.І. Бази даних  
Владіміров В.А. Англійська мова  

 

Раніше було зазначено, що для введення даних у таблиці оператором ІNSERT ІNTO може використовуватися оператор SELECT. Це зручно, коли для заповнення полів однієї таблиці використовуються значення полів інших таблиць.

Запит: Заповнити ТаблСтудент прізвищами студентів і назвами дисциплін по який вони повинні здавати іспити використовуючи дані ТаблГрупа і ТаблДисципліна
INSERT INTO ТаблСтудент(ПІБ, Дисципліна) SELECT ТаблГрупа.ПІБ, ТаблПредмет.Дисципліна FROM ТаблГрупа, ТаблПредмет WHERE (((ТаблГрупа.Група) =ТаблПредмет.Група) And ((ТаблПредмет.ВидКонтролю)='Іспит'));
ПІБ Дисципліна Оцінка
Степанова К.Е. Англійська мова  
Крылова Т.С. Англійська мова  
Миронов А.В. Англійська мова  
Сидоров К.А. Англійська мова  
Петров Ф.И. Англійська мова  
Уткина Н.В. Мережі  
Иванова Е.А. Мережі  
Трофимов П.А. Мережі  
Владимиров В.А. Інформатика  
Степанова К.Е. Інформатика  
Крылова Т.С. Інформатика  
Миронов А.В. Інформатика  
Сидоров К.А. Інформатика  
Петров Ф.И. Інформатика  
Владимиров В.А. Бази даних  
Степанова К.Е. Бази даних  
Крылова Т.С. Бази даних  
Миронов А.В. Бази даних  
Сидоров К.А. Бази даних  
Петров Ф.И. Бази даних  
Владимиров В.А. Англійська мова  

Результат:

 

 

Агрегатні функції можуть застосовуватися як у вираженні виводу результатів рядка SELECT, так і у вираженні умови обробки сформованих груп HAVІNG. Тут агрегатна функція обчислюється для кожної виділеної групи. Значення, отримані при обчисленні агрегатних функцій, можуть бути використані, для виводу результатів чи для умови добору груп.

Запит: вивести номера груп, у яких отримані двійки.
SELECT DISTINCT ТаблГрупа.Група FROM ТаблСтудент, ТаблГрупа WHERE ((ТаблСтудент.ПІБ)=(ТаблГрупа.ПІБ) AND ((ТаблСтудент.Оцінка)=2) GROUP BY ТаблГрупа.Група HAVING ((Count(*))<>False);

Результат:

Група
 

 

Вкладені запити

За допомогою SQL можна вкладати запити усередину один одного. Щоб виконати основний запит, SQL спочатку повинний оцінити внутрішній запит (його називають підзапитом) усередині речення WHERE чи HAVІNG. Відбувається це традиційним чином, тобто виповнюється вкладений запит, що витягає необхідні для визначення значення предиката дані, а тільки потім - основний. Підзапит повинний вибрати тільки одне поле, а тип даних цього поля повинний збігатися з тим значенням, з яким він буде порівнюватися в предикаті.

Можлива ситуація, коли результатом підзапита є кілька різних значень, це унеможливлює оцінку предиката основного запиту і СКБД видасть помилку. Тому обов'язково потрібно переконатися, що підзапит буде відображати тільки один рядок виводу. Крім того, при використанні підзапиту, що узагалі не виводить ніяких значень, основний запит не виведе ніяких значень: його предикат буде мати невідоме значення.

У деяких випадках варто використовувати DІSTІNCT для того, щоб у під запиті одержати одиночне значення.

Наприклад, запит - вивести ПІБ тих, хто здав всі іспити - повинний бути вкладеним. Для його виконання спочатку треба скласти і виконати запит - скільки іспитів повинний здавати кожен студент (табл. ТаблГруппа і ТаблДисціплина). Потім скласти і виконати запит - скільки іспитів здав кожен студент (табл. ТаблСтудент). І, нарешті, порівняти результати двох запитів - якщо значення збігаються, то ПІБ вивести в результат підсумкового запиту.

Для приклада спочатку виконаємо всі запити окремо, а потім покажемо, що результат буде еквівалентний одному вкладеному запиту.

Запит: Визначити кількість іспитів, що повинний здавати кожен студент.
SELECT ТаблГрупа.ПІБ, Count(ТаблГрупа.Група) AS [Кількість іспитів] FROM ТаблГрупа, ТаблДисципліна WHERE ((ТаблГруппа.Група)= [ТаблДисципліна].[Група] AND (ТаблДисципліна.ВидКонтролю)='Іспит') GROUP BY ТаблГрупа.ПІБ, ТаблДисципліна.Група, ТаблДисципліна.ВидКонтролю;
ПІБ Кількість іспитів
Владіміров В. А.  
Іванова Е. А.  
Крилова Т. С.  
Міронов А. В.  
Петров Ф. І.  
Сідоров К. А.  
Стєпанова К. Е.  
Трофімов П. А.  
Уткіна Н. В.  

Результат:

 

 

Запит: Визначити кількість іспитів, що здав кожен студент.
SELECT ПІБ, Count(ТаблСтудент.ПІБ) AS [ Здано іспитів ] FROM ТаблСтудент WHERE Оцінка>2 GROUP BY [ПІБ]; Результат:
ПІБ Здано іспитів
Владіміров В. А.  
Іванова Е. А.  
Крилова Т. С.  
Міронов А. В.  
Петров Ф. І.  
Сідоров К. А.  
Стєпанова К. Е.  
Трофімов П. А.  
Уткіна Н. В.  

 

Тепер порівнюючи результати виконання двох запитів можна зробити висновок про те, що сесію здали Іванова Е. А. і Трофімов П. А. Аналогічний результат виходить відразу при виконанні вкладеного запиту.

 

 

Запит: вивести ПІБ тих, хто здав всі іспити.
SELECT ТаблСтудент.ПІБ FROM ТаблСтудент WHERE (ТаблСтудент.Оцінка>2) GROUP BY ТаблСтудент.ПІБ HAVING (Count(ТаблСтудент.ПІБ)=(SELECT COUNT(ТаблГрупа.ПІБ) FROM ТаблГрупа, ТаблДисципліна WHERE ТаблГрупа.Група=ТаблДисципліна.Група AND ТаблДисципліна.ВидКонтролю='Іспит' AND ТаблГрупа.ПІБ = ТаблСтудент.ПІБ)); Або еквівалентний більш короткий запис SELECT ПІБ FROM ТаблСтудент WHERE Оцінка>2 GROUP BY [ПІБ] HAVING COUNT(*) = (SELECT COUNT(*) FROM ТаблГрупа, ТаблДисципліна WHERE ТаблГрупа.Група=ТаблДисципліна.Група AND ТаблДисципліна.ВидКонтролю='Іспит' AND ТаблГрупа.ПІБ = ТаблСтудент.ПІБ)); Результат:
ПІБ
Владіміров В.А.
Іванова Е. А.
Крилова Т.С.
Петров Ф.І.
Трофімов П. А.
Уткіна Н.В.

 

 

Питання для самоконтролю по ТЕМІ 8

1. Охарактеризуйте мову запитів SQL.

2. Назвіть оператори визначення даних мови SQL.

3. Назвіть оператори маніпулювання даними мови SQL.

4. Назвіть основні типи даних мови SQL.

5. Назвіть основні убудовані функції мови SQL.

6. Приведіть приклад запиту на створення таблиць на SQL.

7. Приведіть приклади запитів на зміну структури таблиць на SQL.

8. Приведіть приклад запиту на вилучення таблиці на SQL.

9. Приведіть приклад запиту на додавання нових записів у таблиці на SQL.

10. Приведіть приклад запиту на створення ключового поля для таблиці.

11. Приведіть приклад запиту на завдання зовнішнього ключа для таблиці.

12. Приведіть приклад запиту на створення і вилучення індексу з таблиці.

13. Охарактеризуйте структуру запиту з оператором SELECT.

14. Приведіть приклад запиту на вивід усіх полів з таблиці. Змініть порядок виводу полів.

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

16. Приведіть приклад запиту на вивід даних відповідно до однієї умови.

17. Приведіть приклад запиту на вивід даних відповідно до декількох умов.

18. Приведіть приклад запиту з параметрами.

19. Приведіть приклад запиту на вивід даних із сортуванням.

20. Приведіть приклад запиту на вивід даних з угрупованням.

21. Приведіть приклад запиту на вивід даних з угрупованням і використанням групових операцій.

22. Приведіть приклад запиту на вибірку даних з декількох таблиць.

23. Приведіть приклад вкладеного запиту.

 

Поделиться:





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



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