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