Самовчитель SQL від простих запитів до складних. Справжнім «Чайникам» присвячується або MySQL для початківців

Вітаю вас на моєму блогу сайт. Сьогодні поговоримо про SQL запити для початківців. У деяких веб-майстрів може виникнути питання. Навіщо вивчати SQL? Хіба не можна обійтися?

Виявляється, що для створення професійного інтернет-проекту цього буде замало. Sql використовується для роботи з БД і створення додатків для Вордпрес. Розглянемо як використовувати запити докладніше.

Що це таке

Sql – мова структурованих запитів. Створено визначення типу даних, надання доступу до них та обробці інформації за короткі проміжки часу. Він описує компоненти або результати, які ви хочете бачити на інтернет-проекті.

Якщо говорити по-простому, ця мова програмування дозволяє додавати, змінювати, шукати і відображати інформацію в БД. Популярність mysql пов'язана з тим, що він використовується для створення динамічних інтернет-проектів, основою яких є база даних. Тому для розробки функціонального блогу вам необхідно вивчити цю мову.

Що може робити

Мова sql дозволяє:

  • створювати таблиці;
  • змінювати отримувати та зберігати різні дані;
  • об'єднувати інформацію у блоки;
  • захистити дані;
  • створювати запити у access.

Важливо! Розібравшись із sql ви зможете писати програми для Вордпрес будь-якої складності.

Яка структура

БД складається з таблиць, які можна подати у вигляді Ексель файлу.

У неї є ім'я, колонки та ряд з якоюсь інформацією. Створювати подібні таблиці можна за допомогою запитів sql.

Що потрібно знати


Основні моменти щодо Sql

Як зазначалося вище, запити застосовуються для обробки та введення нової інформації в БД, що складається з таблиць. Кожен її рядок – це окремий запис. Отже, створимо БД. Для цього напишіть команду:

Create database ‘bazaname’

У лапках пишемо ім'я БД на латиниці. Намагайтеся вигадати для неї зрозуміле ім'я. Не створюйте бази типу «111», «www» тощо.

Після створення БД встановлюємо:

SET NAMES 'utf-8'

Це потрібно, щоб контент на сайті правильно відображатися.

Тепер створюємо таблицю:

CREATE TABLE 'bazaname'. ‘table’ (

id INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,

log VARCHAR(10),

pass VARCHAR(10),

date DATE

У другому рядку ми прописали три атрибути. Подивимося, що вони означають:

  • Атрибут NOT NULL означає, що осередок не буде порожнім (поле обов'язкове для заповнення);
  • Значення AUTO_INCREMENT - автозаповнення;
  • PRIMARY KEY – первинний ключ.

Як додати інформацію

Для заповнення поля створеної таблиці значеннями використовується оператор INSERT. Пишемо такі рядки коду:

INSERT INTO ‘table’

(login, pass, date) VALUES

('Vasa', '87654321', '2017-06-21 18:38:44');

У дужках вказуємо назву стовпців, а наступної - значення.

Важливо! Дотримуйтесь послідовності назв і значень стовпців.

Як оновити інформацію

Для цього використовується команда UPDATE. Подивимося, як змінити пароль конкретного користувача. Пишемо такі рядки коду:

UPDATE 'table' SET pass = '12345678' WHERE id = '1'

Тепер поміняйте пароль '12345678'. Зміни відбуваються у рядку з id=1. Якщо не писати команду WHERE – поміняються всі рядки, а не конкретні.

Рекомендую вам придбати книгу « SQL для чайників ». За її допомогою ви зможете крок за кроком професійно працювати з БД. Вся інформація побудована за принципом від простого до складного і добре сприйматиметься.

Як видалити запис

Якщо ви написали щось не так, виправте це за допомогою DELETE. Працює так само, як і UPDATE. Пишемо такий код:

DELETE FROM 'table' WHERE id = '1'

Вибірка інформації

Для отримання значень з БД використовується команда SELECT. Пишемо такий код:

SELECT * FROM 'table' WHERE id = '1'

У цьому прикладі в таблиці вибираємо всі наявні поля. Це відбувається, якщо прописати в команді зірочку «*». Якщо потрібно вибрати якесь вибіркове значення, пишемо так:

SELECT log , pass FROM table WHERE id = ‘1’

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


Видалення таблиці

Відбувається за допомогою DROP. Для цього напишемо такі рядки:

DROP TABLE table;

Виведення запису з таблиці за певною умовою

Розглянемо такий код:

SELECT id, countri, city FROM table WHERE people>150000000

Він відобразить записи країн, де населення більше ста п'ятдесяти мільйонів.

Об'єднання

Зв'язати разом кілька таблиць можна за допомогою Join. Як це працює подивіться докладніше у цьому відео:

PHP та MySQL

Ще раз хочу наголосити, що запити при створенні інтернет-проекту – це звичайна справа. Щоб їх використовувати у php-документах, виконайте такий алгоритм дій:

  • Поєднуємося з БД за допомогою команди mysql_connect();
  • Використовуючи mysql_select_db(), вибираємо потрібну БД;
  • Обробляємо запит за допомогою mysql_fetch_array();
  • Закриваємо з'єднання командою mysql_close().

Важливо! Працювати з БД не складно. Головне – правильно написати запит.

Початківці вебмайстра подумають. А що почитати з цієї теми? Хотілося б порекомендувати книгу Мартіна Грабера « SQL для простих смертних ». Вона написана так, що новачкам все буде зрозуміло. Використовуйте її як настільну книгу.

Але це теорія. Яка ж справа на практиці? Насправді інтернет-проект потрібно не тільки створити, а ще й вивести в ТОП Гугла та Яндекса. У цьому вас допоможе відеокурс Створення та розкрутка сайту ».


Відео інструкція

Чи залишилися ще питання? Перегляньте детальніше онлайн відео.

Висновок

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

Цей підручник є щось на кшталт «штампу моєї пам'яті» з мови SQL (DDL, DML), тобто. це інформація, яка накопичилася в процесі професійної діяльності і постійно зберігається в моїй голові. Це для мене достатній мінімум, який застосовується при роботі з базами даних найчастіше. Якщо виникає потреба застосовувати більш повні конструкції SQL, то я зазвичай звертаюся за допомогою в бібліотеку MSDN розташовану в інтернет. На мій погляд, утримати все в голові дуже складно, та й немає особливої ​​потреби в цьому. Але знати основні конструкції дуже корисно, т.к. вони застосовні практично у такому вигляді у багатьох реляційних базах даних, як-от Oracle, MySQL, Firebird. Відмінності в основному полягають у типах даних, які можуть відрізнятись у деталях. Основних конструкцій мови SQL не так багато, і за постійної практики вони швидко запам'ятовуються. Наприклад, для створення об'єктів (таблиць, обмежень, індексів тощо) достатньо мати під рукою текстовий редактор середовища (IDE) для роботи з базою даних, і немає потреби вивчати візуальний інструментарій заточений для роботи з конкретним типом баз даних (MS SQL) , Oracle, MySQL, Firebird, …). Це зручно і тим, що весь текст знаходиться перед очима, і не потрібно бігати по численних вкладках, щоб створити, наприклад, індекс або обмеження. При постійній роботі з базою даних створити, змінити, а особливо перестворити об'єкт за допомогою скриптів виходить у рази швидше, ніж якщо це робити у візуальному режимі. Також у скриптовому режимі (відповідно, за належної акуратності), простіше ставити і контролювати правила найменування об'єктів (моя суб'єктивна думка). До того ж скрипти зручно використовувати у разі, коли зміни, які робляться в одній базі даних (наприклад, тестової), необхідно перенести в такому вигляді в іншу базу (продуктивну).

Мова SQL підрозділяється на кілька частин, тут я розгляну 2 найважливіші його частини:
  • DML – Data Manipulation Language (мова маніпулювання даними), що містить такі конструкції:
    • SELECT – вибірка даних
    • INSERT – вставка нових даних
    • UPDATE – оновлення даних
    • DELETE – видалення даних
    • MERGE - злиття даних
Т.к. я є практиком, як такої теорії в даному підручнику буде мало, і всі конструкції пояснюватимуться на практичних прикладах. До того ж я вважаю, що мову програмування, а особливо SQL, можна освоїти лише на практиці, самостійно помацавши її і зрозумівши, що відбувається, коли ви виконуєте ту чи іншу конструкцію.

Цей підручник створено за принципом Step by Step, тобто. необхідно читати його послідовно та бажано відразу ж виконуючи приклади. Але якщо у вас виникає потреба дізнатися про якусь команду більш детально, то використовуйте конкретний пошук в інтернет, наприклад, у бібліотеці MSDN.

Під час написання цього підручника використовувалася база даних MS SQL Server версії 2014, для виконання скриптів я використовував MS SQL Server Management Studio (SSMS).

Коротко про MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) – утиліта для Microsoft SQL Server для конфігурування, управління та адміністрування компонентів бази даних. Ця утиліта містить редактор скриптів (який в основному і буде нами використовуватися) та графічну програму, яка працює з об'єктами та налаштуваннями сервера. Головним інструментом SQL Server Management Studio є Object Explorer, який дозволяє користувачеві переглядати, витягувати об'єкти сервера, а також керувати ними. Цей текст частково запозичений із вікіпедії.

Для створення нового редактора скрипта використовуйте кнопку New Query/Новий запит:

Для зміни поточної бази даних можна використовувати список, що випадає:

Для виконання певної команди (або групи команд) виділіть її та натисніть кнопку «Execute/Виконати» або клавішу «F5». Якщо в редакторі в даний момент знаходиться тільки одна команда, або вам необхідно виконати всі команди, нічого виділяти не потрібно.

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

Власне це все, що нам необхідно буде знати для виконання наведених тут прикладів. Решта за утилітою SSMS неважко вивчити самостійно.

Трохи теорії

Реляційна база даних (РБД, або далі в контексті просто БД) є сукупністю таблиць, пов'язаних між собою. Якщо говорити грубо, то БД – файл у якому дані зберігаються у структурованому вигляді.

СУБД – Система Управління цими Базами даних, тобто. це комплекс інструментів до роботи з конкретним типом БД (MS SQL, Oracle, MySQL, Firebird, …).

Примітка
Т.к. у житті, у розмовної промови, ми переважно говоримо: «БД Oracle», і навіть просто «Oracle», насправді маючи на увазі «СУБД Oracle», то контексті даного підручника іноді вживатиметься термін БД. З контексту, на мою думку, буде зрозуміло, про що саме йдеться.

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

Таблиця - це головний об'єкт РБД, усі дані РБД зберігаються рядково в стовпцях таблиці. Рядки, записи – теж синоніми.

Для кожної таблиці, як і її стовпців задаються найменування, якими згодом до них йде звернення.
Найменування об'єкта (ім'я таблиці, ім'я стовпця, ім'я індексу тощо) у MS SQL може мати максимальну довжину 128 символів.

Для довідки– у БД ORACLE найменування об'єктів можуть мати максимальну довжину 30 символів. Тому для конкретної БД потрібно виробляти свої правила для найменування об'єктів, щоб укластися в ліміт за кількістю символів.

SQL - мова що дозволяє здійснювати запити в БД у вигляді СУБД. У конкретній СУБД, мова SQL може мати специфічну реалізацію (свій діалект).

DDL і DML - підмножина мови SQL:

  • Мова DDL служить до створення та модифікації структури БД, тобто. для створення/зміни/видалення таблиць та зв'язків.
  • Мова DML дозволяє здійснювати маніпуляції із даними таблиць, тобто. з її рядками. Він дозволяє робити вибірку даних із таблиць, додавати нові дані в таблиці, а також оновлювати та видаляти існуючі дані.

У мові SQL можна використовувати 2 види коментарів (однорядковий та багаторядковий):

Однорядковий коментар
і

/* багаторядковий коментар */

Власне, все для теорії цього буде достатньо.

DDL – Data Definition Language (мова опису даних)

Для прикладу розглянемо таблицю з даними про співробітників, у звичному для людини програмістом, що не є:

У разі стовпці таблиці мають такі наименования: Табельний номер, ПІБ, Дата народження, E-mail, Посада, Відділ.

Кожен з цих стовпців можна охарактеризувати за типом даних, що містяться в ньому:

  • Табельний номер – ціле число
  • ПІБ – рядок
  • Дата народження – дата
  • E-mail – рядок
  • Посада – рядок
  • Відділ – рядок
Тип стовпця - характеристика, яка говорить про те, які дані можуть зберігати даний стовпець.

Для початку буде достатньо запам'ятати тільки такі основні типи даних, що використовуються в MS SQL:

Значення Позначення у MS SQL Опис
Рядок змінної довжини varchar(N)
і
nvarchar(N)
За допомогою числа N ми можемо вказати максимально можливу довжину рядка для відповідного стовпця. Наприклад, якщо хочемо сказати, що значення стовпця «ПІБ» може містити максимум 30 символів, необхідно задати їй тип nvarchar(30).
Відмінність varchar від nvarchar полягає в тому, що varchar дозволяє зберігати рядки у форматі ASCII, де один символ займає 1 байт, а nvarchar зберігає рядки у форматі Unicode, де кожен символ займає 2 байти.
Тип varchar варто використовувати тільки в тому випадку, якщо ви на 100% впевнені, що в даному полі не потрібно зберігати символи Unicode. Наприклад, varchar можна використовувати для зберігання адрес електронної пошти, т.к. вони зазвичай містять лише символи ASCII.
Рядок фіксованої довжини char(N)
і
nchar(N)
Від рядка змінної довжини цей тип відрізняється тим, що й довжина рядок менше N символів, вона завжди доповнюється праворуч до довжини N пробілами і зберігається у БД у вигляді, тобто. у базі даних вона займає рівно N символів (де один символ займає 1 байт для char і 2 байта для типу nchar). На практиці цей тип дуже рідко знаходить застосування, і якщо використовується, він використовується переважно у форматі char(1), тобто. коли поле визначається одним символом.
Ціле число int Даний тип дозволяє нам використовувати в стовпці лише цілі числа, як позитивні, і негативні. Для довідки (зараз це не так актуально для нас) – діапазон чисел, що дозволяє тип int від -2 147 483 648 до 2 147 483 647. Зазвичай це основний тип, який використовується для завдання ідентифікаторів.
Речове чи дійсне число float Якщо говорити простою мовою, то це числа, в яких може бути десяткова точка (кома).
Дата date Якщо у стовпці необхідно зберігати лише Дату, яка складається з трьох складових: Числа, Місяця та Року. Наприклад, 15.02.2014 (15 лютого 2014 року). Даний тип можна використовувати для стовпця "Дата прийому", "Дата народження" і т.п. у тих випадках, коли нам важливо зафіксувати лише дату, або коли складова часу нам не важлива і її можна відкинути або якщо вона не відома.
Час time Даний тип можна використовувати, якщо у стовпці необхідно зберігати лише дані час, тобто. Годинники, Хвилини, Секунди та Міллісекунди. Наприклад, 17:38:31.3231603
Наприклад, щоденний «Час відправлення рейсу».
дата і час datetime Цей тип дозволяє одночасно зберегти і Дату, і Час. Наприклад, 15.02.2014 17:38:31.323
Для прикладу це може бути дата та час якоїсь події.
Прапор bit Даний тип зручно застосовувати для зберігання значень виду «Так»/«Ні», де «Так» зберігатиметься як 1, а «Ні» зберігатиметься як 0.

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

Для виконання прикладів створимо тестову базу під назвою Test.

Просту базу даних (без вказівки додаткових параметрів) можна створити, виконавши таку команду:

CREATE DATABASE Test
Видалити базу даних можна командою (варто бути дуже обережним із цією командою):

DROP DATABASE Test
Для того, щоб перейти на нашу базу даних, можна виконати команду:

USE Test
Або ж виберіть базу даних Test у списку в області меню SSMS. При роботі мною найчастіше використовується саме цей спосіб перемикання між базами.

Тепер у нашій БД ми можемо створити таблицю, використовуючи описи у тому вигляді як вони є, використовуючи пробіли та символи кирилиці:

CREATE TABLE [Співробітники]([Табельний номер] int, [ПІБ] nvarchar(30), [Дата народження] date, nvarchar(30), [Посада] nvarchar(30), [Відділ] nvarchar(30))
У цьому випадку нам доведеться укладати імена у квадратні дужки […].

Але в базі даних для більшої зручності всі назви об'єктів краще задавати на латиниці і не використовувати в іменах прогалини. У MS SQL зазвичай у разі кожне слово починається з великої літери, наприклад, для поля «Табельний номер», ми могли б задати ім'я PersonnelNumber. Також у імені можна використовувати цифри, наприклад, PhoneNumber1.

На замітку
У деяких СУБД кращим може бути наступний формат найменувань «PHONE_NUMBER», наприклад, такий формат часто використовується в БД ORACLE. Природно при завданні ім'я поля бажано щоб воно не збігалося з ключовими словами, що використовуються в СУБД.

З цієї причини можете забути про синтаксис із квадратними дужками та видалити таблицю [Співробітники]:

DROP TABLE [Співробітники]
Наприклад, таблицю зі співробітниками можна назвати «Employees», а її полям можна задати такі назви:

  • ID – Табельний номер (Ідентифікатор співробітника)
  • Name – ПІБ
  • Birthday – Дата народження
  • Email – E-mail
  • Position – Посада
  • Department – ​​Відділ
Найчастіше для назви поля ідентифікатора використовується слово ID.

Тепер створимо нашу таблицю:

CREATE TABLE Employees(ID int, Name nvarchar(30), Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30))
Для того, щоб встановити обов'язкові для заповнення стовпці, можна використовувати опцію NOT NULL.

Для вже існуючої таблиці поля можна перевизначити за допомогою наступних команд:





























Оновлення поля ID ALTER TABLE Employees ALTER COLUMN ID int NOT NULL

На замітку
Загальна концепція мови SQL для більшості СУБД залишається однаковою (принаймні про це я можу судити з тих СУБД, з якими мені довелося попрацювати). Відмінність DDL у різних СУБД в основному полягають у типах даних (тут можуть відрізнятися не тільки їх найменування, а й деталі їх реалізації), так само може трохи відрізнятися і сама специфіка реалізації мови SQL (тобто суть команд одна і та ж, але можуть бути невеликі відмінності в діалекті, на жаль, але одного стандарту немає). Володіючи основами SQL ви можете перейти з однієї СУБД в іншу, т.к. вам у разі потрібно лише розібратися у деталях реалізації команд у новій СУБД, тобто. в більшості випадків достатньо буде просто провести аналогію.

Створення таблиці CREATE TABLE Employees(ID int, -- в ORACLE тип int - це еквівалент(обгортка) для number(38) Name nvarchar2(30), -- nvarchar2 в ORACLE еквівалентний nvarchar у MS SQL Birthday date, Email n , Position nvarchar2(30), Department nvarchar2(30)); -- оновлення полів ID та Name (тут замість ALTER COLUMN використовується MODIFY(…)) ALTER TABLE Employees MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); -- додавання PK (у цьому випадку конструкція виглядає як і в MS SQL, вона буде показана нижче) ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
Для ORACLE є відмінності в плані реалізації типу varchar2, його кодування залежить від налаштувань БД і текст може зберігатися, наприклад, у кодуванні UTF-8. Крім цього, довжину поля в ORACLE можна задати як у байтах, так і в символах, для цього використовуються додаткові опції BYTE і CHAR, які вказуються після довжини поля, наприклад:

NAME varchar2(30 BYTE) -- місткість поля дорівнюватиме 30 байтам NAME varchar2(30 CHAR) -- місткість поля дорівнюватиме 30 символам
Яка опція буде використовуватися за замовчуванням BYTE або CHAR, у разі простої вказівки в ORACLE типу varchar2(30), залежить від налаштувань БД, так само вона може іноді задаватися в налаштуваннях IDE. Загалом часом можна легко заплутатися, тому у випадку ORACLE, якщо використовується тип varchar2 (а це тут часом виправдано, наприклад, при використанні кодування UTF-8) я волію явно прописувати CHAR (бо зазвичай довжину рядка зручніше вважати саме в символах ).

Але в разі якщо в таблиці вже є які-небудь дані, то для успішного виконання команд необхідно, щоб у всіх рядках таблиці поля ID і Name були обов'язково заповнені. Продемонструємо це на прикладі, вставимо в таблицю дані в поля ID, Position та Department, це можна зробити наступним скриптом:

INSERT Employees(ID,Position,Department) VALUES (1000,N"Директор",N"Адміністрація"), (1001,N"Програміст",N"ІТ"), (1002,N"Бухгалтер",N"Бухгалтерія" ), (1003,N"Старший програміст",N"ІТ")
У разі, команда INSERT також видасть помилку, т.к. при вставці ми не зазначили значення обов'язкового поля Name.
Якщо б у нас у початковій таблиці були ці дані, то команда «ALTER TABLE Employees ALTER COLUMN ID int NOT NULL» виконалася б успішно, а команда «ALTER TABLE Employees ALTER COLUMN Name int NOT NULL» видала повідомлення про помилку, що поле Name є NULL (не зазначені) значення.

Додамо значення для поля Name і знову заллємо дані:


Також опцію NOT NULL можна використовувати безпосередньо під час створення нової таблиці, тобто. у контексті команди CREATE TABLE.

Спочатку видалимо таблицю за допомогою команди:

DROP TABLE Employees
Тепер створимо таблицю з обов'язковими для заповнення стовпцями ID та Name:

CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30))
Можна також після імені стовпця написати NULL, що означатиме, що в ньому будуть допустимі значення NULL (не вказані), але цього робити не обов'язково, так як дана характеристика мається на увазі за умовчанням.

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

ALTER TABLE Employees ALTER COLUMN Name nvarchar(30) NULL
Або просто:

ALTER TABLE Employees ALTER COLUMN Name nvarchar(30)
Також даною командою ми можемо змінити тип поля на інший сумісний тип, або змінити його довжину. Наприклад, розширимо поле Name до 50 символів:

ALTER TABLE Employees ALTER COLUMN Name nvarchar(50)

Первинний ключ

При створенні таблиці бажано, щоб вона мала унікальний стовпець або сукупність стовпців, яка є унікальною для кожного її рядка – за даним унікальним значенням можна однозначно ідентифікувати запис. Таке значення називається первинним ключем таблиці. Для нашої таблиці Employees таким унікальним значенням може бути стовпець ID (який містить «Табельний номер співробітника» - нехай у нашому випадку це значення унікальне для кожного співробітника і не може повторюватися).

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

ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID)
Де "PK_Employees" це ім'я обмеження, що відповідає за первинний ключ. Зазвичай найменування первинного ключа використовується префікс «PK_» після якого йде ім'я таблиці.

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

ALTER TABLE ім'я_таблиці ADD CONSTRAINT ім'я_обмеження PRIMARY KEY(поле1,поле2,…)
Варто зазначити, що в MS SQL усі поля, які входять до первинного ключа, повинні мати характеристику NOT NULL.

Також первинний ключ можна визначити безпосередньо під час створення таблиці, тобто. у контексті команди CREATE TABLE. Видалимо таблицю:

DROP TABLE Employees
А потім створимо її, використовуючи наступний синтаксис:

CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30) NOT NULL, Віртуальний час, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30), CONSTRAINT PK_Employees PRIMARY KEY всіх полів, як обмеження)
Після створення заллємо в таблицю дані:

INSERT Employees(ID,Position,Department,Name) VALUES (1000,N"Директор",N"Адміністрація",N"Іванов І.І."), (1001,N"Програміст",N"ІТ",N" Петров П.П."), (1002,N"Бухгалтер",N"Бухгалтерія",N"Сідорів С.С."), (1003,N"Старший програміст",N"ІТ",N"Андрєєв А. А.")
Якщо первинний ключ у таблиці складається лише з значень одного стовпця, можна використовувати наступний синтаксис:

CREATE TABLE Employees(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - вказуємо як характеристику поля Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department n
Насправді ім'я обмеження можна і не ставити, у цьому випадку йому буде присвоєно системне ім'я (на зразок PK__Employee__3214EC278DA42077):

CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30), PRIMARY KEY(ID))
Або:

CREATE TABLE Employees(ID int NOT NULL PRIMARY KEY, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30))
Але я рекомендував би для постійних таблиць завжди явно ставити ім'я обмеження, т.к. за явно заданим і зрозумілим ім'ям з ним згодом буде легше проводити маніпуляції, наприклад, можна зробити його видалення:

ALTER TABLE Employees DROP CONSTRAINT PK_Employees
Але такий короткий синтаксис, без зазначення імен обмежень, зручно застосовувати під час створення тимчасових таблиць БД (ім'я тимчасової таблиці починається з # чи ##), які після використання буде видалено.

Підсумуємо

на Наразіми розглянули такі команди:
  • CREATE TABLEимя_таблицы (перерахування полів та його типів, обмежень) – служить до створення нової таблиці в поточної БД;
  • DROP TABLEимя_таблицы – служить видалення таблиці з поточної БД;
  • ALTER TABLEім'я_таблиці ALTER COLUMNім'я_стовпця … – служить для оновлення типу стовпця або зміни його налаштувань (наприклад для завдання характеристики NULL або NOT NULL);
  • ALTER TABLEім'я_таблиці ADD CONSTRAINTім'я_обмеження PRIMARY KEY(поле1, поле2,…) – додавання первинного ключа до вже існуючої таблиці;
  • ALTER TABLEім'я_таблиці DROP CONSTRAINTимя_обмеження – видалення обмеження з таблиці.

Трохи про тимчасові таблиці

Вирізка із MSDN.У MS SQL Server існує два види тимчасових таблиць: локальні (#) та глобальні (##). Локальні тимчасові таблиці видно лише їхнім творцям до завершення сеансу з'єднання з екземпляром SQL Server, як тільки вони створені вперше. Локальні часові таблиці автоматично видаляються після відключення користувача від екземпляра SQL Server. Глобальні часові таблиці видно всім користувачам протягом будь-яких сеансів з'єднання після створення цих таблиць і видаляються, коли всі користувачі, які посилаються на ці таблиці, відключаються від екземпляра SQL Server.

Тимчасові таблиці створюються у системній базі tempdb, тобто. створюючи їх ми не засмічуємо основну базу, в іншому ж часові таблиці повністю ідентичні звичайним таблицям, їх можна видалити з допомогою команди DROP TABLE. Найчастіше використовуються локальні (#) часові таблиці.

Для створення тимчасової таблиці можна використати команду CREATE TABLE:

CREATE TABLE #Temp(ID int, Name nvarchar(30))
Так як тимчасова таблиця в MS SQL аналогічна звичайній таблиці, її відповідно також можна видалити самому командою DROP TABLE:

DROP TABLE #Temp

Так само тимчасову таблицю (як і звичайну таблицю) можна створити і відразу заповнити даними повертаються запитом використовуючи синтаксис SELECT … INTO:

SELECT ID,Name INTO #Temp FROM Employees

На замітку
У різних СУБД реалізація тимчасових таблиць може відрізнятись. Наприклад, у СУБД ORACLE і Firebird структура часових таблиць повинна бути визначена заздалегідь командою CREATE GLOBAL TEMPORARY TABLE із зазначенням специфіки зберігання в ній даних, далі користувач бачить її серед основних таблиць і працює з нею як зі звичайною таблицею.

Нормалізація БД – дроблення на підтаблиці (довідники) та визначення зв'язків

Наша поточна таблиця Employees має недолік у тому, що в полях Position і Department користувач може ввести будь-який текст, що в першу чергу загрожує помилками, так як він у одного співробітника може вказати як відділ просто «ІТ», а у другого співробітника, наприклад , ввести "ІТ-відділ", у третього "IT". У результаті незрозуміло, що мав на увазі користувач, тобто. чи є дані співробітники працівниками одного відділу, чи користувач описався і це 3 різних відділу? А тим більше, у цьому випадку, ми не зможемо правильно згрупувати дані для якогось звіту, де, можливо, потрібно показати кількість співробітників у розрізі кожного відділу.

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

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

Щоб уникнути цих недоліків і застосовується, так звана, нормалізація бази даних – дроблення її на підтаблиці, таблиці довідники. Не обов'язково лізти в нетрі теорії і вивчати, що з себе представляють нормальні форми, достатньо розуміти суть нормалізації.

Давайте створимо 2 таблиці довідники «Посади» та «Відділи», першу назвемо Positions, а другу відповідно Departments:

CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY ) NOT NULL)
Зауважимо, що тут ми використовували нову опцію IDENTITY, яка говорить про те, що дані в стовпці ID нумеруватимуться автоматично, починаючи з 1, з кроком 1, тобто. при додаванні нових записів їм послідовно присвоюватимуться значення 1, 2, 3, і т.д. Такі поля зазвичай називають автоінкрементними. У таблиці може бути визначено лише одне поле з властивістю IDENTITY і, як правило, але необов'язково, таке поле є первинним ключем для даної таблиці.

На замітку
У різних СУБД реалізація полів із лічильником може робитися за своїм. У MySQL, наприклад, таке поле визначається за допомогою опції AUTO_INCREMENT. У ORACLE і Firebird раніше цю функціональність можна було емулювати за допомогою використання послідовностей (SEQUENCE). Але наскільки я знаю у ORACLE зараз додали опцію GENERATED AS IDENTITY.

Давайте заповнимо ці таблиці автоматично, виходячи з поточних даних записаних у полях Position і Department таблиці Employees:

Заповнюємо поле Name таблиці Positions, унікальними значеннями з поля Position таблиці .
Те саме проробимо для таблиці Departments:

INSERT Departments(Name) SELECT DISTINCT Department FROM Employees WHERE Department IS NOT NULL
Якщо ми відкриємо таблиці Positions і Departments, то побачимо пронумерований набір значень по полю ID:

SELECT * FROM Positions

SELECT * FROM Departments

Дані таблиці тепер і відіграватимуть роль довідників для завдання посад та відділів. Тепер ми посилатимемося на ідентифікатори посад та відділів. Насамперед створимо нові поля в таблиці Employees для зберігання даних ідентифікаторів:

Додаємо поле для ID посади ALTER TABLE Employees ADD PositionID int -- додаємо поле для ID відділу ALTER TABLE Employees ADD DepartmentID int
Тип посилальних полів повинен бути яким самим, як і в довідниках, в даному випадку це int.

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

ALTER TABLE Employees ADD PositionID int, DepartmentID int
Тепер пропишемо посилання (посилальні обмеження - FOREIGN KEY) для цих полів, для того, щоб користувач не мав можливості записати в дані поля, значення, відсутні серед значень ID, що знаходяться в довідниках.

ALTER TABLE Employees ADD CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID)
І те саме зробимо для другого поля:

ALTER TABLE Employees ADD CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID)
Тепер користувач у дані поля зможе занести лише значення ID із відповідного довідника. Відповідно, щоб використовувати новий відділ або посаду, він насамперед повинен буде додати новий запис до відповідного довідника. Т.к. посади та відділи тепер зберігаються в довідниках в одному єдиному примірнику, то щоб змінити назву, достатньо змінити її тільки в довіднику.

Ім'я посилального обмеження, зазвичай, є складовим, воно складається з префікса «FK_», потім йде ім'я таблиці і після знака підкреслення йде ім'я поля, яке посилається на ідентифікатор таблиці-довідника.

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

ALTER TABLE таблиця ADD CONSTRAINT ім'я_обмеження FOREIGN KEY(поле1,поле2,…) REFERENCES таблиця_довідник(поле1,поле2,…)
В даному випадку в таблиці "таблиця_довідник" первинний ключ представлений комбінацією з декількох полів (поле1, поле2, ...).

Власне, тепер оновимо поля PositionID та DepartmentID значеннями ID із довідників. Скористайтеся для цього DML командою UPDATE:

UPDATE e SET PositionID=(SELECT ID FROM Positions WHERE Name=e.Position), DepartmentID=(SELECT ID FROM Departments WHERE Name=e.Department) FROM Employees e
Подивимося, що вийшло, виконавши запит:

SELECT * FROM Employees

Все, поля PositionID та DepartmentID заповнені відповідними посадами та відділами ідентифікаторами потреби у полях Position і Department у таблиці Employees тепер немає, можна видалити ці поля:

ALTER TABLE Employees DROP COLUMN Position,Department
Тепер таблиця у нас набула такого вигляду:

SELECT * FROM Employees

ID Name Birthday Email PositionID DepartmentID
1000 Іванов І.І. NULL NULL 2 1
1001 Петров П.П. NULL NULL 3 3
1002 Сидоров С.С. NULL NULL 1 2
1003 Андрєєв А.А. NULL NULL 4 3

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

SELECT e.ID,e.Name,p.Name PositionName,d.Name DepartmentName FROM Employees e LEFT JOIN Departments d ON d.ID=e.DepartmentID LEFT JOIN Positions p ON p.ID=e.PositionID

В інспекторі об'єктів ми можемо побачити всі об'єкти, створені для даної таблиці. Звідси можна проводити різні маніпуляції з цими об'єктами – наприклад, перейменовувати чи видаляти об'єкти.

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

ALTER TABLE Employees ADD ManagerID int
У цьому полі допустиме значення NULL, поле буде порожнім, якщо, наприклад, над співробітником немає вищестоящих.

Тепер створимо FOREIGN KEY на таблицю Employees:

ALTER TABLE Employees ADD CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID)
Давайте тепер створимо діаграму і подивимося, як виглядають на ній зв'язки між нашими таблицями:

В результаті ми повинні побачити наступну картину (таблиця Employees пов'язана з таблицями Positions і Depertments, а також посилається сама на себе):

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

Для прикладу перестворимо таблицю із зазначенням опції ON DELETE CASCADE для FK_Employees_DepartmentID:

DROP TABLE Employees CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARYKE ) REFERENCES Departments(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) )VALUES (1000,N"Іванов І.І.","19550219",2,1,NULL), (1001,N"Петров П.П.","19831203",3,3,1003), (1002 ,N"Сідоров С.С.","19760607",1,2,1000), (1003,N"Андрєєв А.А.","19820417",4,3,1000)
Видалимо відділ з ідентифікатором 3 з таблиці Departments:

DELETE Departments WHERE ID=3
Подивимося дані таблиці Employees:

SELECT * FROM Employees

ID Name Birthday Email PositionID DepartmentID ManagerID
1000 Іванов І.І. 1955-02-19 NULL 2 1 NULL
1002 Сидоров С.С. 1976-06-07 NULL 1 2 1000

Як бачимо, дані відділу 3 з таблиці Employees так само віддалилися.

Опція ON UPDATE CASCADE веде себе аналогічно, але діє при оновленні значення ID у довіднику. Наприклад, якщо ми змінимо ID посади в довіднику посад, то в цьому випадку буде проводитись оновлення DepartmentID у таблиці Employees на нове значення ID, яке ми задали в довіднику. Але в даному випадку це продемонструвати не вийде, т.к. у колонки ID у таблиці Departments стоїть опція IDENTITY, яка не дозволить нам виконати наступний запит (змінити ідентифікатор відділу 3 на 30):

UPDATE Departments SET ID=30 WHERE ID=3
Головне зрозуміти суть цих 2-х опцій ON DELETE CASCADE та ON UPDATE CASCADE. Я застосовую ці опції дуже рідко і рекомендую добре подумати, як вказувати в посилальному обмеження, т.к. при ненавмисному видаленні запису з таблиці довідника це може призвести до великих проблем і створити ланцюгову реакцію.

Відновимо відділ 3:

Даємо дозвіл на додавання/зміну IDENTITY значення SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name) VALUES(3,N"ИТ") -- забороняємо додавання/зміну IDENTITY значення SET
Повністю очистимо таблицю Employees за допомогою команди TRUNCATE TABLE:

TRUNCATE TABLE Employees
І знову перезаллємо в неї дані, використовуючи попередню команду INSERT:

INSERT Employees (ID,Name,Birthday,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Іванов І.І.","19550219",2,1,NULL), (1001,N"Петров П.П." ,"19831203",3,3,1003), (1002,N"Сідорів С.С.","19760607",1,2,1000), (1003,N"Андрєєв А.А.","19820417" ,4,3,1000)

Підсумуємо

На даний момент до наших знань додалося ще кілька команд DDL:
  • Додавання якості IDENTITY до поля – дозволяє зробити це поле автоматично заповнюваним (полем-лічильником) для таблиці;
  • ALTER TABLEім'я_таблиці ADDперелік_полей_з_характеристиками – дозволяє додати нові поля до таблиці;
  • ALTER TABLEім'я_таблиці DROP COLUMNсписок_полів – дозволяє видалити поля з таблиці;
  • ALTER TABLEім'я_таблиці ADD CONSTRAINTім'я_обмеження FOREIGN KEY(поля) REFERENCESтаблиця_довідник(поля) – дозволяє визначити зв'язок між таблицею та таблицею довідником.

Інші обмеження – UNIQUE, DEFAULT, CHECK

За допомогою обмеження UNIQUE можна сказати, що значення для кожного рядка в даному полі або в наборі полів має бути унікальним. У випадку таблиці Employees таке обмеження ми можемо накласти на поле Email. Тільки попередньо заповнимо Email значеннями, якщо вони ще не визначені:

UPDATE Employees SET Email=" [email protected]" WHERE ID=1000 UPDATE Employees SET Email=" [email protected]" WHERE ID=1001 UPDATE Employees SET Email=" [email protected]" WHERE ID=1002 UPDATE Employees SET Email=" [email protected] WHERE ID=1003
А тепер можна накласти на це поле обмеження-унікальності:

ALTER TABLE Employees ADD CONSTRAINT UQ_Employees_Email UNIQUE(Email)
Тепер користувач не зможе внести той самий E-Mail у кількох співробітників.

Обмеження унікальності зазвичай називається так – спочатку йде префікс «UQ_», далі назва таблиці і після знака підкреслення йде ім'я поля, яке накладається дане обмеження.

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

ALTER TABLE ім'я_таблиці ADD CONSTRAINT ім'я_обмеження UNIQUE(поле1,поле2,…)
За допомогою додавання до поля обмеження DEFAULT ми можемо задати значення за замовчуванням, яке буде підставлятись у випадку, якщо при вставці нового запису це поле не буде перераховане у списку полів команди INSERT. Це обмеження можна встановити безпосередньо при створенні таблиці.

Давайте додамо до таблиці Employees нове поле «Дата прийому» і назвемо його HireDate і скажемо що значення за замовчуванням даного поля буде поточна дата:

ALTER TABLE Employees ADD HireDate date NOT NULL DEFAULT SYSDATETIME()
Або якщо стовпець HireDate вже існує, то можна використовувати наступний синтаксис:

ALTER TABLE Employees ADD DEFAULT SYSDATETIME() FOR HireDate
Тут не вказав ім'я обмеження, т.к. у випадку DEFAULT у мене склалася думка, що це не так критично. Але якщо робити по-доброму, то, гадаю, не треба лінуватися і варто поставити нормальне ім'я. Робиться це так:

ALTER TABLE Employees ADD CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME() FOR HireDate
Оскільки цього стовпця раніше не було, то при його додаванні до кожного запису в поле HireDate буде вставлено поточне значення дати.

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

INSERT Employees(ID,Name,Email)VALUES(1004,N"Сергєєв С.С."," [email protected]")
Подивимося, що вийшло:

SELECT * FROM Employees

ID Name Birthday Email PositionID DepartmentID ManagerID HireDate
1000 Іванов І.І. 1955-02-19 [email protected] 2 1 NULL 2015-04-08
1001 Петров П.П. 1983-12-03 [email protected] 3 4 1003 2015-04-08
1002 Сидоров С.С. 1976-06-07 [email protected] 1 2 1000 2015-04-08
1003 Андрєєв А.А. 1982-04-17 [email protected] 4 3 1000 2015-04-08
1004 Сергєєв С.С. NULL [email protected] NULL NULL NULL 2015-04-08

Перевірочне обмеження CHECK використовується в тому випадку, коли необхідно здійснити перевірку значень, що вставляються в поле. Наприклад, накладемо дане обмеження на поле табельний номер, яке ми є ідентифікатором співробітника (ID). За допомогою цього обмеження скажемо, що табельні номери повинні мати значення від 1000 до 1999:

ALTER TABLE Employees ADD CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999)
Обмеження зазвичай називається так само, спочатку йде префікс "CK_", потім ім'я таблиці та ім'я поля, на яке накладено це обмеження.

Спробуємо вставити неприпустимий запис для перевірки, що обмеження працює (ми маємо отримати відповідну помилку):

INSERT Employees(ID,Email) VALUES(2000," [email protected]")
А тепер змінимо значення, що вставляється на 1500 і переконаємося, що запис вставиться:

INSERT Employees(ID,Email) VALUES(1500," [email protected]")
Можна також створити обмеження UNIQUE і CHECK без вказівки імені:

ALTER TABLE Employees ADD UNIQUE (Email) ALTER TABLE Employees ADD CHECK (ID BETWEEN 1000 AND 1999)
Але це дуже хороша практика і краще ставити ім'я обмеження у явному вигляді, т.к. щоб розібратися потім, що буде важче, потрібно буде відкривати об'єкт і дивитися, за що він відповідає.

При хорошому найменуванні багато інформації про обмеження можна дізнатися безпосередньо на його ім'я.

І, відповідно, всі ці обмеження можна створити відразу при створенні таблиці, якщо її ще немає. Видалимо таблицю:

DROP TABLE Employees
І перестворимо її з усіма створеними обмеженнями однією командою CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), -- для DEFAULT я з (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT UQ_Employees_Email UNIQUE (Email), CONSTRAINT CK_Employees_ID CHECK (ID BETWEEN 1000 AND 1999))

INSERT Employees (ID,Name,Birthday,Email,PositionID,DepartmentID)VALUES (1000,N"Іванов І.І.","19550219"," [email protected]",2,1), (1001,N"Петров П.П.","19831203"," [email protected]",3,3), (1002,N"Сідоров С.С.","19760607"," [email protected]",1,2), (1003,N"Андрєєв А.А.","19820417"," [email protected]",4,3)

Трохи про індекси, які створюються при створенні обмежень PRIMARY KEY та UNIQUE

Як можна побачити на скріншоті вище, при створенні обмежень PRIMARY KEY та UNIQUE автоматично створилися індекси з такими самими назвами (PK_Employees та UQ_Employees_Email). За замовчуванням індекс для первинного ключа створюється як CLUSTERED, а решти індексів як NONCLUSTERED. Варто сказати, що поняття кластерного індексу не в усіх СУБД. Таблиця може мати лише один кластерний (CLUSTERED) індекс. CLUSTERED - означає, що записи таблиці будуть сортуватися за цим індексом, так само можна сказати, що цей індекс має безпосередній доступ до всіх даних таблиці. Це головний індекс таблиці. Якщо сказати ще грубіше, це індекс, прикручений до таблиці. Кластерний індекс - це дуже потужний засіб, який може допомогти при оптимізації запитів, поки просто запам'ятаємо це. Якщо ми хочемо сказати, щоб кластерний індекс використовувався не в первинному ключі, а для іншого індексу, то при створенні первинного ключа ми повинні вказати опцію NONCLUSTERED:

ALTER TABLE ім'я_таблиці ADD CONSTRAINT ім'я_обмеження PRIMARY KEY NONCLUSTERED(поле1,поле2,…)
Наприклад зробимо індекс обмеження PK_Employees некластерним, а індекс обмеження UQ_Employees_Email кластерним. Насамперед видалимо дані обмеження:

ALTER TABLE Employees DROP CONSTRAINT PK_Employees ALTER TABLE Employees DROP CONSTRAINT UQ_Employees_Email
А тепер створимо їх з опціями CLUSTERED та NONCLUSTERED:

ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (ID) ALTER TABLE Employees ADD CONSTRAINT UQ_Employees_Email UNIQUE CLUSTERED (Email)
Тепер, виконавши вибірку з таблиці Employees, ми побачимо, що записи відсортувалися за кластерним індексом UQ_Employees_Email:

SELECT * FROM Employees

ID Name Birthday Email PositionID DepartmentID HireDate
1003 Андрєєв А.А. 1982-04-17 [email protected] 4 3 2015-04-08
1000 Іванов І.І. 1955-02-19 [email protected] 2 1 2015-04-08
1001 Петров П.П. 1983-12-03 [email protected] 3 3 2015-04-08
1002 Сидоров С.С. 1976-06-07 [email protected] 1 2 2015-04-08

До цього, коли кластерним індексом був індекс PK_Employees, стандартні записи сортувалися по полю ID.

Але в даному випадку це лише приклад, який показує суть кластерного індексу, т.к. швидше за все до таблиці Employees будуть робитися запити з полю ID і у якихось випадках, можливо, вона сама виступатиме у ролі довідника.

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

Кластерний індекс вигідно застосовувати до полів, якими вибірка йде найчастіше.

Іноді в таблицях створюють ключ сурогатному полю, ось у цьому випадку буває корисно зберегти опцію CLUSTERED індекс для більш відповідного індексу і вказати опцію NONCLUSTERED при створенні сурогатного первинного ключа.

Підсумуємо

На даному етапі ми познайомилися з усіма видами обмежень, у їхньому найпростішому вигляді, які створюються командою виду «ALTER TABLE ім'я_таблиці ADD CONSTRAINT ім'я_обмеження...»:
  • PRIMARY KEY– первинний ключ;
  • FOREIGN KEY- Налаштування зв'язків і контроль цілісності даних;
  • UNIQUE- дозволяє створити унікальність;
  • CHECK- дозволяє здійснювати коректність введених даних;
  • DEFAULT– дозволяє встановити значення за замовчуванням;
  • Також слід зазначити, що всі обмеження можна видалити, використовуючи команду « ALTER TABLEім'я_таблиці DROP CONSTRAINTім'я_обмеження».
Також ми частково торкнулися теми індексів і розібрали поняття кластерний ( CLUSTERED) та некластерний ( NONCLUSTERED) індекс.

Створення самостійних індексів

Під самостійністю тут маються на увазі індекси, які створюються задля обмеження PRIMARY KEY чи UNIQUE.

Індекси по полю або полям можна створювати наступною командою:

CREATE INDEX IDX_Employees_Name ON Employees(Name)
Також тут можна вказати опції CLUSTERED, NONCLUSTERED, UNIQUE, а також можна вказати напрямок сортування кожного окремого поля ASC (за замовчуванням) або DESC:

CREATE UNIQUE NONCLUSTERED INDEX UQ_Employees_EmailDesc ON Employees(Email DESC)
Під час створення некластерного індексу опцію NONCLUSTERED можна відпустити, т.к. вона мається на увазі за умовчанням, тут вона показана просто, щоб вказати позицію опції CLUSTERED чи NONCLUSTERED у команді.

Видалити індекс можна наступною командою:

DROP INDEX IDX_Employees_Name ON Employees
Прості індекси, як і обмеження, можна створити в контексті команди CREATE TABLE.

Наприклад знову видалимо таблицю:

DROP TABLE Employees
І перестворимо її з усіма створеними обмеженнями та індексами однією командою CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDATE DEFAULT ), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID), CONSTRAINT UQ_Employees_Email UNIQUE(Email), CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999), INDEX IDX_Employees_Name(Name))
Насамкінець вставимо в таблицю наших співробітників:

INSERT Employees (ID,Name,Birthday,Email,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Іванов І.І.","19550219"," [email protected]",2,1,NULL), (1001,N"Петров П.П.","19831203"," [email protected]",3,3,1003), (1002,N"Сідорів С.С.","19760607"," [email protected]",1,2,1000), (1003,N"Андрєєв А.А.","19820417"," [email protected]",4,3,1000)
Додатково варто зазначити, що до некластерного індексу можна включати значення за допомогою вказівки їх у INCLUDE. Тобто. в даному випадку INCLUDE-індекс чимось нагадуватиме кластерний індекс, тільки тепер не індекс прикручений до таблиці, а необхідні значення прикручені до індексу. Відповідно такі індекси можуть дуже підвищити продуктивність запитів на вибірку (SELECT), якщо всі перелічені поля є в індексі, то можливо звернень до таблиці взагалі не знадобиться. Але це природно підвищує обсяг індексу, т.к. Значення перелічених полів дублюються в індексі.

Вирізка із MSDN.Загальний синтаксис команди для створення індексів

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name ON (column [ ASC | DESC ] [ ,...n ]) [ INCLUDE (column_name [ ,...n ]) ]

Підсумуємо

Індекси можуть збільшити швидкість вибірки даних (SELECT), але індекси зменшують швидкість модифікації даних таблиці, т.к. після кожної модифікації системі потрібно буде перебудувати всі індекси для конкретної таблиці.

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

Висновок щодо DDL

Як можна побачити, мова DDL не така складна, як може здатися на перший погляд. Тут я зміг показати практично всі основні конструкції, оперуючи всього трьома таблицями.

Головне - зрозуміти суть, а решта практики.

Успіхів вам в освоєнні цієї чудової мови під назвою SQL.

Structured Query Language (структурована мова запитів) або SQL- це декларативна мова програмування для використання у квазі-реляційних базах даних. Багато оригінальних рис SQL були взяті для кортежних обчислень, але останні розширення SQL включають все більше реляційної алгебри.
SQL спочатку створений IBM, але багато виробників розробили власні діалекти. Він був прийнятий як стандарт американським Національним інститутом стандартів (ANSI) в 1986 і ISO в 1987 . У стандарті мови програмування SQL, ANSI заявив, що офіційний вимова SQL є "ес кью ель". Тим не менш, багато фахівців бази даних вживали "сленгову" вимову «Сіквель», що відображає початкову назву мови, Sequel, яка була змінена пізніше через конфлікт торгових марок і найменувань у компанії IBM. Програмування для початківців.
Мова програмування SQLбув переглянутий в 1992 році, і ця версія відома як SQL-92 в. Потім було переглянуто 1999 , щоб стати SQL: 1999 (AKA SQL3). Програмування для чайників SQL 1999 підтримує об'єкти, які раніше не підтримується і в інших версіях, але тільки в кінці 2001 лише кілька систем управління базами даних підтримували SQL реалізації: 1999.
SQL, хоча визначається як ANSI і ISO, має безліч варіацій і розширень, більшість з яких мають власні характеристики, такі як реалізація корпорації Oracle «PL / SQL» або реалізація Sybase і Microsoft під назвою «Transact-SQL», що може заплутати знак основами програмування Також не рідкість для комерційних реалізацій опустити підтримку основних особливостей стандарту, такі типи даних як дата і час, віддаючи перевагу якомусь їхньому власному варіанту. Як результат, на відміну від ANSI C або ANSI Fortran, які зазвичай можна портувати з платформи на платформу без серйозних структурних змін, запити мови програмування SQL рідко можуть бути перенесені між різними системами баз даних без істотних модифікацій. Більшість людей в області баз даних вважають, що ця відсутність сумісності є навмисним, щоб забезпечити кожного розробника власною системою управління базами даних і прив'язати покупця до конкретної бази даних.
Як випливає з назви, мова програмування SQL призначена для конкретних, обмежених цілей - запитів даних, що містяться в реляційній базі даних. Як такий, він є набором інструкцій мови програмування для створення вибірок даних, а не процедурна мова, такої як C або BASIC , які призначені для вирішення набагато більше широкого колапроблем. Розширення мови, таких як «PL / SQL», призначені для вирішення цього обмеження, додавши процедурні елементи для SQL при збереженні переваг SQL. Інший підхід полягає в тому, що дозволяється в питання SQL вбудовувати команди процедурної мови програмування і взаємодіяти з базою даних. Наприклад, Oracle та інші підтримують мову Java у базі даних, тоді як PostgreSQL дозволяє писати функції на Perl, Tcl або С.
Один анекдот про SQL: "SQL не є структурованою, ні мовою." Суть жарту у тому, що SQL перестав бути мовою Тьюринга. .

Select * from T
C1 C2
1 a
2 b
C1 C2
1 a
2 b
Select C1 from T
C1
1
2
C1 C2
1 a
2 b
Select * from T where C1=1
C1 C2
1 a

Враховуючи таблицю T, запит Select* from T виведе на екран усі елементи всіх рядків таблиці.
З тієї ж таблиці запит Select C1 from T виведе на екран елементи зі стовпця C1 всіх рядків таблиці.
З тієї ж таблиці запит Select * from T where C1=1 виведе на екран всі елементи всіх рядків, де значення колонки С1 дорівнює "1".

SQL ключові слова

SQL слова поділяються на низку груп.

Перша – це Data Manipulation Language або DML(Мова управління даними). DML є підмножиною мови, що використовується для запиту до баз даних, додавання, оновлення та видалення даних.

  • SELECT є однією з найчастіше використовуваних команд DML і дозволяє користувачеві запитати як опис бажаного результату у вигляді безлічі. В опитуванні не зазначено, яким чином результати повинні бути розташовані - переведення запиту у форму, яка може бути виконана в базі даних, є роботою системи баз даних, більш конкретно оптимізатор запиту.
  • INSERT використовується для додавання рядків (формального набору) до існуючої таблиці.
  • UPDATE використовується для зміни значень даних у наявному рядку таблиці.
  • DELETE – визначення існуючих рядків, які будуть видалені з таблиці.

Три інші ключові слова, можна сказати, що потрапляють до групи DML:

  • BEGIN WORK (або START TRANSACTION, залежно від діалекту SQL) можуть бути використані, щоб відзначити початок транзакції бази даних, які виконуються або повністю не виконуються.
  • COMMIT встановлює, що всі зміни даних після здійснення операцій зберігаються.
  • ROLLBACK визначає, що всі зміни даних після останньої фіксації або відкату повинні бути знищені до того моменту, який був зафіксований у БД як «відкат».

COMMIT та ROLLBACK застосовуються в таких областях, як контроль транзакцій та блокування. Обидві інструкції завершують усі поточні транзакції (набори операцій над БД) та знімають усі блокування на зміну даних у таблицях. Присутність або відсутність BEGIN WORK чи аналогічної заяви залежить від конкретної реалізації SQL.

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

  • CREATE визначає об'єкти (наприклад, таблиці), які будуть створені у базі даних.
  • DROP визначає, які існуючі об'єкти в базі даних будуть видалені, як правило, безповоротно.
  • Деякі системи баз даних також підтримують команду ALTER, яка дозволяє користувачеві змінювати існуючий об'єкт по-різному - наприклад, можна зробити додавання стовпців в існуючу таблицю.

Третьою групою ключових слів SQL є Data Control Language або DCL (мова контролю даних). DCLвідповідає за права доступу до даних та дозволяє користувачеві контролювати, хто має доступ, щоб переглядати або маніпулювати даними в базі даних. Тут два основні ключові слова.

На сьогоднішній день курси SQL для чайників стають все більш популярними. Це можна просто пояснити, адже в сучасному світі все частіше можна зустріти так звані "динамічні" веб-сервіси. Вони відрізняються досить гнучкою оболонкою і ґрунтуються на Всі програмісти-початківці, які вирішили присвятити сайтів, насамперед записуються на курси SQL "для чайників".

Навіщо вивчати цю мову?

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

Що таке SQL?

Або мова структурованих запитів була створена з однією єдиною метою: визначати надавати до них доступ і обробляти їх за досить короткі проміжки часу. Якщо ви знаєте SQL-значення, тоді вам буде зрозуміло, що цей сервер відносять до так званих "непроцедурних" мов. Тобто в його можливості входить лише опис будь-яких компонентів або результатів, які ви хочете побачити в майбутньому на сайті. Але при цьому не вказує на те, які результати точно збирається отримати. Кожен новий запит у цій мові є як би додатковою "надбудовою". Саме в такому порядку, в якому вони введені в базі даних, запити будуть виконуватися.

Які процедури можна виконувати за допомогою цієї мови?

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

  • створювати найрізноманітніші таблиці;
  • отримувати, зберігати та змінювати отримані дані;
  • змінювати структури таблиць на власний розсуд;
  • об'єднувати отриману інформацію у єдині блоки;
  • обчислювати отримані дані;
  • забезпечувати повний захист інформації.

Які команди найпопулярніші в даній мові?

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

  1. DDL – це команда, яка визначає дані. Вона використовується для того, щоб створювати, змінювати та видаляти найрізноманітніші об'єкти в базі.
  2. DCL є командою, яка управляє даними. Її використовують для надання доступу різним користувачам до інформації в базі, а також використовувати таблиці або подання.
  3. TCL - команда, яка керує різноманітними транзакціями. Її головною метою є визначення ходу транзакції.
  4. DML – маніпулює отриманими даними. В її завдання входить дозвіл користувачеві переміщати різну інформацію з бази даних або вносити її туди.

Типи привілеїв, які існують на цьому сервері

Під привілеями маються на увазі ті дії, які може виконати той чи інший користувач відповідно до свого статусу. Найменшою, безумовно, є звичайний вхід до системи. Звісно ж, з часом привілеї можуть змінюватись. Старі видалятимуться, а нові додаватимуться. На сьогоднішній день всі ті, хто проходить курси SQL Server "для чайників", знають, що існує кілька типів дозволених дій:

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

Історія створення SQL

Ця мова була створена дослідницькою лабораторією IBM у 1970 році. У той час назва його була дещо іншою (SEQUEL), але через кілька років використання її поміняли, трохи скоротивши. Незважаючи на це, навіть сьогодні багато відомих світових фахівців у галузі програмування все ще вимовляють назву по-старому. Створено SQL з однією-єдиною метою - винайти мову, яка була б настільки простою, що її могли б без особливих проблем вивчити навіть прості користувачі Інтернету. Цікавий той факт, що на той час SQL був не єдиною подібною мовою. У Каліфорнії ще одна група фахівців розробила схожий Ingres, але він так і не став поширеним. До 1980 року існувало кілька варіацій SQL, які лише певною мірою відрізнялися друг від друга. Щоб запобігти замішанню, 1983-го було створено стандартний його варіант, який популярний і сьогодні. Курси SQL для чайників дозволяють дізнатися набагато більше про сервіс і повністю вивчити його за кілька тижнів.

Ласкаво просимо до області розробки баз даних, що виконується за допомогою стандартної мови запитів SQL. У системах управління базами даних (СУБД) є багато інструментів, що працюють на різних апаратних платформах.

  • Основи реляційних баз даних

    У цьому розділі ... | Організація інформації | Що таке база даних. Що таке СУБД. Порівняння моделей баз даних Що таке реляційна база даних

  • Основи SQL

    У цьому розділі ... | Що таке SQL. Помилки, пов'язані з SQL | Погляд на різні стандарти SQL | Знайомство зі стандартними командами та зарезервованими словами SQL | Подання чисел, символів, дат, часу та інших типів даних Невизначені значення та обмеження

  • Компоненти SQL

    У цьому розділі ... | Створення баз даних Обробка даних Захист баз даних SQL - це мова, спеціально розроблена, щоб створювати та підтримувати дані в реляційних базах. І хоча компанії, що поставляють системи для управління такими базами, пропонують свої реалізації SQL, розвиток мови визначається і контролюється стандартом ISO/ANSI.

  • Створення та підтримка простої бази даних

    У цьому розділі ... | Створення, зміна та видалення таблиці з бази даних за допомогою інструменту RAD. | Створення, зміна та видалення таблиці з бази даних за допомогою SQL. | Перенесення бази даних до іншої СУБД.

  • Створення багатотабличної реляційної бази даних

    У цьому розділі ... | Що має бути у базі даних | Визначення відносин між елементами бази даних Зв'язування таблиць за допомогою ключів | Проектування цілісності даних Нормалізація бази даних У цьому розділі буде наведено приклад створення багатотабличної бази даних.

  • Маніпуляції даними з бази

    У цьому розділі ... | Робота із даними | Отримання таблиці необхідних даних | Виведення інформації, обраної з однієї чи безлічі таблиць | Оновлення інформації, що знаходиться в таблицях та уявленнях | Додавання нового рядка до таблиці

  • Визначення значень

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

  • Складні вирази зі значенням

    У цьому розділі ... | Використання умовних виразів case | Перетворення елемента даних із одного типу даних на інший | Економія часу введення даних з допомогою виразів зі значенням типу запис | У розділі 2 SQL був названий підмовою даних.

  • "Пристрілка" до потрібних даних

    У цьому розділі ... | Вказівки необхідних таблиць | Відділення необхідних рядків від інших | Створення ефективних пропозицій where | Як працювати зі значеннями null Створення складових виразів із логічними зв'язками | Групування висновку результату запиту по стовпцю

  • Реляційні оператори

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

  • Використання вкладених запитів

    У цьому розділі ... | Вилучення даних з безлічі таблиць за допомогою одного оператора SQL | Пошук елементів даних шляхом порівняння значення однієї таблиці з набором значень з іншого | Пошук елементів даних шляхом порівняння значення з однієї таблиці з вибраним за допомогою оператора selectєдиним значенням з іншого

  • Рекурсивні запити

  • Забезпечення безпеки бази даних

    У цьому розділі ... | Управління доступом до таблиць баз даних | Ухвалення рішення про надання доступу | Надання повноважень доступу Анулювання повноважень доступу Запобігання спробам несанкціонованого доступу

  • Захист даних

    У цьому розділі ... | Як уникнути пошкодження бази даних Проблеми, спричинені одночасними операціями | Вирішення цих проблем за допомогою механізмів SQL | Завдання необхідного рівня захисту за допомогою команди set transaction

  • Використання SQL у додатках

    У цьому розділі ... | SQL у додатку | Спільне використання SQL з процедурними мовами Як уникнути несумісності. Код SQL, вбудований у процедурний код Виклик модулів SQL із процедурного коду | Виклик SQL із RAD-інструменту | У попередніх розділах ми переважно розглядали SQL-команди окремо, тобто. формулювалася задача обробки даних, і під неї створювався SQL-запит.

  • ODBC та JDBC

    У цьому розділі ... | Визначення ODBC Опис частин ODBC | Використання ODBC серед клієнт/сервер | Використання ODBC у Internet | Використання ODBC в локальних мережах| Використання JDBC З кожним роком комп'ютери однієї організації чи кількох різних організацій дедалі частіше з'єднуються друг з одним. Тому виникає необхідність у налагодженні спільного доступу до баз даних через мережу.

  • SQL:2003 та XML

    У цьому розділі ... | Використання SQL із XML | XML, бази даних та Internet | Однією з найістотніших нових функціональних можливостей мови SQL:2003 є підтримка файлів XML (extensible Markup Language - мова розмітки, що розширюється), які все більше стають універсальним стандартом обміну даними між різнорідними платформами.

  • Курсори

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