MySQL 查询语法与关键操作全解析

MySQL全面指南:增删改查、联表查询与权限管理详解

一、MySQL基础操作语法

1.1 数据插入(INSERT)

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);

1.2 数据查询(SELECT)

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条)

1.3 数据更新(UPDATE)

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;

1.4 数据删除(DELETE)

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

二、联表查询深度解析

2.1 连接类型对比表

连接类型 关键字 结果特征 执行效率
内连接 INNER JOIN 仅匹配两表存在关联的行 ★★★★
左外连接 LEFT JOIN 包含左表全部+右表匹配结果 ★★★
右外连接 RIGHT JOIN 包含右表全部+左表匹配结果 ★★★
全外连接 UNION实现 两表所有记录的并集 ★★
交叉连接 CROSS JOIN 笛卡尔积(慎用)

2.2 实际应用示例

场景:电商订单系统

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;

2.3 连接优化技巧

  1. 始终为连接字段建立索引

  2. 优先使用INNER JOIN

  3. 避免多层嵌套连接

  4. 使用EXPLAIN分析执行计划

三、用户权限管理体系

3.1 权限管理操作示例

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.%';

3.2 权限分类速查表

权限类型 作用范围 典型应用场景
SELECT 表/视图 报表生成
INSERT 数据录入
UPDATE 表/字段 信息修改
DELETE 数据清理
CREATE 数据库/表 新环境部署
DROP 数据库/表 系统维护
GRANT OPTION 权限管理 多级管理员体系
EXECUTE 存储过程 业务逻辑封装

四、高级查询技巧

4.1 子查询应用

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;

4.2 窗口函数示例

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;

五、安全与最佳实践

  1. 权限最小化原则:永远不要使用root账户进行常规操作

  2. SQL注入防护:始终使用预处理语句

    php

    复制

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
    $stmt->execute(['username' => $inputUsername]);
  3. 定期备份策略

    bash

    复制

    mysqldump -u root -p --all-databases > full_backup.sql
  4. 性能监控:使用SHOW PROCESSLIST和慢查询日志

  5. 连接池管理:合理配置max_connections参数

你可能感兴趣的:(后端,mysql,数据库)