SEC S20W1 || Databases and SQL language - Part 1

sergeyk -

З початком вересня я повернувся після літньої перерви на Steemit і помітив тут Steemit Engagement Challenge аж Season 20 вже проходить.
Мені пощастило брати участь як викладач та ще я беру участь як учень. Вчора я ледве завершив домашнє завдання з розробки мобільних застосунків, а сьогодні ось в останній день дійшла черга до SQL. Якщо з розробкою для Android я не стикався зовсім, то з SQL кілька команд довелося задавати. Але то було дуже давно. І завдяки Steemit Engagement Challenge я можу повчитися, бо без них явсе відкладав на потім. А тут хочеться прийняти участь саме зараз коли йдуть замгання.

Отже моя домашня робота.

Вправа 1:

Для кожного з наступних тверджень перевірте кожне положення, поставивши літеру V, якщо воно правильне, або F, якщо воно неправильне.

Стовпець відповідає:

- ❌індекс 
- ✅елементарна властивість об'єкта реального світу
- ❌б'єкт реального світу

Позначте літеру V перед правильним словом, щоб завершити наступне речення:
A 𐄂𐄂𐄂𐄂𐄂𐄂 – це набір даних, пов’язаних з одним предметом (або сутністю), структурованих у форматі таблиці.

- ❌База даних
- ✅Таблиця
- ❌рядок

Які з наступних пропозицій відповідають первинному ключу?

- ✅Поле, яке не приймає дублікатів
- ✅Дозволяє ідентифікувати інформацію для її отримання
- ❌Перший запис у таблиці

У SQL, щоб забезпечити цілісність даних у дочірній таблиці після зміни значення первинного ключа батьківської таблиці, ми використовуємо пункт:

- ❌CHECK
- ✅ON UPDATE CASCADE
- ❌ON DELETE CASCADE

Обмеження цілісності для стовпця:

- ✅PRIMARY KEY
- ✅CHECK
- ✅FOREIGN KEY
- ✅REFERENCES

Які речення в SQL, розміщені після типу даних поля, забезпечують унікальність вмісту цього поля?

- ✅PRIMARY KEY
- ✅UNIQUE
- ❌NOT NULL
- ❌CONSTRAINT

У SQL команда Drop Table дозволяє:

- ❌Видалення обмежень цілісності лише для таблиці
- ✅Видалення таблиці
- ❌Видалення одного або кількох рядків із таблиці
- ❌Видалення одного або кількох стовпців із таблиці

Вправа 2

Для опису співробітників компанії та їх розподілу за різними функціями була створена наступна таблиця:

codempnomempprenempdnempniveaucodfctintfct
E001TOUNSISafa1980-01-10Master20Finance
E002KEFIAli1981-09-12High School10Administrative
E003BEJIMohamed1977-04-15High School20Finance
E004TOUATILamia1965-06-21Technician20Security
E005SOUSSILeila1982-11-28Master10Administrative
E006SFAXILotfi1988-06-09Master30Legal

Опис колонок

ColumnDescriptionColumnDescription
codempEmployee codednempEmployee's date of birth
nomempEmployee's last nameniveauRecruitment level
prenempEmployee's first namecodfctFunction code
intfctFunction title

Ця таблиця страждає від аномалій від її створення. Визначте аномалії цієї структури та поясніть їх походження.

Відповідь:

Щоб попрактикуватися в створенні SQL таблиць та запитів я завантажив
DB Browser for SQLite https://sqlitebrowser.org/

та створив таблицю з завданння

Аномалії оновлення:

Якщо нам потрібно оновити 'Recruitment level' або 'Function title' то це доведеться зробити по всій таблиці.
Виправлення займе багато часу, може призвести до помилок і невідповідностей.
А в великію БД зберігання однакового тексту сильно збільший розмір БД.
Рішення: Для цих назв треба зробити окремі таблиці.

Аномалії видалення:

Якщо ми видалимо працівника, наприклад з Function title = Security, то інформація про Security теж не буде присутня в БД.
Рішення: знов приходимо до того що для цих назв треба зробити окремі таблиці.

Аномалія додавання:

Наприклад у нас з'явилося нове значення для 'Recruitment level' або 'Function title', але співробітника з такими характеристиками ще нема. То ці значення нема де зберегти.
Рішення: знов приходимо до того що для цих назв треба зробити окремі таблиці.

Щоб виправити аномалії, ми пропонуємо наступні правила управління:

R1: Співробітник призначений лише для однієї функції, і функція може включати кількох працівників.
R2: Працівник має лише один рівень набору, а рівень набору стосується кількох працівників.

Для цього створимо три незалежні/самостійні таблиці

Щоб СУБД врахувала, що працівник може займати посаду в компанії протягом визначеного періоду та може займати ту саму посаду в різний час,

R1 стає таким: працівник може виконувати одну або кілька функцій, і для кожного призначення записуються дати початку та закінчення призначення.

Так, попередня реалізація БД ще й не могла розповідати про історію - хто коли і на якій посаді був. А відображала лиш поточний момент.

Те що ми зробили БД з чотирьох таблиць вийшло дуже зручним. Для даної реалізації не слід змінювати структуру трьох таблиць. Лише до четвертої слід додати два поля з датою. Перше обов'язкове, а друге може бути постим - коли працівник ще працює.

Ми пропонуємо додати таблицю під назвою «бонус» для запису бонусів за продуктивність, нарахованих кожному працівнику протягом року, з полями AnneePrime як роком бонусу та PrimeRend як значенням бонусу. Для цього ми повинні дотримуватись нового правила менеджменту R3: працівник може отримувати бонуси за результат протягом того самого року.

Вправа 3:

Розглянемо базу даних «GestElections», яка містить інформацію про вибори членів ради закладів середньої школи. Це описано таким спрощеним текстовим представленням:
| Electeur (NumElv, NomPrenElv, AgeElv) |
| Кандидат (NumCand, NumList#, Appelation) |
| Liste (NumList, DesList, NbrCand) |
| Виборець (NumCand#, NumList#, NumElv#) |

ColumnDescriptionData TypeSizeMandatoryTable
NumElvNumber of an elector studentAuto-increment3YesElecteur
NomPrenElvElector student's full nameText20YesElecteur
AgeElvElector student’s age [12..20]Numeric2NoElecteur
NumCandNumber of a candidate studentNumeric2YesCandidat
NumListList numberNumeric1YesListe
AppelationCandidate's designationText20YesCandidat
DesListUnique designation of a listText20YesListe
NbrCandNumber of candidates [1..6]Numeric2NoListe

Створимо БД і таблиці в них

Додайте стовпець «Datevote», що представляє поточну дату, до таблиці «Виборець».
ALTER TABLE Viborec ADD COLUMN Datevote DATE DEFAULT CURRENT_DATE;

Розширити колонку «Назва» таблиці «Кандидат» до 30 символів.
ALTER TABLE Candidat MODIFY Appelation VARCHAR(30) NOT NULL; - це можна зробити однією командою

Розділіть стовпець «NomPrenElv» таблиці «Electeur» на «LastName» та «FirstName», кожен із 15 символів (обидва поля є обов’язковими).

ALTER TABLE Electeur
ADD COLUMN LastName VARCHAR(15) NOT NULL,
ADD COLUMN FirstName VARCHAR(15) NOT NULL;

UPDATE Electeur
SET LastName = SUBSTRING_INDEX(NomPrenElv, ' ', 1),
    FirstName = SUBSTRING_INDEX(NomPrenElv, ' ', -1);
ALTER TABLE Electeur DROP COLUMN NomPrenElv;

тут ми додамо два стовбці та розіб'ємо пробілом ім'я та прізвище в них
старий стовбець з іменем слід видалити.

Керівник вишу хоче зібрати статистику голосів за статтю виборця (хлопець чи дівчина), але не може знайти результатів.

Що йому можна запропонувати?
Напишіть свою пропозицію на SQL.

Звісно не може найти результатів адже в таблиці нема відповідного поля.
його слід додати

ALTER TABLE Electeur
ADD COLUMN Gender VARCHAR(6) NOT NULL;

але його тепер слід заповнити
-- Припустимо, у вас вже є дані про стать, які потрібно вставити

UPDATE Electeur
SET Gender = 'Male'  -- або 'Female'
WHERE NumElv = ...; -- тут за якоюсь ознакою, є наприклад чоловічі та жіночі імена

Після того як дане поле у всих буде заповнене
можна зібрати статистику

SELECT Gender, COUNT(*) AS NumberOfVotes
FROM Viborec
JOIN Electeur ON Viborec.NumElv = Electeur.NumElv
GROUP BY Gender;

Перший тиждень майже минув, але можна підключитися з наступного тижня @jen0revision @mahadisalim @creeping
Мережі Х у мене нажаль немає.

Сподіваюся наступного разу завдання будуть не набагато складніші.