Understanding sql

АЖ ДО ЦЬОГО МІСЦЯ, ми запитуємо ТАБЛИЦІ даних і виконували команди по вилученню цих даних, вважаючи, що ці таблиці вже були створені ким - то до нас. Це дійсно найбільш реальна ситуація, коли невелика кількість людей створюють таблиці, які потім використовуються іншими людьми. Наша мета полягає в тому, щоб охопивши інформацію спочатку більш широко, перейти потім до більш вузьких питань.

В цьому розділі, ми будемо обговорювати створення, зміна, і видалення таблиць. Все це відноситься до самих таблиць, а не до даних які в них містяться. Будете або не будете Ви виконувати ці операції самостійно, але їх концептуальне розуміння збільшить ваше розуміння мови SQL і природу таблиць які ви використовуєте. Ця глава вводить нас в область SQL звану - DDL (Мова Визначення Даних), де створюються об'єкти даних SQL.

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

КОМАНДА СТВОРЕННЯ ТАБЛИЦІ

Таблиці створюються командою CREATE TABLE. Ця команда створює порожню таблицю - таблицю без рядків. Значення вводяться за допомогою DML команди INSERT (Див. Главу 15). Команда CREATE TABLE в основному визначає їм таблиці, у вигляді опису набору імен стовпців зазначених в певному порядку. Вона також визначає типи даних і розміри стовпців. Кожна таблиця повинна мати принаймні один стовпець. Як сказано в Главі 2. типи даних значно змінюються від програми до програми. Для сумісності зі стандартом, вони повинні все, по крайней мере, підтримувати стандарт типу ANSI. Він описаний в Додатку B.

Так як прогалини використовуються для поділу частин команди SQL, вони не можуть бути частиною імені таблиці (або будь-якого іншого об'єкта, такого як індекс). Підкреслення (_) - зазвичай використовується для поділу слів в іменах таблиць.

Значення аргументу розміру залежить від типу даних. Якщо ви його не вказуєте, ваша система сама призначатиме значення автоматично. Для числових значень, це - найкращий вихід, бо в цьому випадку, всі ваші підлогу такого типу отримають один і той же розмір що звільняє вас від проблем їх загальної сумісності (див. Главу 14). Крім того, використання аргументу розміру з деякими числовим наборами, не зовсім просте питання. Якщо вам потрібно зберігати великі числа, вам безсумнівно знадобляться гарантії, що підлогу досить великі щоб вмістити їх.

Один тип даних для якого ви, в основному, повинні призначати розмір - CHAR. Аргумент розміру - це ціле число яке визначає максимальне число символів яке може вмістити поле. Фактично, число символів поля може бути від нуля (якщо поле - NULL) до цього числа. За замовчуванням, аргумент розміру = 1, що означає що поле може містити тільки одну букву. Це звичайно не зовсім те що ви хочете.

Таблиці належать користувачеві який їх створив, і імена всіх таблиць належать даному користувачеві повинні відрізнятися друга від друга, як і імена всіх стовпців усередині даної таблиці. Окремі таблиці можуть використовувати однакові імена стовпців, навіть якщо вони належать одному і тому ж користувачеві. Прикладом цього - стовпець city в таблиці Замовників і в таблиці Продавців. Користувачі не є власниками таблиць можуть посилатися до цих таблиць за допомогою імені власника цих таблиць супроводжуваного точкою; наприклад, таблиця Employees створена Smith буде називатися Smith.Employees коли вона згадується якимось іншим користувачем (ми розуміємо що Smith - це Ідентифікатор Дозволи (ID). (ID) посилає користувачем (ваш дозволений ID - це ваше їм в SQL. Цей висновок обговорювалося в Главі 2. і буде продовжений в Главі 22).

Ця команда буде створювати таблицю Продавців: Порядок стовпців в таблиці визначається порядком в якому вони вказані. Їм стовпчика не повинно розділятися при перенесенні рядки (що зроблено для зручності читання), але відокремлюється комами.

Індекси - це засіб SQL, яке народив сам ринок, а не ANSI. Тому, сам по собі стандарт ANSI в даний час не підтримує індекси, хоча вони дуже корисні і широко застосовувана.

Коли ви створюєте індекс в поле, ваша база даних запам'ятовує відповідний порядок всіх значень цього підлогу в області пам'яті. Припустимо що наша таблиця Замовників має тисячі входів, а ви хочете знайти замовника з номером = 2999. Так як рядки не впорядковані, ваша програма буде переглядати всю таблицю, рядок за рядком, перевіряючи кожен раз значення стать cnum на рівність значенню 2999. Однак, якби був індекс в поле cnum. то програма могла б вийти на номер 2999 прямо за індексом і дати інформацію про те як знайти правильний рядок таблиці.

У те брешемо як індекс значно покращує ефективність запитів, використання індексу кілька уповільнює операції модифікації DML (такі як INSERT і DELETE), а сам індекс займає обсяг пам'яті. Отже, кожен раз коли ви створюєте таблицю Ви повинні прийняти рішення, індексувати її чи ні. Індекси можуть складатися з численних полів. Якщо більше ніж одне поле вказується для одного індексу, друге впорядковується всередині першого, третє всередині другого, і так далі. Якщо ви мали перше й останнє їм в двох різних полях таблиці, ви могли б створити індекс який би впорядкував попереднє поле всередині наступного. Це може бути виконано незалежно від способу впорядковували стовпців в таблиці.

Синтаксис для створення індекс - зазвичай наступний (пам'ятаєте, що це не ANSI стандарт): Таблиця, звичайно, повинна вже бути створена і повинна містити їм стовпчика. Їм індексу не може бути використано для чогось іншого в базі даних (будь-яким користувачем). Одного разу створений, індекс буде невидимий користувачеві. SQL сам вирішує коли він необхідний щоб посилатися на нього і робить це автоматично. Якщо, наприклад, таблиця Замовників буде найбільш часто згадуваною в запитах продавців до їх власної клієнтури, було б правильно створити такий індекс в поле snum таблиці Замовників. Тепер, той продавець який має відношення до цієї таблиці зможе знайти власну клієнтуру дуже швидко.

УНІКАЛЬНІСТЬ ІНДЕКСУ

Індексом в попередньому прикладі, на щастя, не пропонується унікальність, незважаючи на наше зауваження, що це є одним з призначень індексу. Даний продавець може мати будь-яке число замовників. Однак, цього не станеться якщо ми використовуємо ключове слово UNIQUE перед ключовим словом INDEX. Поле сnum, в якості первинного ключа, стане першим кандидатом для унікального індексу: ПРИМІТКА: ця команда буде відхилена якщо вже є ідентичні значення в поле cnum. Кращий спосіб мати справу з індексами полягає в тому, щоб створювати їх відразу після того, як таблиця створена і перш, ніж введені будь-які значення. Так само зверніть увагу що, для унікального індексу більш ніж одного підлогу, це - комбінація значень, кожне з яких, може і не бути унікальним. Попередній приклад - непрямий спосіб змусити поле cnum працювати як первинний ключ таблиці Замовників. Бази даних впливають на первинні та інші ключі конкретніше. Ми будемо обговорювати цей висновок далі в главах 18 і 19.

ВИДАЛЕННЯ ІНДЕКСІВ

Головною ознакою індексу є його їм - тому він може бути видалений. Зазвичай користувачі не знають про існування індексу. SQL автоматично визначає чи дозволено користувачу використовувати індекс, і якщо так, то дозволяє використовувати його. Однак, якщо ви хочете видалити індекс, ви повинні знати його їм. Цей синтаксис використовується для видалення індексу:

ЗМІНА ТАБЛИЦІ ПІСЛЯ ТОГО ЯК ВОНА БУЛА СТВОРЕНА

Команда ALTER TABLE не частина стандарту ANSI; але це - широко доступна, і досить змістовна форма, хоча її можливості дещо обмежені. Вона використовується щоб змінити визначення існуючої таблиці. Зазвичай, вона додає стовпці до таблиці. Іноді вона може видаляти стовпці або змінювати їх розміри, а також в деяких програмах додавати або видаляти обмеження (обговорені в Главі 18). Типовий синтаксис щоб додати стовпець до таблиці. Стовпець буде додано зі значенням NULL для всіх рядків таблиці. Новий стовпець стане останнім по порядку стовпцем таблиці. Взагалі то, можна додати відразу кілька нових стовпців, відокремивши їх комами, в одній команді. Є можливість видаляти або змінювати стовпці. Найбільш часто, зміною стовпчика може бути просто збільшення його розміру, або додавання (видалення) обмеження. Ваша система повинна переконатися, що будь-які зміни не суперечать існуючим даними - наприклад при спробі додати обмеження до колонку який вже мав значення при порушенні якого обмеження буде відхилено. Найкраще двічі перевірити це. По крайней мере, подивіться документацію вашої системи щоб переконатися, чи гарантує вона що саме це було причиною. Через нестандартного характеру команди ALTER TABLE, вам все одно необхідно подивитися той розділ вашої системної документації де йдеться про особливі випадки.

Якщо ваша система не підтримує ALTER TABLE. або якщо ви хочете уникнути її використання, ви можете просто створити нову таблицю, з необхідними змінами при створенні, і використовувати команду INSERT з SELECT * запитом щоб переписати в неї дані зі старої таблиці. Користувачам яким було надано доступ до старої таблиці (див. Главу 22) повинен бути наданий доступ до нової таблиці.

ВИДАЛЕННЯ ТАБЛИЦІ

Ви повинні бути власником (тобто бути творцем) таблиці щоб мати можливість видалити її. Тому не хвилюйтеся про випадковий руйнуванні ваших даних, SQL спочатку зажадає щоб ви очистили таблицю перш, ніж видалить її з бази даних. Таблиця з розташованими в ній рядками, не може бути видалена. Зверніться до Глави 15 за подробицями щодо того як видаляти рядки з таблиці. Синтаксис для видалення вашої таблиці, якщо звичайно вона є порожньою, наступна: При подачі цієї команди, їм таблиці більше не розпізнається і немає такої команди яка могла бути дана цьому об'єкту. Ви повинні переконатися, що ця таблиця не посилається зовнішнім ключем до іншої таблиці (Зовнішні ключі обговорюються в Главі 19), і що вона не використовується у визначенні Уявлення (Глава 20).

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

Тепер Ви вже побіжно орієнтуєтеся в основах визначень даних. Ви можете створювати, змінювати, і видаляти таблиці. У те брешемо як тільки перша з цих функцій - частина офіційного стандарту SQL, інші будуть брешемо від часу змінюватися, особливо - ALTER TABLE. DROP TABLE дозволяє вам позбавитися від таблиць які не приносять користі. Вона знищує тільки порожні таблиці, і отже не руйнує дані.

Ви тепер знаєте про індекси а також, як їх створювати і видаляти. SQL не дає вам великого управління над ними, так як реалізація яку ви використовуєте досить вдало визначає, як швидко виконуються різні команди. Індекси - це один з інструментів дає Вам можливість впливати безпосередньо на ефективність ваших команд в SQL. Ми розглянули індекси тут щоб відрізняти їх від обмежень, з якими їх не можна плутати. Обмеження - це тема Глави 18 і Глави 19.

РОБОТА З SQL

1. Напишіть пропозицію CREATE TABLE яке б вивело нашу таблицю Замовників. 2. Напишіть команду яка б давала можливість користувачеві швидко знаходити порядки згруповані по датах з таблиці Порядків. 3. Якщо таблиця Порядків вже створена, як Ви можете змусити поле onum бути унікальним (якщо допустити що всі поточні значення унікальні). 4. Створіть індекс який би дозволяв кожному продавцеві швидко відшукувати його порядки згруповані по датам. 5. Припустимо, що кожен продавець має тільки одного замовника з цією оцінкою, введіть команду яка його отримає. (Див. Додаток A для відповідей.)