更新数据
- 基本语法
update 表名 set 字段 = 值[,字段2=值] [where 条件] - 高级新语法(限制数量)
update 表名 set 字段 = 值[,字段2=值] [where 条件][limit 更新数量]
update my_copy set name = 'c' where name = 'a' limit 3; -- 更新记录中含有name= a的前三条
删除数据
- 普通删除
delete from 表名 [where 条件]; - 限制删除
delete from 表名 [where 条件] limit 记录数;
delete from my_copy where name = 'a' limit 10; -- 删除前10条
- 在删除场景中,如果表中主键存在自增长,当记录删除后,自增长不会还原。
思路:请空表,充值自增长
数据删除不会影响表结构,只能删除表后重建表
truncate 表名; -- 先删除,后新增改变
查询数据
- 基本语法
select 字段列表/* from 表名[where 条件]; - 完整语法
select [select 选项] 字段列表[字段别名]/* from 数据源 [where 条件子句] [group by 条件子句] [having 条件子句] [order by 条件子句] [limit 条件子句]
(1) select 选项 :
select 对查出结果的处理方式:
- all:默认选项,保留所有结果
- distinct :去重,(两条记录的所有字段相同)
(2)字段别名
当查询数据时,字段的名字并不一定能满足需求(尤其是多表查询时,会出现同名字段)所以需要对字段名进行重命名。
语法:
字段名 as 别名
select id,number as 学号,name as 姓名, sex as 性别 from my_student;
(3) 数据源
数据源即数据库中的表,只要结构上构成二维表,都满足数据源的要求。有三种来源:
单表数据源,多表数据源,查询语句
- 单表数据源
select * from 表名
- 单表数据源
select * from 表名1,表名2,表名3...
- 查询语句
因为查询语句也是二维表结构
select * from (select 语句) as 表名
SELECT * FROM (select * from
banner_item)as item
(4)where 子句
用来判断和筛选数据,where 子句返回的结果:0或者1,没有bool 类型,0代表false ,1代表true。
where 1代表匹配所有条件都成立
- 判断条件:
比较运算符:> ,< ,>=,<=,!=, <>(不等于),=,like,between and,in,not in
逻辑运算符:&& ,||,!
where原理:where语句是唯一一个在磁盘获取数据就开始判断的条件,判断如果符合条件,则将数据放到内存。
select * from my_student where id = 1 || id = 3 || id =5;
select * from my_student where id in(1,3,5)
select * from my_student where height >= 170 && height <= 180;
select * from my_student where height between 170 and 180;
PS :between 是区间值,左边的值一定要小于等于右边的值
(5)group by
分组的意思,根据某个字段分组,相同的分到同一组
基本语法:group by 字段名
分组的意义是为了统计数据(按组统计:按分组字段进行统计);
分组一般和统计函数一起使用
SQL 提供了一系列的统计函数:
count():统计分组后的记录数,每一组有多少记录
count()有两种参数,count(*)代表统计记录,count(字段名)代表统计对应的字段,但记录中有null的 不统计。
max():统计每组中的最大值
min():统计每组中的最小值
avg():统计平均值
sum():统计和
统计商品中推荐产品总数:
- 单字段分组
SELECT recommend, COUNT(*) FROM `product` GROUP BY `recommend` ;
SELECT recommend, COUNT(*),sum(`price`) ,max(`stock`) ,min(stock),avg(`price`) FROM `product` GROUP BY `recommend` ;
- 多字段分组
SELECT `class_id` ,`sex` ,COUNT(*) FROM `student` GROUP BY `class_id` ,`sex` ;
-- 先按班级分组,再按性别分组
SELECT `class_id` ,`sex` ,COUNT(*),group_concat(name) FROM `student` GROUP BY `class_id` ,`sex` ;
-- group_concat 函数可以将结果中的某个字段进行字符串连接
- 回溯统计 with rollup
任何一个分组后,都会有一个小组。最后都需要向上级根据分组字段汇报统计结果。
SELECT `class_id` ,COUNT(*) FROM `student` GROUP BY `class_id` with rollup ;
屏幕快照 2017-08-08 下午12.27.52.png
(6)having 子句
与where子句一样,进行条件判断。
where子句是针对磁盘数据进行判断,在数据进入内存后,进行了一些诸如分组操作后,分组的结果就需要having子句来处理。
having几乎能做where的所有操作。但having能做的有些处理,where却不能。具体表现如下:
1.having 能做分组后的统计操作,where却不能,因为统计函数是内存级别,where操作的数据还在磁盘中
SELECT `recommend` , COUNT(*) FROM `product` GROUP BY `recommend`
-- 选出商品是否推荐的分组
屏幕快照 2017-08-08 下午3.36.23.png
SELECT `recommend` , COUNT(*) FROM `product` GROUP BY `recommend` HAVING COUNT(*) >8
-- 选出推荐商品和非推荐商品中大于8的商品个数
屏幕快照 2017-08-08 下午3.39.16.png
SELECT `recommend` , COUNT(*) FROM `product` WHERE COUNT(*) >8 GROUP BY `recommend`
-- 错误
屏幕快照 2017-08-08 下午3.45.05.png
2.having 能使用字段别名,而where不能
SELECT `recommend` , COUNT(*) as total FROM `product` GROUP BY `recommend` HAVING total >8
(7) order by
排序 根据某个字段进行升序或者降序排序。依赖于校对集,有校对集判断是否区分大小写等等
使用语法:order by 字段名 [asc|desc] -- 默认asc 升序
SELECT * FROM `product` ORDER BY `stock`
排序也可以多字段排序,先按一个字段排,再次基础再进行排序
SELECT * FROM `product` ORDER BY `recommend` DESC ,`stock`
(8) limit
limit 是一种限制数量的语句
limit有两种方式:
- 只用来限制长度
SELECT * FROM `product` LIMIT 10
- 限制起始位置
语法:limit 起始位置,长度
SELECT * FROM `product` LIMIT 0 ,10
SELECT * FROM `product` LIMIT 10 ,10
limit 常用于数据分页
网友评论