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