Sql多条件查询,子查询,in及分页查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xbc1213/article/details/50095261

多条件搜索时where 1=1 并不高效,如果使用这种方法,在数据库中会做全表查询(对每行数据都进行扫描,比对),会无法使用索引等优化查询的策略,建立的索引会暂时失效.

Case函数用法1

无论方法1,2,case必须和end一起使用.下接when then

select 
数学成绩=
(
case
    when Math>100 then '优',
    when Math>90 then '良',
    when Math>80 then '中',
    else '不及格'
end
)

case后面不接什么,是在一个范围中.

case()函数用法2

select 
数学成绩=
(
case (Math)
    when 100 then 1,
    when 99 then 2,
    when 98 then 3
end
)

这边是单独的值,数学成绩为100显示1,99为2,98为3

案例
在订单表中,统计每个销售员的总销售金额,列出销售员名,总销售金额,称号(>6000金牌,>5500银牌,>4500铜牌,否则为普通)

select 
销售员,
销售员金额=sum(销售数量*销售价格),
称号=
(
case
    when Sum(销售数量*销售价格)>6000 then '金牌',
    when Sum(销售数量*销售价格)>5500 then '银牌',     
    when Sum(销售数量*销售价格)>4500 then '铜牌',
    else '铁牌'
end
)
from MyOrders group by 销售员

子查询

把一个查询的结果在另一个查询中使用就叫做子查询(将一个查询语句作为一个结果集供其他sql语句使用)
例如

select * from (select col1,col2 from tab) as t

将括号内的内容作为t表,进行查询.

子查询基本分类
独立子查询
子查询可以独立运行–可以单独运行子查询中的内容
相关子查询
子查询引用父查询中的结果.

或者or 也and

例子

select * from (select english from tab) as t where english>90

in

IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值.(单列多行)
SQL IN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

实例

select * from student where TsClassId in
(select tsclassid from tblClass where tclassname='一期' or '二期')

查询出总人数,男同学多少人,数学成绩平均成绩多少?

select 
总人数=(select count(*) from tab),
男同学=(select count(*) from tab where gander=1),
数学平均成绩=(select avg(math) from tab)

子查询就像使用普通的表一样,被当做结果集的查询语句被称为子查询,所有可以使用表的地方几乎都可以使用子查询来代替

例子

select (select max(col1) from tab),(select min(col1) from  tab),(select avg(col1)) from tab) from tab

这里写图片描述

查询第几条至第几条的数据

方法1.
关键字:not in

select top 2 * from tab where stuid not in (select top 2 stuid from tab)

查询第三条第四天的数据

方法2
关键字:Row_number
作用:生成连续的编号,在使用between and 对编号进行限制查询.
注意:row_number必须和over一起使用,over(order by)要有
例子:

select * from (select 编号=Row_number()over(order by col1),* from tab) as t between 2 and 4

该种方法中如果order by的那一列数值相同,则不会并列.例如都是98分,1个会是第二名,1个会是第三名,但是名次是连续的.

over()
over是依次排序,在over括号内orderby前头如果加上Partition by col1则会效果不同.
partition本身是分区,划分的意思.

这里写图片描述

Rank()
如果使用Rank()替换Row_number,则会产生不连续的名次,但是98分的都是第2名,下面这个就是第四名

select tsmath,名次=rank()over(order by tsmath desc) from tblScore

这里写图片描述

展开阅读全文

没有更多推荐了,返回首页