Програмна інженерія в системах управління. Лекції. Автор і лектор: Олександр Пупена
<- до лекцій | на основну сторінку курсу |
---|---|
12. Мова SQL
12.1. Загальні принципи
SQL (Structured Query Language – мова структурованих запитів) – це універсальна мова для створення, модифікації і керування даними в реляційних базах даних. Дана мова описана в ряді стандартів ANSI, ISO/IEC і на момент написання останньою версією є SQL:2019. На сьогоднішній день практично всі відомі СКБД підтримують даний стандарт, з деяким розширеннями до нього для адаптації під свої формати даних та функціональні можливості серверів. Такі мови називають діалектами SQL. Так, наприклад діалект СКБД MS SQL Server має назву «Transact-SQL», а MySQL – «SQL/PSM». Перед використанням SQL для конкретної СКБД варто ознайомитися з підтримуваними командами.
рис.12.1. Принципи роботи SQL
При необхідності використовувати мови SQL в ПЗ для доступу до даних, варто перевірити роботу SQL-запитів в тестових утилітах. Для здійсненні запиту використовується якийсь із інтерфейсів СКБД, який дозволяє обмінюватися текстовими повідомленнями. Тим не менше часто з СКБД постачаються консольні програми, які дозволяють взаємодіяти з СКБД командами в тому числі SQL.
Наприклад, в СКБД mariadb можна запустити однойменну програму (рис.12.2), ввести ім’я користувача та пароль доступу до СКБД, та зайти у меню введення SQL команд. На ис.12.2 показаний приклад виведення списку баз даних та усіх записів з таблиці testdb.
рис.12.2. Робота з консоллю
Для того, щоб команди виконалися, необхідно завершити їх символом ;
.
Є багато графічних клієнтських утиліт, які з’єднуються з базами даних через різні інтерфейси і надають можливість керувати ними. Наприклад, Microsoft SQL Server Management Studio
дає можливість не лише виконувати запити SQL, але і надає інструменти для їх побудови (Query Designer
).
На рис.12.3 показаний приклад перевірки SQL-запиту в інший безкоштовній утиліті HeidiSQL, яка ставиться разом з MariaDB.
рис.12.3. Тестова утиліта для робота з СКБД
Мова SQL задає тільки формат повідомлень запитів та відповідей між застосунком-клієнтом та сервером. Однак яким чином цей запит передається, як формується з’єднання між застосунками, створюється та розриваються сеанси і т.п. вирішується на інших рівнях взаємодії. Усі сучасні стандартизовані технології доступу до даних (ODBC, JDBC, OLE DB, ADO, .NET) надають інтерфейс через SQL.
Мова SQL розроблена для взаємодії з реляційними БД для інших типів вона не завжди застосовна. Тим не менше, багато NoSQL СКБД підтримують SQL-подібні мови.
12.2. Загальний опис SQL команд
SQL використовується для створення структури бази даних, маніпуляції з даними, тобто їх вибірки і модифікації, та для їх адміністрування. Будь яка операція по вибірці, модифікації, визначенню або адмініструванню виконується за допомогою оператору (statement) або команди (command) SQL.
Use – використовується в усіх реляційних базах даних для вказівки бази даних за замовчуванням.
USE db1;
SELECT COUNT(*) FROM mytable; # вибірка з db1.mytable
USE db2;
SELECT COUNT(*) FROM mytable; # вибірка з db2.mytable
SHOW DATABASES – показує перелік БД.
SHOW TABLES – показує перелік таблиць. Наприклад:
SHOW DATABASES;
SHOW TABLES FROM testdb;
Мова SQL надає широкі можливості для роботи з означенням схеми даних та самими даними, як прийнято відносити до однієї з груп:
- DDL (Data Definition Language) — робота зі структурою бази
- DML (Data Manipulation Language) — робота з записами
- DCL (Data Control Language) — робота з правами
- TCL (Transaction Control Language) — робота з транзакціями
Основні команди SQL відповідно до цих груп наведені на рис.12.4.
рис.12.4. Класифікація команд за призначенням
Однак найбільш вживаними серед цих груп є команди означення схеми даних та роботи з записами даних. Тому надалі зупинимося на них детальніше.
12.3. Запити для означення схеми даних
CREATE – створює базу даних або таблицю в базі даних. Наприклад:
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Колонка типу даних (datatype) означує які значення в полі : integer, character, money, date and time, binary і т.п. Для різних типів БД типи можуть відрізнятися. У таблицях 12.1-12.3 показані для прикладу типи даних для MySQL.
Таблиця 12.1. Деякі текстові типи даних MySQL
Тип | Характеристики |
---|---|
CHAR(size) | Рядок із фіксованою довжиною (може містити літери, цифри та спеціальні символи). Параметр size означує довжину стовпця в символах - може бути від 0 до 255. За замовчуванням 1 |
VARCHAR(size) | Рядок із змінною довжиною (може містити літери, цифри та спеціальні символи). Параметр size означує максимальну довжину стовпця в символах - може становити від 0 до 65535 |
BINARY(size) | Аналогічний CHAR (), але зберігає двійкові байтові рядки. Параметр size означує довжину стовпця в байтах. За замовчуванням 1 |
VARBINARY(size) | Аналогічний VARCHAR (), але зберігає двійкові байтові рядки. Параметр size означує максимальну довжину стовпця в байтах. |
TINYBLOB | Для BLOBів (Binary Large OBjects). Макс довжина: 255 bytes |
TINYTEXT | Зберігає string з максимальною довжиною 255 символів |
TEXT(size) | Зберігає string з максимальною довжиною 65,535 байт |
BLOB(size) | Для BLOBs (Binary Large OBjects). Зберігає до 65,535 байтів даних |
Таблиця 12.2. Деякі числові типи даних MySQL
Тип | Характеристики |
---|---|
BIT(size) | Тип бітового значення. Кількість бітів на значення вказано в розмірі. Параметр size може містити значення від 1 до 64. Значення за замовчуванням для size доівнює 1. |
TINYINT(size) | Дуже маленьке ціле число. Діапазон для знакового числа від -128 до 127, для беззнакового - від 0 до 255. Параметр розміру означує максимальну ширину відображення (яка становить 255) |
BOOL або BOOLEAN | Нуль вважається хибним, ненульові значення - істинними. |
SMALLINT(size) | Невелике ціле число. Діапазон для знакового числа від -32768 до 32767, для беззнакового - від 0 до 65535. Параметр розміру визначає максимальну ширину відображення (яка становить 255) |
INT(size) або INTEGER(size) | Ціле число. Діапазон для знакового числа від -2147483648 до 2147483647, для беззнакового - від 0 до 4294967295. Параметр розміру визначає максимальну ширину відображення (яка становить 255) |
FLOAT(p) | Число з плаваючою комою. MySQL використовує значення p, щоб визначити, чи використовувати FLOAT або DOUBLE для результуючого типу даних. Якщо p від 0 до 24, тип даних стає FLOAT (). Якщо p становить від 25 до 53, тип даних стає DOUBLE () |
DECIMAL(size, d) або DEC(size, d) | Точне число з фіксованою точкою. Загальна кількість цифр вказана в розмірі. Кількість цифр після десяткової коми визначається параметром d. Максимальне число для розміру - 65. Максимальне число для d - 30. Значення за замовчуванням для розміру - 10. Значення за замовчуванням для d - 0. |
Таблиця 12.2. Типи даних дати та часу в MySQL
Тип | Характеристики |
---|---|
DATE | Дата. Формат: YYYY-MM-DD. Підтримуваний діапазон - від “1000-01-01” до “9999-12-31” |
DATETIME(fsp) | Поєднання дати та часу. Формат: YYYY-MM-DD hh:mm:ss. Підтримуваний діапазон - від “1000-01-01 00:00:00” до “9999-12-31 23:59:59”. Додавання DEFAULT та ON UPDATE у визначення стовпця приведе до отримання автоматичної ініціалізації та оновлення поточною датою та часом |
TIMESTAMP(fsp) | Мітка часу. Значення TIMESTAMP зберігаються як кількість секунд з епохи Unix (‘1970-01-01 00:00:00’ UTC). Формат: YYYY-MM-DD hh:mm:ss. Підтримуваний діапазон - від ‘1970-01-01 00:00:01’ UTC до ‘2038-01-09 03:14:07’ UTC. Автоматичну ініціалізацію та оновлення поточною датою та часом можна вказати за допомогою DEFAULT CURRENT_TIMESTAMP та ON UPDATE CURRENT_TIMESTAMP у означенні стовпця |
TIME(fsp) | Час. Формат: hh: mm: ss. Підтримуваний діапазон: від -838: 59: 59 до 838: 59: 59. |
YEAR | Рік у чотирьох-символьному форматі. Значення, дозволені у чотиризначному форматі: від 1901 до 2155 та 0000. MySQL 8.0 не підтримує рік у двосимвольному форматі. |
DROP – видаляє об’єкт з бази даних: database, table, index, view та інші. Наприклад у наступному прикладі видаляється таблиця.
DROP TABLE Persons;
А в цьому видаляється база даних.
DROP DATABASE testDB;
Створення індексу в MySQL відбувається через означення його в таблиці через ключове словосполучення PRIMARY KEY:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);
Те саме для СКБД MS SQL Server/Oracle/MS Access матиме вигляд:
CREATE TABLE Persons (
ID int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
ALTER - змінює структуру об’єктів бази даних. Модифікує існуючий об’єкт.
У наступному прикладі добавляється колонка nicname
:
ALTER TABLE Persons ADD nicname varchar(255);
У цьому прикладі видаляється колонка nicname
ALTER TABLE Persons DROP COLUMN nicname ;
У цьому прикладі модифікується тип колонки Age
ALTER TABLE persons MODIFY COLUMN Age SMALLINT;
SHOW CREATE TABLE persons;
TRUNCATE – очищає весь зміст таблиці (видаляє всі дані в таблиці). Він працює швидше за DELETE.
TRUNCATE testdb.persons;
12.4. Запити для створення та модифікації даних
Є дві можливості операцій по маніпуляції з даними – вибірка даних (data retrieval) і модифікація даних (data modification). Вибірка – це пошук необхідних даних, а модифікація означає добавлення, знищення або заміна даних. Операції по вибірці називають SQL запитами (SQL queries). Вони проводять пошук в базі даних, найбільш ефективно вибирають необхідну інформацію і відображають її. У всіх запитах SQL використовується ключове слово SELECT
. Операції по модифікації виконуються відповідно з використанням ключових слів INSERT
, DELETE
та UPDATE
.
INSERT INTO – вставлення даних в таблицю (створення запису в таблиці).
У наступному прикладі в таблицю Persons вставляються записи з вказаними значеннями. Якщо поля перераховуються в дужках після назви таблиці, то можна не вказувати їх всі а послідовність записуваних значень змінювати. Якщо за назвою таблиці одразу йде ключове слово VALUES, то значення вказуються в тій кількості і послідовності, як вони задаються при означенні таблиці.
DROP TABLE persons; /*видалимо стару таблицю*/
CREATE TABLE Persons (
PersonID INT NOT NULL AUTO_INCREMENT, /*тип лічильник*/
LastName varchar(255) COLLATE 'utf8_unicode_ci', /*кодування utf8*/
FirstName varchar(255) COLLATE 'utf8_unicode_ci',
Address varchar(255) COLLATE 'utf8_unicode_ci',
City varchar(255) COLLATE 'utf8_unicode_ci',
PRIMARY KEY (PersonID) /*первинний ключ*/
);
INSERT INTO Persons (LastName, FirstName, Address, City)
VALUES ('Озерний', 'Олександр', 'Володимирська 68', 'Київ');
INSERT INTO Persons VALUES (0, 'Іваненко', 'Іван', 'Стрийська 1', 'Львів');
INSERT INTO Persons VALUES (0, 'Романенко', 'Роман', 'Виноградна 1', 'Одеса');
INSERT INTO Persons VALUES (0, 'Петренко', 'Петро', 'Тениста', 'Одеса');
UPDATE – оновлення (модифікація) існуючих даних в таблиці. У цьому прикладі для усіх записів, я яких значення поля PersonID
<3, будуть замінені значення полів LastName
та FirstName
UPDATE testdb.persons
SET LastName = 'Супер', FirstName = 'Стар'
WHERE PersonID<3;
У цьому прикладі для всіх записів таблиці persons
значення поля LastName
буде дорівнювати об’єднанню полів LastName
та FirstName
UPDATE persons
SET LastName = CONCAT (LastName, " " , FirstName);
SELECT – отримання даних з БД.
Спрощена його конструкція має вигляд:
SELECT список_стовпчиків
FROM список_таблиць
[WHERE умови]
де слова в квадратних дужках []
– не обов’язкові.
У списку стовпчиків (полів записів) вказуються ті поля таблиці, які повертаються після обробки запиту. Список таблиць означує з яких таблиць необхідно проводити вибірку, а в умовах вказують умови для вибірки рядків.
У даному прикладі повертаються усі записи з таблиці Persons
SELECT * FROM Persons
А у цьому повертаються тільки поля LastName
та FirstName
SELECT LastName, FirstName
FROM Persons
У цьому прикладі задається умова, при якій будуть повертатися тільки ті запити, в яких поле City
=’Одеса’
SELECT LastName, FirstName, Address
FROM Persons
WHERE City='Одеса'
Ключове слово WHERE - використовується для команд SELECT, UPDATE, DELETE і інших для вказівки умови, що має задовольняти запис. Ці умови задаються операторами: порівняння, логічними, визначення діапазону:
- порівняння (=,<,>, >=, <=, <> або != )
- логічними (AND, OR, NOT)
- визначення діапазону (BETWEEN і NOT BETWEEN)
- символьному порівнянню за шаблоном (LIKE)
- входження в перелік IN
У наступному прикладі будуть повертатися усі записи, в яких поле LastName
буде містити текст %енко
SELECT LastName, FirstName
FROM Persons
WHERE LastName LIKE '%енко'
Повний синтаксис оператора SELECT
має наступний вигляд:
SELECT [ALL|DISTINCT] список_стовпчиків
[INTO нова_таблиця]
FROM {таблиця | курсор}[,{таблиця | курсор}…]
[WHERE умови]
[GROUP BY стовпчик [, стовпчик…]]
[HEAVING умови]
[ORDER BY {ім’я_стовпчика | список_вибору}[ASC|DESC] ... ]
У списку SELECT
вказуються ті поля (стовпчики), які необхідно повернути запитом. Є можливість зробити деякі операції над полями перед відображенням: +,-,*, /.
Ключове слово INTO
вказує на необхідність створення нової таблиці з вказаним іменем.
Умови в WHERE
задаються операторами порівняння (=
,<
,>
, >=
, <=
, !=
або <>
), логічними (AND
, OR
, NOT
), визначення діапазону (BETWEEN
і NOT BETWEEN
), символьному порівнянню за шаблоном (LIKE
) та ін.
Ключове слово ORDER BY
дозволяє упорядковувати знайдені записи по вказаному стовпчику по зростанню ASC
, або по спаданню DESC
.
У наступному прикладі буде виведено перелік записів упорядкованих за полем LastName
по зростанню
SELECT * FROM Persons
ORDER BY LastName ASC
Додатково про ORDER BY можна почитати за посиланням
GROUP BY – може групувати записи за певними полями. У цьому прикладі, виводиться значення кількості записів, що мають однакові поля City
SELECT COUNT(city), city
FROM persons
GROUP BY City
ORDER BY COUNT(city) DESC;
рис.12.5. Приклад групування
У наведеному вище прикладі використовується функція COUNT
. СКБД як правило підтримують велику кількість функцій. Серед них є функції агрегації, наприклад:
- COUNT (column_name) – кількість рядків, що відповідають критеріям
- SUM (column_name) - сума
- MAX (column_name) - максимальне
- MIN (column_name) - мінімальне
- AVG (column_name) - середнє
Для визначення доступних функцій необхідно звертатися до довідкової системи.
Команда DELETE призначена для видалення усіх записів з таблиці, залишається місце для записів(команда що видаляє таблиці які задовільняють умову)
Для користувача частіше всього зручно дивитися назви колонок (полів) у читабельному вигляді, а не так як вони називаються в таблицях. Для цього використовуються ALIAS (псевдоніми), які дає можливість виводити поля під певним текстом. Наприклад, запис виду:
SELECT COUNT(City) AS 'кількість', city AS 'місто'
FROM persons
GROUP BY city
ORDER BY 'кількість' DESC;
виведе записи у вигляді, як на рис.12.6. Зверніть увагу, на назви колонок.
рис.12.6. Виведення назви колонок через псевдоніми.
Запитання для самоперевірки
- Яке призначення мови SQL?
- Яким чином можна скористатися мовою при роботі з СКБД?
- Які групи команд мови роботи з БД підтримує SQL?
- Розкажіть про команду CREATE.
- Розкажіть про типи даних на прикладі MySQL.
- Розкажіть про команду DROP.
- Розкажіть про команду ALTER.
- Розкажіть про команду INSERT INTO.
- Розкажіть про команду UPDATE
- Розкажіть про команду SELECT.
- Розкажіть про використання ключового слова WHERE.
- Розкажіть про призначення функцій SQL. Наведіть приклад.
- Розкажіть про призначення псевдонімів у запитах SQL.
<- до лекцій | на основну сторінку курсу |
---|---|