【MySQL】SQL简述

个人主页:Guiat
归属专栏:MySQL

文章目录

  • [1. SQL基础概念](#1. SQL基础概念)
    • [1.1 SQL的组成部分](#1.1 SQL的组成部分)
    • [1.2 MySQL的特点](#1.2 MySQL的特点)
  • [2. 数据库与表操作](#2. 数据库与表操作)
    • [2.1 数据库操作](#2.1 数据库操作)
    • [2.2 表操作](#2.2 表操作)
  • [3. 数据操作语言(DML)](#3. 数据操作语言(DML))
    • [3.1 插入数据](#3.1 插入数据)
    • [3.2 查询数据](#3.2 查询数据)
    • [3.3 更新数据](#3.3 更新数据)
    • [3.4 删除数据](#3.4 删除数据)
  • [4. 高级查询](#4. 高级查询)
    • [4.1 聚合函数](#4.1 聚合函数)
    • [4.2 JOIN操作](#4.2 JOIN操作)
    • [4.3 子查询](#4.3 子查询)
  • [5. 索引与性能优化](#5. 索引与性能优化)
    • [5.1 索引类型](#5.1 索引类型)
    • [5.2 创建和管理索引](#5.2 创建和管理索引)
    • [5.3 索引性能对比](#5.3 索引性能对比)
    • [5.4 查询优化建议](#5.4 查询优化建议)
  • [6. 事务处理](#6. 事务处理)
    • [6.1 ACID特性](#6.1 ACID特性)
    • [6.2 事务控制](#6.2 事务控制)
    • [6.3 事务隔离级别](#6.3 事务隔离级别)
  • [7. 存储过程和函数](#7. 存储过程和函数)
    • [7.1 创建存储过程](#7.1 创建存储过程)
    • [7.2 创建函数](#7.2 创建函数)
  • [8. 数据库安全](#8. 数据库安全)
    • [8.1 用户管理与权限](#8.1 用户管理与权限)
    • [8.2 SQL注入防范](#8.2 SQL注入防范)
  • [9. 备份与恢复](#9. 备份与恢复)
    • [9.1 数据备份](#9.1 数据备份)
    • [9.2 数据恢复](#9.2 数据恢复)
  • [10. MySQL性能监控与优化](#10. MySQL性能监控与优化)
    • [10.1 性能监控工具](#10.1 性能监控工具)
    • [10.2 性能优化方法](#10.2 性能优化方法)
    • [10.3 监控关键指标](#10.3 监控关键指标)

正文

1. SQL基础概念

SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言。MySQL是一种流行的开源关系型数据库管理系统,它使用SQL作为其主要语言。

1.1 SQL的组成部分

SQL语言主要由以下几个部分组成:

  • DDL(数据定义语言):用于定义数据库结构
  • DML(数据操作语言):用于对数据进行增删改查
  • DCL(数据控制语言):用于权限控制
  • TCL(事务控制语言):用于事务管理

1.2 MySQL的特点

  • 开源免费
  • 性能稳定可靠
  • 支持多种存储引擎
  • 跨平台
  • 支持大型数据库

2. 数据库与表操作

2.1 数据库操作

sql 复制代码
-- 创建数据库
CREATE DATABASE my_database;

-- 使用数据库
USE my_database;

-- 删除数据库
DROP DATABASE my_database;

-- 查看所有数据库
SHOW DATABASES;

2.2 表操作

sql 复制代码
-- 创建表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT,
    department VARCHAR(50),
    salary DECIMAL(10,2)
);

-- 查看表结构
DESC employees;

-- 修改表结构(添加列)
ALTER TABLE employees ADD COLUMN hire_date DATE;

-- 删除表
DROP TABLE employees;

-- 查看所有表
SHOW TABLES;

3. 数据操作语言(DML)

3.1 插入数据

sql 复制代码
-- 插入单行数据
INSERT INTO employees (name, age, department, salary)
VALUES ('张三', 30, '技术部', 10000.00);

-- 插入多行数据
INSERT INTO employees (name, age, department, salary) VALUES
('李四', 25, '市场部', 8000.00),
('王五', 35, '人事部', 12000.00),
('赵六', 28, '技术部', 9500.00);

3.2 查询数据

sql 复制代码
-- 查询所有列
SELECT * FROM employees;

-- 查询特定列
SELECT name, department, salary FROM employees;

-- 条件查询
SELECT * FROM employees WHERE department = '技术部';

-- 排序
SELECT * FROM employees ORDER BY salary DESC;

-- 分页
SELECT * FROM employees LIMIT 10 OFFSET 0;

3.3 更新数据

sql 复制代码
-- 更新单个字段
UPDATE employees SET salary = 11000.00 WHERE name = '张三';

-- 同时更新多个字段
UPDATE employees 
SET salary = salary * 1.1, department = '研发部'
WHERE department = '技术部';

3.4 删除数据

sql 复制代码
-- 删除特定记录
DELETE FROM employees WHERE name = '赵六';

-- 删除所有记录
DELETE FROM employees;
-- 或
TRUNCATE TABLE employees;

4. 高级查询

4.1 聚合函数

sql 复制代码
-- 计数
SELECT COUNT(*) FROM employees;

-- 求和
SELECT SUM(salary) FROM employees;

-- 平均值
SELECT AVG(salary) FROM employees;

-- 最大值和最小值
SELECT MAX(salary), MIN(salary) FROM employees;

-- 分组统计
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department;

4.2 JOIN操作

假设我们有departments表:

sql 复制代码
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50),
    location VARCHAR(100)
);

INSERT INTO departments VALUES
(1, '技术部', 'A栋5楼'),
(2, '市场部', 'B栋3楼'),
(3, '人事部', 'A栋2楼');

-- 添加外键
ALTER TABLE employees ADD dept_id INT;
ALTER TABLE employees ADD FOREIGN KEY (dept_id) REFERENCES departments(dept_id);

-- 更新员工表中的部门ID
UPDATE employees SET dept_id = 1 WHERE department = '技术部';
UPDATE employees SET dept_id = 2 WHERE department = '市场部';
UPDATE employees SET dept_id = 3 WHERE department = '人事部';

JOIN查询:

sql 复制代码
-- 内连接
SELECT e.name, e.salary, d.dept_name, d.location
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;

-- 左连接
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;

-- 右连接
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;

4.3 子查询

sql 复制代码
-- 子查询作为条件
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- 子查询作为临时表
SELECT dept_name, emp_count
FROM (
    SELECT d.dept_name, COUNT(*) as emp_count
    FROM employees e
    JOIN departments d ON e.dept_id = d.dept_id
    GROUP BY d.dept_name
) AS dept_stats
WHERE emp_count > 2;

5. 索引与性能优化

5.1 索引类型

  • 主键索引:表中的主键自动创建索引
  • 唯一索引:确保索引列中的值是唯一的
  • 普通索引:加速查询
  • 全文索引:用于全文搜索
  • 复合索引:多列索引

5.2 创建和管理索引

sql 复制代码
-- 创建普通索引
CREATE INDEX idx_name ON employees(name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON employees(email);

-- 创建复合索引
CREATE INDEX idx_dept_salary ON employees(department, salary);

-- 删除索引
DROP INDEX idx_name ON employees;

-- 查看表的索引
SHOW INDEX FROM employees;

5.3 索引性能对比

下面的Mermaid图表展示了有索引和无索引的查询性能差异:
是 否 查询请求 有索引? 索引查找 全表扫描 快速返回结果 慢速返回结果

5.4 查询优化建议

  1. 尽量避免在WHERE子句中使用函数或运算符
  2. 使用覆盖索引减少回表操作
  3. 合理使用EXPLAIN分析查询计划
  4. 避免SELECT *,只查询需要的列
  5. 合理设计表结构和选择数据类型

6. 事务处理

6.1 ACID特性

  • 原子性(Atomicity):事务是不可分割的单位
  • 一致性(Consistency):事务前后数据库的完整性约束不被破坏
  • 隔离性(Isolation):一个事务的执行不被另一个事务干扰
  • 持久性(Durability):事务一旦提交,其结果永久保存

6.2 事务控制

sql 复制代码
-- 开始事务
START TRANSACTION;

-- 执行操作
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;

-- 提交事务
COMMIT;

-- 或回滚事务
-- ROLLBACK;

6.3 事务隔离级别

MySQL支持的四种事务隔离级别:
问题 问题 问题 解决 问题 问题 解决 解决 问题 解决 解决 解决 事务隔离级别 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 脏读 不可重复读 幻读

7. 存储过程和函数

7.1 创建存储过程

sql 复制代码
DELIMITER //
CREATE PROCEDURE get_employee_by_dept(IN dept_name VARCHAR(50))
BEGIN
    SELECT * FROM employees e
    JOIN departments d ON e.dept_id = d.dept_id
    WHERE d.dept_name = dept_name;
END //
DELIMITER ;

-- 调用存储过程
CALL get_employee_by_dept('技术部');

7.2 创建函数

sql 复制代码
DELIMITER //
CREATE FUNCTION calculate_bonus(salary DECIMAL(10,2), rating INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    DECLARE bonus DECIMAL(10,2);
    IF rating = 5 THEN
        SET bonus = salary * 0.2;
    ELSEIF rating = 4 THEN
        SET bonus = salary * 0.15;
    ELSE
        SET bonus = salary * 0.1;
    END IF;
    RETURN bonus;
END //
DELIMITER ;

-- 使用函数
SELECT name, salary, calculate_bonus(salary, 5) AS bonus
FROM employees;

8. 数据库安全

8.1 用户管理与权限

sql 复制代码
-- 创建用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';

-- 授予权限
GRANT SELECT, INSERT, UPDATE ON my_database.* TO 'app_user'@'localhost';

-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'localhost';

-- 收回权限
REVOKE UPDATE ON my_database.* FROM 'app_user'@'localhost';

-- 删除用户
DROP USER 'app_user'@'localhost';

8.2 SQL注入防范

不安全的代码示例:

php 复制代码
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$username'";

安全的代码示例:

php 复制代码
$username = $mysqli->real_escape_string($_POST['username']);
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

9. 备份与恢复

9.1 数据备份

bash 复制代码
# 使用mysqldump进行备份
mysqldump -u root -p my_database > backup.sql

# 备份特定表
mysqldump -u root -p my_database employees departments > backup_tables.sql

# 仅备份结构
mysqldump -u root -p --no-data my_database > schema_backup.sql

9.2 数据恢复

bash 复制代码
# 恢复数据库
mysql -u root -p my_database < backup.sql

# 在MySQL客户端中恢复
mysql> source backup.sql

10. MySQL性能监控与优化

10.1 性能监控工具

  • SHOW PROCESSLIST:显示当前运行的查询
  • SHOW STATUS:显示系统状态变量
  • PERFORMANCE_SCHEMA:提供服务器内部执行情况
  • 慢查询日志:记录执行时间超过阈值的查询

10.2 性能优化方法

下图显示了MySQL性能优化的几个关键领域:
MySQL优化 服务器优化 内存配置 缓冲区大小 并发连接数 查询优化 索引设计 查询重写 避免子查询 表设计优化 范式化 分区表 垂直/水平拆分 硬件优化 SSD存储 足够内存 多核CPU

10.3 监控关键指标

sql 复制代码
-- 查看数据库连接数
SHOW STATUS LIKE 'Connections';

-- 查看缓冲区使用情况
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

-- 查看查询缓存命中率
SHOW STATUS LIKE 'Qcache%';

结语

感谢您的阅读!期待您的一键三连!欢迎指正!

相关推荐
程序员云帆哥8 分钟前
MySQL JDBC Driver URL参数配置规范
数据库·mysql·jdbc
TDengine (老段)26 分钟前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
大气层煮月亮1 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang1 小时前
达梦数据库的命名空间
数据库·oracle
三三木木七2 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔2 小时前
sql数据库语法
数据库·sql
唐古乌梁海2 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强2 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL2 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王2 小时前
NoSQL介绍
数据库·nosql