Базите данни могат да бъдат трудни за заобикаляне на главата. Те обаче са от съществено значение за програмирането с пълен стек и изграждането на бек-енд услуги, които съхраняват данни.
В тази публикация ще демистифицирам SQL, бази данни и системи за управление на релационни бази данни. Също така ще използвам някои аналогии с Магьосническия свят, включително самия Хари Потър и някои от часовете, които посещава в Хогуортс.
Преди да се потопим в ключовите термини, нека дефинираме какво представлява самата база данни:
Абаза данни е структуриран набор от данни, съхранявани в компютър, особено такъв, който е достъпен по различни начини. По същество това е организиран набор от данни на компютър, който може да бъде достъпен по електронен път от компютърна система.
Ключови условия
По-долу са някои ключови термини, с които ще започнем:
- RDMS: Системи за управление на релационни бази данни. Тази рамка за бази данни е основата на MySQL.
- SQL: Структуриран език за заявки.
- Таблици: Обекти на база данни, които носят данни. Пример за име на таблица е „Студенти“, или „Учители“, или „Курсови“.
- Полета: Стойностите на таблица са известни като полета. Примерни полета за учащи ще бъдат „Име“, „Фамилно име“ и „GPA“.
- Запис/ред: Индивидуално вписване в таблицата.
След като добавим учители и курсове към базата данни, можем да имаме таблици за студенти, учители и курсове.
Докато продължаваме напред в ръководството, ще използваме само Студентите пример тук като справка. Ако сте имали късмета да бъдете наети като софтуерен инженер в Хогуортс, вашата база данни може да използва добре някои от тези команди :D
SQL изявления
Синтаксис
Точката и запетаята е стандартният начин за разделяне на един SQL израз от друг. Той позволява множество SQL оператори да се изпълняват в едно и също извикване. В това ръководство ще имаме точка и запетая в края на всяко изявление.
Най-важните SQL команди
Създаване :Създава нова SQL таблица.
Ако създавахме студентската база данни за училището Хогуортс, например, щяхме да използваме CREATE да направи маса, наречена "Студенти".
- Синтаксис
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
- Пример
CREATE TABLE Students
(first_name VARCHAR(255),
last_name VARCHAR(255),
login VARCHAR(255),
age INTEGER,
gpa REAL,
house VARCHAR(255));
Изпускане :Изтрива таблица. Бъдете много внимателни, когато използвате тази команда, тъй като това ще изтрие всички данни в таблицата!
Ако искаме да изтрием цялата студентска база данни, ще използваме DROP за да извършите това действие.
- Синтаксис
DROP TABLE table_name;
- Пример
DROP TABLE Students;
Вмъкване :Добавя нови редове с данни към таблица.
Ще използваме INSERT за добавяне на нови студенти, когато се записват в Хогуортс.
- Синтаксис
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- Пример
INSERT
INTO Students(first_name, last_name, login, age, gpa, house)
VALUES
('Harry', 'Potter', 'theboywholived', 15, 4.0, 'Gryffindor'),
('Hermionie', 'Granger','granger2', 15, 4.5, 'Gryffindor'),
('Ron', 'Weasley','weasley7', 15, 3.7, 'Gryffindor'),
('Draco', 'Malfoy', 'malfoy999', 15, 4.0, 'Slytherin'),
('Cedric', 'Diggory','diggory123', 15, 4.0, 'Hufflepuff');
Изберете :Използва се за извличане на данни в база данни, които да бъдат върнати в табличен формат.
Ако искаме да извлечем всички имена на студенти, които са в къщата на Грифиндор, ще използваме SELECT команда. Примерът по-долу отправя заявка към таблицата Students за собственото и фамилното име на всеки ученик в базата данни, което за нас е само петте реда, описани по-горе.
- Синтаксис
SELECT column1, column2, ...
FROM table_name;
- Пример
SELECT first_name, last_name FROM Students;
first_name | фамилно_име |
---|---|
Хари | Потър |
Хърмаяни | Грейнджър |
Рон | Уизли |
Драко | Малфой |
Седрик | Дигъри |
Като алтернатива, ако искаме да изберем всички полета в таблицата, нашата команда ще използва синтаксиса "*", което означава избор на всички полета:
SELECT * FROM Students;
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Хари | Потър | theboywholived | 15 | 4 | Грифиндор |
Хърмаяни | Грейнджър | granger2 | 15 | 4.5 | Грифиндор |
Рон | Уизли | уизли7 | 15 | 3.7 | Грифиндор |
Драко | Малфой | malfoy999 | 15 | 4 | Слидерин |
Седрик | Дигъри | diggory123 | 15 | 4 | Хъфълпаф |
Клаузи
Аклауза е логическа част от SQL израз и (на теория) е незадължително поле.
В горното изявление ние просто върнахме всички полета в базата данни на Student. Не сме посочили условие за връщаните стойности.
Ами ако искаме да запитаме не всички ученици, а само тези, чиято къща е Грифиндор? Какво ще кажете за запитване на студенти, чието име започва с "H", или студенти в Хъфълпъф и Слидерин? Тези по-сложни случаи се решават с SQL клаузи.
По-долу е даден преглед на най-често срещаните клаузи, но има още няколко клаузи в езика SQL. Ето един добър общ преглед, ако искате още информация.
Примери за клаузи
Къде: Използва се за посочване на условие при извличане на данни от база данни. Връщайки се към примера с Select, ще трябва да използваме WHERE за да посочите къщата като Грифиндор.
- Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- Пример
SELECT * FROM Students
WHERE house='Gryffindor';
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Хари | Потър | theboywholived | 15 | 4 | Грифиндор |
Хърмаяни | Грейнджър | granger2 | 15 | 4.5 | Грифиндор |
Рон | Уизли | уизли7 | 15 | 3.7 | Грифиндор |
И Използва се за комбиниране на множество клаузи в SQL израз, където всички условия, разделени от И, са верни. Ще използваме И, за да получим ученици от Грифиндор, които имат успех над 3,8.
- Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
- Пример
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Хари | Потър | theboywholived | 15 | 4 | Грифиндор |
Хърмаяни | Грейнджър | granger2 | 15 | 4.5 | Грифиндор |
Или :Подобно на И, но връща само данни, в които само ЕДНО от условията, разделени от ИЛИ, е вярно. Ако искахме да извлечем ученици в Хъфълпаф и Слидерин, но не и в двете, щяхме да използваме командата ИЛИ.
- Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
- Пример
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Драко | Малфой | malfoy999 | 15 | 4 | Слидерин |
Седрик | Дигъри | diggory123 | 15 | 4 | Хъфълпаф |
Харесвам: Използва се с WHERE за търсене на конкретен модел. Ако искаме само името и фамилията на магьосници/вещици с имена, започващи с "H", бихме могли да използваме командата Like.
- Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
- Пример
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
first_name | фамилно_име |
---|---|
Хари | Потър |
Хърмаяни | Грейнджър |
Брой: Използва се за намиране на броя на колона (или колони) в таблица.
- Синтаксис
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
- Пример
SELECT COUNT(first_name) FROM Students;
COUNT(first_name) |
---|
5 |
Две други команди, които използват същия синтаксис, са AVG и SUM. AVG ще изчисли средната стойност на всички стойности, а sum ще изчисли сбора от всички стойности.
Изберете лимит: Използва се за прекъсване на отговорите само до определено количество. Начинът, по който се избират най-добрите отговори, е по реда на първо вмъкване в базата данни в хронологичен ред.
- Синтаксис
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
- Пример
SELECT * FROM Students LIMIT 3;
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Хари | Потър | theboywholived | 15 | 4 | Грифиндор |
Хърмаяни | Грейнджър | granger2 | 15 | 4.5 | Грифиндор |
Рон | Уизли | уизли7 | 15 | 3.7 | Грифиндор |
Други полезни команди
Поръчайте по: Сортира резултатите във възходящ или низходящ ред.
- Синтаксис
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
- Пример
SELECT * FROM Students ORDER BY first_name;
first_name | фамилно_име | вход | възраст | gpa | къща |
---|---|---|---|---|---|
Седрик | Дигъри | diggory123 | 15 | 4 | Хъфълпаф |
Драко | Малфой | malfoy999 | 15 | 4 | Слидерин |
Хари | Потър | theboywholived | 15 | 4 | Грифиндор |
Хърмаяни | Грейнджър | granger2 | 15 | 4.5 | Грифиндор |
Рон | Уизли | уизли7 | 15 | 3.7 | Грифиндор |
Групиране по: Групира категории, които имат еднакви стойности, в редове. Ако искате да знаете броя на учениците във всяка къща (3 в Грифиндор например), можете да използвате командата Group By.
- Синтаксис
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
- Пример
SELECT COUNT(first_name), house FROM Students GROUP BY house;
COUNT(first_name) | къща |
---|---|
3 | Грифиндор |
1 | Хъфълпаф |
1 | Слидерин |
И накрая, ето една DB Fiddle, която показва всички горепосочени команди в действие!
Нормализирани срещу денормализирани бази данни
Когато проектирате база данни, има два основни модела на проектиране, които можете да следвате, всеки със свои собствени компромиси.
Нормализирано: Оптимизира за минимизиране на излишъка не за време за четене.
Да кажем, че имаме таблица с курсове, която има идентификационен номер на учител за учителя, който преподава този курс. Имаме и база данни на учители, която съдържа името на учителя.
Когато искаме да получим имена на учители, преподаващи конкретен курс, ще трябва да потърсим както таблиците за курсове, така и за Учители, тъй като таблицата на курса няма името на преподавателя (ефективно, но излишно).
Денормализирано: Оптимизира за време за четене , не за минимизиране на излишъка.
Да приемем, че имаме таблица с курсове, която има ИД на учител И име на учител. Имаме база данни на учители, която също има името на учителя. Когато искаме да получим имена на учители в курса, можем просто да използваме таблицата на курса (излишна, но ефективна).
Интегритет на данните
За потребителите е жизненоважно данните, с които взаимодействат, да са сигурни, правилни и разумни. Примерите са да се уверите, че възрастта не е отрицателно число или че няма двама ученици да имат една и съща информация. Наричаме това катоинтегритет на данните.
Цялостността на данните има няколко форми и може да бъде разделена на четири категории:
- Цялост на обекта :Няма дублиращи се редове в таблица. Например, не можем да вмъкнем Рон Уизли два пъти в базата данни.
- Цялост на домейна :Ограничаване на типа стойности, които човек може да вмъкне, за да наложи правилните стойности. Например къща може да бъде само Грифиндор, Рейвънклоу, Слидерин или Хъфълпаф.
- Цялост на препратката :Записите, които се използват от други записи, не могат да бъдат изтрити. Учител не може да бъде изтрит, ако в момента преподава курс.
- Дефинирана от потребителя цялост: Категория „други“, която се състои от бизнес логика и правила към базата данни.
Общи SQL бази данни
- Оракул :Много стабилен и зрял, но може да струва скъпо
- MySQL :Лек и бърз за настройка, но не толкова зрял като Oracle
- PostgreSQL :Добър за определени случаи на употреба, но не супер бърз
Ресурси
- SWEPrep – Въпроси за интервю направо във входящата ви кутия
- SQL и бази данни на freeCodeCamp
- Изчистване на кода
- Ефективна Java
- Документация на Oracle
- Документация за MySql
- Документация за PostgreSQL
Бъдете актуални
- Теми на Reddit :Страхотни теми за бази данни, SQL и нови технологии
- Новини за хакери: Наистина страхотен ресурс, за да сте в течение на най-новите разработки в технологичната индустрия
- CodePen: Отличен ресурс за откриване на добри SQL практики.