SQL


SQL — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). Используется в MySQL, PostgreSQL и так далее.


Шпаргалка по командам и запросам SQL для MySQL/MariaDB


Типы

TINYINT Может хранить числа от -128 до 127

SMALLINT Диапазон от -32 768 до 32 767

MEDIUMINT Диапазон от -8 388 608 до 8 388 607

INT Диапазон от -2 147 483 648 до 2 147 483 647

BIGINT Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

FLOAT от –3.402823466E+38 до –1.175494351E-38, 0 и 1.175494351E-38 до 3.402823466E+38

DOUBLE, DOUBLE PRECISION, REAL от -1.7976931348623157E+308 до -2.2250738585072014E-308, 0 и 2.2250738585072014E-308 до 1.7976931348623157E+308

DATE в диапазоне от «1000-01-01» до «9999-12-31»

DATETIME Дата и время Допустимые диапазоны от «1000-01-01 00:00:00» до «9999-12-31 23:59:59». MySQL хранит поле типа DATETIME в виде «YYYY-MM-DD HH:MM:SS» (ГГГГ-ММ-ДД ЧЧ-ММ-СС).

TIMESTAMP Дата и время Диапазон от «1970-01-01 00:00:00» до, примерно, 2037 года. поле типа TIMESTAMP в видах «YYYYMMDDHHMMSS» (TIMESTAMP(14)), «YYMMDDHHMMSS» (TIMESTAMP(12)), «YYYYMMDD» (TIMESTAMP(8))

TIME Диапазон от «-838:59:59» до «838:59:59». MySQL хранит поле TIME в виде «HH:MM:SS», но позволяет присваивать значения столбцам TIME с использованием либо строки или числа.

YEAR Если вы используете 4 цифра, то допустимые значения 1901-2155, и 0000. Если 2 цифры, то 1970-2069 (70-69). MySQL хранит значения поля YEAR в формате «YYYY».

VARCHAR Строка переменной длины. от 1 до 255 символов.

TINYTEXT с максимальной длиной 255 (28 - 1) символов.

ТЕХТ с максимальной длиной 65535 (216 - 1) символов.

MEDIUMTEXT с максимальной длиной 16777215 (224 - 1) символов.

LONGTEXT с максимальной длиной 4294967295 (232 - 1) символов.


Общие команды

Список таблиц

show tables;

Создаём таблицу
1
2
3
4
5
6
7
8
9
CREATE TABLE `accounts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type_acc` int(11) NOT NULL DEFAULT '0',
  `parent_id` int(11) NOT NULL,
  `name_acc` tinytext NOT NULL,
  `description_acc` tinytext,
  `requisites_acc` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

NOT NULL - не может быть пустым

AUTO_INCREMENT - автоматическое добавление следующего значения

DEFAULT - значение добавится, если не указано явно

Посмотреть описание таблицы

DESC accounts;

или

SHOW COLUMNS FROM accounts;

Удаление таблицы

DROP TABLE accounts;

Команда, которая создала таблицу

SHOW CREATE TABLE accounts; (выдаст коменду из пункта “Создаём таблицу”)


Работаем с пользователями

Создание пользователя с нужным паролем:

CREATE USER UserName IDENTIFIED BY “password”;

Даём право выбирать данные из таблицы:

GRANT SELECT ON TableName TO UserName;

Аналогично, разрешаем что-то добавлять, но не обновлять:

GRANT INSERT ON TableName TO UserName;

Разрешаем всё в определённой таблице:

GRANT ALL ON TableName TO UserName;

Разрешаем всё на все базы (первая звёздочка) и таблицы (вторая)

GRANT ALL ON TableName TO UserName;

ЗАБИРАЕМ! право выбирать данные из таблицы:

REVOKE SELECT ON . TO UserName;


Создаём роли (не работает в MySQL, не поддерживает!):

CREATE ROLE GroupName;

Разрешаем всё в определённой таблице для группы:

GRANT ALL ON TableName TO GroupName;

Удаление роли

DROP ROLE GroupName;


Читаем данные из таблицы, SELECT-запросы

SELECT * FROM accounts; (получаем все значения из таблицы accounts)

SELECT * FROM accounts WHERE name_acc = ‘значение’; (получаем всё, что содержит значение, при числах апострофы не нужны (WHERE id = 5))

SELECT id FROM accounts WHERE name_acc = ‘значение’; (получаем только id, результат будет быстрее)

SELECT name_acc FROM accounts WHERE name_acc = ‘значение’ AND id = ‘значение 2’; (результат по 2 проверкам)

SELECT name_acc FROM accounts WHERE name_acc = ‘значение’ AND id > ‘значение 2’; (вторая проверка выбирает значения больше указанного, можно > < => <=)

SELECT name_acc FROM accounts WHERE id BETWEEN 2 AND 10; (ищем значение между 2 и 10 (включительно!))

SELECT name_acc FROM accounts WHERE NOT id BETWEEN 2 AND 10; (NOT обязательно после WHERE, ищем всё, кроме указанного диапазона)

SELECT name_acc FROM accounts WHERE name_acc = ‘значение’ OR id = ‘значение 2’; (тут ИЛИ)

SELECT name_acc FROM accounts WHERE name_acc IN(‘значение1’,‘значение2’,‘значение3’); (один вариант вместо кучи OR)

SELECT name_acc FROM accounts WHERE name_acc NOT IN(‘значение1’,‘значение2’,‘значение3’); (обратное предыдущему варианту, не выбираем указанное)

SELECT name_acc FROM accounts WHERE parent_id IS NULL; (ищем что незаполнено в столбце parent_id)

SELECT name_acc FROM accounts WHERE name_acc LIKE ‘%ие’; (ищем похожее, % - любое количество символов)

SELECT name_acc FROM accounts WHERE NOT name_acc LIKE ‘%ие’; (NOT обязательно после WHERE, ищем не содержащее указанное значение)

SELECT name_acc FROM accounts ORDER BY name_acc; (выборка с сортировкой по алфавиту по полю name_acc)

SELECT name_acc FROM accounts ORDER BY name_acc DESC; (выборка с сортировкой по алфавиту В ОБРАТНОМ ПОРЯДКЕ по полю name_acc)

SELECT SUM(debet) FROM operations WHERE account = 8; (суммируем данные по столбцу debet для account 8)

SELECT account, SUM(debet) FROM operations GROUP BY account ORDER BY SUM(debet); (суммы, группируя по account, например, суммируя платы по компаниям)

SELECT account, AVG(debet) FROM operations GROUP BY account; (получаем среднее значение, группируя по полю account)

SELECT account, MAX(debet) FROM operations GROUP BY account; (получаем максимальное значение, группируя по полю account)

SELECT account, MIN(debet) FROM operations GROUP BY account; (получаем минимальное значение, группируя по полю account)

SELECT COUNT(debet) FROM operations; (получаем количество записей в столбце debet)

SELECT * FROM operations LIMIT 2; (получаем только 2 строки)

SELECT * FROM operations LIMIT 1,2; (получаем строки со второй (отсчёт с 0, поэтому стоит 1) и 2 строки всего)

SELECT type_acc from accounts WHERE id=5 UNION SELECT date_oper from operations WHERE account=8;

(UNION объединяет запросы)

Преобразование типов, CAST

SELECT CAST(“2017-02-23” AD DATE) - строка в дату

Числовые функции

MOD(x,y) остаток деления

RAND() случайное число

ROUND(x) округляет до целого

ROUND(x,y) округляет до дробной части y. Например ROUND(5.2346345723, 2) вернёт 5.23

SIGN(x) возвращает 1, если число положительное, -1 если отрицательное


Удаление записей, DELETE-запросы

DELETE FROM accounts; (удаляет все записи из таблицы)

DELETE FROM accounts WHERE name_acc = ‘значение’; (удаляем строку по значению, если их несколько - удаляются все)

DELETE FROM accounts WHERE name_acc = ‘значение’ AND id = ‘значение 2’; (результат по 2 проверкам, удаляем по совпадению с двумя значениями)

DELETE FROM accounts WHERE name_acc = ‘значение’ OR id = ‘значение 2’; (удаляем строки или по первому совпадению или по второму)


Вставить записи, INSERT-запросы

Эти запросы не заменяют данные, а добавляют!

INSERT INTO accounts (ст1, ст2) VALUES (‘значение 1’, 15); (для чисел кавычки не нужны)


Обновить записи, UPDATE-запросы

UPDATE accounts SET name_acc = ‘Новое значение’ WHERE id = 7; (обновляем name_acc на строке с id = 7)

Так же как и в SELECT, можно использовать AND , OR и т.д.

Изменение таблицы, ALTER-запросы

ALTER TABLE accounts ADD test INT NOT NULL AFTER account; (добавил поле test после поля account)

ALTER TABLE accounts DROP test; (удалил поле test)

Для ALTER так же доступны CHANGE и MODIFY

Транзакции

Обеспечивают:

  • Атомарность (или все операции выполнены или не выполнена ни одна)

  • Целостность

  • Изолированность (пока одна транзакция не пройдёт, вторая не тронется)

  • Устойчивость (сохранение изменённых данных)

Транзакции доступны на InnoDB и BDB. Если у таблицы другой движок, сменить можно так:

ALTER TABLE account TYPE = InnoDB;

Как это работает

START TRANSACTION;

SELECT …

UPDATE …

INSERT …

и тут:

ROLLBACK; (эта команда отменит изменения)

или

COMMIT; (Закрепить, согласится с изменениями)

Не забыть закрыть транзакцию, иначе журнал будет расти до бесконечности. :)

Временные таблицы

Существует до завершения сеанса пользователя. Создать:

CREATE TEMPORARY TABLE temp_accounts;

Временная таблица из результата запроса:

CREATE TEMPORARY TABLE temp_accounts AS SELECT * FROM accounts;

Графические программы для работы с БД MySQL/MariaDB

MySQL workbench