
- •2. Типи даних
- •3. Вибірка, або читання даних
- •3.1. Синтаксис оператора select
- •3.2. Використовування умов пошуку для відбору рядків
- •Лекція № тема. Отримання підсумкових даних план
- •1. Агрегатні функції та їх використання
- •2. Сортування результатів запиту
- •Лекція № тема. Прості запити і правила їх виконання план
- •1. Однотабличні запити
- •2. Особливості багатотабличних запитів
- •3. Об'єднання таблиць
- •2. Використовування вкладених запитів
- •3412 Поляків Анатолій Олексійович
- •3412 Поляків Анатолій Олексійович 25.50
- •Лекція № тема: Внесення змін в базу даних. Способи створення баз даних. План:
- •Внесення змін в базу даних.
- •1.1 Додавання інформації в базу даних.
- •1.2. Видалення даних.
- •1.3. Заміна існуючих даних.
- •2.1. Створення баз даних
- •2.2. Створення таблиць.
- •2.3. Модифікація (зміна) таблиць.
- •2.4. Видалення таблиць.
- •2.5. Індекси.
- •2.6. Визначення умов перевірки.
1.2. Видалення даних.
Видалення рядків з таблиці можна здійснити командою модифікації 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 достатньо проста для розуміння, тому більш докладне на ній зупинятися не будемо.
1.3. Заміна існуючих даних.
Набагато більш серйозним питанням є можливість зміни деяких або всіх значень в існуючому рядку таблиці, що реалізується за допомогою команди 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 = 'Федченко1 викличе помилку.
В пропозиції 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;
а потім результат цього запиту (4.2) використати для модифікації
UPDATE USP
SET OCENKA = OCENKA - 1
WHERE OCENKA < 4.2;
Таким чином, команда UPDATE, що управляє змістом запису, є однією з ключових в мові SQL. Вона застосовна як до всіх рядків таблиці, якщо не використовується предикат, визначальний записи, що модифікуються, так і до конкретних рядків за наявності предиката, який, у свою чергу, може мати достатньо складну структуру.
Розділ 2.Способи створення баз даних.