[数据库] MySQL数据库从入门到实战:核心概念与代码示例详解

434 0
Honkers 2026-6-11 22:38:40 来自手机 | 显示全部楼层 |阅读模式

1. MySQL简介与安装配置

什么是MySQL?

MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle公司。它使用结构化查询语言(SQL)进行数据库管理,具有以下特点:

  • 开源免费:社区版完全免费
  • 高性能:支持高并发访问
  • 可扩展性:支持集群和分布式部署
  • 跨平台:支持Windows、Linux、macOS等操作系统
  • 安全性高:提供完善的权限管理和数据加密

安装MySQL(以Ubuntu为例)

  1. # 更新包列表
  2. sudo apt update
  3. # 安装MySQL服务器
  4. sudo apt install mysql-server
  5. # 启动MySQL服务
  6. sudo systemctl start mysql
  7. # 设置开机自启
  8. sudo systemctl enable mysql
  9. # 运行安全配置脚本
  10. sudo mysql_secure_installation
复制代码

连接MySQL

  1. # 命令行连接
  2. mysql -u root -p
  3. # 使用指定主机和端口连接
  4. mysql -h localhost -P 3306 -u root -p
复制代码

2. 数据库基本操作

创建数据库

  1. -- 创建数据库
  2. CREATE DATABASE IF NOT EXISTS school_db;
  3. -- 查看所有数据库
  4. SHOW DATABASES;
  5. -- 使用数据库
  6. USE school_db;
  7. -- 删除数据库(谨慎操作)
  8. -- DROP DATABASE school_db;
复制代码

数据类型介绍

MySQL支持多种数据类型:

类型分类常用类型说明
数值类型INT, DECIMAL, FLOAT整数、小数
字符串类型VARCHAR, CHAR, TEXT变长、定长字符串
日期时间DATE, TIME, DATETIME日期和时间
二进制类型BLOB存储二进制数据

3. 数据表操作

创建学生表

  1. CREATE TABLE students (
  2. id INT PRIMARY KEY AUTO_INCREMENT,
  3. name VARCHAR(50) NOT NULL,
  4. age INT CHECK (age >= 0 AND age <= 100),
  5. gender ENUM('男', '女') DEFAULT '男',
  6. email VARCHAR(100) UNIQUE,
  7. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  8. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码

创建课程表

  1. CREATE TABLE courses (
  2. course_id INT PRIMARY KEY AUTO_INCREMENT,
  3. course_name VARCHAR(100) NOT NULL,
  4. teacher VARCHAR(50),
  5. credit DECIMAL(3,1) DEFAULT 2.0,
  6. start_date DATE,
  7. end_date DATE,
  8. INDEX idx_course_name (course_name)
  9. );
复制代码

创建选课关系表

  1. CREATE TABLE student_courses (
  2. id INT PRIMARY KEY AUTO_INCREMENT,
  3. student_id INT NOT NULL,
  4. course_id INT NOT NULL,
  5. score DECIMAL(5,2) CHECK (score >= 0 AND score <= 100),
  6. enroll_date DATE DEFAULT (CURDATE()),
  7. -- 外键约束
  8. FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
  9. FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,
  10. -- 复合唯一约束
  11. UNIQUE KEY uk_student_course (student_id, course_id)
  12. );
复制代码

表结构查看与修改

  1. -- 查看表结构
  2. DESC students;
  3. SHOW CREATE TABLE students;
  4. -- 添加列
  5. ALTER TABLE students ADD COLUMN phone VARCHAR(20) AFTER email;
  6. -- 修改列
  7. ALTER TABLE students MODIFY COLUMN name VARCHAR(100) NOT NULL;
  8. -- 删除列
  9. ALTER TABLE students DROP COLUMN phone;
  10. -- 重命名表
  11. ALTER TABLE students RENAME TO student_info;
复制代码

4. 数据增删改查(CRUD)

插入数据

  1. -- 插入单条数据
  2. INSERT INTO students (name, age, gender, email)
  3. VALUES ('张三', 20, '男', 'zhangsan@example.com');
  4. -- 插入多条数据
  5. INSERT INTO students (name, age, gender, email) VALUES
  6. ('李四', 21, '女', 'lisi@example.com'),
  7. ('王五', 22, '男', 'wangwu@example.com'),
  8. ('赵六', 19, '女', 'zhaoliu@example.com');
  9. -- 插入课程数据
  10. INSERT INTO courses (course_name, teacher, credit) VALUES
  11. ('数据库原理', '张老师', 3.0),
  12. ('数据结构', '李老师', 4.0),
  13. ('操作系统', '王老师', 3.5);
  14. -- 插入选课记录
  15. INSERT INTO student_courses (student_id, course_id, score) VALUES
  16. (1, 1, 85.5),
  17. (1, 2, 90.0),
  18. (2, 1, 88.0),
  19. (3, 3, 92.5);
复制代码

查询数据

  1. -- 查询所有列
  2. SELECT * FROM students;
  3. -- 查询指定列
  4. SELECT id, name, age FROM students;
  5. -- 条件查询
  6. SELECT * FROM students WHERE age > 20;
  7. SELECT * FROM students WHERE gender = '女' AND age < 22;
  8. -- 模糊查询
  9. SELECT * FROM students WHERE name LIKE '张%';
  10. SELECT * FROM students WHERE email LIKE '%@example.com';
  11. -- 排序
  12. SELECT * FROM students ORDER BY age DESC;
  13. SELECT * FROM students ORDER BY created_at DESC, name ASC;
  14. -- 分页查询
  15. SELECT * FROM students LIMIT 10 OFFSET 0; -- 第1页
  16. SELECT * FROM students LIMIT 10 OFFSET 10; -- 第2页
  17. -- 聚合函数
  18. SELECT COUNT(*) as total_students FROM students;
  19. SELECT AVG(age) as avg_age FROM students;
  20. SELECT MAX(age) as max_age, MIN(age) as min_age FROM students;
  21. SELECT gender, COUNT(*) as count FROM students GROUP BY gender;
  22. -- 分组查询
  23. SELECT gender, AVG(age) as avg_age
  24. FROM students
  25. GROUP BY gender
  26. HAVING avg_age > 20;
复制代码

更新数据

  1. -- 更新单条记录
  2. UPDATE students SET age = 21 WHERE id = 1;
  3. -- 批量更新
  4. UPDATE students SET updated_at = NOW() WHERE age > 20;
  5. -- 使用CASE语句条件更新
  6. UPDATE students
  7. SET age = CASE
  8. WHEN age < 20 THEN age + 1
  9. WHEN age >= 20 THEN age
  10. END;
复制代码

删除数据

  1. -- 删除指定记录
  2. DELETE FROM students WHERE id = 5;
  3. -- 删除所有记录(谨慎操作)
  4. -- DELETE FROM students;
  5. -- 清空表(重置自增ID)
  6. -- TRUNCATE TABLE students;
复制代码

5. 高级查询技巧

连接查询

  1. -- 内连接
  2. SELECT s.name, c.course_name, sc.score
  3. FROM students s
  4. INNER JOIN student_courses sc ON s.id = sc.student_id
  5. INNER JOIN courses c ON sc.course_id = c.course_id;
  6. -- 左连接
  7. SELECT s.name, c.course_name, sc.score
  8. FROM students s
  9. LEFT JOIN student_courses sc ON s.id = sc.student_id
  10. LEFT JOIN courses c ON sc.course_id = c.course_id;
  11. -- 右连接
  12. SELECT s.name, c.course_name, sc.score
  13. FROM students s
  14. RIGHT JOIN student_courses sc ON s.id = sc.student_id
  15. RIGHT JOIN courses c ON sc.course_id = c.course_id;
  16. -- 全外连接(MySQL通过UNION实现)
  17. SELECT s.name, c.course_name, sc.score
  18. FROM students s
  19. LEFT JOIN student_courses sc ON s.id = sc.student_id
  20. LEFT JOIN courses c ON sc.course_id = c.course_id
  21. UNION
  22. SELECT s.name, c.course_name, sc.score
  23. FROM students s
  24. RIGHT JOIN student_courses sc ON s.id = sc.student_id
  25. RIGHT JOIN courses c ON sc.course_id = c.course_id
  26. WHERE s.id IS NULL;
复制代码

子查询

  1. -- 标量子查询
  2. SELECT name, age,
  3. (SELECT AVG(age) FROM students) as avg_age
  4. FROM students;
  5. -- 列子查询
  6. SELECT * FROM students
  7. WHERE age IN (SELECT age FROM students WHERE gender = '男');
  8. -- 行子查询
  9. SELECT * FROM students
  10. WHERE (age, gender) = (SELECT MAX(age), '男' FROM students);
  11. -- 表子查询
  12. SELECT s.name, c.course_name
  13. FROM students s
  14. JOIN (
  15. SELECT student_id, course_id
  16. FROM student_courses
  17. WHERE score > 90
  18. ) sc ON s.id = sc.student_id
  19. JOIN courses c ON sc.course_id = c.course_id;
复制代码

窗口函数

  1. -- 排名函数
  2. SELECT
  3. name,
  4. age,
  5. ROW_NUMBER() OVER (ORDER BY age DESC) as row_num,
  6. RANK() OVER (ORDER BY age DESC) as rank_num,
  7. DENSE_RANK() OVER (ORDER BY age DESC) as dense_rank_num
  8. FROM students;
  9. -- 聚合窗口函数
  10. SELECT
  11. name,
  12. age,
  13. AVG(age) OVER () as overall_avg_age,
  14. AVG(age) OVER (PARTITION BY gender) as gender_avg_age
  15. FROM students;
  16. -- 前后行比较
  17. SELECT
  18. name,
  19. age,
  20. LAG(age) OVER (ORDER BY age) as prev_age,
  21. LEAD(age) OVER (ORDER BY age) as next_age
  22. FROM students;
复制代码

6. 索引优化

创建索引

  1. -- 创建普通索引
  2. CREATE INDEX idx_student_name ON students(name);
  3. -- 创建唯一索引
  4. CREATE UNIQUE INDEX idx_student_email ON students(email);
  5. -- 创建复合索引
  6. CREATE INDEX idx_student_age_gender ON students(age, gender);
  7. -- 创建全文索引(适用于文本搜索)
  8. CREATE FULLTEXT INDEX idx_student_name_fulltext ON students(name);
  9. -- 查看表索引
  10. SHOW INDEX FROM students;
复制代码

索引使用示例

  1. -- 使用索引的查询
  2. EXPLAIN SELECT * FROM students WHERE name = '张三';
  3. EXPLAIN SELECT * FROM students WHERE age > 20 AND gender = '男';
  4. -- 全文索引搜索
  5. SELECT * FROM students
  6. WHERE MATCH(name) AGAINST('张*' IN BOOLEAN MODE);
  7. -- 强制使用索引
  8. SELECT * FROM students FORCE INDEX (idx_student_name)
  9. WHERE name LIKE '张%';
复制代码

索引优化建议

  1. 选择合适列:WHERE、JOIN、ORDER BY、GROUP BY中的列
  2. 避免过多索引:每个索引都会增加写操作开销
  3. 使用复合索引:遵循最左前缀原则
  4. 定期分析索引:使用ANALYZE TABLE更新索引统计信息

7. 事务与锁机制

事务基本操作

  1. -- 开始事务
  2. START TRANSACTION;
  3. -- 或使用
  4. BEGIN;
  5. -- 执行SQL操作
  6. UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  7. UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  8. -- 提交事务
  9. COMMIT;
  10. -- 回滚事务
  11. ROLLBACK;
复制代码

事务隔离级别

  1. -- 查看当前隔离级别
  2. SELECT @@transaction_isolation;
  3. -- 设置隔离级别
  4. SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  5. SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  6. -- 四种隔离级别
  7. -- READ UNCOMMITTED 读未提交
  8. -- READ COMMITTED 读已提交
  9. -- REPEATABLE READ 可重复读(MySQL默认)
  10. -- SERIALIZABLE 串行化
复制代码

锁机制示例

  1. -- 共享锁(读锁)
  2. SELECT * FROM students WHERE id = 1 LOCK IN SHARE MODE;
  3. -- 排他锁(写锁)
  4. SELECT * FROM students WHERE id = 1 FOR UPDATE;
  5. -- 表级锁
  6. LOCK TABLES students READ; -- 读锁
  7. LOCK TABLES students WRITE; -- 写锁
  8. UNLOCK TABLES; -- 释放锁
复制代码

8. 存储过程与函数

创建存储过程

  1. DELIMITER //
  2. CREATE PROCEDURE GetStudentInfo(IN student_id INT)
  3. BEGIN
  4. SELECT s.name, s.age, s.gender, c.course_name, sc.score
  5. FROM students s
  6. LEFT JOIN student_courses sc ON s.id = sc.student_id
  7. LEFT JOIN courses c ON sc.course_id = c.course_id
  8. WHERE s.id = student_id;
  9. END //
  10. DELIMITER ;
  11. -- 调用存储过程
  12. CALL GetStudentInfo(1);
复制代码

创建函数

  1. DELIMITER //
  2. CREATE FUNCTION CalculateGrade(score DECIMAL(5,2))
  3. RETURNS VARCHAR(10)
  4. DETERMINISTIC
  5. BEGIN
  6. DECLARE grade VARCHAR(10);
  7. IF score >= 90 THEN SET grade = '优秀';
  8. ELSEIF score >= 80 THEN SET grade = '良好';
  9. ELSEIF score >= 70 THEN SET grade = '中等';
  10. ELSEIF score >= 60 THEN SET grade = '及格';
  11. ELSE SET grade = '不及格';
  12. END IF;
  13. RETURN grade;
  14. END //
  15. DELIMITER ;
  16. -- 使用函数
  17. SELECT name, score, CalculateGrade(score) as grade
  18. FROM student_courses sc
  19. JOIN students s ON sc.student_id = s.id;
复制代码

触发器示例

  1. DELIMITER //
  2. CREATE TRIGGER UpdateStudentCount
  3. AFTER INSERT ON students
  4. FOR EACH ROW
  5. BEGIN
  6. UPDATE statistics
  7. SET student_count = student_count + 1,
  8. last_update = NOW()
  9. WHERE id = 1;
  10. END //
  11. DELIMITER ;
复制代码

9. Python连接MySQL示例

安装MySQL驱动

  1. pip install mysql-connector-python
  2. # 或
  3. pip install pymysql
复制代码

基本连接与操作

  1. import mysql.connector
  2. from mysql.connector import Error
  3. def connect_to_mysql():
  4. """连接MySQL数据库"""
  5. try:
  6. connection = mysql.connector.connect(
  7. host='localhost',
  8. user='root',
  9. password='your_password',
  10. database='school_db'
  11. )
  12. if connection.is_connected():
  13. print("成功连接到MySQL数据库")
  14. return connection
  15. except Error as e:
  16. print(f"连接失败: {e}")
  17. return None
  18. def create_table(connection):
  19. """创建表"""
  20. try:
  21. cursor = connection.cursor()
  22. create_table_query = """
  23. CREATE TABLE IF NOT EXISTS employees (
  24. id INT AUTO_INCREMENT PRIMARY KEY,
  25. name VARCHAR(100) NOT NULL,
  26. position VARCHAR(100),
  27. salary DECIMAL(10, 2),
  28. hire_date DATE
  29. )
  30. """
  31. cursor.execute(create_table_query)
  32. connection.commit()
  33. print("表创建成功")
  34. except Error as e:
  35. print(f"创建表失败: {e}")
  36. def insert_data(connection):
  37. """插入数据"""
  38. try:
  39. cursor = connection.cursor()
  40. insert_query = """
  41. INSERT INTO employees (name, position, salary, hire_date)
  42. VALUES (%s, %s, %s, %s)
  43. """
  44. employees = [
  45. ('张三', '工程师', 15000.00, '2023-01-15'),
  46. ('李四', '经理', 25000.00, '2022-06-20'),
  47. ('王五', '设计师', 12000.00, '2023-03-10')
  48. ]
  49. cursor.executemany(insert_query, employees)
  50. connection.commit()
  51. print(f"插入了 {cursor.rowcount} 条记录")
  52. except Error as e:
  53. print(f"插入数据失败: {e}")
  54. def query_data(connection):
  55. """查询数据"""
  56. try:
  57. cursor = connection.cursor(dictionary=True) # 返回字典格式
  58. query = "SELECT * FROM employees WHERE salary > %s"
  59. cursor.execute(query, (13000,))
  60. results = cursor.fetchall()
  61. print("查询结果:")
  62. for row in results:
  63. print(f"ID: {row['id']}, 姓名: {row['name']}, 职位: {row['position']}, 薪资: {row['salary']}")
  64. except Error as e:
  65. print(f"查询失败: {e}")
  66. def update_data(connection):
  67. """更新数据"""
  68. try:
  69. cursor = connection.cursor()
  70. update_query = "UPDATE employees SET salary = salary * 1.1 WHERE position = %s"
  71. cursor.execute(update_query, ('工程师',))
  72. connection.commit()
  73. print(f"更新了 {cursor.rowcount} 条记录")
  74. except Error as e:
  75. print(f"更新失败: {e}")
  76. def main():
  77. """主函数"""
  78. connection = connect_to_mysql()
  79. if connection:
  80. try:
  81. create_table(connection)
  82. insert_data(connection)
  83. query_data(connection)
  84. update_data(connection)
  85. query_data(connection) # 再次查询查看更新结果
  86. finally:
  87. if connection.is_connected():
  88. connection.close()
  89. print("数据库连接已关闭")
  90. if __name__ == "__main__":
  91. main()
复制代码

使用连接池

  1. from mysql.connector import pooling
  2. # 创建连接池
  3. connection_pool = pooling.MySQLConnectionPool(
  4. pool_name="mypool",
  5. pool_size=5,
  6. host='localhost',
  7. user='root',
  8. password='your_password',
  9. database='school_db'
  10. )
  11. # 从连接池获取连接
  12. def get_connection_from_pool():
  13. try:
  14. connection = connection_pool.get_connection()
  15. return connection
  16. except Error as e:
  17. print(f"从连接池获取连接失败: {e}")
  18. return None
  19. # 使用连接
  20. connection = get_connection_from_pool()
  21. if connection:
  22. # 执行数据库操作
  23. cursor = connection.cursor()
  24. cursor.execute("SELECT * FROM students")
  25. results = cursor.fetchall()
  26. # 使用完毕后将连接返回连接池
  27. connection.close
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行