Sql多条件查询,子查询,in及分页查询
2015-11-29 12:29
435 查看
多条件搜索时where 1=1 并不高效,如果使用这种方法,在数据库中会做全表查询(对每行数据都进行扫描,比对),会无法使用索引等优化查询的策略,建立的索引会暂时失效.
case后面不接什么,是在一个范围中.
这边是单独的值,数学成绩为100显示1,99为2,98为3
案例
在订单表中,统计每个销售员的总销售金额,列出销售员名,总销售金额,称号(>6000金牌,>5500银牌,>4500铜牌,否则为普通)
例如
将括号内的内容作为t表,进行查询.
子查询基本分类
独立子查询
子查询可以独立运行–可以单独运行子查询中的内容
相关子查询
子查询引用父查询中的结果.
或者or 也and
例子
IN 操作符允许我们在 WHERE 子句中规定多个值.(单列多行)
SQL IN 语法
实例
查询出总人数,男同学多少人,数学成绩平均成绩多少?
子查询就像使用普通的表一样,被当做结果集的查询语句被称为子查询,所有可以使用表的地方几乎都可以使用子查询来代替
例子
![](https://img-blog.csdn.net/20151129120811109)
关键字:not in
查询第三条第四天的数据
方法2
关键字:Row_number
作用:生成连续的编号,在使用between and 对编号进行限制查询.
注意:row_number必须和over一起使用,over(order by)要有
例子:
该种方法中如果order by的那一列数值相同,则不会并列.例如都是98分,1个会是第二名,1个会是第三名,但是名次是连续的.
over()
over是依次排序,在over括号内orderby前头如果加上Partition by col1则会效果不同.
partition本身是分区,划分的意思.
![](https://img-blog.csdn.net/20151129122732190)
Rank()
如果使用Rank()替换Row_number,则会产生不连续的名次,但是98分的都是第2名,下面这个就是第四名
Case函数用法1
无论方法1,2,case必须和end一起使用.下接when thenselect 数学成绩= ( 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
相关文章推荐
- MySQL 锁
- MySQL锁定状态查看命令
- mysql数据表类型
- 8天学通MongoDB——第八天 驱动实践
- 8天学通MongoDB——第七天 运维技术
- linux-CentOS6.4下安装oracle11g详解
- Redis.3.0.5集群安装详解
- 8天学通MongoDB——第六天 分片技术
- mysql备份脚本
- 打开mysql的查询日志
- redis数据类型
- 利用predis操作redis方法大全
- 数据库代码编写规范
- sqlserver 空间数据类型
- MySQL 调优/优化的 100 个建议
- MySQL性能优化的最佳21条经验
- Oracle GoldenGate 之--异构平台同步(Mysql到Oracle)
- 常用MySQL图形化管理工具
- Navicat for Mysql SSH tunnel 跳板机解决方案
- mysql解压版安装