初识mysql关于DML与DQL(每日笔记)
DML: 增删改表中数据
-
添加数据:
-
语法
insert into 表名 (列名1,列名2,....列名n) values (值1,值2,...值n);
-
注意:
-
列名和值必须一一对应
-
如果表名后不定义列名,则默认给所有列添加值
insert into 表名 values (值1,值2,...值n);
-
除了数字类型,其他类型需要使用(单双)引号引起来
-
-
-
删除数据
-
语法:
delete from 表名 [where条件]
-
注意:
- 如果不加条件,则删除表中所有记录
- 如果要删除所有记录
- delete from 表名; --不推荐使用,有多少记录就会执行多少次delete操作,效率比较低
- truncate table 表名;
- truncate是整体删除(速度较快), delete是逐条删除(速度较慢)。
- truncate不写服务器log,delete写服务器log,也就是truncate效率比delete高的原因。
- truncate不激活trigger(触发器),但是会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。而delete删除以后,Identity依旧是接着被删除的最近的那一条记录ID加1后进行记录。
-
DML语句(增删改表中数据)
添加语句:关键词 insert into
insert into 表名 (列名1,列名2,列名3....)]values (值1,值2,值3...)
注意:列名可写可不写 ,如果不写需要将所有列名添加数据,如果需要对指定列名添加数据,则必须写出列名
insert into也可以同时添加多条数据,使用逗号隔开
insert into 表名 (列名1,列名2,列名3....)]values (值1,值2,值3...),(值1,值2,值3...)
若我希望插入的数据是另一张表中的所有数据
insert into 此表 (列名1,列名2...) select (对应列名1,对应列名2...) from 另一张表
此表中的列名部分语句可以添加可以不添加
如果插入的数据是整张表的每一个字段,那么会按照字段顺序依次插入,
如果插入的字段不是整个表中的字段数,那么需要指定对应的字段名称
修改语句: update
update 表名 set 列名 = 值 限定条件
-- 限定条件可以用where 列名 = 值
注意 where 中可以添加运算符
运算符 | 含义 | 范例 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5!=6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于等于 | 5>=6 | false |
<= | 小于等于 | 5<=6 | true |
BETWEEN | 在某个范围之间 | BETWEEN 5 AND 10 | - |
AND && | 并且 | 5>1AND1>2 | false |
OR || | 或 | 5>1OR1>2 | true |
删除表中数据:delete from/truncate
能删除一行,也可以删除全部数据,但是能不能删除表结构,同时也不能可以改变计数器(auto_increment)
delete from 表名
delete from 表名 where 条件
truncate 只能整张表删除,同步不会改变表结构,但是可以重置计数器
我们学习过一个删除: drop 可以删除表结构
速度上面说 :drop > truncate > delete
Truncate table 表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放, 相当于drop了整张表又创建一个新的且与之相同的表结构
DQL语句(查询表中的数据)
查询语句:关键字 select
select * from 表名
-
语法:
select 字段列表 from 表名列名 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
-
基础查询
-
多字段的查询
select 列名1,列名2,...from 表名;
注意:如果查询所有,可以使用*来代替字段列表
-
去除重复:关键词 distinct
select distinct 列名1,列名2,...from 表名;
-
计算列:例如计算student 表中math与English 成绩之和
select name,math,english,math + english from student; -- 注意如果字段的值为null,可以使用ifnull关键词 select name,math,english,ifnull(math,0) + ifnull(english,0) from student;
注意:
一般可以使用四则运算计算一些列的值.(一般只会进行数值类型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
- 表达式1:哪个字段需要判断是否为null
- 表达式2:如果该字段为null后的替换值
-
起别名
select 列名1,列名2,...from 表名 as 新名字; -- as可以省略
-
-
条件查询
-
where子句后跟条件
-
运算符
-
>,<,<=,>=,=,<>
select * from 表名 where 列名[>,<,<=,>=,=,<>]条件值
-
between...and:在..之间
select * from student where age between 10 and 20
-
like:模糊查询
select * from student where name like '%张%' -- 表示查询名字中带有'张'这个字符
占位符:
- _ :表示单个的占位符
- % :表示多个占位符
-
in(集合)
select * from student where age between 10 and 20
-
is null
注意:null不可以用
>,<,<=,>=,=,<>
进行判断,可以使用 is null /is not null -
and或&&
表示查询多个条件都满足
-
or或||
表示查询多个条件中满足一个即可
-
not或!
表示查询列名不为某个值, 一般情况下用作 not null
-
-
-
排序查询
-
语法:order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2,... select * from student order by age
-
排序方式:
-
ASC:升序,默认的 如果不写排序方式就是默认
-
DESC:降序
select * from student order by age desc
-
-
-
聚合函数:将一页数据作为一个整体,进行纵向的计算
- count:计算个数
- max:计算最大值
- min:计算最小值
- sum:求和
- avg:计算平均值
-
分组查询
-
语法:group by 分组字段;
-- 按照性别分组,分别查询男女同学的平均分 select sex,avg(math) from student group by sex;
-
注意:
- 分组之后查询的字段:分组字段,聚合函数
- where和having的区别?
- where在分之前进行限定,如果不满足条件,则不参与分组. having在分组之后限定,如果不满足结果,则不会被查询出来
- where后不可以跟聚合函数,having可以进行聚合函数的判断
-
-
分页查询
- 语法:limit 开始的索引,每页查询的条数;
- 公式:每页开始的索引 = (当前的页码 - 1) * 每页显示的条数
- limit的分页操作是mysql的一个"方言"