数据库高级操作和回顾

新增数据

基本语法
insert into 表名 [(字段列表)] values (值列表);
在数据插入的时候,假设主键对应的值已经存在,插入一定会失败。

主键冲突
当主键存在冲突的时候,可以选择性的进行处理;更新好替换

主键冲突:更新操作
Insert into 表名 [(字段列表:包含主键)] values (值列表) on duplicate key update 字段=新值;

insert into test_class values(1,1);
insert into test_class values(1,2);

主键冲突:更新
insert into test_class values(1,2) on duplicate key update roomId=2;
在这里插入图片描述主键冲突:替换
replace into test_class values(2,4) ;

在这里插入图片描述数据新增:蠕虫复制

蠕虫复制:从已有的数据中去获取数据,然后将数据又进行新增操作;数据成倍的增加。

表创建高级操作:从已有表创建新表(复制表结构)

create table 表名 like 数据库.表名;

在这里插入图片描述只复制结构,不复制数据。
蠕虫复制:先查出数据,然后将查出的数据新增一遍。
insert into 表名 [(字段列表)] select 字段列表/* from 数据表名;

例如: insert into copy select * from cc;
在这里插入图片描述蠕虫复制的意义
1、从已有表拷贝数据到新表中
2.可以快速让表中的数据膨胀到一定的数量级;测试表的压力以及效率。

更新数据
update 表名 set 字段=值 [where条件]

新增高级语法
update 表名 set 字段=值 [where条件] [limit更新数量]
例如:update copy set name=3 where name=1 limit 3;
在这里插入图片描述
删除数据
与更新类似:可以通过limit限制数量
delete from 表名 [where条件][limit条件]
例如 delete from copy where name=3 limit 2;

在这里插入图片描述
思路:数据的删除是不会改变表的结构,只能删除表后重建表。
truncate 表名
清空表:重置自增长

查询数据
基本语法
select 字段列表/* from 表名 [where条件]

完整语法
select [select 选项] 字段列表[字段别名] /* from 数据源 [where条件子句][group by 子句] [having 子句] [order by 子句] [limit 子句];

select选项
select选项:select对查出来的结果的处理方式
All:默认的,保留所有的结果
Distinct 去重,查出来的结果,将重复的给去除(所有字段都相同)

在这里插入图片描述select (distinct 字段列表),别的字段

字段别名
字段别名:当数据进行查询出来的时候,有时候名字并不一定就满足需求(多表查询的时候,会有同名字段),需要对字段名重新命名:别名

语法
字段名 [as] 别名;

select
stuId as 学号,
stuName as 姓名,
sex 性别 from test_student;
在这里插入图片描述有无as都可以。

数据源
数据源:数据的来源,关系型数据库的来源都是数据表,本质上只要保证数据类似二维表,最终都可以作为数据源。
数据源分为多种:单表数据源,多表数据源,查询语句
单表数据源:select * from 表名
多表数据源:select * from 表1,表2;
在这里插入图片描述从一张表中取出一条记录,去另外一张表中匹配所有记录,而且全部保留:(记录数和字段数),将这种结果称为:笛卡尔积(交叉连接):笛卡尔积没什么用,尽量避免。

子查询:数据的来源是一条查询语句(查询语句的结果是二维表)
select * from (select 语句) as 表名;

select * from (select * from test_student) as s;
在这里插入图片描述Where 子句
Where 子句:用来判断数据,筛选数据。

where子句返回结果:0或者1,0代表false,1代表true.
判断条件:比较运算符 >,<,>=,<=,!=,<>,=,like,between and,in,not in
逻辑运算符:&&(and),||(or),!(not)

where原理:where是唯一一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘取出一条记录,开始进行where判断;判断的结果如果成立保存到内存,如果失败直接放弃。

rand 0-1之间的随机数,floor向下取整
update test_student set age=floor(rand()*20+20),height=floor(rand()*20+170);

在这里插入图片描述条件查询1:要求找出学生id为1,3的学生
select * from test_student where stuId=1 || stuId=3;
或 select * from test_student where stuId in(1,3);

在这里插入图片描述条件查询2:找身高在180到190之间的学生
select * from test_student where height >= 180 and height <= 190;
select * from test_student where height between 180 and 190;

在这里插入图片描述between本身是闭区间;between左边的值必须小于或者等于右边的值。
例如:select * from test_student where height between 190 and 180;
在这里插入图片描述所有条件都满足:
select * from test_student where 1;

在这里插入图片描述
Group by 子句
Group by:分组的意思,根据某个字段进行分组(相同的放一组,不同的分到不同的组)

基本语法:group by 字段名
例如:根据性别分组
select * from test_student group by sex;
在这里插入图片描述分组的意义:是为了统计数据(按组统计:按分组字段进行数据统计)
sql提供了一系列统计函数
count():统计分组后的记录数;每一组有多少记录
max(): 统计每组中最大的值
min():统计最小值
avg(): 统计平均值
sun(): 统计和
分组统计:身高高矮,年龄平均和总年龄
select sex,count(*),max(height),min(height),avg(age) sum(age) from test_student group by sex;

在这里插入图片描述count()函数:统计记录数,可以使用两种参数,*代表统计记录,字段名代表统计对应的字段(null不统计)

在这里插入图片描述分组会自动排序:根据分组字段,默认升序。
group by 字段 [asc|desc]; --对分组的结果然后合并之后的整个结果进行排序。

在这里插入图片描述多字段分组:先根据一个字段进行分组,然后对分组的结果再次按照其他字段进行分组。

alter table test_student add c_id int;
update test_student set c_id=ceil(rand3);
insert into test_student values(4,‘王五’,‘女’,24,170,2);
select c_id,sex,count(
) from test_student group by c_id,sex;

先班级,后男女
在这里插入图片描述有一个函数:可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段);
group_concat(字段);

在这里插入图片描述回溯统计: with rollup :任何一个分组后都会有一个小组,最后都需要向上级分组进行汇报统计;根据当前分组的字段,这就是回溯统计:回溯统计的时候会将分组字段置空。

select c_id,count(*) from test_student group by c_id with rollup;

在这里插入图片描述
select c_id,sex,count(*) from test_student group by c_id,sex,with rollup;

在这里插入图片描述多字段回溯:考虑第一层分组会有此回溯;第二次分组要看第一次分组的组数,组数是多少,回溯就是多少,然后加上第一层的回溯即可。

Having 子句
Having 子句:与where子句一样:进行条件判断的。
where是针对磁盘数据进行判断,进入到内存之后,会进行分组操作;分组结果需要having 来处理。
Having能做where能做的几乎所有事情,但是where却不能做having能做的所有事情。

1、分组统计的结果或者说是统计函数只有having能够使用

求出所有班级人数大于等于2的学生人数
select c_id,count() from test_student group by c_id hacing count ()>=2;
select c_id,count() from test_student where count() >= 2 group by c_id ;–错误
在这里插入图片描述2、having 能够使用字段别名;where不能;where是从磁盘中取数据,而名字只可能是字段名,别名是在字段进入到内存后才会产生。

select c_id,count() as total from test_student group by c_id having total>=2;
select c_id ,count(
) as total from test_student where total >= 2 group by c_id ;

在这里插入图片描述select stuName as 名字,stuId 学号 from test_student having 名字 like ‘张%’;
select stuName as 名字,stuId 学号 from test_student where 名字 like ‘张%’;–错误
在这里插入图片描述Order by子句

Order by子句:排序,根据某个字段进行升序或者降序排序,依赖校对集。
使用基本语法:
order by 字段名 [asc|desc];–asc是升序(默认),desc是降序

select * from test_student group by c_id;
select * from test_student order by c_id;

在这里插入图片描述排序可以进行多字段排序:先根据某个字段进行排序,然后排序好的内容,再按照某个数据进行再次排序。

多字段排序,先班级,后性别
select * from tese_student order by c_id,sex desc;
在这里插入图片描述Limit子句
Limit子句:是一种限制结果的语句:限制数量
limit 有两种使用方式
1、方案一:只用来限制长度(数据量):limit 数据量;
查询学生:前两个
select * from test_student limit 2;
在这里插入图片描述2、方案二:限制起始位置,限制数量:limit 起始位置,长度;
查询学生:前两个

select * from test_student limit 0, 2;–记录数从0开始编号

select * from test_student limit 1,2;–记录数从1开始编号
在这里插入图片描述
limit方案2主要用来实现数据的分页:为用户节省时间,提交服务器的响应效率,减少资源的浪费。
对于用户来讲:可以点击的分页按钮:1,2,3,4
对于服务器来讲:根据用户选择的页码来获取不用的数据 :limit offset,length;

length:每页显示的数据量:基本不变;

Offset :offset=(页码-1)*每页显示量

回顾

列属性:主键,自增长,唯一键
关系:一对一,一对多和多对多
范式:三层范式
1NF:字段必须符合原子性
2NF:不存在部分依赖(没有复合主键)
3NF:不存在传递依赖(实体单独建表)
逆规范化:效率与磁盘空间的博弈

高级数据操作
新增操作:主键冲突(更新和替换),蠕虫复制
更新操作:限制更新数量:limit
删除操作:限制删除数量:limit,清空表(truncat)
查询操作:select 选项,字段别名,数据源(单表,多表和子查询[别名]),where子句(条件判断:从磁盘),group by子句(分组统计,统计函数,分组排序,多字段分组,回溯统计),having 子句(判断结果,针对分组统计结果),order子句(排序,多字段排序),limit(限制记录数,分页)

猜你喜欢

转载自blog.csdn.net/weixin_44097082/article/details/94866696