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

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

-- 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;
