sql查询⼤于某个⽇期_复杂查询
1.视图
2.⼦查询
3.标量⼦查询
4.关联⼦查询
5.如何⽤SQL解决业务问题
6.各种函数
select 查询结果 -- 第五步
from 查询表名 -- 第⼀步
where 查询指定条件 -- 第⼆步
group by 分组 -- 第三步
having 对分组结果指定条件 -- 第四步
order by 查询结果排序 -- 第六步
limit 从结果中取出指定⾏数; -- 第七步
注意:from后⾯不能直接使⽤别名
1.视图(针对频繁、复杂使⽤的SQL语句)
数据表中存放的是数据,视图中存放的是查询语句。
使⽤视图时,会运⾏视图⾥⾯的sql查询语句,创建出⼀张临时表。当客户端与数据库的连接断开后临
时表会被⾃动删除。创建视图:
create view 视图名称(视图列名1,视图列名2)
as
select查询语句;
案例:
create view count_as_sex(性别,⼈数)
as
select 性别,count(*)
from student
group by 性别;
使⽤视图:在from⼦句中⽤视图名代替表名
select 性别,⼈数 from count_as_sex;
注意事项:避免在视图的基础上再创建视图,这样会降低SQL的执⾏效率。不能向视图⾥⾯插⼊数据,不然会报错(因为视图本⾝没有数据,只是SQL语句)。
2.⼦查询(偶尔使⽤SQL,视图经常使⽤)
在⼦句中嵌套SQL查询语句:先运⾏⼦查询,再运⾏外部语句。可以在from、where字句中嵌套SQL查询语句。
select 性别,⼈数
from(
select 性别,count(*) as ⼈数
from student
group by 性别
) as count_as_sex;
出每个课程⾥成绩最低的学号:(这个实际上是内连接查询,相当于两张表取交集)
select t1.学号,t1.课程号,t1.成绩
from score as t1, (select 课程号,min(成绩) as 最⼩成绩 from score group by 课程号) as t2
where t1.`课程号`=t2.`课程号` and t1.成绩=t2.最⼩成绩
ORDER BY 课程号 asc, 成绩 asc;
any all关键字,any与some等同
selet 列名1
from 表名1
where 列名1>any(⼦查询); -- 列名1⾥⾯的数据⼤于any中的其中任意⼀个数据
哪些学⽣的成绩⽐课程号0002的全部成绩⾥的其中任意⼀个⾼?select语句查询日期
理解为,学⽣的成绩⼤于0002课程号的最⼩成绩。
select 学号,课程号,成绩
from score
where 成绩>any(select 成绩 from score where 课程号='00002');
selet 列名1
from 表名1
where 列名1>all(⼦查询); -- 列名1⾥⾯的数据⼤于all中的所有数据
哪些学⽣的成绩⽐课程号0002的全部成绩⾥都⾼?
select 学号,课程号,成绩
from score
where 成绩>all(select 成绩 from score 课程号='0002');
⼦查询注意事项:
1)两个数字⽐较倍数应该使⽤:a/3>all(b) ⽽不能使⽤:a>3*all(b)
2)避免使⽤多层嵌套⼦查询:很难维护、执⾏效率很差。
as ⼦查询名称是可以省略的。(最好不要省略)
3)⼦查询⾥⾯的as ⼦查询名称
3.标量⼦查询(⼦查询返回的必须是1⾏1列的单⼀数据,可以⽤在where⼦句中)⼤于平均成绩学⽣的学号和成绩(注意,不区分课程号)
where⼦句中不能使⽤汇总函数:where 成绩>avg(成绩)
但是可以使⽤标量⼦查询:
select 学号,课程号,成绩
from score
where 成绩>(select avg(成绩) from score);
扩展:⼤于平均成绩学⽣的学号和成绩(注意,要区分课程号)
select t1.学号,t1.课程号,t1.成绩
from score as t1, (select 课程号,avg(成绩) as 平均成绩 from score group by 课程号) as t2 where t1.成绩>t2.平均成绩 and t1.课程号=t2.课程号;
标量⼦查询可以使⽤在任何使⽤单⼀数值的位置:
select 学号,课程号,成绩,(select avg(成绩)from score)as 总平均成绩
from score;
扩展:按照课程号计算出平均成绩。
from score as t1, (select 课程号,avg(成绩)as 平均成绩 from score group by 课程号)as t2 where t1.课程号=t2.课程号
order by 课程号 asc, 学号 asc;
4.关联⼦查询
在每个组⾥⾯进⾏⽐较的时候就可以使⽤关联⼦查询。
案例:⼤于平均成绩学⽣的学号和成绩(注意,要区分课程号)
select 学号,课程号,成绩
from score as s1
where 成绩>(select avg(成绩) from score as s2 where s1.课程号=s2.课程号 group by 课程号);
5.如何使⽤SQL解决业务问题
理解问题(翻译成⼤⽩话),写出分析思路,写出对应⼦句。
哪些学⽣的成绩⽐课程0002的全部成绩⾥的 其中任意⼀个⾼?
select 学号,课程号,成绩
from score
where 成绩>any(select 成绩 from score where 课程号='0002');
6.各种函数
汇总函数:
汇总函数
count()求某列的⾏数,Null不计算在内。count(*)求所有的⾏数,Null值会被计算在内。
sum()对某列数值求和,只能计算数值类型
只能计算数值类型。
只能计算数值类型。
avg()对某列数值求平均,只能计算数值类型
max()求某列的最⼤值。
min()求某列的最⼩值。
算数函数:
算数函数
四舍五⼊ round(数值,保留的⼩数位数) round(123.32,1) 结果:123.3 round(123.32,-1) 结果:120
绝对值 abs(数值) abs(-100) 结果:100
求余数 mod(被除数,除数) mod(7,2) 结果:1
字符串函数:
字符串函数
字符串长度 length(字符串) length('abcd') 结果:4
⼤写转⼩写 lower(字符串) lower('ABC') 结果:abc
⼩写转⼤写 upper(字符串) upper('abc') 结果:ABC
字符串拼接 concat(字符串1,字符串2) concat('我是','恐怖⼤魔王') 结果:我是恐怖⼤魔王
字符串替换 replace(字符串,被替换的字符串,⽤什么字符串替换) replace('不到⼯作','不到','⼀定能') 结果:⼀定能到⼯作字符串截取 substring(字符串,截取的起始位置,截取长度) substring('abcde',2,3) 结果:bcd
⽇期函数
⽇期函数:
当前⽇期 current_date
当前时间 current_time

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。