Рівень 18. Базові принципи роботи з SQL
Рівень 18
Вступ до SQL

А як щодо бази даних?
Адже цей рівень про бази даних, так?

Абсолютно вірно. База даних —
саме те, що нам потрібно.
Але перш ніж братися до створення бази даних, необхідно краще розібратися, які види даних у ній зберігатимуться і на які категорії їх буде поділено.
Перед вами кілька карток із каталогу джедая Грега. Знайдіть схожі дані, зібрані Грегом про кожну людину. Присвойте таким даним мітку, що описує категорію інформації, і запишіть ці мітки у відведених полях.
Візьми аркуш паперу й випиши всі категорії, за якими можна структурувати дані про друзів Грега. Усього буде 9 категорій.
Категорії, які ми визначимо, використовуватимуться для впорядкування даних.
Ось що має вийти в результаті
Розглядаємо дані за категоріями
Погляньмо на дані з нового боку. Якщо розрізати кожен аркуш на смужки, а потім розкласти їх по горизонталі, ось що вийде:
Мендоса
Системний адміністратор
Сан-Франциско, CA
театр, танці
Тепер, якщо розрізати ще один аркуш із назвами цих категорій і розкласти смужки над відповідними даними, результат виглядатиме приблизно так:
Ім'я
Дата народження
Статус
Електронна пошта
Шукає
Прізвище
Професія
Місце проживання
Захоплення
А ось як виглядає та сама інформація у вигляді ТАБЛИЦІ з рядків і стовпців.

А я вже бачив таке подання даних в Excel. Чим таблиці SQL відрізняються від нього? І що це за стовпці й рядки?
Що таке «база даних»?
Перш ніж переходити до докладного розгляду таблиць, рядків і стовпців, зробімо крок назад і спробуймо уявити загальну картину. Перша структура SQL, про яку ви маєте знати, — контейнер, у якому зберігаються всі ваші таблиці. Вона й називається базою даних.
Базою даних називається контейнер, у якому зберігаються таблиці та інші структури SQL для роботи з ними. Словникове визначення бази даних.
Щоразу, коли ви шукаєте щось в Інтернеті, звертаєтеся до довідки, користуєтеся TiVo, замовляєте квитки, отримуєте штраф за перевищення швидкості або купуєте щось у магазині, потрібна інформація запитується з бази даних.
Ви та лише кілька з баз даних, що вас оточують
Код під мікроскопом
База даних складається з таблиць.
Таблиця — це структура, у якій зберігаються дані, впорядковані за стовпцями та рядками. Пам'ятаєте категорії з попереднього прикладу? Кожна категорія відповідає
стовпцю таблиці.
Наприклад, стовпець може містити одне зі значень: Неодружений, Одружений, Розлучений.
Рядок таблиці містить усю інформацію про один об'єкт таблиці. У новій таблиці Грега рядок містить повний опис однієї людини. Наприклад, в одному рядку можуть зберігатися такі дані: Джон, Джексон, неодружений, письменник, jj@boards-r-us.com.
Інформація в базі даних поділяється на таблиці.
Стань таблицею
Нижче ви знайдете кілька карток і таблицю. Ваше завдання — уявити себе на місці частково заповненої таблиці. Звісно, вам захочеться заповнити порожні місця й досягти рівноваги та внутрішньої наповненості. Також дайте стовпцям таблиці змістовні назви. Коли ви
впораєтеся з вправою, перевірте, чи вдалося вам досягти духовної єдності з таблицею.
Відповідь
З вмісту карток зрозуміло, що йдеться про пончики з варенням: jelly_doughnuts
У базах даних зберігається логічно пов'язана інформація
Усі таблиці в базі даних мають бути так чи інакше пов'язані між собою. Наприклад, база даних з інформацією про з'їдені пончики може складатися з таких таблиць:
Таблиці під лупою
Стовпець — фрагмент даних, що зберігаються в таблиці.
Рядок (або запис) — набір стовпців, що описують атрибути одного об'єкта.
Стовпці та рядки утворюють таблицю.
Перед вами приклад таблиці для зберігання даних адресної книги. Стовпці також часто називають полями — ці два терміни означають те саме. Крім того, терміни «рядок» і «запис» також вважаються синонімами.

Виходить, дані з моїх карток
можна перетворити на таблицю?
Саме так. Спочатку інформація про кожну людину ділиться на категорії.
Категорії стають стовпцями. Кожна картка перетворюється на запис. Ви можете взяти всю інформацію з карток і перетворити її на таблицю.
Категорії, що об'єднають усі дані з карток
Ім'я
Дата народження
Статус
Електронна пошта
Шукає
Прізвище
Професія
Місце проживання
Захоплення
Дані однієї картки утворюють рядок
Мендоса
Системний адміністратор
Сан-Франциско, CA
театр, танці
Знайомство з типами даних
Перед вами ще кілька корисних типів даних. Їхня робота — зберігати ваші дані без спотворень. Давайте познайомимося з усіма.
CHAR (або CHARACTER) — суворий і непоступливий, вимагає, щоб його дані мали фіксовану довжину.
DEC (або DECIMAL) — забезпечує зберігання чисел із заданою точністю.
INT (або INTEGER) — вважає, що числа мають бути цілими, але не боїться від'ємних значень.
BLOB — працює з великими блоками текстових даних.
DATE — зберігає дати, але не зважає на час.
Слизький тип DATETIME або TIMESTAMP залежно від СКБД. Зберігає дату й час. Його родич TIME працює лише з часом, без дати.
VARCHAR зберігає текстові дані довжиною до 255 символів. Вирізняється гнучкістю, легко пристосовується до змінної довжини даних
Будьте обережні! У вашій СКБД можуть використовуватися інші назви типів!
На жаль, загальноприйнятої системи назв типів не існує.
У вашій конкретній СКБД деякі типи можуть називатися інакше. За інформацією про правильні назви звертайтеся до документації СКБД.
Як ви зрозуміли типи даних?
Привіт! Щоб стало зрозуміло, як користуватися типами даних, у мене є для тебе завдання. Лише на практиці ти зможеш зрозуміти, як дані поділяються за типами. Роздрукуй або перемалюй собі цю таблицю. Потім вибери й впиши найбільш відповідний тип даних для кожного стовпця, а заодно заповни відсутні приклади. Побачимося під час перевірки завдання!

Я досі ніяк не зрозумію. Навіщо все ускладнювати? Чому ми не зберігаємо всі текстові дані в стовпцях типу BLOB? Так було б простіше для всіх... і мені довелося б менше запам'ятовувати.
Це все робиться з міркувань ефективності! Стовпець VARCHAR або CHAR має фіксований розмір, не більше 256 символів, тоді як стовпець BLOB займає набагато більше пам'яті. Зі збільшенням обсягу бази даних на жорсткому диску може закінчитися місце. Крім того, зі значенням BLOB не можна виконувати деякі важливі рядкові операції, доступні для VARCHAR і CHAR (але про це пізніше).
З текстом зрозуміло, а навіщо потрібні різні числові типи INT і DEC? Адже ціле число завжди можна записати як дробове без дробової частини.
Знову ж таки з міркувань ефективності. Оптимальний вибір типу даних для кожного стовпця таблиці зменшує її розмір і прискорює роботу з даними.
Окей, я зрозумів тебе. З великими обсягами даних не жартують. Там кожен байт на рахунку. Але це все на сьогодні? Інших типів немає?
Є, але ці типи найважливіші. Конкретний набір підтримуваних типів даних також залежить від СКБД, тому за додатковою інформацією слід звертатися до документації. Також рекомендуємо книгу «SQL in a Nutshell» — це чудовий довідник, у якому описано основні відмінності між різними СКБД.
Хто що робить? Відповідь на завдання R2D2 про типи даних
Важливі моменти, які ви не використовуватимете
Парадоксально, але факт: нижче перелічено основні команди для керування таблицями — створення, видалення та читання таблиць. Але, як ви вже зрозуміли із заголовка, тестувальники зазвичай не користуються цими командами, це більше прерогатива програмістів. Завдання тестувальника зводиться до вміння витягти з таблиць потрібний перелік даних для тестів. Команди керування:
Для виведення опису структури таблиці використовується команда DESC.
Команда DROP TABLE знищує таблицю з усім вмістом. Будьте уважні, ніколи не використовуйте її просто так!
Для збереження даних у таблиці використовується команда INSERT, яка існує в кількох варіантах.
NULL — невизначене значення, яке не дорівнює нулю або порожньому рядку. Для стовпця, що містить null, виконується умова IS NULL, але при цьому він не дорівнює NULL.
Стовпці, значення яких не вказано в команді INSERT, за замовчуванням ініціалізуються значенням NULL.
Щоб заборонити зберігання null у стовпці, використовуйте ключові слова NOT NULL під час створення таблиці.
Умова DEFAULT визначає значення за замовчуванням — якщо під час заповнення таблиці значення стовпця не вказано, він автоматично заповнюється цим значенням.
CREATE TABLE
Команда створює таблицю, але для її виконання необхідно знати ІМЕНА та ТИПИ ДАНИХ стовпців. Вони визначаються на основі аналізу інформації, яка зберігатиметься в таблиці.
DROP TABLE
Команда видаляє таблицю, під час створення якої було допущено помилку, — але це слід робити до виконання команд INSERT, що заповнюють таблицю даними.
CREATE DATABASE
Команда створює базу даних, у якій зберігаються всі таблиці з даними.
USE DATABASE
Команда відкриває базу даних для створення таблиць.
NULL і NOT NULL
Під час створення бази даних слід знати, які стовпці не повинні набувати значення NULL — це спростить сортування та пошук даних. Умова NOT NULL задається для стовпців під час створення таблиці.
DEFAULT
Визначає значення за замовчуванням для стовпця; воно використовується, якщо значення стовпця не вказано під час вставлення рядка.
DEFAULT і значення за замовчуванням
Якщо в стовпці часто зберігається якесь одне конкретне значення, йому можна призначити значення за замовчуванням за допомогою ключового слова DEFAULT. Значення, що йде після DEFAULT, автоматично заноситься в таблицю щоразу під час додавання нового запису — якщо не задано інше значення. Значення за замовчуванням має відповідати типу даних стовпця
CREATE TABLE doughnut_list
(
doughnut_name VARCHAR(10) NOT NULL,
doughnut_type VARCHAR(6) NOT NULL,
doughnut_cost DEC(3,2) NOT NULL DEFAULT 1.00
);
DEFAULT
1) Стовпець ЗАВЖДИ має містити значення. Для цього ми не лише оголошуємо його з ключовими словами NOT NULL, а й призначаємо значення за замовчуванням 1.
2) Це значення зберігається в стовпці doughnut_cost, якщо в команді INSERT не вказано інше значення.
DEC(3,2)
Значення може містити до 3 цифр: одну до коми і дві після неї
NOT NULL у виводі DESC
А ось як виглядатиме таблиця my_contacts, якщо оголосити всі стовпці з ключовими словами NOT NULL:
Опис
таблиці.
Зверніть
увагу на слово NO
у стовпці
null.
Команда створює таблицю, у якої всі стовпці оголошено з NOT NULL
Команда SELECT. Вибірка даних
Під час роботи з базами даних операція вибірки зазвичай виконується частіше, ніж операція вставлення даних у базу. У цьому розділі ви познайомитеся з могутньою командою SELECT
і дізнаєтеся, як отримати доступ до важливої інформації, яку ви зберегли у своїх таблицях. Також ви навчитеся використовувати умови WHERE, AND та OR для вибіркового відбору даних і запобігання виведенню непотрібних даних.
Складний пошук
Грег нарешті переніс усі дані зі своєї картотеки в таблицю my_contacts. Тепер йому хочеться відпочити. Він роздобув два квитки на концерт і хоче запросити одну зі своїх знайомих — дівчину Енн із Сан-Франциско. Щоб знайти її адресу електронної пошти, Грег переглядає вміст таблиці my_contacts командою SELECT з розділу 1.
SELECT * FROM my_contacts;
Ви маєте уявити себе на місці Грега — переглянути таблицю my_contacts і знайти в ній усіх Енн із Сан-Франциско. Потім виписати їхні імена, прізвища та адреси електронної пошти ->
Тот, Енн: Anne_Toth@leapinlimos.co,
Харді, Енн: anneh@bOttOmsup.com
Паркер, Енн: annep@starbuzzcofee.com
Блант, Енн: annbunt@breakneckpizza.com
Різні Енн та адреси їхньої електронної пошти
Шукаємо контакт
Пошук забрав надто багато часу і був надзвичайно нудним. Також існує цілком реальна небезпека, що Грег пропустив кількох підходящих Енн, зокрема ту, яку він шукає. Дізнавшись адреси електронної пошти, Грег тепер розсилає повідомлення й отримує відповіді...
Вдосконалена команда SELECT
Наступна команда SELECT допоможе Грегу відшукати дані Енн набагато швидше, ніж за дотошного перегляду всієї величезної таблиці. У цій команді ми використовуємо умову WHERE, яка уточнює для СКБД критерій відбору записів. Умова звужує результати пошуку, а команда повертає лише ті записи, для яких ця умова виконується.
Знак = в умові WHERE означає, що кожне значення стовпця first_name перевіряється на рівність із текстом 'Енн'. Якщо два значення рівні, весь запис включається до результату вибірки. Якщо ні — запис пропускається.
У цьому вікні консолі показано результат запиту — підмножину записів, у яких стовпець first_name містить значення 'Енн'.

Хвилиночку, ви ж не думали, що я не помічу знак * ? Що він тут робить?
Зірочка (*) наказує СКБД повернути значення всіх стовпців таблиці.

Що це за * ?
Хвилиночку, ви ж не думали, що я не помічу знак * ?
Що він тут робить?
Зірочка (*) наказує СКБД повернути значення всіх стовпців таблиці.
А якщо я не хочу включати у вибірку всі стовпці? Чи можна використати щось інше замість зірочки?
Так, можна. Зірочка вибирає всі стовпці, але за кілька сторінок ви дізнаєтеся, як обмежити вибірку частиною стовпців, щоб з результатом було простіше працювати
Що це за * ?
Зірочка (*) наказує СКБД повернути значення всіх стовпців таблиці
Час практики
Ви, напевно, подумали, що зараз будуть якісь нудні завдання, але нічого такого! Зараз ми з вами замутимо фруктові коктейлі в барі Galaxy QA Academy. Перегляньте таблицю всього меню, а потім Магістр дасть вам SQL-запит, і за його допомогою ви дізнаєтеся, який коктейль вам дістався!
Який напій видасть запит, сказати мені ти маєш.
1.SELECT * FROM easy_drinks WHERE main = 'Спрайт'?
2.SELECT * FROM easy_drinks WHERE main = содовая ?
3.SELECT * FROM easy_drinks WHERE amount2 = 6 ?
4.SELECT * FROM easy_drinks WHERE second = "апельсиновый сок"; ?
5.SELECT * FRОM easy_drinks WHERE amount1 < 1.5 ?
6.SELECT * FROM easy_drinks WHERE amount2 < '1' ?
7.SELECT * FROM easy_drinks WHERE main > 'содовая' ?
8.SELECT * FROM easy_drinks WHERE amount1 = '1.5'; ?

Запитання на підвищену оцінку: з'ясуйте, який запит не працює ...
А які запити виконаються, хоча, здавалося б, не повинні
Увага, правильна відповідь
Апострофи як спеціальні символи
Якщо ви вставляєте в таблицю дані (INSERT) або робите запит на пошук даних (SELECT) зі значенням VARCHAR, CHAR або BLOB, що містить внутрішній апостроф, необхідно повідомити СКБД, що цей апостроф не завершує текст,
а є його частиною і його потрібно включити до рядка. Для цього можна поставити
перед апострофом зворотну похилу риску.
Команда із внутрішнім апострофом
Ви маєте повідомити СКБД, що апостроф не позначає початок або кінець рядка, а є частиною тексту
Екранування зворотною похилою рискою
Щоб розв'язати цю проблему (і водночас виправити команду INSERT), поставте перед апострофом у тексті зворотну похилу риску:
INSERT INTO my_contacts
VALUES
('Фаніон', 'Стів', 'steve@onionflavoredring.com', 'Ч', '1970-01-04', 'Панк', 'Гровер\'с Мілл, NJ', 'Неодружений', 'Бунтарство', 'Однодумці, гітаристи');
Коли ви ставите перед апострофом префікс \, що вказує, що апостроф є частиною тексту, це називається «екрануванням»
Екранування подвоєнням апострофа
Апостроф також можна «екранувати» іншим способом — поставивши перед ним додатковий апостроф:
INSERT INTO my_contacts
VALUES
('Фаніон', 'Стів', 'steve@onionflavoredring.com', 'Ч', '1970-01-04', 'Панк', 'Гровер''с Мілл, NJ', 'Неодружений', 'Бунтарство', 'Однодумці', 'гітаристи');
Апострофи також можна «екранувати» подвоєнням, тобто заміною одного апострофа двома.
Перепишіть наступну команду, використовуючи два різні способи екранування внутрішнього апострофа:
SELECT * FROM my_contacts
WHERE
location = 'Гровер'с Мілл, NJ';

Звір зі відповіддю Магістра
1. Перший спосіб: зворотна коса риска
2. Другий спосіб: подвоєння апострофа
Відбір конкретних стовпців
Отже, ви вмієте писати команду SELECT для вибірки будь-яких типів даних — зокрема й таких, що містять апострофи.

Результат SELECT * виходить надто
довгим. А якщо мене цікавить лише адреса електронної пошти? Чи не можна
приховати зайві стовпці?
Команда SELECT може включити у вибірку лише ті стовпці, які вам потрібні.
Щоб з результатами було зручно працювати, їх потрібно трохи обмежити. Інакше кажучи, вихідні дані таблиці мають містити меншу кількість стовпців — лише ті стовпці таблиці, які нас цікавлять.
Перш ніж вводити наступний запит SELECT, прикиньте, як виглядатиме таблиця результатів.
Погляньте лишень, яку гарну й лаконічну таблицю повертає наш новий запит. Це успіх!
Відбір стовпців прискорює отримання результатів
Указуючи, які стовпці має повертати запит, ми відбираємо з повних результатів цікаву для нас інформацію.
Подібно до того, як умова WHERE обмежує кількість записів, що повертаються, конструкція відбору стовпців обмежує кількість повернутих стовпців. По суті, ви доручаєте роботу з відбору інформації SQL.
Відбір стовпців корисний і зручний, але має й інші переваги.
Зі збільшенням обсягу даних у таблиці відбір стовпців прискорює отримання результатів. Прискорення проявляється і під час використання коду SQL в інших мовах програмування, наприклад PHP.
Кілька способів отримати «Поцілунок»
Пам'ятаєте нашу таблицю easy_drinks? Наступна команда SELECT поверне коктейль «Поцілунок»:
SELECT drink_name FROM easy_drinks
WHERE
main = 'вишневий сік';
Кілька способів отримати «Поцілунок»
Пам'ятаєте нашу таблицю easy_drinks? Наступна команда SELECT поверне коктейль «Поцілунок»:
SELECT drink_name FROM easy_drinks
WHERE
main = 'вишневий сік';
Команда SELECT — найуживаніша для тестувальника. Давай якомога більше практикуватися — допишіть чотири команди SELECT, щоб вони також повертали «Поцілунок». А щоб закріпити, запишіть ще три команди SELECT, які повертають коктейль «Жабка».

Якщо ти вже знайшов відповідь — давай перевіримо її разом
Поцілунок - 1
Поцілунок - 2
Поцілунок - 3
Поцілунок - 4
Жаба - 1
Жаба - 2
Жаба - 3
Круто, ми впевнені, що тобі дуже сподобалося писати запити. Давай ще щось виберемо за допомогою SQL. Використовуючи таблицю my_contacts, напиши кілька запитів для Грега. Включіть у вибірку лише ті стовпці, які необхідні для отримання відповіді. Зверніть особливу увагу на апострофи.
1. Напишіть запит для отримання адрес електронної пошти всіх програмістів.
2. Напишіть запит для отримання імені та місця проживання всіх людей, у яких дата народження збігається з вашою.
3. Напишіть запит, за допомогою якого Грег міг би знайти всіх Ен із Сан-Франциско.
Поєднання умов
Дві умови пошуку — тип «з глазур'ю» та оцінка «10» — можна об'єднати в один запит за допомогою ключового слова AND. Результати такого запиту задовольнятимуть обидві умови.
Результат запиту AND. Навіть якщо запит поверне кілька записів, ми знатимемо, що в усіх цих закладах є глазуровані пончики з оцінкою 10, тож піти можна в будь-який із них. Або в усі по черзі.
Пошук числових значень
Припустімо, ви хочете знайти в таблиці easy_drinks усі напої, що містять понад одну унцію содової, і зробити це в одному запиті. Складне рішення з двома запитами виглядає так:

А як було б чудово, якби
в одному запиті можна було знайти всі напої з таблиці easy_drinks,
що містять понад 1 унцію содової...
Але я знаю, що це лише мрії...
Проте використовувати два запити замість одного неефективно; до того ж ви ризикуєте пропустити напої, до складу яких входить 1.75 або 3 унції содової. Краще скористатися оператором порівняння «більше»:
Оператори порівняння
Раніше в наших умовах WHERE використовувався лише оператор =. Ви щойно побачили приклад використання оператора >, який порівнює одне значення з іншим. Нижче наведено повний перелік операторів порівняння.
Оператор = перевіряє лише точні збіги. Він не допоможе, якщо ви хочете перевірити, що якесь значення менше або більше за інше. Сили добра все перевірять для тебе, щоб усе було точно. Ми не терпимо відхилень.
Цей дивний знак означає «не дорівнює». Його результат прямо протилежний результату знака =. Два значення або рівні, або не рівні — третього не дано. Ти або на боці світла, або на боці темряви — обирай сам!
Всім відомий знак рівності.

<>
Означає «не дорівнює». Повертає всі записи, значення яких не збігається із зазначеним
Оператор «менше» порівнює значення стовпця, указаного ліворуч, зі значенням у правій частині. Якщо значення стовпця менше, то запис включається до набору, що повертається.
Оператор «більше» за змістом протилежний знаку «менше». Він порівнює значення стовпця зі значенням у правій частині. Якщо значення стовпця більше, то запис включається до набору, що повертається.
Оператор «менше» повертає всі значення, менші за задане.
І звісно, існує парний оператор «більше». У нас завжди є противага тій стороні.
Оператор «менше або дорівнює» відрізняється від «менше» лише одним: стовпці, значення яких дорівнює заданому, також включаються
до результату.
Повертаються всі записи зі значенням стовпця, МЕНШИМ АБО РІВНИМ заданому.
Те саме і з оператором «більше або дорівнює». Якщо значення стовпця більше за задане значення або дорівнює йому, то запис включається до набору, що повертається.
А це наш, темний оператор
БІЛЬШЕ АБО ДОРІВНЮЄ.
Оператори порівняння під час пошуку числових даних
У барі зберігається таблиця з цінами та даними про калорійність напоїв. Власник хоче відібрати напої з високою ціною та низькою калорійністю для проведення рекламної акції.
За допомогою операторів порівняння він шукає в таблиці drink_info напої з ціною понад $3.50, що містять не більше 50 калорій.
Запит повертає лише напої, які задовольняють обидві умови, тому що два результати поєднуються ключовим словом AND. Запит повертає напої «Оце так», «Самотнє дерево» та «Сода плюс».
Як ти зрозумів силу нерівностей?
Тепер твоя черга зануритися в SQL. Напишіть запити, які повертають указану інформацію. Також запиши результат кожного запиту. Як завжди, звіримося з відповідями, коли будеш готовий. Напиши запити, щоб знайти:
1. Ціни жовтих напоїв із льодом, що містять понад 33 калорії.
2. Назви та кольори напоїв, що містять не більше 4 грамів вуглеводів, до яких кладуть лід.
3. Назви та колір напоїв, що містять 80 і більше калорій.
4. Напої «Борзая» і «Поцелуй», з кольором та інформацією про використання льоду, але без зазначення назв напоїв у запиті!
Практика рівня
Завдання цього рівня до неподобства просте. Хай мене розберуть 1000 дроїдів, якщо ти не виконаєш його одним махом після всіх завдань, що ми перепаяли на цьому рівні! Тобі належить працювати з реальною БД типу MySQL. У практичному завданні тобі треба буде написати 10 запитів. Коли будеш готовий, надішли їх нам через форму.

Теоретичний тест рівня SQL-1
Форма для надсилання створених вами SQL-запитів




































