美文网首页
mysql 表数据高级操作

mysql 表数据高级操作

作者: 陈智涛 | 来源:发表于2017-08-07 20:14 被阅读0次

更新数据

  • 基本语法
    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 * frombanner_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 常用于数据分页

相关文章

网友评论

      本文标题:mysql 表数据高级操作

      本文链接:https://www.haomeiwen.com/subject/jaoalxtx.html