Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структурована мова запитів SQL.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
663 Кб
Скачать
☆

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

Видалення рядків з таблиці можна здійснити командою Модифікації 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;

Нарешті, так само, як й у випадку з командою INSERT, допускається в предикаті використати вкладений запит. Найчастіше це необхідно, коли критерій, по якому вибираються дані для видалення, базується на іншій таблиці. Наприклад, якщо виникає необхідність у видаленні інформації про студентів з таблиці 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. Це означає, що весь подзапрос буде виконуватися окремо для кожного рядка даної таблиці.

У цілому, структура команди DELETE досить проста для розуміння, тому більш докладно на ній зупинятися не будемо.

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

Набагато більше серйозним питанням є можливість зміни деяких або всіх значень в існуючому рядку таблиці, що реалізується за допомогою команди 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 значеннями. Т.к. пропозиція SET не є предикатом, то можна вводити 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 = STIP - 1

WHERE 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. Вона застосовна як до всіх рядків таблиці, якщо не використається предикат, що визначає записи, що модифікують, так і до конкретних рядків при наявності предиката, що, у свою чергу, може мати досить складну структуру.

Розділ 4 Способи створення баз даних