SQL中常见问题and,where,having

on后面加and条件的情况

假设我有两张表 test_a1表示成绩表,test_a2表示学生表
select * from test_a1
id subject  grade
1	数学  	89.50
1	英语 	90.00
1	语文	    85.00
2	数学	    99.00
2	英语		59.90
2	语文		99.00
3	数学		87.50
3	英语		89.00
3	语文		79.00
4	数学		84.50
4	英语		88.00
4	语文		81.00
5	数学		87.00
5	英语		86.00
5	数学		85.00
select * from test_a2
id  name  sex
1	张三		男
2	李四		男
3	王五		男
4	赵六		女
5	孙七		女

如果我们在两张表关联以后在on后面加 and条件 效果如下
select 
* 
from test_a2 a2 
left join test_a1 a1 on a1.id=a2.id and a2.id = 1

1	张三	男	1	数学	89.50
1	张三	男	1	英语	90.00
1	张三	男	1	语文	85.00
2	李四	男			
3	王五	男			
4	赵六	女			
5	孙七	女
原因:
on后面的加and筛选条件主要是针对的是关联表,
对于主表筛选条件不适用,所以主表里的id !=1的还是被筛选出来,
但是从表里的id !=1的都被过滤掉,所以最终显示出来上述效果
主表id全部查出来,从表只查出来id=1的,最后join出来id !=1 的从表值都为空

on后面加where条件的情况

如果我们在两张表关联以后在on后面加 and条件 效果如下
select 
* 
from test_a2 a2 
left join test_a1 a1 on a1.id=a2.id
where a2.id = 1/a1.id=1 
--上面用a1,a2效果一样,但是不能用id=1,必须加别名,否则会报错 Column 'id' in where clause is ambiguous

1	张三	男	1	数学	89.50
1	张三	男	1	英语	90.00
1	张三	男	1	语文	85.00
原因:
on后加where条件是对两张表join完以后的结果再进行筛选过滤的,可以理解为a1和a2表关联后生成临时表
然后在在临时表上进行的过滤

having和where的使用场景

whereWHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
如:只统计所有学生数学和英语的总成绩
select 
 id
,sum(grade) 
from test_a1 
where subject in('数学','英语')
group by id
id	sum(grade)
1	179.50
2	158.90
3	176.50
4	172.50
5	258.00

havingHAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
如:对学生编号分组,求总成绩大于260的学生编号以及成绩
select id,sum(grade) from test_a1 group by id having sum(grade)>260
id	sum(grade)
1	264.50

总结:

wherehaving区别:
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
whereand区别:
andleft join查询中把on的所有条件作为匹配条件,不符合的右表都为nullwhereand条件筛选后进行再一次的筛选,把不匹配的去掉。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值