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);
相关推荐
友友马2 小时前
『 QT 』按钮类控件属性解析
开发语言·数据库·qt
vvw&2 小时前
如何在 Ubuntu 上安装 PostgreSQL
linux·运维·服务器·数据库·ubuntu·postgresql
csdn_aspnet3 小时前
如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
linux·windows·mysql·macos·centos
qq_5470261793 小时前
Canal实时同步MySQL数据到Elasticsearch
数据库·mysql·elasticsearch
csdn_aspnet4 小时前
CentOS 7 上安装 MySQL 8.0
linux·mysql·centos
java1234_小锋4 小时前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
兰若姐姐4 小时前
如何进行MSSQL提权?sp_oacreate、sp_oamethod和沙盒提权以及xp_regwrighte提权
数据库·sqlserver
一抓掉一大把4 小时前
秒杀-订单创建消费者CreateOrderConsumer
网络·数据库
一只小bit6 小时前
MySQL事务:如何保证ACID?MVCC到底如何工作?
数据库·mysql·oracle