多条件搜索时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