Загрузка…
Загрузка…
Да, за каждую новую сессию.
View — это сохраненный запрос SELECT — виртуальная таблица. Он не хранит данные (если только это не материализованное представление), но предоставляет согласованный интерфейс.
-- Simple view
CREATE VIEW active_customers AS
SELECT id, name, email FROM customers WHERE status = 'active';
-- Complex view with joins
CREATE VIEW order_summary AS
SELECT
o.id AS order_id,
c.name AS customer_name,
SUM(oi.quantity * oi.price) AS total
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON o.id = oi.order_id
GROUP BY o.id, c.name;
-- Query it like a table
SELECT * FROM order_summary WHERE total > 1000;Обновляемые представления (можно использовать INSERT/UPDATE/DELETE):
-- Materialized view (PostgreSQL) — stores actual data, needs refresh
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT DATE_TRUNC('month', order_date) AS month, SUM(total)
FROM orders GROUP BY 1;
REFRESH MATERIALIZED VIEW monthly_sales;-- MySQL Stored Procedure
DELIMITER //
CREATE PROCEDURE TransferMoney(
IN from_account INT,
IN to_account INT,
IN amount DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
UPDATE accounts SET balance = balance - amount WHERE id = from_account;
UPDATE accounts SET balance = balance + amount WHERE id = to_account;
COMMIT;
END //
DELIMITER ;
-- Call it
CALL TransferMoney(1, 2, 100.00);| Хранимая процедура | Функция | |
|---|---|---|
| Возврат | Может возвращать несколько наборов результатов | Должно возвращать ровно одно значение |
| Позвонил с |
CALL proc_name()
| Используется в выражениях:
SELECT func()
| | Побочные эффекты | Да (можно изменять данные) | Обычно нет (детерминированный) | | Сделки | Может управлять транзакциями | Невозможно (в большинстве БД) |
Триггеры автоматически выполняются при возникновении события. Полезно для аудита, но используйте экономно — они скрывают логику.
-- Audit trigger: log all salary changes
CREATE TRIGGER trg_salary_audit
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary <> NEW.salary THEN
INSERT INTO salary_audit (emp_id, old_salary, new_salary, changed_at)
VALUES (NEW.id, OLD.salary, NEW.salary, NOW());
END IF;
END;
-- Trigger types:
-- BEFORE INSERT/UPDATE/DELETE → Validate/modify data before it hits the table
-- AFTER INSERT/UPDATE/DELETE → Log, cascade, notify
-- INSTEAD OF (views only) → Redirect operationsКурсоры повторяются строка за строкой. Они медленные — избегайте их, если операции на основе множеств работают.
-- MySQL cursor example
DELIMITER //
CREATE PROCEDURE ProcessEmployees()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE emp_name VARCHAR(100);
DECLARE emp_salary DECIMAL(10,2);
DECLARE emp_cursor CURSOR FOR
SELECT name, salary FROM employees WHERE department = 'Sales';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN emp_cursor;
read_loop: LOOP
FETCH emp_cursor INTO emp_name, emp_salary;
IF done THEN LEAVE read_loop; END IF;
-- Process each row here
END LOOP;
CLOSE emp_cursor;
END //
DELIMITER ;Ключевой вывод для интервью: включена ли автофиксация по умолчанию в MySQL?
