|
| 1 | +--- |
| 2 | +contributors: |
| 3 | + - ["Bob DuCharme", "http://bobdc.com/"] |
| 4 | + - ["Th3G33k", "https://github.com/Th3G33k"] |
| 5 | +translators: |
| 6 | + - ["Yulian Tolkachov", "https://github.com/3iM0ViY"] |
| 7 | +--- |
| 8 | + |
| 9 | +SQL (англ. Structured Query Language — мова структурованих запитів) — декларативна мова для роботи з базами даних. Імплементації зазвичай додають до мови власні доповнення: [україномовне порівняння MySQL та PostgreSQL](https://dou.ua/forums/topic/51621) або ж [англомовне порівняння різних популярних SQL рішень](http://troels.arvin.dk/db/rdbms/) можуть стати гарними прикладами посібників щодо відмінностей між продуктами. |
| 10 | + |
| 11 | +Реалізації зазвичай мають командний рядок, де можна інтерактивно користуватися командами наведеними нижче. Вони також пропонують спосіб виконання послідовності таких команд, збережених у вибраному скрипті. (Хорошою, хоч і не стандартизованою, практикою є завершувати роботу з командним рядком словами QUIT чи EXIT, які підтримує більшість реалізацій SQL.) |
| 12 | + |
| 13 | +Низка зразків команд наведених у цьому посібнику передбачають, що у вас завантажена [зразкова база даних співробітників уявної компанії](https://dev.mysql.com/doc/employee/en/), доступна для ознайомлення на [GitHub](https://github.com/datacharmer/test_db). Самі файли репозиторію — скрипти команд, подібних тим що наведені далі, що створюють і заповнюють таблиці даними про співробітників вигаданої компанії. Синтаксис для виконання цих скриптів буде залежати від реалізації SQL, котрою ви користуєтесь. Зазвичай, це утиліта, яку ви запускаєте з командного рядка операційної системи. |
| 14 | + |
| 15 | + |
| 16 | +```sql |
| 17 | +-- Коментарі починаються двома дефісами. Кожна команда закінчується крапкою з комою. |
| 18 | + |
| 19 | +/* |
| 20 | +Багаторядковий коментар |
| 21 | +має таку форму написання. |
| 22 | +*/ |
| 23 | + |
| 24 | +-- SQL не враховує регістр ключових слів. Проте у наведених тут прикладах команд |
| 25 | +-- дотримується правило написання їх великими літерами, оскільки це полегшує |
| 26 | +-- їх розрізнення серед назв баз даних, таблиць і стовпців. |
| 27 | + |
| 28 | +-- Створити й видалити базу даних (БД). Регістр має значення в контексті назв БД та таблиць. |
| 29 | +CREATE DATABASE someDatabase; |
| 30 | +DROP DATABASE someDatabase; |
| 31 | + |
| 32 | +-- Відобразити доступні БД. |
| 33 | +SHOW DATABASES; |
| 34 | + |
| 35 | +-- Використовувати конкретну наявну БД. |
| 36 | +USE employees; |
| 37 | + |
| 38 | +-- Вибрати всі рядки та стовпчики з таблиці departments обраної БД. |
| 39 | +-- За змовчуванням, інтерпретатор прокручує результати на екрані. |
| 40 | +SELECT * FROM departments; |
| 41 | + |
| 42 | +-- Отримати всі рядки тільки стовпців dept_no та dept_name з таблиці departments. |
| 43 | +-- Це ок розділяти команди на декілька рядків. |
| 44 | +SELECT dept_no, |
| 45 | + dept_name FROM departments; |
| 46 | + |
| 47 | +-- Вибрати всі стовпчики departments, але обмежитись тільки 5 рядками. |
| 48 | +SELECT * FROM departments LIMIT 5; |
| 49 | + |
| 50 | +-- Отримати ті значення стовпчиків dept_name з таблиці departments, |
| 51 | +-- що містять підрядок 'en' всередині себе. |
| 52 | +SELECT dept_name FROM departments WHERE dept_name LIKE '%en%'; |
| 53 | + |
| 54 | +-- Отримати всі стовпці з таблиці departments для тих рядків, що в стовпці dept_name |
| 55 | +-- мають значення, котре починається з літери 'S' та має рівно 4 символи після неї. |
| 56 | +SELECT * FROM departments WHERE dept_name LIKE 'S____'; |
| 57 | + |
| 58 | +-- Вибрати унікальні значення title з таблиці titles, не відображаючи дублікати. |
| 59 | +SELECT DISTINCT title FROM titles; |
| 60 | + |
| 61 | +-- Те саме, що й минулою командою, тільки сортуючи (з урахуванням регістру) за |
| 62 | +-- значенням title. Порядок виводу можна вказати, додавши ASC — зростаючий, |
| 63 | +-- або DESC — спадаючий. Наростальний порядок використовується за змовчуванням. |
| 64 | +SELECT DISTINCT title FROM titles ORDER BY title ASC; |
| 65 | + |
| 66 | +-- Оператори порівняння (=, >, <, >=, <=, <>) та логічні оператори |
| 67 | +-- (AND, OR) можна використовувати для уточнення запитів. |
| 68 | +SELECT * FROM departments WHERE dept_no = 'd001' OR dept_no = 'd002'; |
| 69 | + |
| 70 | +-- Ідентична дія. |
| 71 | +SELECT * FROM departments WHERE dept_no IN ('d001', 'd002'); |
| 72 | + |
| 73 | +-- Повертає протилежний результат. |
| 74 | +SELECT * FROM departments WHERE dept_no NOT IN ('d001', 'd002'); |
| 75 | + |
| 76 | +-- Вибірка у вказаному діапазоні. |
| 77 | +SELECT * from departments WHERE dept_no BETWEEN 'd001' AND 'd002'; |
| 78 | + |
| 79 | +-- Порахувати кількість рядків у таблиці departments. |
| 80 | +SELECT COUNT(*) FROM departments; |
| 81 | + |
| 82 | +-- Переглянути кількість рядків в таблиці departments, |
| 83 | +-- що мають всередині значення dept_name підрядок 'en'. |
| 84 | +SELECT COUNT(*) FROM departments WHERE dept_name LIKE '%en%'; |
| 85 | + |
| 86 | +-- Агрегатні функції можна використовувати разом із GROUP BY |
| 87 | +-- для обчислення одного значення із обраної сукупності значень. |
| 88 | +-- Найчастіше використовувані функції: |
| 89 | +-- MIN(), MAX(), COUNT(), SUM(), AVG(). |
| 90 | +-- Використовуйте HAVING, щоб відфільтрувати рядки за агрегованими значеннями. |
| 91 | + |
| 92 | +-- Команда отримує загальну кількість працівників за номером департаменту |
| 93 | +-- за умови, що у департаменті їх понад 100. |
| 94 | +SELECT dept_no, COUNT(dept_no) FROM dept_emp GROUP BY dept_no |
| 95 | +HAVING COUNT(dept_no) > 100; |
| 96 | + |
| 97 | +-- За допомогою ключового слова AS можна задавати псевдоніми для назв |
| 98 | +-- стовпців або таблиць у межах запиту. |
| 99 | +SELECT COUNT(A.*) AS total_employees, COUNT(B.*) total_departments |
| 100 | +FROM employees AS A, departments B; |
| 101 | + |
| 102 | +-- Стандартний формат запису дат: "рррр-мм-дд". |
| 103 | +-- Однак він може відрізнятися в залежності від імплементації, |
| 104 | +-- операційної системи, та налаштувань локальної сесії. |
| 105 | +SELECT * FROM dept_manager WHERE from_date >= '1990-01-01'; |
| 106 | + |
| 107 | +-- Об'єднання даних з кількох таблиць за допомогою оператора JOIN. |
| 108 | +-- Таблиця titles містить назви посад працівників з прив'язкою до |
| 109 | +-- їх порядкових номерів та періодів роботи (між from_date та to_date). |
| 110 | +-- Наступна команда отримує перші 10 рядків такої інформації, але замінює |
| 111 | +-- номери працівників на їх імена та прізвища шляхом порівняння з таблицею employees. |
| 112 | +SELECT employees.first_name, employees.last_name, |
| 113 | + titles.title, titles.from_date, titles.to_date |
| 114 | +FROM titles INNER JOIN employees ON |
| 115 | + employees.emp_no = titles.emp_no LIMIT 10; |
| 116 | + |
| 117 | +-- Отримати результати декількох запитів. |
| 118 | +-- UNION повертає лише унікальні рядки, а UNION ALL — усі, включно з дубльованими. |
| 119 | +SELECT * FROM departments WHERE dept_no = 'd001' |
| 120 | +UNION |
| 121 | +SELECT * FROM departments WHERE dept_no = 'd002'; |
| 122 | + |
| 123 | +-- Порядок SQL синтаксису: |
| 124 | +-- SELECT _ FROM _ JOIN _ ON _ WHERE _ GROUP BY _ HAVING _ ORDER BY _ UNION |
| 125 | + |
| 126 | +-- Перелічити всі таблиці з усіх БД. В реалізаціях зазвичай існує |
| 127 | +-- власна команда для виконання цієї дії з поточною БД. |
| 128 | +SELECT * FROM INFORMATION_SCHEMA.TABLES |
| 129 | +WHERE TABLE_TYPE='BASE TABLE'; |
| 130 | + |
| 131 | +-- Створити таблицю tablename1 в межах обраної БД з двома вказаними стовпцями. |
| 132 | +-- Для стовпчиків можна вказувати їх типи даних, а також безліч інших можливих налаштувань. |
| 133 | +CREATE TABLE tablename1 (fname VARCHAR(20), lname VARCHAR(20)); |
| 134 | + |
| 135 | +-- Додати до таблиці tablename1 рядок даних. Ми припускаємо, що таблиця була |
| 136 | +-- налаштована таким чином, аби сприймати ці значення за доречні. |
| 137 | +INSERT INTO tablename1 VALUES('Richard','Mutt'); |
| 138 | + |
| 139 | +-- Замінити ім'я (fname) на 'John' в усіх рядках зі значенням прізвища (lname) 'Mutt'. |
| 140 | +UPDATE tablename1 SET fname='John' WHERE lname='Mutt'; |
| 141 | + |
| 142 | +-- Видалити всі рядки з таблиці tablename1 |
| 143 | +-- в котрих значення lname починається на 'М' |
| 144 | +DELETE FROM tablename1 WHERE lname LIKE 'M%'; |
| 145 | + |
| 146 | +-- Видалити всі рядки з tablename1, залишивши пусту таблицю. |
| 147 | +DELETE FROM tablename1; |
| 148 | + |
| 149 | +-- Видалити усю таблицю tablename1. |
| 150 | +DROP TABLE tablename1; |
| 151 | +``` |
| 152 | + |
| 153 | +## Додаткова література |
| 154 | + |
| 155 | +* [W3schoolsUA - SQL Підручник](https://w3schoolsua.github.io/sql/index.html#gsc.tab=0): гарний онлайн підручник/довідник з детальним розбором команд з прикладами та вправами для самоперевірки. |
| 156 | +* [SQL Fiddle](https://sqlfiddle.com): онлайн SQL компілятор із відкритим вихідним кодом, підтримкою форматів різних БД та такими фішками як ШІ інтеграцією чи колаборативною роботою з іншими користувачами. |
0 commit comments