sql
复制
-- 插入单条完整记录(需包含所有字段) INSERT INTO users VALUES (1, 'admin', '[email protected]', '2023-01-01'); -- 指定字段插入(推荐方式) INSERT INTO users (username, email, created_at) VALUES ('john', '[email protected]', NOW()); -- 批量插入多条记录 INSERT INTO products (name, price) VALUES ('Laptop', 999.99), ('Mouse', 19.99), ('Keyboard', 49.99);
sql
复制
-- 基础查询(带条件过滤) SELECT * FROM orders WHERE order_date >= '2023-01-01' AND total_amount > 100; -- 字段别名与计算 SELECT product_name AS name, unit_price * quantity AS total_price FROM order_items; -- 排序与分页 SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 20; -- 获取第3页数据(每页10条)
sql
复制
-- 单字段更新 UPDATE customers SET last_login = NOW() WHERE customer_id = 1001; -- 多字段条件更新 UPDATE products SET price = price * 0.9, -- 打九折 stock = stock - 1 WHERE category = 'Electronics' AND stock > 0; -- 使用子查询更新 UPDATE orders o JOIN ( SELECT customer_id FROM customers WHERE vip_level > 3 ) vip ON o.customer_id = vip.customer_id SET o.priority = 1;
sql
复制
-- 条件删除 DELETE FROM log WHERE created_at < '2020-01-01'; -- 关联删除(删除用户及其订单) DELETE users, orders FROM users JOIN orders ON users.user_id = orders.user_id WHERE users.status = 'inactive'; -- 清空表的不同方式 TRUNCATE TABLE audit_log; -- 快速清空并重置自增ID
连接类型 | 关键字 | 结果特征 | 执行效率 |
---|---|---|---|
内连接 | INNER JOIN | 仅匹配两表存在关联的行 | ★★★★ |
左外连接 | LEFT JOIN | 包含左表全部+右表匹配结果 | ★★★ |
右外连接 | RIGHT JOIN | 包含右表全部+左表匹配结果 | ★★★ |
全外连接 | UNION实现 | 两表所有记录的并集 | ★★ |
交叉连接 | CROSS JOIN | 笛卡尔积(慎用) | ★ |
sql
复制
-- 内连接:获取有效订单详情 SELECT o.order_id, u.username, o.total_amount FROM orders o INNER JOIN users u ON o.user_id = u.user_id WHERE o.status = 'paid'; -- 左连接:包含未下单用户 SELECT u.user_id, COUNT(o.order_id) AS order_count FROM users u LEFT JOIN orders o ON u.user_id = o.user_id GROUP BY u.user_id; -- 三表连接:订单-商品-供应商 SELECT o.order_id, p.product_name, s.supplier_name FROM order_items oi JOIN products p ON oi.product_id = p.product_id JOIN suppliers s ON p.supplier_id = s.supplier_id;
始终为连接字段建立索引
优先使用INNER JOIN
避免多层嵌套连接
使用EXPLAIN分析执行计划
sql
复制
-- 创建只读用户 CREATE USER 'report_user'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!'; -- 授予特定数据库的查询权限 GRANT SELECT ON sales_db.* TO 'report_user'@'192.168.1.%'; -- 创建管理员用户(带权限传递) GRANT ALL PRIVILEGES ON inventory.* TO 'admin'@'localhost' WITH GRANT OPTION; -- 撤销删除权限 REVOKE DELETE ON customer_data.* FROM 'support_staff'@'%'; -- 查看用户权限 SHOW GRANTS FOR 'report_user'@'192.168.1.%';
权限类型 | 作用范围 | 典型应用场景 |
---|---|---|
SELECT | 表/视图 | 报表生成 |
INSERT | 表 | 数据录入 |
UPDATE | 表/字段 | 信息修改 |
DELETE | 表 | 数据清理 |
CREATE | 数据库/表 | 新环境部署 |
DROP | 数据库/表 | 系统维护 |
GRANT OPTION | 权限管理 | 多级管理员体系 |
EXECUTE | 存储过程 | 业务逻辑封装 |
sql
复制
-- 标量子查询(在SELECT中) SELECT product_name, (SELECT AVG(price) FROM products) AS avg_price FROM products; -- EXISTS检查 SELECT customer_id FROM customers c WHERE EXISTS ( SELECT 1 FROM orders WHERE customer_id = c.customer_id AND total_amount > 1000 ); -- 派生表应用 SELECT dept_name, AVG(salary) AS avg_salary FROM ( SELECT d.name AS dept_name, e.salary FROM employees e JOIN departments d ON e.dept_id = d.id ) dept_salaries GROUP BY dept_name;
sql
复制
-- 部门薪资排名 SELECT employee_name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank FROM employees; -- 滚动销售额统计 SELECT order_date, daily_sales, SUM(daily_sales) OVER (ORDER BY order_date ROWS 6 PRECEDING) AS 7day_avg FROM ( SELECT DATE(order_time) AS order_date, SUM(amount) AS daily_sales FROM orders GROUP BY DATE(order_time) ) daily_summary;
权限最小化原则:永远不要使用root账户进行常规操作
SQL注入防护:始终使用预处理语句
php
复制
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $inputUsername]);
定期备份策略
bash
复制
mysqldump -u root -p --all-databases > full_backup.sql
性能监控:使用SHOW PROCESSLIST和慢查询日志
连接池管理:合理配置max_connections参数