MySQL基础操作案例设计

复制代码
mysql 常用基础语句
创建库

使用数据库

创建表

给表添加字段

给表字段添加注解

删除字段

修改字段长度

修改字段类型

删除表同时删除数据

删除表数据但是数据表和结构表留

删除库

查询库中存在的表

查询具体某给表的结构

检查当前数据库中是否有大表查询

根据字段模糊查询

查询某个字段值相同的记录个数

分组查询

排序

having 过滤

获取top n ,获取某个值最大的前几条数据(前几名的数据)

左关联

有关联

内关联

union 查询

union all 查询

子查询

============================================

数据库案例:学生选课系统

1. 创建库

sql

复制代码
CREATE DATABASE student_management;

2. 使用数据库

sql

复制代码
USE student_management;

3. 创建表

sql

复制代码
-- 创建学生表
CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    gender ENUM('男', '女'),
    class_name VARCHAR(50),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建课程表
CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    course_name VARCHAR(100) NOT NULL,
    teacher VARCHAR(50),
    credit DECIMAL(3,1)
);

4. 给表添加字段

sql

复制代码
-- 给学生表添加邮箱字段
ALTER TABLE students ADD COLUMN email VARCHAR(100);

-- 给课程表添加课程类型字段
ALTER TABLE courses ADD COLUMN course_type VARCHAR(20);

5. 给表字段添加注解

sql

复制代码
-- 使用注释说明字段含义
ALTER TABLE students MODIFY COLUMN email VARCHAR(100) COMMENT '学生邮箱地址';
ALTER TABLE courses MODIFY COLUMN course_type VARCHAR(20) COMMENT '课程类型:必修/选修';

6. 删除字段

sql

复制代码
-- 删除学生表的邮箱字段
ALTER TABLE students DROP COLUMN email;

7. 修改字段长度

sql

复制代码
-- 将学生姓名字段长度从50改为80
ALTER TABLE students MODIFY COLUMN name VARCHAR(80) NOT NULL;

8. 修改字段类型

sql

复制代码
-- 将年龄字段从INT改为TINYINT
ALTER TABLE students MODIFY COLUMN age TINYINT;

9. 删除表同时删除数据

sql

复制代码
-- 先创建临时表用于演示
CREATE TABLE temp_table (id INT, data VARCHAR(50));
-- 删除表(表结构和数据都删除)
DROP TABLE temp_table;

10. 删除表数据但是表结构保留

sql

复制代码
-- 清空学生表数据但保留表结构
TRUNCATE TABLE students;

11. 删除库

sql

复制代码
-- 注意:这会删除整个数据库
-- DROP DATABASE student_management;

12. 查询库中存在的表

sql

复制代码
SHOW TABLES;

13. 查询具体某个表的结构

sql

复制代码
DESC students;
-- 或者
SHOW COLUMNS FROM students;

14. 检查当前数据库中是否有大表查询

sql

复制代码
-- 查询所有表的大小
SELECT 
    table_name AS '表名',
    round(((data_length + index_length) / 1024 / 1024), 2) AS '大小(MB)'
FROM information_schema.TABLES 
WHERE table_schema = 'student_management'
ORDER BY (data_length + index_length) DESC;

15. 根据字段模糊查询

sql

复制代码
-- 查询姓名包含"张"的学生
SELECT * FROM students WHERE name LIKE '%张%';

-- 查询以"李"开头的学生
SELECT * FROM students WHERE name LIKE '李%';

16. 查询某个字段值相同的记录个数

sql

复制代码
-- 统计每个班级的学生人数
SELECT class_name, COUNT(*) as student_count 
FROM students 
GROUP BY class_name;

-- 统计男女学生人数
SELECT gender, COUNT(*) as count 
FROM students 
GROUP BY gender;

17. 分组查询

sql

复制代码
-- 按班级分组统计平均年龄
SELECT class_name, AVG(age) as avg_age, COUNT(*) as student_count
FROM students
GROUP BY class_name;

18. 排序

sql

复制代码
-- 按年龄升序排序
SELECT * FROM students ORDER BY age ASC;

-- 按年龄降序排序,年龄相同的按姓名升序
SELECT * FROM students ORDER BY age DESC, name ASC;

19. HAVING 过滤

sql

复制代码
-- 查询学生人数超过2人的班级
SELECT class_name, COUNT(*) as student_count
FROM students
GROUP BY class_name
HAVING COUNT(*) > 2;

-- 查询平均年龄大于18岁的班级
SELECT class_name, AVG(age) as avg_age
FROM students
GROUP BY class_name
HAVING AVG(age) > 18;

20. 获取TOP N,获取某个值最大的前几条数据

sql

复制代码
-- 获取年龄最大的3个学生
SELECT * FROM students ORDER BY age DESC LIMIT 3;

-- 获取年龄最小的5个学生
SELECT * FROM students ORDER BY age ASC LIMIT 5;

21. 左关联

sql

复制代码
-- 创建选课表
CREATE TABLE student_courses (
    id INT PRIMARY KEY AUTO_INCREMENT,
    student_id INT,
    course_id INT,
    score DECIMAL(4,1)
);

-- 左关联:查询所有学生及其选课情况(包括没选课的学生)
SELECT s.student_id, s.name, c.course_name, sc.score
FROM students s
LEFT JOIN student_courses sc ON s.student_id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id;

22. 右关联

sql

复制代码
-- 右关联:查询所有课程及其选课学生(包括没人选的课程)
SELECT c.course_name, s.name, sc.score
FROM students s
RIGHT JOIN student_courses sc ON s.student_id = sc.student_id
RIGHT JOIN courses c ON sc.course_id = c.course_id;

23. 内关联

sql

复制代码
-- 内关联:只查询有选课记录的学生和课程
SELECT s.name, c.course_name, sc.score
FROM students s
INNER JOIN student_courses sc ON s.student_id = sc.student_id
INNER JOIN courses c ON sc.course_id = c.course_id;

24. UNION 查询

sql

复制代码
-- 合并查询结果(去重)
SELECT name FROM students WHERE gender = '男'
UNION
SELECT name FROM students WHERE age > 20;

25. UNION ALL 查询

sql

复制代码
-- 合并查询结果(不去重)
SELECT name FROM students WHERE gender = '男'
UNION ALL
SELECT name FROM students WHERE age > 20;

26. 子查询

sql

复制代码
-- 查询年龄大于平均年龄的学生
SELECT * FROM students 
WHERE age > (SELECT AVG(age) FROM students);

-- 查询选了"数学"课程的学生
SELECT * FROM students 
WHERE student_id IN (
    SELECT student_id FROM student_courses 
    WHERE course_id = (SELECT course_id FROM courses WHERE course_name = '数学')
);

-- 使用子查询作为派生表
SELECT s.name, s.class_name, avg_scores.avg_score
FROM students s
JOIN (
    SELECT student_id, AVG(score) as avg_score 
    FROM student_courses 
    GROUP BY student_id
) avg_scores ON s.student_id = avg_scores.student_id;

完整的数据示例

sql

复制代码
-- 插入示例数据
INSERT INTO students (name, age, gender, class_name) VALUES
('张三', 20, '男', '计算机一班'),
('李四', 19, '女', '计算机一班'),
('王五', 21, '男', '计算机二班'),
('赵六', 18, '女', '计算机二班'),
('钱七', 22, '男', '计算机三班');

INSERT INTO courses (course_name, teacher, credit, course_type) VALUES
('数学', '张老师', 4.0, '必修'),
('英语', '李老师', 3.0, '必修'),
('编程', '王老师', 5.0, '选修');

INSERT INTO student_courses (student_id, course_id, score) VALUES
(1, 1, 85.5),
(1, 2, 78.0),
(2, 1, 92.0),
(2, 3, 88.5),
(3, 2, 76.0),
(4, 1, 95.0),
(4, 2, 89.0),
(4, 3, 91.5);
相关推荐
xmjd msup25 分钟前
mysql的分区表
数据库·mysql
Lyyaoo.26 分钟前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM31 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens35 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.135 分钟前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick199344 分钟前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花8 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56619 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全10 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_7717172110 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql