您的位置:首页 > 数据库

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

2015-11-29 12:29 435 查看
多条件搜索时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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: