数据库操作核心知识点整理
文章目录
- 一、表结构创建与管理
- 二、约束条件
- 三、查询操作(SELECT命令)
- 四、多表查询与连接
- 五、数据更新操作
- 六、注意事项
一、表结构创建与管理
-
创建数据表(CREATE TABLE)
基本语法示例:CREATE TABLE student(sno char(8), -- 学号,固定长度8字符name varchar(20), -- 姓名,可变长度最大20字符age int -- 年龄,整数类型 );
-
删除数据表(DROP TABLE)
- 功能:删除整个基本表(包括表结构和数据)。
- 语法:
DROP TABLE 表名;
二、约束条件
-
UNIQUE约束
- 作用:保证列中数据唯一(允许NULL,但NULL只允许出现一次)。
-
主键约束(PRIMARY KEY)
- 特性:唯一标识表中记录,不允许为NULL,且值必须唯一。
-
外键约束(FOREIGN KEY)
- 作用:建立表之间的关联关系,确保子表中的外键值对应主表的主键值。
三、查询操作(SELECT命令)
-
执行顺序
单表查询流程:
FROM(读表到内存)→ WHERE(筛选行)→ GROUP BY(分组)→ HAVING(分组后筛选)→ SELECT(选择列)→ ORDER BY(排序)
-
单表查询基础
- 去重(DISTINCT):去除查询结果中重复的记录,如
SELECT DISTINCT 列名 FROM 表;
。 - 列别名:通过
列名 别名
或列名 AS 别名
定义,如SELECT SNAME NAME FROM student;
。 - 判等条件:使用
=
进行等于判断(注意字符串需用单引号包裹,如WHERE Name = '张三'
)。 - 非BETWEEN AND等价写法:例如
WHERE Age > 18 AND Age < 25
(等价于BETWEEN 19 AND 24
)。 - 空值检测:用
IS NULL
或IS NOT NULL
(不能用= NULL
),如WHERE Age IS NULL
。 - 多重条件:WHERE后用
AND
/OR
连接,如WHERE Age > 18 AND Name LIKE '张%'
。
- 去重(DISTINCT):去除查询结果中重复的记录,如
-
模糊查询(部分匹配)
- 通配符:
%
:匹配任意长度的字符串(包括0个字符);_
:匹配任意单个字符(UTF8编码中,一个汉字需用一个_
匹配)。
- 示例:
WHERE Name LIKE '张_%'
(匹配“张”开头的3字符姓名,如“张三”“张四”)。
- 通配符:
-
聚合函数
AVG(列名)
:求数值型列的平均值;SUM(列名)
:求数值型列的总和;COUNT()
:计数(COUNT(*)
统计所有记录,包括重复和NULL;COUNT(DISTINCT 列名)
统计不重复的非NULL值)。
-
分组查询(GROUP BY)
- 功能:按指定列分组,对每组进行聚合计算。
- 搭配
HAVING
:对分组后的结果筛选(仅作用于GROUP BY的分组),如:SELECT sno FROM sc WHERE cno = 'C1' OR cno = 'C2' GROUP BY sno HAVING COUNT(*) = 2; -- 筛选同时选了C1和C2的学号
-
排序(ORDER BY)
- 功能:对查询结果排序,放在查询语句最后。
- 示例:
SELECT * FROM student ORDER BY Age DESC;
(按年龄降序)。
四、多表查询与连接
-
笛卡积与连接
- 笛卡积:两表连接未加条件时,结果行数为两表行数乘积(n×m),需避免。
- 连接类型:
INNER JOIN
:只保留两表匹配的记录;LEFT JOIN
:保留左表所有记录,右表无匹配则为NULL;RIGHT JOIN
:保留右表所有记录,左表无匹配则为NULL;FULL JOIN
:保留两表所有记录,无匹配则为NULL。
- 优化建议:先通过WHERE筛选缩减数据量,再进行连接。
-
连接写法
- 隐式连接(简化写法):
SELECT * FROM S, SC WHERE S.Sno = SC.Sno;
- 自身连接:同一张表作为两个表处理(需取别名区分),如
SELECT a.Name, b.Name FROM student a, student b WHERE a.Class = b.Class;
- 隐式连接(简化写法):
-
子查询(嵌套查询)
- 原则:能用普通查询(如连接)实现的,优先不用子查询;需分步骤返回结果时,使用嵌套查询(优化速度)。
- 避免:相关子查询(依赖父查询字段,效率低);尽量用
IN
代替=
,不用ANY
/ALL
。
五、数据更新操作
-
修改数据(UPDATE)
- 建议:明确写出列名(避免数据库迁移时因列顺序变化出错)。
- 示例:
UPDATE student SET Age = 20 WHERE Sno = '20230001';
-
删除数据(DELETE)
- 特性:只删除表中记录,表结构保留。
- 示例:
DELETE FROM student WHERE Age < 18;
六、注意事项
- where 里面不可以使用聚合语句
SELECT * FROM orders
WHERE SUM(amount) > 100; -- 报错,WHERE 不能直接用聚合函数`
正确写法
-- 方式1:HAVING(需先 GROUP BY)
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 100;-- 方式2:子查询
SELECT * FROM orders
WHERE customer_id IN (SELECT customer_id FROM orders GROUP BY customer_id HAVING SUM(amount) > 100
);