MySQL-9复杂操作-查询
1.数据查询
基本语法select 字段列表/* from 表名 [where 条件];
完整语法select [select 选项] 字段列表 [字段别名] / * from 数据源 [where 条件子句][group by 子句] [having 子句] [order by 子句] [limit 子句];
--1.select选项 :select 对产出来的结果的处理方式
all(默认),保留所有的结果 select * from 表名 === select all * from 表名
destinct,去重 查出来的结果,将重复给去除(只发生在所有字段都相同的情况下)
distinct 的使用2.字段别名 :当数据进行查询时,有时候名字并不一定满足需求(多表查询是,会有同名字段),需要对字段名进行重命名 :既别名
--1.as :字段名 as 别名
--2.字段名 别名
添加查询时添加别名的两种方式3.数据源
数据源即为 数据来源,关系行数据库的来源都是数据表:本质上只要保证数据类似二维表,都可以作为数据源
数据源 分为多种,既单表数据源、多表数据源、查询语句
--1.单表数据源:select * from 表名
--2.多表数据源:select * from 表名1,表名2,表名3...........;
表1 my_default 7条数据 表2 king_class 2条数据select * from 表1,表2;
多表数据源 14条数据从一张表中 取出一条记录,去另外一张表中匹配所有记录,且全部保留:(记录数和字段数),将这种结果 称之为笛卡尔集 既一种交叉连接
笛卡尔集一般并没有什么卵用,耗费相当多资源 ,需要尽量避免出现笛卡尔集
--3.子查询 数据的来源是一条查询语句(查询语句的结果是一张二维表)
select * from (select 语句) as 表名 ; 相当于将括号内select 语句 的查询结果起一个别名(as 表名)
子查询1 子查询24.where 子句
where 子句用来判断数据,筛选数据
where 子句返回结果 0或者1 false or true
基本运算符:> ,< ,>= 等等
逻辑运算符:&&(and),|| (or) ,! (not)
模糊查询 :like , %表示任意多个字符 ,_表示一个任意字符
select * from students where name like '黄%' (表示查询姓黄的学生)
select * from students where name like '黄_' (查询姓黄并且名字是一个字的学生)
select * from students where name like “黄%” or name like "%静" (查询姓黄或叫静的学生)
范围查询:between .......and..........(在...区间)(当存在多个and 时 ,将优先匹配between and),in/not in
where 是唯一一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘取出一条记录,则开始进行where 判断,判断结果成立则加载进内存,如果不成立则放弃(从源头保证尽可能避免的无效数据占用内存);而其他的判断,都是后期对内存进行的判断
--1.集合 in( )
利用多个或找出符合条件的数据 利用集合in ( ) 完成查找--2.between A and B (在 A 到 B 之间)
其中 between 本身是闭区间 且 左边的值必须小于右边的值
在某范围区间 的实现5.Group by 子句 (根据某个字段进行分组,相同的放一组,不同的放不同的组)
Group by 只会将同类型数据进行分组,且只展示该组第一个数据
在新MySQL 中 group by 字段 必须被 select 约束
按照字段分组,表示此字段相同的数据会被放在一个组中
分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
可以对分组后的数据进行统计,做聚合运算
--1.基础语法
select 列1,列2,聚合.......from 表名 group by 列1,列2,列3.。。
select male as male ,count(*) from my_stu group by male; 基础使用1 基础使用2 group by 约束字段 male,age 并未被 select 严格声明 导致报错 同理报错2--2.having 对分组的结果进行筛选
select male as male,count(*) from my_stu group by male having male = 0; select male as male,count(*) from my_stu group by having count(*)>2; 约束别名where 和 having 的区别
where 对 from 后面指定的表进行筛选 ,属于筛选原始数据
having 对group by 的结果进行筛选
--3.分组的意义是为了统计数据(按照分组字段 进行数据统计)
SQL 提供了一系列的统计函数:
count () :统计分组后的记录数
里面可以使用两种参数: * 代表统计记录,字段名代表统计对应的字段 (null 不进行统计)
select count(*) from my_stu;max():统计最大值
min ():最小值
avg():平均值
sum():和
使用示例1 使用示例2--4.分组的排序
group by 字段 [asc/desc] 分组 会自动排序,根据分组字段, 默认升序asc ,需要降序desc需要声明出
对分组排序的结果 合并之后的整体结果进行排序 而不是对于分组内部的数据进行排序
--5. 多字段分组 ,先班级,后男女
当前表所有字段 其中主键id为逻辑主键 子增长查询每个班级 对应性别下有多少人 先按照班级排序 后按照性别排序
select class_id,male,count(*) from my_stu group by class_id,male;
以班级为条件 查询性别 总数,并以先班级后性别排序 以班级id为条件查询每班性别总数,并以先性别 后 班级排序--6.group_concat() 函数
可以对分组的结果中某个字段进行 字符串链接(保留该组所有的某个字段)
group_concat() 函数的使用 group_concat 其他两种使用方法--7.回溯统计 with rollup
任何一个分组后 都会有一个小组 , 最后都需要向上级分组进行一次汇报统计:(根据当前分组的字段)
这就是回溯统计:回溯统计时,会将分组字段至空
单字段分组 回溯统计
既 查询每一个班级,然后按照班级排序 完成后进行一次回溯
单字段分组 回溯统计多字段分组 回溯统计
既 先按照班级分组 班级又按照性别分组 ------->既性别会按照班级统计一次( x3 ),而班级会单独统计一次,
既:第一层分组 会有一次回溯 ,第二次分组 需要考虑 上一层分组的组数 。。。。。。。。。。直到最后一层分组
多字段分组 回溯统计6.order by 子句
order by 排序 ,根据某个字段进行升序或者降序排序,依赖校对集(大小写等)
基本语法:
order by 字段1 [asc/desc],字段2[asc/desc].............. 其中 asc 是升序(默认操作) desc是降序
order by 基本使用多字段排序 :先根据某个字段进行排序,然后在排序好的内部,再按照某个数据再进行一次排序
多字段排序,先按照class_id 升序排列 再按照 male 降序排列 都按照升序排列 班级降序排列, male 升序排列7.limit子句
是一种限制结果的子句:可以用来限制数量 多用于分页
way1:只用来限制数据量 limit 数据量
select * from my_stu limit 2;way2:限制起始位置 & 限制长度 多用于分页 既从指定的位置开始 向后找多少条数据
select * from my_stu limit 2,2;两个参数分别对应偏移量和长度