В. М. Дубовой Укладач д т. н., проф

Вид материалаДокументы

Содержание


Сортування результатів запиту
Select sfam, sima, sotch, stip*2 from students
SELECT SFAM, SIMA, SOTCH, 'y.e.', STIP*2 FROM. STUDENTS
SELECT COUNT (DISTINCT SNUM) , 'студ. одержують стипендію ', STIP, ' у.е.'
Select * from students order by sfam asc
Select * from students order by stip desc, sfam asc
Внесення змін у базу даних
Додавання інформації в базу даних
Insert into teachers
Insert into teachers
Insert into teachers (tdate, tfam, tima)
Insеrt into avgraiting (snum, avgocenka) select snum, avg
Insert into sto (sfam, sima, sotch) select sfam, sima, sotch from students where snum = any (select snum from usp where ocenka =
Insert into maxocenka (snum, ocenka) select snum, ocenka
Видалення даних
Delete from students
Delete from students where snum = 3416
Delete from usp where udate = 10/06/1999
Delete from students where snum=(select snum from usp
Delete from students where exists (select * from usp
...
Полное содержание
Подобный материал:
1   2   3   4   5   6   7

Сортування результатів запиту



Більшість БД, що працюють з SQL, надають спеціальні кошти, що дозволяють удосконалювати висновок запитів.

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

SELECT SFAM, SIMA, SOTCH, STIP*2 FROM STUDENTS;

Висновок цього запиту буде такою:

SFAM

SIMA

SOTCH




Поляків

Анатолій

Олексійович

51.00

Старова

Любов

Михайлівна

34.00

Гриценко

Володимир

Миколайович

0.00

Котенко

Анатолій

Миколайович

0.00

Нагорний

Євгеній

Васильович

51.00

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

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

SELECT SFAM, SIMA, SOTCH, 'y.e.', STIP*2 FROM. STUDENTS;

Висновок цього запиту буде наступний:

SFAM

SIMA

SOTCH







Поляків

Анатолій

Олексійович

у.е.

51.00

Старова

Любов

Михайлівна

у.е.

34.00

Гриценко

Володимир

Миколайович

у.е.

0.00

Котенко

Анатолій

Миколайович

у.е.

0.00

Нагорний

Євгеній

Васильович

У.е.

51.00

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

SELECT COUNT (DISTINCT SNUM) , 'студ. одержують стипендію ', STIP, ' у.е.'

FROM STUDENTS GROUP BY STIP;


В результаті буде отримано:




STIP




2 студ. одержують стипендію

0.00

у.е.

1 студ. одержують стипендію

17.00

у.е

2 студ. одержують стипендію

25.00

у.е.

Некоректність висновку тексту для стипендії 17.00 не можна уникнути, не створивши більш складної конструкції для висновку, чим запропонована. Іноді корисніше вивести один коментар для усього висновку в цілому чи робити свій власний коментар для кожного рядка, однак це забезпечують різні програми, що використовують SQL і мають засоби генератора звітів.

Для упорядкування висновку полів таблиць SQL використовує команду ORDER BY, дозволяючи сортувати висновок запиту відповідно до значень у тій чи іншій кількості обраних стовпців. Якщо вказується кілька полів, то стовпці висновку упорядковуються один усередині іншого, при цьому можна визначати зростання (ASC) чи убування (DESC) для кожного стовпця. За замовчуванням установлене зростання.

Як приклад використовуємо запит, що виводить таблицю з інформацією про студентів за абеткою прізвищ:

SELECT * FROM STUDENTS ORDER BY SFAM ASC;

Висновок цього запиту приведений нижче:

SNUM

SFAM

SIMA

SOTCH




3414

Гриценко

Володимир

Миколайович

0.00

3415

Котенко

Анатолій

Миколайович

0.00

3416

Нагорний

Євгеній

Васильович

25.50

3412

Поляків

Анатолій

Олексійович

25.50

3413

Старова

Любов

Михайлівна

17.00

Приклад для упорядочивания інформації з декількох стовпців. Упорядкуємо по зменшенню розмір стипендії, а для студентів, що мають однаковий її розмір - за абеткою їхніх прізвищ. Для цього скористаємося запитом:

SELECT * FROM STUDENTS ORDER BY STIP DESC, SFAM ASC;

Результати запиту наступні:

SNUM

SFAM

SIMA

SOTCH




3414

Нагорний

Євгеній

Васильович

25.50

3415

Поляків

Анатолій

Олексійович

25.50

3416

Старова

Любов

Михайлівна

17.00

3412

Гриценко

Володимир

Миколайович

0.00

3413

Котенко

Анатолій

Миколайович

0.00

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


Внесення змін у базу даних


При роботі з SQL винятково важливо не тільки уміти вибирати дані, але і користатися засобами, що керують значеннями в таблиці. Значення можуть бути поміщені і вилучені з полів трьома командами мови DML (Мова Маніпулювання Даними), а саме:
  • INSERT - уставити;
  • UPDATE - модифікувати;
  • DELETE - видалити.



Додавання інформації в базу даних


Всі записи в SQL уводяться з використанням команди модифікації INSERT. У найпростішій формі ця команда ім'я наступний синтаксис:

INSERT INTO VALUES , …);

Так, наприклад, для додавання запису в таблицю викладачів TEACHERS, можна скористатися наступним вираженням:

INSERT INTO TEACHERS

VALUES (4006, 'Федченко', 'Світлана', 'Геннадіївна', 01/09/1999);

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

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

INSERT INTO TEACHERS

VALUES (NULL, 'Федченко', 'Світлана', 'Геннадіївна', 01/09/1999);

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

Також допускається вказувати стовпці, куди необхідно здійснити вставку значення, що дозволяє робити це в будь-якому порядку. Наприклад, команда:

INSERT INTO TEACHERS (TDATE, TFAM, TIMA)

VALUES (01/09/1999, 'Федченко', 'Світлана');

дозволяє вставити значення в полючи таблиці в порядку TDATE, TFAM, TIMA, причому стовпці TNUM і ТОТСН відсутні. Це означає, що для цих полів автоматично встановлюється значення за замовчуванням. Значення за замовчуванням може бути введене чи заздалегідь, у противному випадку, це буде NULL значення. Якщо обмеження забороняє використання значення NULL у даному полі, то обов'язково треба подбати про забезпечення стовпця змістовним значенням для будь-якої команди INSERT.

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

INSERT INTO EXCELLENT SELECT * FROM USP WHERE OCENKA = 5;

У результаті буде сформована таблиця з даними, приведеними в табл. 2.5.

Таблиця 2.5 Таблиця ЕХСЕLLENT

UNUM

OCENKA

UDATE

SNUM

PNUM

1001

5

10/06/1999

3412

2001

1005

5

12/06/1999

3416

2004


Отже, буде зробленеі наступне: Всі значення, дані запитом (інформація про студентів, що має тільки особисті оцінки), містяться в таблицю, названу EXCELLENT. Для того щоб не відбулося помилки, таблиця EXCELLENT повинна вже бути створена командою CREATE TABLE і мати п'ять стовпців, що збігаються з таблицею USP по типі даних.

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

У принципі, мається можливість указувати стовпці по імені, як це вже було продемонстровано вище, а значить - упорядковувати інформацію, що додається.

Наприклад, за допомогою нижчеподаної команди можна вставити інформацію про середній бал кожного студента:

INSЕRT INTO AVGRAITING (SNUM, AVGOCENKA) SELECT SNUM, AVG

(OCENKA) FROM USP GROUP BY SNUM;

Зверніть увагу на те, що зазначено імена стовпців таблиці AVGRAITING, а виходить, послідовність даних списку, що вставляється, (тобто порядок проходження полів у пропозиції SELECT) повинна з цим порядком збігатися.

У INSERT можна використовувати подзапросы усередині запиту, що генерує значення для цієї команди аналогічно тому. Наприклад, для вставки у вже наявну таблицю STO прізвищ, імен і по батькові студентів, у яких хоча б одна відмінна оцінка, можна скористатися наступною командою:

INSERT INTO STO (SFAM, SIMA, SOTCH) SELECT SFAM, SIMA, SOTCH FROM STUDENTS WHERE SNUM = ANY (SELECT SNUM FROM USP WHERE OCENKA = 5);

Обидва запити в цій команді функціонують так само, як якби вони не були частиною вираження INSERT. Подзапрос знаходить Всі рядки для студентів, що мають відмінні оцінки, і формує набір значень SNUM. Зовнішній запит вибирає рядка з таблиці STUDENTS, де ці значення SNUM знайдені, а INSERT уставляє знайдені дані в таблицю STO.

У команді INSERT допускається використовувати співвіднесені подзапросы. Припустимо, що мається таблиця МАХОCENKA, у якій зберігається інформація про студента, що має максимальну оцінку за визначену дату (скажемо, для нарахування іменної стипендії). Тоді, для відстеження зміни даних у таблиці успішності і модифікації відповідної інформації про претендента на іменну стипендію, необхідно скористатися наступною командою зі співвіднесеним подзапросом:

INSERT INTO MAXOCENKA (SNUM, OCENKA) SELECT SNUM, OCENKA

FROM USP FIRST WHERE OCENKA = (SELECT MAX (OCENKA)

FROM USP SECOND WHERE FIRST.UDATE=SECOND.UDATE);

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

Видалення даних


Видалення рядків з таблиці можна здійснити командою модифікації DELETE. Варто враховувати, що вона може видаляти тільки цілі записи таблиці, а не індивідуальні значення того чи іншого полючи. З цієї причини для даного оператора параметр полючи є недоступним. Наприклад, видалення усього вмісту таблиці STUDENTS, можна скористатися наступним:

DELETE FROM STUDENTS;

У процесі роботи частіше необхідно видаляти не всі дані, а тільки деякі визначені рядки з таблиці. Для того щоб визначити, які рядки будуть вилучені, використовують предикат, аналогічно тому, як це робиться для запитів. Наприклад, щоб видалити інформацію про студента Нагорний, моя використовувати наступну команду:

DELETE FROM STUDENTS WHERE SNUM = 3416;

Тут як предикат використаний номер студентського квитка: це поле фактично є первинним ключем таблиці, що дає гарантію видалення тільки одного запису. Використання полючи SFAM, узагалі говорячи, приводить до видалення декількох записів, тому що в таблиці могла зберігатися формація про однофамільців.

У команді DELETE допускається використовувати предикат, що вибирає целую групу рядків. Наприклад, що випливає команда видаляє з таблиці USP Всі дані, що відносяться до оцінок, лученным 10/06/1999:

DELETE FROM USP WHERE UDATE = 10/06/1999;

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

DELETE FROM STUDENTS WHERE SNUM=(SELECT SNUM FROM USP

WHERE OCENKA= 3);

У даному випадку подзапрос вибере всіх студентів, що мають трійки, з таблиці успішності, і в предикат основної команди поверне номера їхніх студентських квитків.

Допускається в предикаті команди DELETE використовувати і подзапросы, що дає можливість установити досить складні критерії того, які рядки будуть віддалятися. Крім того, дуже ефективно виконувати спочатку вторинні дії (перевірки і т.п.), після чого виконувати саме видалення. Хоча не можна посилатися на таблицю, з якої будуть віддалятися запису, у пропозиції FROM подзапроса, у предикаті допускається посилання на поточну рядок цієї таблиці, тобто можна використовувати співвіднесені подзапросы. Наприклад:

DELETE FROM STUDENTS WHERE EXISTS (SELECT * FROM USP

WHERE OCENKA = 3 AND STUDENTS.SNUM = USP.SNUM);

Частина предиката внутрішнього запиту посилається до таблиці STUDENTS. Це означає, що весь подзапрос буде виконуватися окремо для кожного рядка даної таблиці.


Зміна існуючих даних


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

Наприклад, щоб змінити оцінки всіх студентів на 5, необхідно використовувати команду:

UPDATE USP SET OCENKA = 5;

Звичайно, набагато частіше приходиться вказувати не всі, а тільки визначені рядки таблиці для зміни єдиного значення, і з цією метою разом з UPDATE можна використовувати предикати. Наприклад, змінити оцінки на 5 по предметі з кодом 2003, можна виконавши таку команду:

UPDATE USP SET OCENKA = 5 WHERE PNUM = 2003;

За допомогою команди UPDATE можна модифікувати дані з декількох полів - пропозиція SET може призначати будь-як число стовпців, відокремлюваних комами. Всі зазначені призначення можуть бути зроблені для будь-якого табличного рядка, але тільки для однієї в кожен момент часу. Припустимо, що викладач Викулина пішла на пенсію, і замість її заняття повинна вести викладач Федченко. Це можна такою командою:

UPDATE TEACHERS SET TFAM = 'Федченко', TNAME = 'Світлана',

TOTCH = 'Геннадіївна' , TDATE =01/09/1999 WHERE TNUM = 4001;

Ця команда передасть новому викладачу Федченко всі поточні навчальні предмети з таблиці PREDMET - у нашому прикладі це буде фізика. Однак майте на увазі, що модифікувати відразу багато таблиць в одній команді UPDATE не можна, а отже, не можна і використовувати назва (префікс) таблиці з ім'ям полючи для цієї команди. Т.е., наприклад, SET TEACHERS. TFAM = 'Федченко' викликає помилку.

У пропозиції SET команди UPDATE можна використовувати вираження, розташовуючи їх у списку для того полючи, яких необхідно змінити (нагадаємо, що в пропозиції VALUES команди INSERT вираження використовувати не можна). Наприклад, для того, щоб збільшити стипендію в 2 рази, можна використовувати наступну конструкцію:

UPDATE STUDENTS SET STIP = STIP*2;

При цьому щораз, коли команда посилається до зазначеного значення полючи в пропозиції SET, дія виробляється, зрозуміло, над ще не модифікованими даними поточної запису.

Крім того, можна використовувати більш складні предикати вибору запису для модифікації. Наприклад, якщо необхідно подвоїти тільки стипендію розміром 25.50, то команда буде наступною:

UPDATE STUDENTS SET STIP = STIP*2 WHERE STIP = 25.50;

Команда UPDATE може працювати з NULL значеннями. Так що, якщо необхідно змінити всі оцінки студентів по навчальному предметі з кодом 2003 на NULL, можна скористатися наступною командою:

UPDATE USP SET OCENKA - NULL WHERE PNUM = 2003;

Потужним засобом модифікації даних є використання подзапросов у команді модифікації UPDATE. Важливий принцип, якому треба дотримувати при роботі з командами модифікації і підзапитами, полягає в тому, що не можна в пропозиції FROM будь-якого подзапроса модифікувати таблицю, до якої посилається основна команда.

Зверніть увагу на наступний важливий момент - у команді модифікації UPDATE (до речі, так само, як і в команді INSERT) може виникнути проблематична ситуація, зв'язана з можливими дублікатами рядків, одержуваними в результаті вкладеного запиту. У цьому випадку, якщо в таблиці, що модифікується, є обмеження, що змушують її значення бути унікальними, команда чи модифікації вставки зазнає невдачі. Тому рекомендується яким-небудь образом з'ясувати те, що ці значення могли минулого вже бути використані в таблиці, перш ніж намагатися чи вставити модифікувати запис. Це можна реалізувати за допомогою додавання вкладеного подзапроса, що використовує в предикаті оператори EXISTS, IN, < > чи аналогічні.

Не варто забувати про заборону посилання вкладених запитах до таблиці, що модифікується командою UPDATE. З цієї причини запити і подзапросы в командах модифікації мають часом досить складну структуру. Крім того, усередині необов'язкового предиката цієї команди можна використовувати співвіднесені подзапросы, аналогічно тому як це робиться для DELETE.

Наприклад, що випливає запит збільшує розмір стипендії в 2 рази студентам, у яких маються оцінки, принаймні, по двох навчальних предметах:

UPDATE STUDENTS SET STIP=STIP*2

WHERE 2<=(SELECT COUNT (SNUM) FROM USP

WHERE STUDENTS.SNUM=USP.SNUM);

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

Розглянемо ще один, досить складний, приклад зі співвіднесеним подзапросом. Тут будемо модифікувати розмір стипендії для студентів, що мають мінімальний бал у той інший день:

UPDATE STUDENTS SET STIP=STRIP-1WHERE SNUM IN

(SELECT SNUM FROM USP FIRST WHERE OCENKA =(SELECT MIN (OCENKA)

FROM USP SECOND WHERE FIRST.UDATE =SECOND. UDATE));

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

SELECT AVG (OCENKA) FROM USP;

а потім результат цього запиту використовувати для модифікації

UPDATE USP SET OCENKA = OCENKA - 1 WHERE OCENKA < 4.2

Таким чином, команда UPDATE, що керує змістом запису, є однієї з ключових у мові SQL. Вона застосовна як до всіх рядків таблиці, якщо не використовується предикат, що визначає записи, що модифікуються, так і до конкретних рядків при наявності предиката, що, у свою чергу, може мати досить складну структуру.