Команда SQL-SELECT

Алгебраїчні оператори в запитах. Запити, які залучають кілька таблиць (об’єднання таблиць). Підсумкові запити з використанням функцій агрегування. Підзапити та їх групування оператором GROUP BY. Використання зовнішніх об’єднань RIGHT (LEFT) JOIN.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык украинский
Дата добавления 21.02.2012
Размер файла 23,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Реферат

На тему “Команда SQL - SELECT

Львів 2012

Зміст

1 Алгебраїчні оператори в запитах

2 Запити, які залучають кілька таблиць (об'єднання таблиць)

3 Підсумкові запити

4 Групування запитів

5 Підзапити

6 Зовнішні об'єднання

7 Висновки

1 Алгебраїчні оператори в запитах

алгебраїчний оператор запит

Для визначення даних, котрі ми хочемо відшукати з бази даних можна використати кілька запитів пов'язаних між собою алгебраїчними операторами відповідно до синтаксису:SELECT_instruction operator SELECT_instruction

Є три таких оператора:

UNION, UNION ALL- об'єднання результатів запиту (з вилученням рядків що повторюються чи ні відповідно).

INTERSECT- перетин результатів запиту.

EXCEPT- різниця результатів запиту (в Oracle також MINUS).

Приклад

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

Щоб вирішити цю проблему, по-перше знайти кількість відділів, де на даний час працюють декілька працівників і потім використати оператор MINUS:

SELECT Dept.Deptno FROM Dept

MINUS

SELECT Emp.Deptno FROM Emp;

DEPTNO

----------

40

Приклад

Покажіть імена працівників додаючи позначення * до працівників, які працюють в департаменті 10.

Для вирішення цієї проблеми використовують оператор UNION, який розглядає окремо два випадки - працівників, які працюють в департаменті 10 і які не працюють.

SELECT Emp.Ename||'*' FROM Emp

WHERE Emp.Deptno = 10

UNION

SELECT Emp.Ename FROM Emp

WHERE Emp.Deptno <> 10

ORDER BY 1;

EMP.ENAME||'*'

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

ADAMS

ALLEN

BLAKE

CLARK*

FORD

JAMES

JONES

KING*

MARTIN

MILLER*

SCOTT

SMITH

TURNER

WARD

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

Згідно Standard, результуюча таблиця не містить імен стовпців. Однак Oracle використовує вирази з першого запиту SELECT як мітки стовпців коли відображають вміст результуючої таблиці.

Оператор ORDER BY може бути тільки в кінці цілого запиту. В операторі ORDER BY ми можемо посилатися до результуючих стовпців, використовуючи їх послідовні номери 1,2,...

2 Запити, які залучають кілька таблиць (об'єднання таблиць)

Дані котрі, отримують з бази даних можуть міститися в кількох таблицях. Дані з кількох таблиць пов'язуються між собою зв'язками між рядками зв'язком зовнішній ключ -> первинний ключ. В таких випадках і первинний і зовнішній ключ мають те саме ім'я.. Щоб їх розрізнити використовується конструкція, яка йде попереду імені стовпця таблиці наприклад Emp.Deptno. Кажуть, що уточнюють ім'я стовпця іменем таблиці.

Приклад

Список усіх працівників і для кожного вказати назву департаменту.

SELECT Emp.Empno, Emp.Ename, Dept.Dname

FROM Emp, Dept

WHERE Emp.Deptno = Dept.Deptno;

EMPNO ENAME DNAME

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

7369 SMITH RESEARCH

7499 ALLEN SALES

7521 WARD SALES

7566 JONES RESEARCH

7654 MARTIN SALES

7698 BLAKE SALES

7782 CLARK ACCOUNTING

7788 SCOTT RESEARCH

7839 KING ACCOUNTING

7844 TURNER SALES

7876 ADAMS RESEARCH

7900 JAMES SALES

7902 FORD RESEARCH

7934 MILLER ACCOUNTING

Кожен рядок працівника посилається на рядок з таблиці Dept - це узгоджується через значення Deptno value.

Твердження Emp.Deptno=Dept.Deptno в операторі SELECT поданому вище називають об'єднуючим твердженням (join predicate), на відміну від інших тверджень, які називають обмежувальним твердженнями (restricting predicates таким як:

Sal>1000

або

Loc='Warszawa'

Давайте підкреслимо важливість об'єднуючої умови. Якщо ми не включили її в запиті, ми повинні отримати множину всіх можливих комбінацій рядків від зв'язаних таблиць - не тільки тих, який пов'язаний одна з одною загальною характеристикою , як наприклад номер департаменту від згаданого вище запиту. Результат такого повного об'єднання таблиць називають Декартовим добуток цих таблиць.

Оператори об'єдання

В Standard і Oracle від версії 9i, об'єднуючу умову також можна написати в операторі FROM як частину об'єднуючих операторів. Є кілька об'єднуючих операторів. Для запитів можливі наступні варіанти:

SELECT Emp.Empno, Emp.Ename, Dept.Dname

FROM Emp JOIN Dept ON Emp.Deptno = Dept.Deptno;

(ця форма включає оператор JOIN) або коли об'єднуючий стовпчик іменується так само.

SELECT Emp.Empno, Emp.Ename, Dname

FROM Emp JOIN Dept USING (Deptno);

або скорочено

SELECT Empno, Ename, Dname

FROM Emp NATURAL JOIN Dept;

В останньому випадку об'єднуючий стовпчик має те саме ім'я в обидвох таблицях.

Само- об'єдання

Використовуючи зв'язокзовнішній ключ -> первинний ключ можемо здійснити об'єднати таблицю з нею ж . В цьому випадку одна таблиця виступає у двох ролях, відмічаючи псевдонімом ім'я таблиці в операторі FROM.

Приклад

Список усіх працівників і імен їх менеджерів.

SELECT Empl.Ename, Man.Ename AS Mgr

FROM Emp Empl JOIN Emp Man ON Empl.Mgr = Man.Empno;

ENAME MGR

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

SMITH FORD

ALLEN BLAKE

WARD BLAKE

JONES KING

MARTIN BLAKE

BLAKE KING

CLARK KING

SCOTT JONES

TURNER BLAKE

ADAMS SCOTT

JAMES BLAKE

FORD JONES

MILLER CLARK

Псевдонім Empl представляє тут рядок працівника, а псевдонім Man представляє рядок його менеджера забезпечуючи зв'язок між ними умовою у формі рівності:

Empl.Mgr = Man.Empno

Рядок з іменем працівника пов'язаний з точно одним рядком тієї ж таблиці - рядок з іменем менеджера визначений через ідентифікатор Empl.Mgr. Більш звичним і часто використовуваним об'єднання такого типу, яке ґрунтується на зв'язку зовнішній ключ -> первинний ключ . В загальному об'єднуюча умова двох (або більше таблиць) може бути довільна. У випадку нашого прикладу бази даних є одне об'єднання, яке має різні властивості. Продемонструємо це в наступному прикладі:

Приклад

Список всіх працівників з їх рангом окладу.

SELECT e.Empno, e.Ename, s.Grade

FROM Emp e, Salgrade s

WHERE e.Sal BETWEEN s.Losal AND s.Hisal;

EMPNO ENAME GRADE

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

7369 SMITH 1

7876 ADAMS 1

7900 JAMES 1

7521 WARD 2

7654 MARTIN 2

7934 MILLER 2

7499 ALLEN 3

7844 TURNER 3

7566 JONES 4

7698 BLAKE 4

7782 CLARK 4

7788 SCOTT 4

7902 FORD 4

7839 KING 5

Зауважимо, що це є стовпчик Sal з таблиці Emp і стовпчики Losal і Hisal. Ми допускаємо, що закритий інтервал значень [Losal, Hisal] покриває діапазон окладів працівників. Рядок працівника є пов'язаний одним рядком таблиці Salgrade.

Правила обчислення оператора SELECT з об'єднанням:

Якщо запит містить алгебраїчні оператори UNION, INTERSECT і MINUS, повторити кроки 2-7 для їх аргументів.

Обчислити таблицю описану в операторі FROM. Застосувати оператор JOIN щоб їх показати. Розглянути всі результуючі рядки.

Застосувати умову WHERE для цих рядків. Зберегти тільки ті, які True для умови, вилучити ті рядки для яких умова є False або Null.

Для кожного збереженого рядка, обчислюєтться вираз з оператора SELECT.

Якщо є DISTINCT після SELECT, тоді вилучаться всі копії з результуючих рядків.

Виконаються алгебраїчні оператори, якщо вони є.

виконається оператор ORDER BY (сортування рядків), якщо він є.

3 Підсумкові запити

Дані з однієї або більше таблиць можуть бути просумовані з використанням функцій агрегування. Як результат, ми отримуємо один рядок. Семантика запису така:

COUNT()

Кількість значень в стовпці.

MAX()

Максимальне значення стовпця.

MIN()

Мінімальне значення стовпця.

SUM()

Сума значень стовпця.

AVG()

Середнє значення стовпця.

В Oracle є також додаткові функції: STDDEV - стандартне відхилення і VARIANCE - варіація.

З усіма рядками можна виконувати дані обчислення. Тільки аргумент кожної функції визначає, який стовпчик використовувати. Замість стовпця можна використати вираз (expression) (можливого типу) або DISTINCT expression.

У випадку функції COUNT, може бути використаний символ * як аргумент. COUNT(*) означає: підрахунок усіх рядків, які визначає умова в операторі WHERE.

Якщо значення виразу Null тоді конкретне значення не буде включене при обчисленні значення функції.

Приклад

Показати кількість працівників у всій компанії.

SELECT COUNT(*) AS "Number of company employees"

FROM Emp;

Number of company employees

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

14

Приклад

Показати статистику по окладах всіх працівників, які працюють в департаменті Sales

SELECT MIN(e.Sal) AS "Min salary",

MAX(e.Sal) AS "Max salary",

MAX(e.Sal)- MIN(e.Sal) AS "Diff in salaries",

AVG(e.Sal) AS "Avg salary"

FROM Emp e JOIN Dept d ON e.Deptno = d.Deptno

WHERE d.Dname = 'SALES';

Min salary Max salary Diff in salaries Avg salary

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

950 2850 1900 1566.66667

Якщо ми хочемо включити псевдо-значення NULL, коли обчислюються агреговані значення, ми використовуємо функцію NVL. Наступний запит обчилює середнє комісійне значення, який інтерпретує NULL як 0.

SELECT AVG(NVL(e.comm,0)) "Average provision"

FROM Emp e;

Average provision

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

157.142857

4 Групування запитів

Оператор GROUP BY розділяє рядки на групи і обчислює підсумкові функції в середині цих груп.

SELECT … FROM … WHERE …

GROUP BY expression,...

[HAVING condition]

Приклад

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

Версія 1 (без виводу назв департаментів)

SELECT e.Deptno Id, COUNT(*) Number, SUM(e.Sal) Sum

FROM Emp e

GROUP BY e.Deptno;

ID NUMBER SUM

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

10 3 8750

20 5 10875

30 6 9400

Версія 2 (з виводом назв департаментів)

SELECT d.Deptno Id, d.Dname Dep_name, COUNT(*) Number, SUM(e.Sal) Sum

FROM Dept d JOIN Emp e ON d.Deptno = e.Deptno

GROUP BY d.Deptno, d.Dname;

ID DEP_NAME NUMBER SUM

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

10 ACCOUNTING 3 8750

20 RESEARCH 5 10875

30 SALES 6 9400

В другому випадку здійснюється групування після об'єднання двох таблиць Dept і Emp.

Стовчики з яких створюються групи, називають згруповані стовпці( grouping columns). В першому випадку це є Dept.Deptno і в другому випадку це Dept.Deptno і Dept.Dname.

В наступному прикладі є два стовпця e.Deptno і e.Job в операторі GROUP BY. Кожна група містить значення e.Deptno і e.Job, ми сумуємо оклади працівників в середині цих груп.

SELECT e.Deptno, e.Job, SUM(e.Sal)

FROM Emp e

GROUP BY e.Deptno, e.Job;

DEPTNO JOB SUM(SAL)

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

10 CLERK 1300

10 MANAGER 2450

10 PRESIDENT 5000

20 ANALYST 6000

20 CLERK 1900

20 MANAGER 2975

30 CLERK 950

30 MANAGER 2850

30 SALESMAN 5600

Зауважте, що протягом процесу групування, дані сортуються за значенням групуючого стовпця. Ми не можемо припустити, що так буде завжди. Тому що групування може відбуватися іншим шляхом, наприклад, з використанням хешуванням замість сортування.

Ми можемо обмежити показ груп створенням умов для груп. Наприклад, обмежити, показ груп департаментів в яких менше 5 працівників, додаванням наступної умови HAVING:

HAVING COUNT(*)>=5

Отримуємо оператор:

SELECT e.Deptno Id, COUNT(*) Number, SUM(e.Sal) Sum

FROM Emp e

GROUP BY e.Deptno

HAVING COUNT(*)>=5;

ID NUMBER SUM

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

20 5 10875

30 6 9400

В порівнянні з попереднім запитом без оператора HAVING , результат не містив одного рядка з NUMBER = 3:

ID NUMBER SUMA

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

10 3 8750

Ми маємо пам'ятати, що протягом виконання групуючого запиту, спочатку умова WHERE використовується для обмеження. Наступним обмежені рядки групуються і кінцева умова HAVING використвоуєтьмя для обмеження рядків при виводі груп.

Ми маємо пам'ятати про обмеження в операторах SELECT з операторами GROUP BY і HAVING.

Обмеження для запитів групування

Оператор GROUP BY list може містити ім'я тільки одного стовпця( в Oracle будь-якого виразу).

Елементи SELECT , HAVING і ORDER BY можуть бути:

константами,

підсумковими функціями,

групуючим стовпцем (в операторі GROUP BY ),

виразами, які включають елементи (1)-(3)

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

Семантика запитів з операторами GROUP BY і HAVING є наступною:

Правила для виконання групування запитів

Якщо запит містить виклик операторів UNION, INTERSECT і EXCEPT, повторити кроки 2-7 для їх аргументів.

Обчислити таблиці в FROM. Застосувати оператор JOIN. Розглянути всі результуючі рядки.

Застосувати умову WHERE до всіх цих рядків. Зберегти ті рядки, які є True для цієї умови. Вилучити всі інші, тобто які є False або Null.

Поділити збережені рядки по групах згідно специфікації заданої в GROUP BY.

Застосувати умову HAVING до всіх цих груп. Зберегти ті рядки, які є True для цієї умови. Вилучити всі інші, тобто які є False або Null.

Для кожної збереженої групи, обчислити вираз поданий в SELECT.

Якщо є DISTINCT після SELECT, тоді вилучаться всі копії з результуючих рядків.

Виконаються алгебраїчні оператори, якщо вони є.

Виконується ORDER BY(сортування рядків), якщо цей оператор присутній.

5 Підзапити

Ми не будемо обговорювати важливу властивість, яка є в мовах програмування, тобто композицію операторів. Є звичним в структурному підході застосовувати композицію операторів для вирішення проблеми. Якщо ми використовуємо цей метод, ми поділяємо проблему на менші частини, вирішуємо тоді рішення їх відповідно компонуємо, щоб вирішити основну проблему.

SQL означає Мова Структурованих Запитів ( Structured Query Language). В середині операторів WHERE і HAVING, але тільки в SELECT і FROM ми можемо використовувати підзапити, які мають таку саму форму як запити (але тільки закриті в круглі дужки). В під запиті можуть бути аргументами твердження з: =, <, <=, >, >=, <>, IN, NOT IN. Це є обмеження для результату підзапиту. У випадку тверждень: =, <, <=, >, >=, <> і лівого аргументу IN і NOT IN під запит може повернути тільки одне значення. У випадку правих аргументів твержень IN і NOT IN під запит може повернути список значень. (В попередній версії Standard і Oracle були додаткові обмеження для під запиту на входження тільки правого аргумента для реляційних тверджень).

В Standard не можна використовувати оператори ORDER BY і UNION в підзапитах. В Oracle оператори UNION, MINUS і INTERSECT можуть бути в підзапитах.

Ім'я стовпця, який є в основному запиті, можна використати в підзапиті. Такий під запит називають корельованим (correlated). Інші називають некорельовані ( uncorrelated).

Результат некорельованих під запитів не залежить від рядків з основного запиту. Результат корельованого під запиту може залежати від рядків з основного запиту- може бути різний для різних рядків.

Приклад

Список працівників, які отримують більше серед всіх решта.

Щоб виконати цей запит, спочатку знайдемо найбільше значення Sal, використовуючи запит:

SELECT Max(e.Sal) FROM Emp e;

Цей запит можна використати як підзапит в операторі WHERE, де будуть порівнюватися оклади працівників з найбільшим окладом. Як результат ми готові знайти тих працівників, чий оклад є рівний максимальному.

SELECT e.Ename, e.Sal

FROM Emp e

WHERE e.Sal = (SELECT Max(f.Sal) FROM Emp f);

ENAME SAL

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

KING 5000

Може бути більше ніж один підзапит в операторі WHERE.

Приклад

Список всіх працівників, хто працює на тій самій посаді як працівник 7369 і оклад якого більший ніж працівника 7876.

Проблема вирішується наступним запитом:

SELECT e.Ename, e.Job

FROM Emp e

WHERE e.Job = (SELECT f.Job FROM Emp f WHERE f.Empno = 7369)

AND e.Sal > (SELECT g.Sal FROM Emp g WHERE g.Empno = 7876);

ENAME JOB

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

MILLER CLERK

Коли підзапит повертає більше ніж одне значення, ми можемо використати оператор IN замість =.

Приклад

Список департаментів, де працюють CLERK.

Вирішують проблему наступним запитом.

SELECT d.Dname

FROM Dept d

WHERE d.Deptno IN (SELECT e.Deptno FROM Emp e WHERE e.Job = 'CLERK');

DNAME

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

ACCOUNTING

RESEARCH

SALES

Ми маємо досвід з деяких задач, коли використовують оператор NOT IN якщо результат під запиту містив NULL, тому що не було значень для яких можна встановити щось інше ніж NULL. Наступний запит обчислює працівників які не є менеджерами інших.:

SELECT Empl.Ename

FROM Emp Empl

WHERE Empl.Empno NOT IN (SELECT Sub.Mgr FROM Emp Sub);

І отримали пусту таблицю як результат. Це легше компенсувати, тяжче забезпечити щоб Null не зустрічався в результат підзапиту. Є достатнім додати додаткову умову в WHERE підзапиту.

SELECT Empl.Ename

FROM Emp Empl

WHERE Empl.Empno NOT IN (SELECT Sub.Mgr FROM Emp Sub

WHERE Sub.Mgr IS NOT NULL);

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

Приклад

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

В основному запиті ми використовуємо під запит, який шукає максимальний оклад працівників в цьому департаменті:

SELECT Max(e.Sal)

FROM Emp e

WHERE e.Deptno= <Deptno specified in the main query>

і повний запит:

SELECT e.Deptno, e.Ename, e.Sal

FROM Emp e

WHERE e.Sal = (SELECT Max(f.Sal)FROM Emp f WHERE f.Deptno= a.Deptno);

DEPTNO ENAME SAL

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

30 BLAKE 2850

20 SCOTT 3000

10 KING 5000

20 FORD 3000

Оператори SOME, ANY і ALL

Порівняння тверджень можна комбінувати з ключовими словами : SOME (ANY) - читають "для деяких" і ALL - читають "для всіх" або " для кожного", отримуючи композицію, де правий аргумент може бути списком виразів або підзапитом в круглих дужках. Синтаксис є наступним:

expression comparison_operator [ANY|SOME|ALL][expression_list|(subquery)]

Приклад

10000 >= ALL (SELECT Sal FROM Emp)

який може прочитати так: "10000 більше або рівне окладам кожного працівника"

1000 >= SOME (SELECT Sal FROM Emp)

який може прочитати так: "10000 більше або рівне окладу деяких працівників"

Оператори EXISTS і NOT EXISTS

Є два твердження EXISTS і NOT EXISTS, які контролюють чи підзапит містить непустий результат або один пустий. Наприклад, наступна умова перевіряє чи останній працівник працює в департаменті 10:

EXISTS(SELECT 'x' FROM Emp WHERE Deptno= 10)

Істинність цієї умови не залежить від вмісту оператора SELECT.

Приклад

Список працівників, які не мають працівників.

Використовуємо твердження NOT EXISTS і корельований підзапит:

SELECT DISTINCT d.Dname

FROM Dept d

WHERE NOT EXISTS (SELECT 'x' FROM Emp e WHERE e.Deptno = d.Deptno);

DNAME

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

OPERATIONS

Використовуючи твердження NOT EXISTS, ми можемо вирішити задачу знаходження працівників, які не є менеджерами інших - тут не буде проблеми з псевдо-значенням NULL в результаті під запиту.

SELECT e.Empno, e.Ename, e.Job, e.Deptno

FROM Emp e

WHERE NOT EXISTS (SELECT 'x'

FROM Emp f

WHERE f.Mgr = e.Empno);

EMPNO ENAME JOB DEPTNO

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

7369 SMITH CLERK 20

7499 ALLEN SALESMAN 30

7521 WARD SALESMAN 30

7654 MARTIN SALESMAN 30

7844 TURNER SALESMAN 30

7876 ADAMS CLERK 20

7900 JAMES CLERK 30

7934 MILLER CLERK 10

Твердження EXISTS і NOT EXISTS predicates узгоджуються прямо до квантора існування (existential quantifier) і квантора всезагальності (universal quantifier) з запереченням у вкладеній формулі, відповідно - змінна рядка підзапиту буде обмежувати квантор. Вони забезпечують потужний інструментарій для вирішення складних задач через використання запитів SQL. В Standard є також твердження:

UNIQUE (subquery)

котре перевіряє чи не повторюються рядки в результаті під запиту.

Приклад

Твердження

UNIQUE (SELECT Ename FROM Emp)

дає значення True, коли ім'я працівника в таблиці Emp повторюється, інакше дає значення False.

Підзапити в командах UPDATE і DELETE

Підзапити зазвичай є компонентами умов команд WHERE і HAVING . Нагадуємо, що WHERE може бути також в командах UPDATE і DELETE.

Приклад

Збільшити оклад всіх працівників. які працюють в Даласі.

UPDATE Emp e

SET e.Sal = e.Sal * 1.1

WHERE 'DALLAS' = (SELECT d.Loc

FROM Dept d

WHERE e.Deptno = d.Deptno);

Підзапити можуть бути також в інших місцях ніж умова. Нижче розглянемо такі ситуації.

Підзапити в розділі FROM команди SELECT

Example

Обчислити вклад % кожного департаменту у загальну кількість працівників, а також у загальний фонд зарплати у всій компанії.

SELECT a.Deptno "Department",

Trunc(100*a.Number_Empl/b.Number_Empl,1)AS "%Employees",

Trunc(100*a.Salary_Sum/b.Salary_Sum,1) AS "%Salaries"

FROM (SELECT Deptno, COUNT(*) AS Number_Empl, SUM(Sal) AS Salary_Sum

FROM Emp

GROUP BY Deptno) a,

(SELECT COUNT(*) AS Number_Empl, SUM(Sal) AS Salary_Sum

FROM Emp) b;

Department %Employees %Salaries

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

10 21.4 30.1

20 35.7 37.4

30 42.8 32.3

Підзапити в розділі SELECT команди SELECT

Приклад

Для кожного департаменту обчислити скільки працівників у ньому працює.

SELECT d.Deptno "Department",

(SELECT COUNT(*) FROM Emp e WHERE e.Deptno=d.Deptno) AS "#Employees"

FROM Dept d;

Department #Employees

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

10 3

20 5

30 6

40 0

Ця конструкція демонструє структурний підхід до вирішення проблеми. Підпроблема "визначити кількість працівників у департаменті" вирішена незалежно від основної проблеми "показати департаменти".

Підзапити в частині AS команди CREATE TABLE (тільки в Oracle)

Приклад

Скопіювати інформацію про клерків і їх розташування в нову таблицю Clerks.

CREATE TABLE Clerks (Empno, Ename, Sal)

AS SELECT e.Empno, e.Ename, e.Sal

FROM Emp e

WHERE e.Job = 'CLERK';

Використовуючи цю конструкцію, ми не визначаємо типи даних стовпців. З іншої сторони ми можемо визначити обмеження цілісності і значення по замовчуванню. Система автоматично розрахує інформацію про типи даних стовпців і їх розміри з елементів в команді SELECT.

Підзапити в команді INSERT

Приклад

Вставити в тимчасову таблицю усіх працівників, які працюють протягом останніх 10 днів.

INSERT INTO Emp_new

SELECT *

FROM Emp

WHERE Sysdate - Hiredate < 10;

В Standard підзапити записують завжди в круглих дужках (в Oracle не завжди).

6 Зовнішні об'єднання

Зовнішнє об'єдання розширює результат одиночного об'єдання ( inner join) з рядками одної таблиці, які не відповідають рядкам з іншої таблиці.

Приклад

Список всіх працівників з назвою департаменту, де вони працюють.

Допускаємо, що стовпчик Emp.Deptno може містити значення NULL і тоді вставимо в таблицю Emp нового працівника Kowalski без пов'язування з будь-яким відділом.

Запит:

SELECT e.Empno, e.Ename, d.Dname

FROM Emp e LEFT JOIN Dept d ON e.Deptno = d.Deptno;

повертає інформацію про працівників і їх департаменти, у цьому випадку працівник, який не відноситься ні до якого департаменту отримають значення Null value в стовпці d.Dname - в Oracle, при друці буде відображатися пустим символьним рядком.

EMPNO ENAME DNAME

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

7369 SMITH RESEARCH

7499 ALLEN SALES

7521 WARD SALES

7566 JONES RESEARCH

7654 MARTIN SALES

7698 BLAKE SALES

7782 CLARK ACCOUNTING

7788 SCOTT RESEARCH

7839 KING ACCOUNTING

7844 TURNER SALES

7876 ADAMS RESEARCH

7900 JAMES SALES

7902 FORD RESEARCH

7934 MILLER ACCOUNTING

7799 KOWALSKI

Приклад

Список всіх працівників з просумованими окладами.

Можемо використати зовнішнє об'єднання RIGHT JOIN, який є симетричний до LEFT JOIN.

SELECT d.Deptno, d.Dname, SUM(e.Sal)

FROM Emp e RIGHT JOIN Dept d ON e.Deptno = d.Deptno

GROUP BY d.Deptno, d.Dname;

DEPTNO DNAME SUM(SAL)

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

10 ACCOUNTING 8750

20 RESEARCH 1087

30 SALES 9400

40 OPERATIONS

Якщо департамент не має працівників, то просумується і отримає значення Null тільки. Згідно правил результат Null, відобразиться пустим рядком. Якщо ми хочемо отримати значення нуль, ми маємо замінити вираз SUM(Sal) як аргумент функції NVL.

NVL(Sum(Sal),0)

Зауважмо, що подібний але не такий ефект буде, коли використати в Oracle оператор UNION:

SELECT d.Deptno, d.Dname, TO_CHAR(SUM(e.Sal))

FROM Emp e JOIN Dept d ON e.Deptno = d.Deptno

GROUP BY d.Deptno, d.Dname

UNION

SELECT d.Deptno, d.Dname, NULL

FROM Dept d

WHERE NOT EXISTS (SELECT 'x' FROM Emp f WHERE f.Deptno = d.Deptno);

DEPTNO DNAME TO_CHAR(SUM(SAL))

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

10 ACCOUNTING 8750

20 RESEARCH 10875

30 SALES 9400

40 OPERATIONS

Інші оператори об'єднання

Одиничні об'єдання таблиць будемо позначати (T, U ):

Перехресне об'єдання (Cross join) T CROSS JOIN U - Декартовий добуток(Cartesian product) - комбінація усіх рядків:

SELECT * FROM T CROSS JOIN U;

is the same as:

SELECT * FROM T,U;

Повне зовнішнє обєдання (Full outer join) T FULL JOIN U - результат об'єдання правого і лівого зовнішніх об'єданань (без повтору рядків). Приклад запиту:

SELECT e.Ename, d.Dname

FROM Emp e FULL JOIN Dept d ON e.Deptno=d.Deptno;

Поєднує ім'я працівника з їхнім департаментом, показує також працівників які не відносяться до будь-якого департаменту і також дпартаменти, які не містять працівників.

В наступній лекції ми продовжимо обговорення конструкцій мови SQL.

7 Висновки

Протягом цієї лекції. ми закінчили показ різних форм команди SELECT. Ми розглянули наступні конструкції: алгебраїчні оператори в запитах, одиничні оператори об'єднання, підсумкові і групові запити, підзапити.

Размещено на Allbest.ru


Подобные документы

  • Приклади використання всіх типів об’єднань: внутрішнього, зовнішнього лівостороннього та зовнішнього правостороннього. Приклади використання EXIST, ANY, SOME, ALL, UNION. Побудова запитів на основі кількох таблиць. Приклади використання підзапитів.

    лабораторная работа [17,9 K], добавлен 02.04.2015

  • Використання системи керування базами даних (СКБД) Microsoft Access на реляційній моделі. Основні об’єкти баз даних: таблиці, запити, форми, звіти, макроси і модулі. Виконання обрахунків у запитах, підсумкові та перехресні запити, їх використання.

    курсовая работа [569,6 K], добавлен 01.11.2011

  • Загальні відомості про БД: базові визначення, операції. Характеристика зв'язків і мова моделювання. Технологія вибіркового використання даних БД у Excel: фільтрація, пошук даних, реалізація запитів. Побудова зведених таблиць, звітів.

    курсовая работа [200,7 K], добавлен 15.01.2003

  • Оператори визначення даних. Створення таблиць. Вилучення таблиць. Додавання записів. Модифікація даних. Видалення даних. Пошук даних. Database Desktop. Компонент TQuery.

    реферат [165,8 K], добавлен 13.06.2007

  • Методологія застосування можливостей середовища MySQL для роботи з базами даних. Реляційна основа та інтерактивні запити. Динамічне визначення даних. Вигляд таблиць після заповнення. Встановлення зв’язків, проектування схеми. Створення запитів та форм.

    курсовая работа [2,0 M], добавлен 10.04.2015

  • Перевага аудиту за допомогою стовпців. Різні типи стовпців аудиту та їх налаштування. Аудит за допомогою таблиць. Відновлення даних за допомогою таблиць аудиту. Використання таблиць аудиту для відновлення змінених даних. Приклади синтаксичних конструкцій.

    контрольная работа [27,5 K], добавлен 14.01.2010

  • Загальні відомості про електронні таблиці. Призначення електронних таблиць. Завантаження електронних таблиць. Елементи вікна Excel. Робота з книгами. Введення та відображення даних. Редагування даних. Формули і функції.

    курсовая работа [59,9 K], добавлен 28.03.2004

  • Основні категорії функцій, які використовуються в Excel. Електронна таблиця як найбільш розповсюджена і потужна інформаційна технологія для професійної роботи з даними. Використання функцій в Excel для виконання стандартних обчислень в робочих книгах.

    реферат [20,5 K], добавлен 15.09.2009

  • Підстави для змін промислового IНТРАНЕТу. Обчислення лінійної швидкості тіла, що рухається по колу. Формування електронних таблиць з використанням стандартних функцій. Будування нового підходу доступу до даних в програмованих контролерах на браузерах.

    контрольная работа [58,9 K], добавлен 13.09.2009

  • Створення і використання індексів та переглядів БД. Створення і використання тригерів, генераторів та збережених процедур на боці SQL-сервера. Отримання практичних навичок обміну даними між прикладенням і БД. Перегляд записів зв’язаних таблиць БД.

    лабораторная работа [1,9 M], добавлен 08.06.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.