DML 语句
有的地方把 DML 语句(增删改)和 DQL 语句(查询)统称为 DML 语句,有的地方分开,我们目前使用分开称呼的方式
插入
表创建好之后,我们就可以向表里插入数据了,插入记录的基本语法如下
INSERT INTO tablename (field1,field2) VALUES(value1,value2);
例如,向中插入以下记录
insert into job(name,sex,age,hiredate,birthday,salary) values("cxuan","男",24,"2020-04-27","1995-08-22",8000);
也可以不用指定要插入的字段,直接插入数据即可
insert into job values("cxuan02","男",25,"2020-06-01","1995-04-23",12000);
这里就有一个问题,如果插入的顺序不一致的话会怎么样呢?
对于含可空字段、非空但是含有默认值的字段、自增字段可以不用在 insert 后的字段列表出现,values 后面只需要写对应字段名称的 value 即可,没有写的字段可以自动的设置为 NULL、默认值或者自增的下一个值,这样可以缩短要插入 SQL 语句的长度和复杂性。
比如我们设置一下 hiredate、age 可以为 null,来试一下
insert into job(name,sex,birthday,salary) values("cxuan03","男","1992-08-23",15000);
我们可以看到有一行两个字段显示 NULL。在 MySQL 中,insert 语句还有一个很好的特性,就是一次可以插入多条记录
INSERT INTO tablename (field1,field2) VALUES
(value1,value2),(value1,value2),
(value1,value2),
...;
可以看出,每条记录之间都用逗号进行分割,这个特性可以使得 MySQL 在插入大量记录时,节省很多的网络开销,大大提高插入效率。
更新记录
对于表中已经存在的数据,可以通过 update 命令对其进行修改,语法如下
UPDATE tablename SET field1 = value1, field2 = value2 ;
例如,将 job 表中的 cxuan03 中 age 的 NULL 改为 26,SQL 语句如下
update job set age = 26 where name = 'cxuan03';
SQL 语句中出现了一个 where 条件,我们会在后面说到 where 条件,这里简单理解一下它的概念就是根据哪条记录进行更新,如果不写 where 的话,会对整个表进行更新
删除记录
如果记录不再需要,可以使用 delete 命令进行删除
DELETE FROM tablename [WHERE CONDITION]
例如,在 job 中删除名字是 cxuan03 的记录
delete from job where name = 'cxuan03';
在 MySQL 中,删除语句也可以不指定 where 条件,直接使用
delete from job
这种删除方式相当于是清楚表的操作,表中所有的记录都会被清除。
DQL 语句
下面我们一起来认识一下 DQL 语句,数据被插入到 MySQL 中,就可以使用 SELECT
命令进行查询,来得到我们想要的结果。
SELECT 查询语句可以说是最复杂的语句了,这里我们只介绍一下基本语法
一种最简单的方式就是从某个表中查询出所有的字段和数据,简单粗暴,直接使用 SELECT
SELECT FROM tablename;
例如我们将 job 表中的所有数据查出来
select from job;
其中 是查询出所有的数据,当然,你也可以查询出指定的数据项
select name,sex,age,hiredate,birthday,salary from job;
上面这条 SQL 语句和 select from job
表是等价的,但是这种直接查询指定字段的 SQL 语句效率要高。
上面我们介绍了基本的 SQL 查询语句,但是实际的使用场景会会比简单查询复杂太多,一般都会使用各种 SQL 的函数和查询条件等,下面我们就来一起认识一下。
去重
使用非常广泛的场景之一就是 去重
,去重可以使用 distinct
关键字来实现
为了演示效果,我们先向数据库中插入批量数据,插入完成后的表结构如下
你会发现只有两个不同的值,其他和 25 重复的值被过滤掉了,所以我们使用 distinct 来进行去重
条件查询
我们之前的所有例子都是查询全部的记录,如果我们只想查询指定的记录呢?这里就会用到 where
条件查询语句,条件查询可以对指定的字段进行查询,比如我们想查询所有年龄为 24 的记录,如下
select from job where age = 24;
where 条件语句后面会跟一个判断的运算符 =
,除了 =
号比较外,还可以使用 「>、<、>=、<=、!=」 等比较运算符;例如
select from job where age >= 24;
就会从 job 表中查询出 age 年龄大于或等于 24 的记录
除此之外,在 where 条件查询中还可以有多个并列的查询条件,比如我们可以查询年龄大于等于 24,并且薪资大雨 8000 的记录
select from job where age >= 24 and salary > 8000;
多个条件之间还可以使用 or、and 等逻辑运算符进行多条件联合查询,运算符会在以后章节中详细讲解。
排序
我们会经常有这样的需求,按照某个字段进行排序,这就用到了数据库的排序功能,使用关键字 order by
来实现,语法如下
SELECT FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC] , field2 [DESC|ASC],……fieldn [DESC|ASC]]
其中 DESC 和 ASC 就是顺序排序的关键字,DESC 会按照字段进行降序排列,ASC 会按照字段进行升序排列,默认会使用升序排列,也就是说,你不写 order by
具体的排序的话,默认会使用升序排列。order by 后面可以跟多个排序字段,并且每个排序字段可以有不同的排序顺序。
为了演示功能,我们先把表中的 salary
工资列进行修改,修改完成后的表记录如下
下面我们按照工资进行排序,SQL 语句如下
select from job order by salary desc;
语句执行完成后的结果如下
这是对一个字段进行排序的结果,也可以对多个字段进行排序,但是需要注意一点
❝根据 order by 后面声名的顺序进行排序,如果有三个排序字段 A、B、C 的话,如果 A 字段排序字段的值一样,则会根据第二个字段进行排序,以此类推。
如果只有一个排序字段,那么这些字段相同的记录将会无序排列。
❞
限制
对于排序后的字段,或者不排序的字段,如果只希望显示一部分的话,就会使用 LIMIT
关键字来实现,比如我们只想取前三条记录
select from job limit 3;
上面这种 limit 是从表记录的第 0 条开始取,如果从指定记录开始取,比如从第二条开始取,取三条记录,SQL 如下
select from job order by salary desc limit 2,3;
limit 一般经常和 order by 语法一起实现分页查询。
❝注意:limit 是 MySQL 扩展 SQL92 之后的语法,在其他数据库比如 Oracle 上就不通用,我犯过一个白痴的行为就是在 Oracle 中使用 limit 查询语句。。。
</div>