~={yellow}Свойство:=~
- Один пишет, многие читают.
https://sqlitestudio.pl/
https://sqlitebrowser.org

~={yellow}Типы:=~
- NULL - значение NULL
- INTEGER - целочисленный тип (занимает от 1 до 8 байт)
- REAL - вещественный тип (8 байт в формате IEEE)
- TEXT - строковый тип (в кодировке данных базы, обычно UTF-8)
- BLOB (двоичные данные, хранятся "как есть", например, для небольших изображений)

~={yellow}Команды=~
- INSERT - добавление записи в таблицу
- SELECT - выборка данных из таблиц (в том числе и при создании свободной выборки из нескольких таблиц)
```sql
INSERT INTO <table_name> (<column_name1>,<column_name2>, ...) VALUES (<value1>, <value2>, ...) 

INSERT INTO <table_name> VALUES (<value1>, <value2>, ...)


SELECT col1, col2, ... FROM <table_name>
SELECT name, old, score FROM users
SELECT * FROM users

# По критерию
SELECT col1, col2, ... FROM <table_name> WHERE <условие>
```

~={yellow}Операторы=~
```sql
= или ==, >, <, >=, <=, !=, BETWEEN

SELECT * FROM users WHERE score BETWEEN 500 AND 1000

SELECT * FROM users WHERE score == 200
```

~={yellow}Условия=~
```sql
AND - условное И
OR условное ИЛИ
NOT - условное НЕ
IN - вхождение во множество значений
NOT IN - не вхождение во множество значений

SELECT * FROM users WHERE old > 20 AND score < 1000

SELECT * FROM users WHERE old IN(19, 32) AND score < 1000

SELECT * FROM users WHERE old IN(19, 32) AND score <= 1000 OR sex = 1 ORDER BY old DESC


```
~={yellow}Сортировка и ограничения (это все в SELECT)=~
```sql
# Если указать после запроса, то будет сортировка по убыванию
ORDER BY old DESC 

# Если указать после запроса, то будет сортировка по возрастанию
ORDER BY old ASC

# Вывести только N записей
LIMIT 2

# Вывести только 2 записи, но пропустить первые 5
LIMIT 2 OFFSET 5

# Тоже самое
LIMIT 5, 2
```
~={yellow}UPDATE=~
```sql
UPDATE имя_табицы SET имя столбца = новое_значение WHERE условие

UPDATE users SET score = 10000 WHERE roid = 1

UPDATE users SET score = score+500 WHERE sex = 2

UPDATE users SET score = score+500 WHERE name LIKE 'Федор'
```
В поле ~={yellow}LIKE=~ можно использовать:
- % - любое продолжение строки
- _ - любой символ
```sql
# Добавит 1500 очков всем игрокам, чье имя начинается с буквы 'M'
UPDATE users SET score = score+1500 WHERE name LIKE 'M%'

# Изменение значений нескольких полей
UPDATE users SET score = 800, old = 45 WHERE old > 40
```
~={yellow}DELETE=~
```sql
DELETE FROM users WHERE rowid IN(2, 5)
```
---
~={yellow}Агрегирование и группировка записей=~
```sql
# Получить число записей пользователя с user_id = 1
SELECT count(user_id) FROM games WHERE user_id = 1 

# Алиас
SELECT count(user_id) as count FROM games WHERE user_id = 1
```
 - count() - подсчет числа записей
 - sum() -  подсчет суммы указанного поля по всем записям выборки
 - avr() - вычисление среднего арифметического указанного поля
 - min() - нахождение минимального значения для указанного поля
 - max() - нахождение максимального значения для указанного поля
 
```sql
# Подсчет количества уникальных игроков
SELECT count(DISTINCT user_id) as count FROM games

# Получение ID уникальных игроков
SELECT DISTINCT user_id as count FROM games

# Сумма очков для игрока с user_id = 1
SELECT sum(score) as scores FROM games WHERE user_id = 1
```

```sql
# Подсчитать сумму овков для игроков по user_id. Учитывать только те поля где количество очков больше 100. И вывести определенного число записей (поле LIMIT)
SELECT user_id, sum(score) as sum
FROM games
WHERE score > 100
GROUP BY user_id # выполнить группировку по user_id 
ORDER BY sum DESC # отсортировать (по убыванию) по сумме очков
LIMIT 2 # вывести только 2 записи
```

JOIN - создание сводных отчетов
```sql
SELECT name, sex, games.score FROM games
JOIN users ON games.user_id = users.rowid

# Вариант без JOIN но будет другой результат!
SELECT name, sex, games.score FROM users, games
```

```sql
SELECT user_id, sum(score) as sum
FROM games
JOIN users ON games.user_id = users.rowid
GROUP BY user_id
ORDER BY sum DESC
```