1. 数据库操作

创建数据库

1
CREATE DATABASE school;  -- 创建一个名为 "school" 的数据库

删除数据库

1
DROP DATABASE school;  -- 删除名为 "school" 的数据库

选择数据库

1
USE school;  -- 切换到 "school" 数据库,后续操作都在这个库中进行

2. 表操作

创建表

1
2
3
4
5
6
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- 学号(主键,自动增长)
name VARCHAR(50) NOT NULL, -- 姓名(不能为空)
age INT DEFAULT 18, -- 年龄(默认18岁)
class VARCHAR(20) -- 班级
);
  • 解释
    • PRIMARY KEY:唯一标识每一行的列(如学号)。
    • AUTO_INCREMENT:自动生成递增的数字(无需手动输入)。
    • VARCHAR(50):可变长度字符串,最多50个字符。
    • DEFAULT 18:如果插入数据时不指定年龄,默认设为18。

删除表

1
DROP TABLE students;  -- 删除 "students" 表

修改表结构

1
2
3
4
5
6
7
8
9
10
11
-- 添加一列 "gender"
ALTER TABLE students ADD gender VARCHAR(10);

-- 删除列 "class"
ALTER TABLE students DROP COLUMN class;

-- 修改列的数据类型(将 age 的类型改为 TINYINT)
ALTER TABLE students MODIFY age TINYINT;

-- 重命名列(将 "gender" 改为 "sex")
ALTER TABLE students CHANGE gender sex VARCHAR(10);

3. 数据操作(CRUD)

插入数据

1
2
3
4
5
6
7
8
9
-- 插入单条数据(指定列)
INSERT INTO students (name, age)
VALUES ('张三', 20);

-- 插入多条数据
INSERT INTO students (name, age, sex)
VALUES
('李四', 19, '男'),
('王五', 21, '女');

查询数据

1
2
3
4
5
6
7
8
9
10
11
-- 查询所有列
SELECT * FROM students;

-- 查询指定列
SELECT name, age FROM students;

-- 带条件的查询(年龄大于18岁的学生)
SELECT * FROM students WHERE age > 18;

-- 去重查询(查询所有不重复的年龄)
SELECT DISTINCT age FROM students;

更新数据

1
2
3
4
-- 将张三的年龄改为22岁(一定要加 WHERE,否则所有数据都会被修改!)
UPDATE students
SET age = 22
WHERE name = '张三';

删除数据

1
2
3
-- 删除年龄小于18岁的学生(不加 WHERE 会清空整个表!)
DELETE FROM students
WHERE age < 18;

4. 查询进阶

排序

作用:按指定列的值对结果排序(升序或降序)。

1
2
3
4
5
6
7
8
9
10
11
-- 按年龄升序排列(ASC 可省略)
SELECT * FROM students
ORDER BY age ASC;

-- 按年龄降序排列
SELECT * FROM students
ORDER BY age DESC;

-- 多重排序(先按性别升序,再按年龄降序)
SELECT * FROM students
ORDER BY sex ASC, age DESC;

限制结果数量

1
2
3
4
5
6
7
-- 查询前3条数据
SELECT * FROM students
LIMIT 3;

-- 分页查询(跳过前2条,取接下来的3条)
SELECT * FROM students
LIMIT 2, 3; -- 等同于 LIMIT 3 OFFSET 2

模糊查询

1
2
3
4
5
6
7
8
9
10
11
-- 查询名字以 "张" 开头的人
SELECT * FROM students
WHERE name LIKE '张%';

-- 查询名字包含 "小" 的人
SELECT * FROM students
WHERE name LIKE '%小%';

-- 查询名字第二个字是 "三" 的人(如 "张三"、"李三")
SELECT * FROM students
WHERE name LIKE '_三%';

聚合函数

  • COUNT():统计行数。
  • SUM():求和。
  • AVG():求平均值。
  • MAX():最大值。
  • MIN():最小值。
1
2
3
4
5
6
7
8
-- 计算学生总数
SELECT COUNT(*) FROM students;

-- 计算最大年龄
SELECT MAX(age) FROM students;

-- 计算平均年龄
SELECT AVG(age) FROM students;

分组统计

1
2
3
4
5
6
7
8
9
10
-- 按性别分组,统计每组的平均年龄
SELECT sex, AVG(age)
FROM students
GROUP BY sex;

-- 过滤分组结果(只显示平均年龄大于19的组)
SELECT sex, AVG(age)
FROM students
GROUP BY sex
HAVING AVG(age) > 19;

表连接(JOIN)

作用:将多个表的数据关联查询。

连接类型

类型 说明
INNER JOIN 返回两个表都匹配的行(交集)。
LEFT JOIN 返回左表所有行,右表无匹配时显示 NULL
RIGHT JOIN 返回右表所有行,左表无匹配时显示 NULL(较少用,可用 LEFT JOIN 替代)。

示例

假设有两个表:

  • students(学生表)id, name
  • scores(成绩表)student_id, subject, score
1
2
3
4
5
6
7
8
9
-- 内连接:查询有成绩的学生及其成绩
SELECT students.name, scores.subject, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;

-- 左连接:查询所有学生(包括无成绩的)
SELECT students.name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;

注意事项

  • 必须指定连接条件(如 ON students.id = scores.student_id),否则会返回笛卡尔积(所有可能组合)。

  • 多表连接时,建议使用表别名简化代码:

    1
    2
    3
    SELECT s.name, sc.score 
    FROM students AS s
    LEFT JOIN scores AS sc ON s.id = sc.student_id;

子查询(Subquery)

作用:将一个查询的结果作为另一个查询的条件或数据源。

1
2
3
4
5
6
7
-- 查询年龄大于平均年龄的学生
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);

-- 查询有成绩的学生姓名
SELECT name FROM students
WHERE id IN (SELECT student_id FROM scores);

注意事项

  • 子查询必须放在括号内 ()
  • 避免多层嵌套子查询,可能影响可读性和性能。

联合查询(UNION)

作用:合并多个查询的结果(去除重复行)。

1
2
3
4
-- 合并两个表的学生姓名(假设 teachers 表也有 name 列)
SELECT name FROM students
UNION
SELECT name FROM teachers;

UNION ALL

保留重复行:

1
2
3
SELECT name FROM students 
UNION ALL
SELECT name FROM teachers;

CASE WHEN(条件判断)

作用:根据条件返回不同的值。

1
2
3
4
5
6
7
-- 根据年龄标记是否成年
SELECT name, age,
CASE
WHEN age >= 18 THEN '成年'
ELSE '未成年'
END AS 是否成年
FROM students;

总结

  1. 排序和分页ORDER BYLIMIT 是处理结果展示的核心。
  2. 模糊查询:灵活使用 LIKE 和通配符。
  3. 聚合与分组:理解 GROUP BYHAVING 的关系。
  4. 表连接:掌握 INNER JOINLEFT JOIN 的区别。
  5. 子查询和联合:解决复杂查询问题。