六天带你玩转mysql数据库-- 第三天笔记(下)

数据的高级操作:

数据操作:增删改查

新增数据:

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

在这里插入图片描述
主键冲突:

当主键存在冲突的时候(Duplicate  key),可以选择性的进行处理,更新和替换。
主键冲突:更新操作
insert  into  表名  [(字段列表:包含主键)]  values(值列表) on   duplicate  key   update 字段 = 新值;
-- 插入数据
insert into my_class values('php0810','B203');
select * from my_class;
-- 发现插入错误重新插入
insert into my_class values('php0810','B205');
-- 冲突处理
insert into my_class values('php0810','B205') on duplicate key update room = 'B205';
select * from my_class;

在这里插入图片描述

主键冲突:替换

replace  into  表名  [(字段列表:包含主键)]  values(值列表);

在这里插入图片描述

蠕虫复制:

蠕虫复制:从已有的数据中获取数据,然后将数据又进行新增操作:数据成倍的增加。
表创建高级操作:从已有表创建新表(复制表结构)
create  table   表名  like   数据库.表名;

在这里插入图片描述

蠕虫复制:先查出数据,然后将查出的数据新增一遍。
insert  into  表名[(字段列表)]   select   字段列表/*  from   数据表名;
-- 先查看数据
select * from my_collate_bin;
select * from my_gbkcopy;
-- 蠕虫复制
insert into my_gbkcopy select * from my_collate_bin;
-- 查看是否复制成功
select * from my_gbkcopy;
-- 成倍增加
insert into my_gbkcopy select * from my_gbkcopy;
select * from my_gbkcopy;

在这里插入图片描述
在这里插入图片描述

总结:蠕虫复制的意义
1.从已有表拷贝数据到新表中。
2.可以迅速的让表中的数据膨胀到一定的数量级,测试表的压力和效率。

更新数据:

基本语法:
update  表名   set  字段 = 值 [where  条件];
高级新增语法:
update  表名   set  字段 = 值[where  条件][limit   更新数量];
-- 更新部分a变成c
update my_gbkcopy set name = 'c' where name = 'a' limit 3;
-- 查看
select * from my_gbkcopy; 
-- 这时候可以看到前三个a和A被换成了c,因为我们从my_collate_bin
-- 中只是复制了数据而已,并不区分大小写
-- 查看创建表语句
show create table my_gbkcopy;

在这里插入图片描述
在这里插入图片描述

删除数据:

删除数据与更新类似,可以通过limit限制数量。
delete   from  表名  [where 条件][limit  数量];
-- 删除数据:限制记录数为10
delete from my_gbkcopy where name = 'b' limit 10;
select * from my_gbkcopy;

在这里插入图片描述

删除:如果表中存在主键自增长,那么当删除之后,自增长不会还原。

在这里插入图片描述

思考:数据的删除是不会改变表结构,只能删除表后重建表
Truncate   表名;   -- 先删除改变,再新增改变
-- 清空表:重置自增长
truncate my_student;

在这里插入图片描述

查询数据:

基本语法:
select  字段列表/*  from  表名  [where  条件];
完整语法:
select   [select   选项]   字段列表[字段别名]/*    from   数据源   [where  条件子句][group   by  子句][having  子句]
[order  by  子句][limit  子句];
select  选项:select对查出来的结果的处理方式
	All:默认的,保留所有结果
	Distinct:去重,查出来的结果,将重复的去除(所有字段都相同)
-- select选项
select * from my_gbkcopy;
select all * from my_gbkcopy;
-- 去重
select distinct * from my_gbkcopy;

在这里插入图片描述

字段别名:

字段别名:当数据进行查询出来的时候,有时候名字并不一定就满足要求(多表查询的时候,会有同名字段),需要对
字段名进行重命名:别名。
语法:字段名  [as]    别名;
-- 插入数据
insert into my_student values(null,'itcast0001','zs','男'),
(null,'itcast0001','zsa','男'),
(null,'itcast0004','zss','女'),
(null,'itcast0003','zsd','男'),
(null,'itcast0002','zsw','男');

-- 字段别名
select id,
number as 学号,
name as 姓名,
sex 性别 from my_student;

在这里插入图片描述

数据源:数据的来源,关系型数据库的来源都是数据表,本质上只要保证数据类似二维表,最终都可以作为数据源。
数据源分为多种:单表数据源,多表数据源,查询语句
单表数据源:select    *    from   表名;

在这里插入图片描述

多表数据源:

select   *   from   表名1,表名2;
-- 多表数据源
select * from my_student,my_class;
从一张表中取出一条记录去另外一张表中匹配所有记录,而且全部保留(记录数和字段数)将这种结果称之为笛卡尔积。
笛卡尔积称为交叉连接,没有什么用,所以应该尽量避免。

在这里插入图片描述

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

在这里插入图片描述

where 子句

where  子句:用来判断筛选数据;where子句返回两种结果:0或者1,0代表false,1代表true。
判断表达式:比较运算符:>,<,>=,<=,!=,<>表示不等于,=,like,between,and,in/not in
逻辑运算符:&&(and),||(or),!(not)
where原理:where是唯一一个直接从磁盘获取数据的时候就开始判断的条件:从磁盘取出一条记录开始进行where判断,判断
的结果如果成立保存到内存,如果失败就放弃。
-- 增加一个age和height字段
alter table my_student add age tinyint unsigned;
alter table my_student add height tinyint unsigned;
select * from my_student;
-- 增加值:rand取得一个0到1的随机数,floor向下取整
update my_student set age = (rand() * 20 + 20),height = floor(rand() * 20 + 170);
select * from my_student;

在这里插入图片描述

条件查询1:要求找出学生ID为1,3,5的学生
-- 条件查询1:要求找出学生ID为1,3,5的学生
select * from my_student where id = 1 || id = 3 || id = 5; -- 逻辑判断
select * from my_student where id in (1,3,5);  -- 落在集合中

在这里插入图片描述

条件查询2:查出区间落在180-190之间的学生:
-- 找出身高在180-190之间的学生
select * from my_student where height > 180 and height < 190;
select * from my_student where height between 180 and 190;
这里需要注意between和and之间的数值左边的一定要比右边的小。

在这里插入图片描述

select  *  from  my_student  where   1;    -- 所有结果都满足

在这里插入图片描述

group by 子句:

group by:分组的意思,根据某个字段进行分组(相同的放一组,不同的放到不同的组)
基本语法:group  by  字段名;
分组的意义在于为了统计数据(按组统计,按分组字段进行数据统计)
SQL提供了一系列统计函数
count():统计分组后的记录数:每一组有多少个记录
max():统计每组中的最大值
min():统计每组中的最小值
avg():统计每组的平均值
sum():统计每组的和
-- 分组统计:身高高矮,年龄平均,和
select sex,count(*),max(height),min(height),avg(age),sum(age) from my_student group by sex; 

在这里插入图片描述

count()函数:里面可以使用两种参数:*代表统计记录,字段名代表统计对应的字段(null不统计)
-- 分组统计:身高高矮,年龄平均,和
select sex,count(*),max(height),min(height),avg(age),sum(age) from my_student group by sex; 
select sex,count(*),count(age),max(height),min(height),avg(age),sum(age) from my_student group by sex;

在这里插入图片描述

很明显可以看出来统计的时候男的在前,是什么问题呢?

原因在于分组会自动排序,根据分组字段默认升序。
男的拼音nan在女的拼音nv前面导致统计男的在前。

在这里插入图片描述

测试:

设定升降序:
group   by   字段   [asc|desc];    -- 对分组的结果进行合并然后排序

在这里插入图片描述

多字段分组:先根据一个字段进行分组,然后再根据分组的结果再次根据某个字段进行分组。
准备一个数据表进行实验:

在这里插入图片描述

-- 多字段分组
select c_id,sex,count(*) from my_student group by c_id,sex; -- 多字段排序

在这里插入图片描述

有一个函数可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段)
group_concat(字段);

在这里插入图片描述

回溯统计:with rollup

任何一个分组后的结果都有一个小组,最后都需要向上级分组进行汇报统计:根据当前分组的字段,这就是回溯统计。
回溯统计的时候会将分组字段置空。
-- 统计
select c_id,count(*) from my_student group by c_id;
-- 回溯统计
select c_id,count(*) from my_student group by c_id with rollup;

在这里插入图片描述

多字段回溯:考虑第一层分组会有此回溯:第二次分组要看第一次分组的组数,组数是多少回溯就是多少,然后加上第一层回溯即可。
-- 多字段分组回溯统计
select c_id,sex,count(*),group_concat(name) from my_student group by c_id,sex;
select c_id,sex,count(*),group_concat(name) from my_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 my_student group by c_id having count(*) >= 2;
如果使用where的话得放在分组之前,那么分组就是无效的

在这里插入图片描述

2.having能够使用字段别名:where不能,where是从磁盘读取数据,而名字只可能是字段名,别名是在字段进入内存之后才会产生。
select c_id,count(*) as xfl from my_student group by c_id having xfl >= 2;

在这里插入图片描述
在这里插入图片描述

order by子句:

order  by:排序,根据某个字段进行升序或者降序,依赖于校对集
使用基本语法:
order  by   字段名  [asc|desc];   -- asc是升序(默认的排序方式),desc是降序
-- 排序
select * from my_student order by c_id;

在这里插入图片描述

多字段排序:先根据某个字段进行排序,然后根据排序好的字段再按照某个数据进行再次排序。第二字段排序是根据
第一字段排序的结果,不会导致第一字段排序的结果混乱。
-- 多字段排序
select * from my_student order by c_id,sex desc;
select * from my_student order by c_id,sex;    -- 进行对比

在这里插入图片描述

limit 子句:

limit  子句:是一种限制结果的语句,限制数量但不局限于限制数量。
limit有两种使用方式:
1.只用来限制长度(数据量):limit   数据量;
-- 查询学生:前两个
select * from my_student limit 2;

在这里插入图片描述

2.限制起始位置,限制数量:limit   起始位置,长度;     -- 从指定的位置开始往后找数据
这种方式主要用来实现数据的分页:当数据量很大的时候很好处理数据,分页的效果为用户节省时间,
提交服务器的响应效率,减少资源的浪费:
对于用户来讲:可以点击分页按钮:1,2,3,4
对于服务器而言:根据用户选择的页码来获取不同的数据:limit  offset,length;
length:每页显示的数量:基本不变
offset:offset = (页码 - 1) * 每页显示量

-- 查询学生:前两个
select * from my_student limit 0,2;  -- 记录数从0开始编号
select * from my_student limit 2,2;
select * from my_student limit 4,2;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/83715472