—РАБОТА С БАЗОЙ ДАННЫХ MYSQL

———Добавление строки————

ALTER TABLE  `progect_info` ADD  `times` INT( 4 ) NOT NULL ;

———CREATE———

CREATE DATABASE `my_db` CHARACTER SET utf8 COLLATE utf8_general_ci;

———-DROP———-

DROP TABLE IF EXISTS `dumawp_nf3_action_meta`;

———-CREATE———-

CREATE TABLE `dumawp_nf3_action_meta` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `key` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `value` longtext COLLATE utf8mb4_unicode_ci,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

———-INSERT———-

INSERT INTO `dumawp_nf3_action_meta` (`id`, `parent_id`, `key`, `value`) VALUES (1, 1, 'label', 'Store Submission');

———-SELECT————

SELECT * FROM table WHERE id IS NOT NULL;
SELECT * FROM table WHERE id IS NULL;
SELECT name FROM table WHERE id = 1;
SELECT surname, name FROM table WHERE id > 1;

———-DISTINCT (группировка одинаковых значений)————

SELECT DISTINCT surname, name FROM table WHERE id > 1;

———-ORDER BY (сортировка)————

SELECT name FROM table ORDER BY id ASC;
SELECT name FROM table ORDER BY id DESC;
SELECT name FROM table WHERE id < 100 ORDER BY id DESC;

———-LIMIT (ограничение количества выдачи)————

SELECT * FROM table LIMIT 2; //первые две записи
SELECT * FROM table WHERE id > 10 LIMIT 2; //первые две записи после условия

———-DELETE————

DELETE FROM table WHERE id = 5;

———-UPDATE————

UPDATE table SET name = "Наталья Ивановна" WHERE id IN ( 3, 5);
UPDATE table SET name = REPLASE(name, 'old name', 'new name');
UPDATE table SET name = REPLASE(name, 'old name', 'new name') WHERE surname = 'home' OR family = 'new-family';

———ВНЕШНИЙ КЛЮЧ——-
— связывает таблицы

——-СОСТАВНОЙ ПЕРВИЧНЫЙ КЛЮЧ———
— состоит из 2-х и более первичных ключей

——-ТИП ДАННЫХ ДЛЯ ДЕНЕГ——

DECIMAL(10,2)

тип данных для денежных единиц. 10 — максимальная длина строки, 2 — числел после запятой

———FOREIGN KEY———

ALTER TABLE `shop`.`product` 
ADD CONSTRAINT `fk_brand_product` 
FOREIGN KEY (`brand_id`) 
REFERENCES `shop`.`brand` (`id`)
ON DELETE NO ACTION (NO ACTION - не удалять если есть связи, CASCADE - удалять связанные строки при удалении главной)
ON UPDATE NO ACTION;
-- если есть строки противоречащие правилу, запрос не будет произведен.

———INNER JOIN———
———объединение (в которое обязаны попасть строки из двух таблиц которые соответствуют запросам совпадений)———

SELECT * FROM product INNER JOIN category ON product.category_id = category.id;
SELECT name, price FROM product INNER JOIN category ON product.category_id = category.id;
-- (в выводе не должно быть названия которое находится в двух таблицах, либо уточнять таблицу. например product.id)
SELECT name, price FROM product INNER JOIN category ON product.category_id = category.id WHERE price < 10000;
SELECT product.id, brand.name, product.price FROM product 
	INNER JOIN category ON product.category_id = category.id 
	INNER JOIN brand ON product.brand_id = brand.id 
	INNER JOIN product_type ON product.product_type_id = product_type.id ;
SELECT product.id, brand.name as brand_name, product_type.name as product_type, category.name as category_name, product.price FROM product 
	INNER JOIN category ON product.category_id = category.id 
	INNER JOIN brand ON product.brand_id = brand.id 
	INNER JOIN product_type ON product.product_type_id = product_type.id ;
-- с помощью as мы присваиваем новое имя для вывода значений (для удобства) brand,name as brand_name

———LEFT JOIN———
———объединение (в которое обязана попасть все строки первой/левой таблицы)———

SELECT category.* FROM category
	LEFT JOIN product ON product.category_id = category.id
	WHERE product.id is null;
- -выводим все категории которые не привязаны к продуктам

———RIGHT JOIN———
———объединение (в которое обязана попасть все строки второй/правой таблицы)———

SELECT category.* FROM category
	RIGHT JOIN product ON product.category_id = category.id;

——FULL OUTER JOIN——НЕТ В MYSQL!!!——
———объединение (в которое обязана попасть все строки первой и второй таблицы)———

———-UNION———
—склейка запросов——

SELECT * FROM `order`
	LEFT JOIN order_products ON order_products.order_id = `order`.id
	LEFT JOIN product ON order_products.product_id = product.id

UNION

SELECT * FROM `order`
	INNER JOIN order_products ON order_products.order_id = `order`.id
	RIGHT JOIN products ON order_products.product_id = product.id
	WHERE `order`.id is null;

——Агрегирующие функции——
—внутренние функции MySQL—

SELECT count(*) FROM products; - количество ответов (строк)
SELECT sum(price) FROM products; - суммирует все результаты ячейки price в выдаче
SELECT max(price) FROM products; - максимальное значение ячейки price в выдаче
SELECT min(price) FROM products; - минимальное значение ячейки price в выдаче
SELECT sum(price), max(price), max(price) FROM products; - все вместе ^
SELECT sum(price) as total_price, max(price) as max_price, max(price) as min_price FROM products; - все вместе ^
-- для удобного вывода присвоим новые имена

———GROUP BY——-
—группирование по значению в яцейке

SELECT `order`.user_name, max(price), sum(`count`) FROM `order`
	INNER JOIN order_products ON order_products.order_id = `order`.id
	INNER JOIN product ON product.id = order_products.product_id
	GROUP BY `order`.user_name;

——LIKE——
—вхождения

SELECT `order`.user_name, max(price), sum(`count`) FROM `order`
	INNER JOIN order_products ON order_products.order_id = `order`.id
	INNER JOIN product ON product.id = order_products.product_id
	WHERE user_name LIKE 'в%'
	GROUP BY `order`.user_name;
-- ячейка user_name со словом начинающимся на букву "в". % - означает любые символы

——-HAVING——-
—для оперирования агрегирующими функциями

SELECT `order`.user_name, max(price), sum(`count`) FROM `order`
	INNER JOIN order_products ON order_products.order_id = `order`.id
	INNER JOIN product ON product.id = order_products.product_id
	GROUP BY `order`.user_name
	HAVING sum(`count`) >= 5;

 

——УСКОРЕНИЕ РАБОТЫ БД——-
— маленькие базы лучше не оптимизировать
— база данных сохраняет значение выдачи для повторной быстрой выдаче
— ячейке по которой производится поиск добавляем INDEX

 

——ТРАНЗАКЦИИ——
— гарантированное выполнение группы команд
ACID
AtomicityАтомарность (выполняются все либо не одной задачи)
ConsistencyСогласованность (данные в базе остаются в согласованном состоянии (например сумарное значение денег при переводу сохраняется))
IsolationИзолированность (если транзакция начилась, ей ничего не помешает)
DurabilityДолговечность (сбой системы не изменит транзакции)

START TRANSACTION;
	UPDATE `shop`.`user_bank_account` SET money = money - 100 WHERE id = 1;
	UPDATE `shop`.`user_bank_account` SET money = money + 100 WHERE id = 2;
COMMIT