Added missing files and removed unnessesary ones

This commit is contained in:
2023-07-16 16:44:42 +03:00
parent c3fa5367c3
commit 199dd693e4
41 changed files with 1442 additions and 50 deletions

377
SQL/Databases.md Normal file
View File

@ -0,0 +1,377 @@
# Базы данных
## Основы
### Основные определения
*База данных* - набор структурированной информации или данных, которые хранятся в компьютерной системе
*СУБД* - система управления БД
*SQL* - основной интерфейс работы с реляционными базами данных
*Транзакция* - Последовательность операция над БД, рассматриваемых СУБД, как одно целое
### Классификация
* Простейшие базы двнных
* SQL базы данных (реляционные)
* NoSQL базы данных (нереляционные)
* Комбинированные типы
### Реляционные базы данных
> Набор данных с предопределенными связями между ними. Эти данные организованны в виде набора таблиц, состоящих из столбцов и строк. В таблицах хранится информация об объектах, представленных в виде данных
### NoSQL базы данных
> База данных, в которой не используется табличная система строк и столбцов
### Основные функции
* Управление данными во внешней памяти
* Управление данными в оперативной памяти
* Управление транзакциями
* Ведение журнала выполнения операций в базе данных
* поддержка языков баз данных
### Основные БД
* SQL
* Oracle (Вы любите деньги больше, чем надо)
* Microsoft SQL Server (Вы любите деньги больше, чем надо)
* PostgreSQL (Халява)
* NoSQL
* MongoDB
* DB2
* Cassandra
### Первичный и внеший ключ
* *Ключ* - это колонка или колонки,не имеющие дублирующих значений.
* *Первичный ключ* - это поле или набор полей со значением, которые являются уникальными для всей таблицы.
* *Естественные* являются свойствами моделируемого объекта интересными сами по себе, даже если никто не стремится сделать из них ключ
* *Искусственные (суррогатные)* - придуманные коды для ссылки на данные или объекты
* *Внешний ключ* - столбец или группа столбцов, используемых в SQL БД для связи данных между таблицами
### Типы связи в SQL БД
1. "Один к одному"
Образуется когда ключевой столбец присутствует в другой таблице, в которой тоже является ключом либо свойствами столбца задана его уникальность. Используется, когда нужно разделить данные одной таблицы на несколько отдельных таблиц.
2. "Один к многим"
Одной записи первой таблицы соответсвует неколько записей в другой таблие. Символ ключа связи указывает, что таблица,к которой этот конец прилегает, находится на стороне "один", а символ бесконечности находится на стороне "многие".
3. "Многие к многим"
Если нескольким записям одно таблицы соответсвует несколько запясей из другой таблицы. Связь организовывается посредством связывающей таблицы.
### Реляционная алгебра. Операции
* *Проекция* - это столбец фильтра. Получаем содержимое только части столбцов.
* *Выборка* - это фильтрование строки. Включает в себя выбор строк.
* *Декартово произведение* - Каждому элементу из множества R сопоставлен в соответсвие определенный элемент из множества S, то возникает множество, сопоставленное из пар элементов множества R и S.
* *Объединение* - это отношение, которое включает в себя все кортежи обоих отношений без повторов.
* *Вычитание* - это разность односхемных отношений R и S назывется множество кортежей R, не входящих в S.
* *Пересечение* - это пересечение двух односхемных отношений R и S есть подмножество кортежей, принадлежащих обоим отношениям. Это можно выразить через разность: R-(R-S).
* *Соединение* - эта операция определяет подмножество декартова произведения двух разносхемных отношений. Предназначена для обеспечения выборки данных из двух таблиц и включение этих данных в один результативный набор.
### Нормализация и Денормализация
*Нормальная форма* - Свойство отношения, характеризующее его с точки зрения избыточности
*Нормализация* - процесс минимизации избыточности отношения(приведение к НФ)
*Денормализация* - намеренное приведение структуры базы данных в состояние, не соотвествующее критериям нормализации
## Основы синтаксиса
### Идентификаторы и ключевые слова
* *SELECT*, *UPDATE* и *VALUES* являются примерами ключевых слов, то есть слов, имеющих фиксированное значение в языке SQL
* Ключевые слова и идентификаторы без кавычек воспринимаются системой без учета регистра.
* Есть и другой тип идентификаторов: отделённые идентификаторы, или идентификаторы в ковычках
```sql
UPDATE my_table SET a = 5;
UPDATE "my_table" SET "a" = 5;
```
### Константы
* *Строковая константа в SQL* - обычная последовательность символов, заключённая в одинарные ковычки
```sql
SELECT 'foobar'
```
* Ещё один способ записи строковых констант - "заключение строк в доллары".
```sql
$$Жанна д Арк$$
```
* Числовые константы
* 42
* 3.5
* 5e2
* 1.925e-3
* Битовые константы похожи на обычные с дополнительной буквой перед опострофом, показывающих систему счисления
* B'1001'
* X'1FF'
* Константы: Со спецпоследовательностями (начинается с буквы E перед апострофом)
* \b - "забой" (BackSpace)
* \f - подача формы
* \n - новая строка
* \r - возврат каретки
* \t - табуляция
### Операторы
* ^ - возведение в степень
* IS TRUE, IS FALSE
* ISNULL
### Специальные знаки (Вот вооще не операторы)
**Вот с#ка не забудь про ;**
### Коментарии
```sql
-- Коментарий
```
```sql
/* многострочный
коментарий */
```
## Типы данных
### Числовые типы
* *smallint* (2 байта) - целое в небольшом диапозоне
* *integer* (4 байта) - типичный выбор для целых чисел
* *bigint* (8 байт) - целое в большом диапозоне
* *numeric* / *decimal* (переменный) - десятичное с указанной точностью
* *real* (4 байта) - десятичное с переменной точностью
* *double precision* (8 байт) - вещественное число с переменной точностью
* *smallserial* (2 байта) - небольшое целое с автоувелечением
* *serial* (4 байта) - целое с автоувеличением
* *bigserial* (8 байт) - большое целое с автоувеличением
* *money* - два знака после запятой, денежный тип
### Символьные типы данных
* *character varing(n)* / *varchar(n)* - строка ограниченной переменной длины
* *character(n)* / *char(n)* - строка фиксированной длины с пробелами
* *text* - строка неограничсенной переменной длины
### Логический тип данных
* *boolean* (1 байт) - TRUE / FALSE / NULL
### Типы данных даты и времени
* *date* - дата без времени YYYY-MM-DD
* *timestamp* - дата и время с точностью до микросекунды
* *interval* - интервал между датами
* *time* - время без даты. Удобный тип данных чем-то похожий на interval, который работает по модулю 24 (часа), то есть интервал, в котором отстутствуют дни
## DDL - Data Defintion Language
* CREATE - создание таблиц
* ALTER - используется для изменения объектов БД
* DROP - оспользуется для удаления БД
### Примеры
* Создать базу данных:
```sql
CREATE DATABASE test;
```
* Создать таблицу
```sql
CREATE TABLE films(
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
);
```
* Добавить столбец
```sql
ALTER TABLE distributors ADD COLUMN adress varchar(30);
```
* Удалить столбец
```sql
ALTER TABLE distributors DROP COLUMN adress RESTRICT;
```
* Изменить тип данных
```sql
ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
```
* Создать таблицу, если нет с таким же названием:
```sql
CREATE TABLE IF NOT EXISTS ... ;
```
* Получить всё из таблицы:
```sql
SELECT * FROM authors;
```
* Вставить что-то в таблицу:
```sql
INSERT INTO authors VALUES (1, 'Лёва Толстый');
```
## Фильтрация и компоновка данных
### Where
> Для осуществления фильтрации в SQL есть специальный оператор *WHERE*
```sql
SELECT * FROM stores WHERE amount > 10
```
### Агрегатные функции
> Агрегатные функции выполняют вычисления над набром значений и возвращает 1 значение. Агрегатные функции игранируют NULL значения (кроме COUNT)
* *СOUNT(\*)* - находит количество строк в запросе
* *COUNT(**expression**)* - находит количество строк в запросе, для которых **expression** не содержит значение NULL;
* *SUM* - сумма значений выьранных столбцов
* *MAX* - максимальное значение определённого столбца
* *MIN* - минимальное значение определённого столбца
* *AVG* - вычисление среднее значение столбца
### Группировка данных (*GROUP BY*)
> *GROUP BY* определяет, как строки будут группироваться, чтобы разделить их на логические наборы, благодаря чему становится возможном выполнение статических вычеслений отдельно в каждой группе
```sql
SELECT age, SUM(salary) as sum FROM workers GROUP BY age;
-- Сумма зарплат для каждого возраста
-- *as sum* меняет название столбца на нужное нам (было бы так, как написанно (SUM(salary)))
```
### Оператор *HAVING*
> Оператор *HAVING* позволяет определять условия выборки уже сгрупированных данных. *HAVING* применяется строго после GROUP_BY и может использовать результаты агрегатных функций
```sql
SELECT model, COUNT(model) as Qty_model, AVG(price) as Avg_price
FROM PC
GROUP BY model
HAVING AVG(price) < 800;
-- Фильтрует столбцы, которые были бы выданы после GROUP BY
```
### Оператор *SORT BY*
> *ORDER BY* используется для сортировки записей в наборе результатов запроса *SELECT*. Сортирует по возрастанию, но, если нужно сделать по убыванию, то используем *DESC* (от английского descending)
```sql
SELECT * FROM Sumproduct ORDER BY Amount DESC, City
-- Значала сортирует по Amount по убыванию, потом по городу по возростанию
```
### *LIMIT* и *OFFSET*
* *LIMIT* - макс количество выданных строк
* *OFFSET* - пропустить первые N строк
### Общий вид
```sql
SELECT столбцы
FROM ТАБЛИЦА
WHERE условие-фильтра
GROUP BY столбцы-для-группировки
HAVING фильтр-груп
ORDER BY столбцы для сортировки
LIMIT N
OFFSET K
```
```sql
SELECT name, AVG(salary) as avg_salary
FROM workers
GROUP BY name
HAVING name != 'JOHN'
ORDER BY avg_salary DESC
LIMIT 5
OFFSET 3
```
## Соединение и объединение таблиц
### *JOIN*
> *JOIN* позволяет соединения двух или более таблиц
#### Виды
* *JOIN* (только пересечение)
* *LEFT JOIN* (всё из первой и пересечение)
* *RIGHT JOIN* (всё из второй таблицы и пересечение)
* *FULL JOIN* (всё из обоих таблиц)
#### Пример
```sql
SELECT * FROM AUTHORS [LEFT/RIGHT/FULL/""] JOIN BOOKS
ON Author.id = Books.author_id
```
### *UNION*
> Выводит результаты двух *SELECT*. Удаляет дубликаты, если не *UNION ALL*. Кол-во и названия строк должны быть одинаковыми
#### Пример *UNION*
```sql
SELECT val1 FROM table1
UNION
SELECT val1 FROM table2
```
### *INTERSECT*
> Возвращает значения, которые выводят оба *SELECT*. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION
### *EXCEPT*
> Возвращает значения, которые выдал первый *SELECT*, но не второй. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION