SQL: відмінності між версіями

Вилучено вміст Додано вміст
Syum90 (обговорення | внесок)
м Редагування користувача 78.137.2.118 (обговорення) відкинуті до версії користувача Chemist-i
Рядок 6:
Спочатку SQL розроблялась як мова запитів і управління даними, пізніші модифікації SQL створено продавцями системи управління базами даних, які додали процедурні конструкції, control-of-flow команд і розширення мов. З випуском стандарту SQL:1999 такі розширення були формально запозичені як частина мови SQL через Persistent Stored Modules (SQL/PSM).
 
== Підручник ==
ЭТО ПИЗДА ПАЧАНЫ
SQL краще вчити на практиці, тому треба запустити якусь [[w:СУБД|СУБД]], наприклад [[w:mySQL|mySQL]]. Можна використати [http://www.w3schools.com/SQL/ веб-інтерфейс w3schools], правда там не можна змінювати базу.
 
Загалом мову SQL поділяють на дві частини: мову маніпуляції даними ( Data Manipulation Language (DML) ), та мову опису даних ( Data Definition Language (DDL) ). Мова SQL не чутлива до регістру, і оператори пишуть великими буквами тільки для зручності.
 
=== Мова опису даних ===
Дозволяє нам описати структуру даних.
 
Для інформації про типи даних можна переглянути розділ [[SQL/Типи даних MySQL|Типи даних MySQL]].
 
Нехай маємо базу даних університету, і користувача, що має повний доступ до цієї бази. Створимо таблицю з людьми:
<source lang="sql">
CREATE TABLE persons (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
surname VARCHAR(50),
name VARCHAR(200),
tel VARCHAR(50)
);
</source>
 
Щоб потім змінити структуру таблиці використовують команду <code>ALTER</code>, наприклад:
<source lang="sql">
ALTER TABLE persons ADD COLUMN email VARCHAR(100);
</source>
 
Крім цього таблиці можна перейменовувати
<source lang="sql">
ALTER TABLE table RENAME AS new_table;
</source>
 
та звісно видаляти поля:
<source lang="sql">
ALTER TABLE persons DROP COLUMN tel;
</source>
 
=== Мова маніпуляції даними ===
==== SELECT ====
Оператор <code>SELECT</code> дозволяє вибирати дані з бази. Загалом оператор <code>SELECT</code> виглядає так:
<source lang="sql">
SELECT імена_полів
FROM імена_таблиць
WHERE умова;
</source>
 
Імена полів записуються через кому. Якщо потрібно вибрати всі поля, пишуть зірочку ("*"). При потребі можна уточнити з якої таблиці брати поле, додавши перед його іменем.
<code>SELECT</code> може видати нам рядки що повторюються. Якщо ми хочемо мати тільки унікальні значення, то можемо уникнути повторень командою <code>DISTINCT</code>.
 
<source lang="sql">
SELECT DISTINCT поля FROM таблиці;
</source>
 
Умова дозволяє відкинути непотрібні нам значення. Загалом в умові певні поля порівнюються з певними значеннями, чи між собою. Текстові значення беруться в одинарні лапки (можна і в подвійні). Для порівняння можна користуватись такими операторами:
 
{|class="wikitable"
|-
! Оператор !! Опис !! Приклад
|-
| = || Рівність || surname='Іванов'
|-
| <> (можливо також != ) || Нерівність || surname!='Іванов'
|-
| <, >, <=, >= || Менше, більше, менше рівно, більше рівно || age>=18
|-
| BETWEEN || Всі значення що знаходяться між даними двома включно || <source lang="sql">BETWEEN 'Іванов' AND 'Петров'</source>
|-
| LIKE || Порівняння з шаблоном || <source lang="sql">surname LIKE 'І%'</source>
|-
| IN || Приймає одне з перелічених значень || <source lang="sql">faculty IN ('Кубик','Радіофак','Мехмат')</source>
|}
 
В шаблоні для <code>LIKE</code> можна використовувати '%' як замінник для будь-якого числа будь-яких символів, та '_' як замінник для довільного одного символа.
 
Також в умові можна використовувати оператори OR, AND та NOT, та дужки.
 
Також до запиту SELECT можна додати команду ORDER BY, що дозволяє впорядкувати результат за заданими стовпцями. Щоб сортувати в зворотньому порядку після стовпців за якими сортують пишуть DESC:
 
<source lang="sql">
SELECT name FROM students ORDER BY name DESC;
</source>
 
Варто також зауважити, що ORDER BY не може стояти перед WHERE інакше будуть помилки.
 
Також можна задати максимальну кількість записів в результаті. Корисно для великих таблиць. Правда синтаксис трохи відрізняється для різних систем:
 
'''[[MySQL]]'''
<source lang="sql">
SELECT назви_стовпців FROM назва_таблиці LIMIT кількість
</source>
 
'''SQL Server'''
<source lang="sql">
SELECT TOP кількість|відсоток назви_стовпців FROM назва таблиці
</source>
 
'''Oracle'''
<source lang="sql">
SELECT назви_стовпців FROM назва_таблиці WHERE ROWNUM <= кількість
</source>
 
==== JOIN ====
З'єднання використовуються для запитів з кількох таблиць, що базуються на зв'язках між певними стовпцями таблиць.
 
З'єднання бувають різні. Наприклад INNER JOIN (теж саме що і JOIN), де є хоч одне співпадіння в стовпцях таблиці.
 
Пишуть так:
<source lang="sql">
SELECT назви_стовпців
FROM перша_таблиця
INNER JOIN друга_таблиця
ON перша_таблиця.назва_стовпця=друга_таблиця.назва_стовпця
</source>
 
І це буде те ж саме що і
<source lang="sql">
SELECT назви_стовпців
FROM перша_таблиця, друга_таблиця
WHERE перша_таблиця.назва_стовпця=друга_таблиця.назва_стовпця
</source>
 
LEFT JOIN працює та пишеться майже так само, але повертає таблицю, в яку входять всі записи лівої таблиці (недостаючі записи з правої заповнються NULLами).
 
RIGHT JOIN відповідно навпаки.
 
FULL JOIN повертає об'єднання результатів RIGHT та LEFT JOIN.
 
==== INSERT ====
Оператор INSERT додає до таблиці рядок. Має такий синтаксис:
<source lang="sql">
INSERT INTO назва_таблиці VALUES (список_значень);
</source>
 
Значення мають йти в такому ж порядку, як і стопці таблиці. При необхідності можна задати конкретні стовпці, та конкретні значення:
<source lang="sql">
INSERT INTO students(name) VALUES ('Іван');
</source>
 
Всі інші поля отримають значення за замовчуванням.
 
==== UPDATE ====
Змінює значення полів в уже існуючих записах. Синтаксис:
UPDATE назва_таблиці SET стовпець1=значення1, стовпець2=значення2, ... WHERE умова;
З цим оператором треба обережно, бо якщо забути задати умову, то зміняться всі записи таблиці.
 
==== DELETE ====
Найпростіший оператор:
<source lang="sql">
DELETE FROM назва_таблиці WHERE умова;
</source>
 
Знову ж таки, не варто забувати, що немає команди "Відмінити".
 
=== Транзакції ===
 
Насправді можна скасувати незавершену [[SQL/Транзакції|транзакцію]] командою
<source lang="sql">rollback; </source>
Для цього треба бути певним, що ваш клієнт не налаштований автоматично завершувати транзакцію після кожної sql команди.
 
Зміни у транзакції застосовуються командою
<source lang="sql">commit; </source>
 
== MySQL ==