前言:
之前操作的时候大多时候都是用GPT生成的sql语句(有一说一真的实用),但是缺少自己完整独立完成sql语句书写的能力,直到学校课程上到了数据库原理才意识到好像真的需要认真学一下这些sql语句了😎,另外为了方便各位练习达到学习效果😉,如果想要答案可以私我单独发。
一、增删改查
增删改查,也称CRUD(Create, Remove, Update, Delete),是数据库中最常用的几个命令。
增数据
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
删数据
DELETE FROM table_name
WHERE condition;
改数据
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
查数据
SELECT column1, column2, ...
FROM table_name1
JOIN_TYPE table_name2 ON join_condition
WHERE condition
GROUP BY column1, column2, ...
HAVING condition
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
LIMIT number;
上述图片展示了GROUP语句的效果:可以将检索到的数据按照某一个主键组合在一起。
在数据查询中涉及到了很多的关键词:
- SELECT:用于指定要从数据库中检索的列。
column1, column2, …:代表要从表中检索的列名。这些列可以是任何有效的列名或表达式。
-
FROM table_name:指定查询将从哪个表中检索数据。
-
JOIN_TYPE:
-
INNER JOIN:返回两个表中匹配的行。
-
LEFT JOIN 或 LEFT OUTER JOIN:返回左表的所有行,即使右表中没有匹配的行。
-
RIGHT JOIN 或 RIGHT OUTER JOIN:返回右表的所有行,即使左表中没有匹配的行。
-
FULL OUTER JOIN:返回两个表中的所有行,无论它们是否匹配。
-
CROSS JOIN:返回两个表的笛卡尔积,即所有可能的行组合。
table_name1, table_name2:代表参与查询的表的名称。 -
ON join_condition:指定如何连接两个表的条件。通常涉及两个表的关联字段。
-
-
WHERE condition:用于过滤结果集,只返回满足特定条件的行。
-
GROUP BY column1, column2, …:将结果集按指定的列分组,以便可以对每个组应用聚合函数。
-
HAVING condition:用于过滤分组后的结果集,与 WHERE 类似,但用于聚合函数。
-
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], …:对结果集进行排序。ASC 表示升序,DESC 表示降序。
-
LIMIT number:限制结果集中返回的行数。
-
AND, OR:逻辑运算符,用于组合多个条件。
-
聚合函数:
- COUNT():计算行数。
- SUM():计算总和。
- AVG():计算平均值。
- MAX():找出最大值。
- MIN():找出最小值。
二、触发器
触发器(Trigger)是数据库管理系统中的一种特殊的存储过程,它会自动执行(触发)在关联表上执行 INSERT、UPDATE 或 DELETE 操作之前或之后。触发器的主要功能包括:
- 数据完整性:确保数据库中的数据满足特定的完整性约束。
- 自动更新:自动更新表中的数据或相关表中的数据。
- 审核和日志记录:记录数据变更的历史,用于审计和跟踪。
- 复杂业务逻辑:实现复杂的业务规则,这些规则难以通过简单的 INSERT、UPDATE 或 DELETE 操作实现。
- 级联操作:在多个表之间执行级联的 INSERT、UPDATE 或 DELETE 操作。
触发器标准语法:
DELIMITER $$
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
-- 可以包含多个 SQL 语句
END$$
DELIMITER ;
下面结合上面的资料链接给出一个删除触发器代码,在检测到SC表中有删除操作的时候对student表进行操作:
-- 定义删除操作触发器
CREATE TRIGGER sc_delete_trg
AFTER DELETE ON SC
FOR EACH ROW
BEGIN
-- 更新 student 表中对应学生的平均成绩
UPDATE student
SET avgGrade = (
SELECT AVG(Grade) FROM SC WHERE SC.Sno = OLD.Sno
)
WHERE sno = OLD.Sno;
-- 如果学生没有更多成绩记录,则从 student 表中删除该学生的 avgGrade 记录
DELETE FROM student
WHERE sno = OLD.Sno AND NOT EXISTS (
SELECT 1 FROM SC WHERE SC.Sno = OLD.Sno
);
END;
三、视图
视图(View)是数据库中一种虚拟的表,其内容由 SQL 查询定义。视图的作用包括:
-
简化复杂的查询:通过创建视图,可以将复杂的 SQL 查询封装起来,使得用户可以用简单的方式访问复杂的数据集。
-
提高数据安全性:视图可以限制用户对特定数据的访问,只显示他们需要看到的数据,从而保护数据的敏感信息。
-
逻辑数据独立性:视图可以提供逻辑上的抽象,使得应用程序代码可以独立于底层表结构的变化。
-
重用SQL代码:视图可以被看作是可重用的SQL代码,可以在多个地方使用而不需要重复编写相同的查询。
-
优化查询性能:在某些情况下,数据库系统可以对视图的查询进行优化,尤其是在视图被频繁访问时。
**注意!:**视图本身不存储数据,存储数据还是依托表结构,视图仅仅是相当于提供一个观察数据的“窗口”。
视图示例代码:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;