CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Day36-45/38.SQL详解之DML.md
Views: 729
SQL详解之DML
我们接着上一课中创建的学校选课系统数据库,为大家讲解 DML 的使用。DML 可以帮助将数据插入到二维表(insert
操作)、从二维表删除数据(delete
操作)以及更新二维表的数据(update
操作)。在执行 DML 之前,我们先通过下面的use
命令切换到school
数据库。
insert操作
顾名思义,insert
是用来插入行到二维表中的,插入的方式包括:插入完整的行、插入行的一部分、插入多行、插入查询的结果。我们通过如下所示的 SQL 向学院表中添加一个学院。
其中,由于学院表的主键是一个自增字段,因此上面的 SQL 中用default
表示该列使用默认值,我们也可以使用下面的方式完成同样的操作。
我们推荐大家使用下面这种做法,指定为哪些字段赋值,这样做可以不按照建表时设定的字段顺序赋值,可以按照values
前面的元组中给定的字段顺序为字段赋值,但是需要注意,除了允许为null
和有默认值的字段外,其他的字段都必须要一一列出并在values
后面的元组中为其赋值。如果希望一次性插入多条记录,我们可以在values
后面跟上多个元组来实现批量插入,代码如下所示。
在插入数据时,要注意主键是不能重复的,如果插入的数据与表中已有记录主键相同,那么insert
操作将会产生 Duplicated Entry 的报错信息。再次提醒大家,如果insert
操作省略了某些列,那么这些列要么有默认值,要么允许为null
,否则也将产生错误。在业务系统中,为了让insert
操作不影响其他操作(主要是后面要讲的select
操作)的性能,可以在insert
和into
之间加一个low_priority
来降低insert
操作的优先级,这个做法也适用于下面要讲的delete
和update
操作。
假如有一张名为tb_temp
的表中有a
和b
两个列,分别保存了学院的名称和学院的介绍,我们也可以通过查询操作获得tb_temp
表的数据并插入到学院表中,如下所示,其中的select
就是我们之前提到的 DQL,在下一课中会详细讲解。
delete 操作
如果需要从表中删除数据,可以使用delete
操作,它可以帮助我们删除指定行或所有行,例如我们要删除编号为1
的学院,就可以使用如下所示的 SQL。
注意,上面的delete
操作中的where
子句是用来指定条件的,只有满足条件的行会被删除。如果我们不小心写出了下面的 SQL,就会删除学院表中所有的记录,这是相当危险的,在实际工作中通常也不会这么做。
需要说明的是,即便删除了所有的数据,delete
操作不会删除表本身,也不会让 AUTO_INCREMENT 字段的值回到初始值。如果需要删除所有的数据而且让 AUTO_INCREMENT 字段回到初始值,可以使用truncate table
执行截断表操作,truncate
的本质是删除原来的表并重新创建一个表,它的速度其实更快,因为不需要逐行删除数据。但是请大家记住一点,用truncate table
删除数据是非常危险的,因为它会删除所有的数据,而且由于原来的表已经被删除了,要想恢复误删除的数据也会变得极为困难。
update 操作
如果要修改表中的数据,可以使用update
操作,它可以用来删除指定的行或所有的行。例如,我们将学生表中的“杨过”修改为“杨逍”,这里我们假设“杨过”的学号为1001
,代码如下所示。
注意上面 SQL 中的where
子句,我们使用学号作为条件筛选出对应的学生,然后通过前面的赋值操作将其姓名修改为“杨逍”。这里为什么不直接使用姓名作为筛选条件,那是因为学生表中可能有多个名为“杨过”的学生,如果使用 stu_name 作为筛选条件,那么我们的update
操作有可能会一次更新多条数据,这显然不是我们想要看到的。还有一个需要注意的地方是update
操作中的set
关键字,因为 SQL 中的=
并不表示赋值,而是判断相等的运算符,只有出现在set
关键字后面的=
,才具备赋值的能力。
如果要同时修改学生的姓名和生日,我们可以对上面的update
语句稍作修改,如下所示。
update
语句中也可以使用查询的方式获得数据并以此来更新指定的表数据,有兴趣的读者可以自行研究。在书写update
语句时,通常都会有where
子句,因为实际工作中几乎不太会用到更新全表的操作,这一点大家一定要注意。
完整的数据
下面我们给出完整的向 school 数据库的五张表中插入数据的 SQL。
注意:上面的
insert
语句使用了批处理的方式来插入数据,这种做法插入数据的效率比较高。