Вивчіть X за Y хвилин

Де X=SQL

SQL (англ. Structured Query Language — мова структурованих запитів) — декларативна мова для роботи з базами даних. Імплементації зазвичай додають до мови власні доповнення: україномовне порівняння MySQL та PostgreSQL або ж англомовне порівняння різних популярних SQL рішень можуть стати гарними прикладами посібників щодо відмінностей між продуктами.

Реалізації зазвичай мають командний рядок, де можна інтерактивно користуватися командами наведеними нижче. Вони також пропонують спосіб виконання послідовності таких команд, збережених у вибраному скрипті. (Хорошою, хоч і не стандартизованою, практикою є завершувати роботу з командним рядком словами QUIT чи EXIT, які підтримує більшість реалізацій SQL.)

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

-- Коментарі починаються двома дефісами. Кожна команда закінчується крапкою з комою.

/*
Багаторядковий коментар
має таку форму написання.
*/

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

-- Створити й видалити базу даних (БД). Регістр має значення в контексті назв БД та таблиць.
CREATE DATABASE someDatabase; 
DROP DATABASE someDatabase;

-- Відобразити доступні БД.
SHOW DATABASES;

-- Використовувати конкретну наявну БД.
USE employees;

-- Вибрати всі рядки та стовпчики з таблиці departments обраної БД.
-- За змовчуванням, інтерпретатор прокручує результати на екрані.
SELECT * FROM departments;

-- Отримати всі рядки тільки стовпців dept_no та dept_name з таблиці departments.
-- Це ок розділяти команди на декілька рядків.
SELECT dept_no,
       dept_name FROM departments;

-- Вибрати всі стовпчики departments, але обмежитись тільки 5 рядками.
SELECT * FROM departments LIMIT 5;

-- Отримати ті значення стовпчиків dept_name з таблиці departments,
-- що містять підрядок 'en' всередині себе.
SELECT dept_name FROM departments WHERE dept_name LIKE '%en%';

-- Отримати всі стовпці з таблиці departments для тих рядків, що в стовпці dept_name
-- мають значення, котре починається з літери 'S' та має рівно 4 символи після неї.
SELECT * FROM departments WHERE dept_name LIKE 'S____';

-- Вибрати унікальні значення title з таблиці titles, не відображаючи дублікати.
SELECT DISTINCT title FROM titles;

-- Те саме, що й минулою командою, тільки сортуючи (з урахуванням регістру) за 
-- значенням title. Порядок виводу можна вказати, додавши ASC — зростаючий, 
-- або DESC — спадаючий. Наростальний порядок використовується за змовчуванням. 
SELECT DISTINCT title FROM titles ORDER BY title ASC;

-- Оператори порівняння (=, >, <, >=, <=, <>) та логічні оператори
-- (AND, OR) можна використовувати для уточнення запитів.
SELECT * FROM departments WHERE dept_no = 'd001' OR dept_no = 'd002';

-- Ідентична дія.
SELECT * FROM departments WHERE dept_no IN ('d001', 'd002');

-- Повертає протилежний результат.
SELECT * FROM departments WHERE dept_no NOT IN ('d001', 'd002');

-- Вибірка у вказаному діапазоні.
SELECT * from departments WHERE dept_no BETWEEN 'd001' AND 'd002';

-- Порахувати кількість рядків у таблиці departments.
SELECT COUNT(*) FROM departments;

-- Переглянути кількість рядків в таблиці departments, 
-- що мають всередині значення dept_name підрядок 'en'.
SELECT COUNT(*) FROM departments WHERE dept_name LIKE '%en%';

-- Агрегатні функції можна використовувати разом із GROUP BY
-- для обчислення одного значення із обраної сукупності значень.
-- Найчастіше використовувані функції:
-- MIN(), MAX(), COUNT(), SUM(), AVG().
-- Використовуйте HAVING, щоб відфільтрувати рядки за агрегованими значеннями.

-- Команда отримує загальну кількість працівників за номером департаменту
-- за умови, що у департаменті їх понад 100.
SELECT dept_no, COUNT(dept_no) FROM dept_emp GROUP BY dept_no
HAVING COUNT(dept_no) > 100;

-- За допомогою ключового слова AS можна задавати псевдоніми для назв 
-- стовпців або таблиць у межах запиту.
SELECT COUNT(A.*) AS total_employees, COUNT(B.*) total_departments
FROM employees AS A, departments B;

-- Стандартний формат запису дат: "рррр-мм-дд".
-- Однак він може відрізнятися в залежності від імплементації, 
-- операційної системи, та налаштувань локальної сесії.
SELECT * FROM dept_manager WHERE from_date >= '1990-01-01';

-- Об'єднання даних з кількох таблиць за допомогою оператора JOIN. 
-- Таблиця titles містить назви посад працівників з прив'язкою до
-- їх порядкових номерів та періодів роботи (між from_date та to_date).
-- Наступна команда отримує перші 10 рядків такої інформації, але замінює 
-- номери працівників на їх імена та прізвища шляхом порівняння з таблицею employees.
SELECT employees.first_name, employees.last_name,
       titles.title, titles.from_date, titles.to_date
FROM titles INNER JOIN employees ON
       employees.emp_no = titles.emp_no LIMIT 10;

-- Отримати результати декількох запитів.
-- UNION повертає лише унікальні рядки, а UNION ALL — усі, включно з дубльованими.
SELECT * FROM departments WHERE dept_no = 'd001'
UNION
SELECT * FROM departments WHERE dept_no = 'd002';

-- Порядок SQL синтаксису:
-- SELECT _ FROM _ JOIN _ ON _ WHERE _ GROUP BY _ HAVING _ ORDER BY _ UNION

-- Перелічити всі таблиці з усіх БД. В реалізаціях зазвичай існує 
-- власна команда для виконання цієї дії з поточною БД.
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE';

-- Створити таблицю tablename1 в межах обраної БД з двома вказаними стовпцями.
-- Для стовпчиків можна вказувати їх типи даних, а також безліч інших можливих налаштувань.
CREATE TABLE tablename1 (fname VARCHAR(20), lname VARCHAR(20));

-- Додати до таблиці tablename1 рядок даних. Ми припускаємо, що таблиця була
-- налаштована таким чином, аби сприймати ці значення за доречні.
INSERT INTO tablename1 VALUES('Richard','Mutt');

-- Замінити ім'я (fname) на 'John' в усіх рядках зі значенням прізвища (lname) 'Mutt'.
UPDATE tablename1 SET fname='John' WHERE lname='Mutt';

-- Видалити всі рядки з таблиці tablename1 
-- в котрих значення lname починається на 'М'
DELETE FROM tablename1 WHERE lname LIKE 'M%';

-- Видалити всі рядки з tablename1, залишивши пусту таблицю.
DELETE FROM tablename1;

-- Видалити усю таблицю tablename1.
DROP TABLE tablename1;

Додаткова література


Маєте пораду? А може, виправлення? Відкрийте Issue у GitHub-репозиторії або зробіть pull request самостійно!

Автор початкової версії Bob DuCharme, оновлено 1 авторами.