mysql复杂查询语句_MySQL-9复杂操作-查询

1.数据查询

基本语法select 字段列表/* from 表名 [where 条件];

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

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

--1.select选项 :select 对产出来的结果的处理方式

all(默认),保留所有的结果 select * from 表名 === select all * from 表名

destinct,去重 查出来的结果,将重复给去除(只发生在所有字段都相同的情况下)

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

distinct 的使用

2.字段别名 :当数据进行查询时,有时候名字并不一定满足需求(多表查询是,会有同名字段),需要对字段名进行重命名 :既别名

--1.as  :字段名 as 别名

--2.字段名 别名

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

添加查询时添加别名的两种方式

3.数据源

数据源即为 数据来源,关系行数据库的来源都是数据表:本质上只要保证数据类似二维表,都可以作为数据源

数据源 分为多种,既单表数据源、多表数据源、查询语句

--1.单表数据源:select * from 表名

--2.多表数据源:select * from 表名1,表名2,表名3...........;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

表1 my_default 7条数据

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

表2 king_class 2条数据

select * from 表1,表2;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

多表数据源 14条数据

从一张表中 取出一条记录,去另外一张表中匹配所有记录,且全部保留:(记录数和字段数),将这种结果 称之为笛卡尔集 既一种交叉连接

笛卡尔集一般并没有什么卵用,耗费相当多资源 ,需要尽量避免出现笛卡尔集

--3.子查询 数据的来源是一条查询语句(查询语句的结果是一张二维表)

select * from (select 语句) as 表名 ; 相当于将括号内select 语句 的查询结果起一个别名(as 表名)

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

子查询1

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

子查询2

4.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( )

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

利用多个或找出符合条件的数据

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

利用集合in ( ) 完成查找

--2.between A and B (在 A 到 B 之间)

其中 between 本身是闭区间 且 左边的值必须小于右边的值

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

在某范围区间 的实现

5.Group by 子句 (根据某个字段进行分组,相同的放一组,不同的放不同的组)

Group by 只会将同类型数据进行分组,且只展示该组第一个数据

在新MySQL 中 group by 字段 必须被 select 约束

按照字段分组,表示此字段相同的数据会被放在一个组中

分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中

可以对分组后的数据进行统计,做聚合运算

--1.基础语法

select 列1,列2,聚合.......from 表名 group by 列1,列2,列3.。。

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select male as male ,count(*) from my_stu group by male;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

基础使用1

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

基础使用2

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

group by 约束字段 male,age 并未被 select 严格声明 导致报错

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

同理报错2

--2.having  对分组的结果进行筛选

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select male as male,count(*) from my_stu group by male having male = 0;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select male as male,count(*) from my_stu group by having count(*)>2;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

约束别名

where 和 having 的区别

where 对 from 后面指定的表进行筛选 ,属于筛选原始数据

having 对group by  的结果进行筛选

--3.分组的意义是为了统计数据(按照分组字段 进行数据统计)

SQL 提供了一系列的统计函数:

count () :统计分组后的记录数

里面可以使用两种参数:* 代表统计记录,字段名代表统计对应的字段(null  不进行统计)

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select count(*) from my_stu;

max():统计最大值

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

min ():最小值

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

avg():平均值

sum():和

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

使用示例1

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

使用示例2

--4.分组的排序

group by 字段 [asc/desc] 分组 会自动排序,根据分组字段, 默认升序asc ,需要降序desc需要声明出

对分组排序的结果 合并之后的整体结果进行排序  而不是对于分组内部的数据进行排序

--5. 多字段分组 ,先班级,后男女

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

当前表所有字段

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

其中主键id为逻辑主键 子增长

查询每个班级 对应性别下有多少人 先按照班级排序 后按照性别排序

select class_id,male,count(*) from my_stu group by class_id,male;

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

以班级为条件 查询性别 总数,并以先班级后性别排序

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

以班级id为条件查询每班性别总数,并以先性别 后 班级排序

--6.group_concat() 函数

可以对分组的结果中某个字段进行 字符串链接(保留该组所有的某个字段)

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

group_concat() 函数的使用

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

group_concat 其他两种使用方法

--7.回溯统计 with rollup

任何一个分组后 都会有一个小组 , 最后都需要向上级分组进行一次汇报统计:(根据当前分组的字段)

这就是回溯统计:回溯统计时,会将分组字段至空

单字段分组 回溯统计

既 查询每一个班级,然后按照班级排序 完成后进行一次回溯

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

单字段分组 回溯统计

多字段分组 回溯统计

既 先按照班级分组 班级又按照性别分组 ------->既性别会按照班级统计一次( x3 ),而班级会单独统计一次,

既:第一层分组 会有一次回溯 ,第二次分组 需要考虑 上一层分组的组数  。。。。。。。。。。直到最后一层分组

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

多字段分组 回溯统计

6.order by 子句

order by 排序 ,根据某个字段进行升序或者降序排序,依赖校对集(大小写等)

基本语法:

order by 字段1 [asc/desc],字段2[asc/desc].............. 其中 asc 是升序(默认操作) desc是降序

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

order by 基本使用

多字段排序 :先根据某个字段进行排序,然后在排序好的内部,再按照某个数据再进行一次排序

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

多字段排序,先按照class_id 升序排列 再按照 male 降序排列

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

都按照升序排列

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

班级降序排列, male 升序排列

7.limit子句

是一种限制结果的子句:可以用来限制数量 多用于分页

way1:只用来限制数据量 limit 数据量

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select * from my_stu limit 2;

way2:限制起始位置 & 限制长度 多用于分页 既从指定的位置开始 向后找多少条数据

43c1e1ae4729?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

select * from my_stu limit 2,2;

两个参数分别对应偏移量和长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值