Вставка нового запису в таблицю здійснюється оператором INSERT,що може мати вигляд: INSERT INTO <ім'я таблиці> (<список полів>)
VALUES (<список значень>)
У списку перелічуються тільки ті поля, значення яких відомі. Інші можуть опускатися. Для пропущених полів значення беруться за замовчуванням (якщо значення за замовчуванням задані) або поля залишаються порожніми. Наприклад:
У цьому прикладі не зазначений рік народження. Він підставиться за замовчуванням і надалі може бути уточнений.
Інша форма оператора INSERT використовує множину значень, що повертаються оператором SELECT. Цей оператор може вибирати записи з якоїсь іншої таблиці і вставляти їх у дану. Синтаксис цієї форми оператора INSERT такий:
INSERT INTO <ім'я таблиці> <оператор SELECT>
Нехай, наприклад, є таблиця Old_Pers людей похилого віку певної організації і необхідно заповнити її відповідними записами з таблиці Pers. Це можна зробити одним оператором:
INSERT INTO Old_Pers SELECT * FROM Pers
WHERE Year_b < 1950
Таблиця Old_Pers відразу заповниться множиною відповідних записів з Pers.
Наведену форму оператора INSERT можна використовувати для копіювання всіх даних однієї таблиці в іншу, причому ці таблиці можуть бути створені різними СУБД.
Редагування записів здійснюється оператором Update, який має такий синтаксис:
UPDATE <ім’я таблиці> SET <список виду <поле>=<вирази>>
WHERE <умова >
Наявність у цьому операторі умови дозволяє редагувати не тільки один запис, але відразу множину їх. Наприклад, якщо при черговій реорганізації підприємства вирішили злити «Цех 1» і «Цех 2» в один «Цех 1», то виправлення всіх записів у таблиці можна зробити одним оператором:
UPDATE Pers SET Dep = 'Цех1' WHERE Dep = 'Цех2'
Видалення записів здійснюється оператором DELETE:
DELETE FROM <ім'я таблиці> WHERE <умова>
Можливість застосування в цьому операторі умови дозволяє видаляти не тільки один, але відразу множину записів. Наприклад, якщо при реорганізації підприємства підрозділ «Цех 1» ліквідували і всіх його співробітників звільнили зі штату даної організації, то видалити з таблиці усі відповідні записи можна оператором:
DELETE FROM Pers WHERE Dep = 'Цех1'
Операції з таблицями
Створення нової таблиці здійснюється оператором CREATE TABLE:
CREATE TABLE <ім'я таблиці>
(<список виду <ім'я поля> <тип> (<розмір>)>)
Розмір указується тільки для полів строкових і деяких інших типів. Після оголошення деяких полів можуть включатися слова PRIMARY KEY, що вказує на те, що дане поле входить у первинний ключ. Крім того, після оголошення деяких полів можна вставляти слова NOT NULL, що означають, що значення цього поля обов'язково повинне бути задане в кожному запису. Наприклад:
CREATE TABLE Pers(
Num smallint Not Null Primary Key,
Dep char(15),
Fam char(20) Not Null,
Nam char(20) Not Null,
Par char(20) Not Null,
Year_b smallint,
Sex char(1),
Charact BLOb,
Photo BLOb );
Завдання після оголошення поля ключового слова UNIQUE означає, що значення цього поля повинне бути унікальним і не може бути два записи з ідентичними значеннями такого поля.
Після оголошення поля може задаватися ключове слово DEFAULTі значення поля за замовчуванням. Наприклад:
CREATE TABLE Pers(
Num smallint Not Null Primary Key,
Dep char(15),
Fam char (20) Not Null,
Nam char (20) Not Null,
Par char (20) Not Null,
Year_b smallint DEFAULT 1950,
Sex char(1) DEFAULT 'ч' ) ;
У таблиці можуть також створюватися поля, що обчислюються. Вони вводяться заміною покажчика типу поля ключовими словами COMPUTED BY,після яких йде вираз, за яким обчислюється значення поля. Наприклад, оператор
CREATE TABLE Pers(
Num smallint Not Null Primary Key,
Fam char (20) Not Null,
Nam char(20) Not Null,
Par char(20) Not Null,
Year_b smallint DEFAULT 1950,
Age COMPUTED BY (2002 - Year_b) ;
створює поле Age, що обчислюється, та містить підрахований за введеним роком народження вік співробітника.
При створенні таблиці на значення поля можуть накладатися обмеження. Наприклад, оператор
CREATE TABLE Pers(
Num smallint Not Null Primary Key,
Fam char(20) Not Null,
Nam char(20) Not Null,
Par char(20) Not Null,
Year_b smallint DEFAULT 1950
CHECK((Year_b>1917)and(Year_b<1980) ) );
встановлює обмеження на рік народження: більше 1917 і менше 1980. Обмеження записуються після ключового слова CHECK.
Створену таблицю можна зв'язати як дочірню з однією з уже створених таблиць. Синтаксис цоьго зв'язку такий:
У цьому визначенні після слів FOREIGN KEY записується список полів таблиці, що є ключами, по яких дана таблиця зв'язується з головною (батьківською). Список відповідних ключових полів батьківської таблиці після ключового слова REFERENCESможе опускатися, якщо ключем є первинний ключ батьківської таблиці.
Не обов'язкові елементи визначення ON DELETE і ON UPDATEуказують, які дії повинні виконуватися, якщо запис батьківської таблиці видаляється чи модифікується. Можливі значення дій: NO ACTION - при наявності підлеглих записів у дочірній таблиці видалення чи зміна відповідного запису головної таблиці заборонені;
CASCADE - при видаленні запису в головній таблиці відбувається видалення всіх підлеглих записів у дочірній таблиці; при зміні запису в головній таблиці змінюється значення ключового поля у всіх підлеглих записах дочірньої таблиці;
SET DEFAULT - при видаленні чи зміні запису головної таблиці ключовому полю у всіх підлеглих записах дочірньої таблиці привласнюється значення за замовчуванням;
SET NULL - у ключове поле підлеглих записів дочірньої таблиці заноситься NULL.
У нашій базі даних, що розглядається головною таблицею, мабуть, повинна бути таблиця опису підрозділів Dep з полем Dep — підрозділ, що є її первинним ключем. Дочірню таблицю Pers можна зв'язати з нею за її полем Dep — підрозділом, у якому працює співробітник. При перейменуванні підрозділу (зміні запису в головній таблиці) у дочірній таблиці теж повинна каскадно змінюватися назва цього підрозділу у всіх записах, що його містять. Для здійснення цього треба задати режим ON UPDATE CASCADE.При ліквідуванні підрозділу (видаленні запису в головній таблиці) можливо, очевидно, кілька варіантів. Якщо вказати режим ON DELETE CASCADE,то всі записи в таблиці Pers, що стосуються цього підрозділу, автоматично видаляться, тобто всі співробітники підрозділу виявляться звільненими і зведення про неї зникнуть. Імовірно, це невдалий варіант, тому що в реальному житті співробітники ліквідованого підрозділу частково можуть бути переведені в інші підрозділи. Логічніше вказати режим ON DELETE SET NULL.У цьому випадку записи співробітників ліквідованого підрозділу будуть позначені значенням NULLу поле Dep. І надалі адміністрація може вирішувати долю кожного такого співробітника індивідуально. Але значення NULLвідсутнє у головній таблиці і, виходить, що відповідні записи таблиці Pers виявляться не прив'язаними до таблиці Dep. Імовірно, найбільш вдалий варіант — встановити режим ON DELETE SET DEFAULTтау таблиці Pers для поля Dep ввести значення за замовчуванням (наприклад, «Невідомий») і в головній таблиці Dep ввести запис з аналогічним значенням поля Dер.Тоді запити, що створюють ці таблиці, можуть мати вигляд:
/* Створення таблиці Dep */
CREATE TABLE Dep(
Dep char(15) Not Null Primary Key,
Proisv char (1)
/*Створення таблиці Pers */
CREATE TABLE Pers(
Num smallint Not Null Primary Key,
Dep char(15) DEFAULT "Невідомий",
Fam char(20) Not Null,
Nam char(20) Not Null,
Par char (20) Not Null,
……
FOREIGN KEY (Dep) REFERENCES Dep
ON DELETE SET DEFAULT ON UPDATE CASCADE
) ;
При створенні декількох таблиць можна забезпечувати цілісність даних на рівні посилань. Це означає, що в одній з таблиць деяке поле може мати тільки такі значення, що містяться в деякому полі іншої таблиці. У нашому прикладі, мабуть, при створенні таблиці Pers бажано забезпечити, щоб у значення її поля Dep неможливо було ввести підрозділ, відсутній в таблиці Dep. Цеможна зробити такими операторами:
/* Створення таблиці Dep */
CREATE TABLE Dep(
Dep char(15) Not Null Primary Key,
Proisv char(l)
/* Створення таблиці Pers */
CREATE TABLE Pers (
Num smallint Not Null Primary Key,
Dep char (15) DEFAULT "Невідомий",
Fam char (20) Not Null,
Nam char (20) Not Null,
Par char (20) Not Null,
FOREIGN KEY (Dep) REFERENCES Dep
ON DELETE SET DEFAULT ON UPDATE CASCADE,
CONSTRAINT Dep CHECK(EXISTS(
SELECT Dep FROM Dep WHERE Pers.Dep = Dep.Dep))
Після ключового слова CONSTRAINT йде ім'я поля Dep даної таблиці, а потім записана умова перевірки допустимості значення даного поля. У наведеному прикладі ця умова зводиться до того, що значення поля Dep таблиці Pers повинне зустрічатися серед значень поля Dep таблиці Dep.
Ми розглянули основні форми оператора створення таблиці.
Видалення таблиці здійснюється оператором DROP TABLE:
DROP TABLE < ім'я таблиці >
Треба врахувати, що видалення таблиці суттєво відрізняється від видалення в ній усіх записів. При видаленні навіть усіх записів сама таблиця (її структура) залишається, а оператор DROP TABLE цілком знищує таблицю.
Модифікація структури існуючої таблиці здійснюється оператором ALTER TABLE:
ALTER TABLE <Ім'ятаблиці> <дія > < ім'я поля > < тип даних > . . .
У цьому операторі <дія> може приймати значення ADD — додати нове поле, чи DROP — видалити існуюче поле. Якщо поле додається, то для нього треба вказувати <тип даних >. Якщо поле видаляється, то тип даних не вказується. Приведемо приклад оператора модифікації структури: