Mysql数据操作指令

-----多数据插入-----
只要写一次insert指令,但是可以直接插入多条记录
insert into table values(),(),();

主键冲突
我们插入值的时候,主键中已经存在某个值,插入重复值引起主键冲突
两种解决方案
1. 主键冲突更新 duplicate key--主键冲突
类似插入数据语法,如果插入的过程中主键冲突,那么采用更新方法
#insert into 表名 [(字段列表)] values(值列表) on duplicate key update 字段 = 新值;
eg: insert into my_student values('stu0004','小婷') on duplicate key update stu_name = '小婷';
2. 主键冲突替换
当主键冲突之后,干掉原来的数据,重新插入进去
Replace into [(字段列表)] values(值列表);
判断->干掉->插入

蠕虫复制
一分为二,成倍增加,从已有的数据中获取数据,并且将获取到的数据插入到数据表中
#insert into 表名[(字段列表)] select */字段列表 from 表;
注意:
1. 蠕虫复制的确通常是重复数据,没有太大业务意义,可以在短期内快速增加表的数据量,从而可以测试表的
压力,还可以通过大量数据来测试表的效率(索引)
2. 蠕虫复制虽好,但时要注意主键冲突


---------高级查询---------
完整的查询指令:
#select select 选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 限制;

Select 选项:系统该如何对待查询得到的结果
ALL:默认的,表示保存所有的记录
Distinct:去重,去除重复的记录,只保留一条(所有字段都相同)

字段列表:有的时候需要从多张表获取数据,在获取数据的时候,可能存在不同表中有同名字段,需要将同名的字段命名成不同命的:
利用别名 alias
语法: 字段名 [as] 别名

数据源:from后面根的数据不是一个实体表,而是一个从表中查询出来得到的二维结果表(子查询)
基本语法:from(select 字段列表 from 表) as 别名
eg:select * from (select int_1,int_8 from my_int) as int_my;

where:条件筛选

group by:根据指定字段,对数据分组,分组目标为了统计
如果只想看数据显示,那么group by没什么含义:group by将数据按照指定的字段分组之后,只会保留每组的第一条记录
统计函数(聚合函数):
count():统计每组中的数量,如果统计目标是字段,那么不统计为空Null字段,如果为count(*)就代表统计记录
avg():平均数
sum():求和
max():最大值
min():最小值
Group_concat():为了将分组中指定的字段进行合并(字符串拼接)

group by多分组:将数据按照某个字段进行分组之后,对已经分组的数据进行再次分组
#基本语法:group by 字段1,字段2;//先按照字段1进行排序,之后将结果在按照字段2进行排序,以此类推
eg:select class_id,gender,count(*),group_concat(stu_name) from my_student group by class_id,gender;
分组排序:
在MySQL中,分组默认有排序的功能:按照分组字段进行排序,默认是升序
基本语法:group by 字段[asc|desc],
eg:select class_id,gender,count(*),group_concat(stu_name) from my_student group by class_id asc,gender desc;
回溯统计:当分组进行多分组之后,往上统计的过程中,需要进行层层上报,将这种层层上报统计的 过程称之为回溯统计:每一次分组向上统计
的过程都会产生一次新的数据,而且当前数据对应的分组字段为NULL
基本语法:group by 字段[asc|desc] with rollup;//向上滚动
大致就是将每次向上回滚的数据进行统计展示 字段是null

Having子句:本质和where一样,是用来进行数据条件筛选
1. Having是在group by子句之后:可以针对分组数据进行筛选,但是where不行(顺序)
2. having在group by 分组之后,可以使用聚合函数或者字段别名
eg:select class_id,count(*) as number from my_student group by class_id having number >=4;
eg:select class_id,count(*) as number from my_student group by class_id having count(*) >=4;
五子句都可以存在,但是必须要按照顺序,Where能做的Having都可以做,但是having是在group by之后进行操作的
强调:having是在group by之后,group by是在where之后:where的时候表示将数据从磁盘拿到内存,where之后的所有操作都是内存操作

Order by子句:
根据校对规则对数据进行排序
基本语法:order by字段 [asc|desc]
-- 班级学生按照身高排序
select * from my_student order by stu_height asc;
order by 也可以像group by一样进行多字段排序,先按照第一个字段进行排序,然后再按照第二个字段进行排序
order by 字段1 规则,字段2 规则;

limit子句:
limit限制子句:主要是用来限制记录数量获取
记录数限制:纯粹限制获取的数量,从第一条到指定的数量
基本语法:limit 数量;
分页:
利用limit来限制获取指定区间的数据
基本语法:limit offset,length;//offset偏移量:从哪开始,length就是具体获取多少条记录
MySQL中记录的数量从0开始
limit 0,2;//表示获取前两条记录
--分页获取数据
select * from my_student limit 0,2;
select * from my_student limit 2,2;//这个取到的是第三条和第四条记录
注意:limit后面的length表示最多获取对应数量,但是如果数量不够,系统不会强求(记录不够就有多少拿多少,不报错)

原文地址:https://www.cnblogs.com/lszbk/p/12312639.html