去重、合并结果集、通用分页()-其他
去重、合并结果集、通用分页()
count(*)和count(字段的区别)
/*
count(具体字段):表示统计该字段下所有不为null的元素总数
count(*):统计表当中的总数行数
因为每一行记录不可能所有的列都为NULL,一行数据中有至少有一列数据不为null,则这行数据就是有效的
*/
distinct
distinct 只能出现所有字段的前面
distinct 只能出现所有字段的前面
select distinct job from test;
select ename,distinct jodb from emp; -- 错误写法,因为distinct只能出现在所有字段的最前方
-- distinct 出现在两个字段之前,表示两个字段联合起来去重(即作为一个整体)
select distinct job,depto from emp;
# 案例--统计工作岗位的数量
select count(distinct(job)) from emp;
子查询
/*
什么是子查询?
select 语句中嵌套select的语句,被嵌套的select语句称为子查询
子查询都可以出现在哪里
select
..(select).
from
..(select).
where
..(select).
注意:对于select 后面的子查询只能返回1条结果,多于1条就报错了
*/
-- 案例
/*
查询大于最低工资的
思路:
1.先查询出最低工资是多少
select min(sal) from emp;
*/
select * from emp where sal > (select min(sal) from emp);
union并集
完成两个结果集的拼接
union的效率要比表连接的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积
完成两个结果集的拼接
union的效率要比表连接的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积
/*
注意事项:
1.union在进行结果集合并的时候,要求两个结果集的列数必须相同,且列和列的数据类型也要相同(mysql中可以不相同,oracle中则必须相同),但列名则不一定需要相同;oracle会将第一个结果的列名作为结果集的列名
2.我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序
3.union 和 union all的区别
都是取结果的交集
union对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序;
union all:对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复。
*/
/*
案例:查询工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job in ('MANAGER','SALESMAN')
*/
select ename,job from emp where job = MANAGER
union
select ename,job from emp where job = SALESMAN
交集、差集
/*
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
*/
limit
limit是将查询结果集的一部分取出来,通常使用在分页查询当中
limit是将查询结果集的一部分取出来,通常使用在分页查询当中
/*
完整用法: limit startIndex,length
startIndex 是起始下标且是从0开始,length是长度
缺省用法:limit 5;这是取前5
-- 案例1:按照薪资降序,取出排名在前5名的员工?
select * from emp order by sal desc limit 5
等价于
select * from emp order by sal desc limit 0,5
-- 案例2:取出工资排名在[3-5]名的员工?
select * from emp order by sal desc limit 2,3
2:表示起始位置从下标2开始,也就是第三条记录
3:表示长度(即:从下标3,4,5)
-- 案例3:取出工资排名在[5-9]名的员工
select ename,sal from emp order by sal desc limit 4,5
第5名的下标位置是4
5-9名一共5条记录,所以是4,5
*/
通用分页
通用公式:
limit (pageNo-1) * pageSize , pageSize
通用公式:
limit (pageNo-1) * pageSize , pageSize
/*
每页显示3条记录:
第1页:limit 0,3 [0,1,2]
第2页:limit 3,3 [3,4,5]
第3页:limit 6,3 [6,7,8]
第4页:limit 9,3 [9,10,11]
每条显示pageSize条记录
第pageNo页:limit (pageNo-1) * pageSize , pageSize
public static void main(String[] args){
// 用户提交过来一个页码,以及煤业显示的记录条数
int pageNo = 5; //第5页
int pageSize = 10; //每页显示10条
int startIndex = (pageNo - 1) * pageSize;
String sql = "select ... limit" + startIndex + "," + pageSize;
}
*/
————————
count(*)和count(字段的区别)
/*
count(具体字段):表示统计该字段下所有不为null的元素总数
count(*):统计表当中的总数行数
因为每一行记录不可能所有的列都为NULL,一行数据中有至少有一列数据不为null,则这行数据就是有效的
*/
distinct
distinct 只能出现所有字段的前面
distinct 只能出现所有字段的前面
select distinct job from test;
select ename,distinct jodb from emp; -- 错误写法,因为distinct只能出现在所有字段的最前方
-- distinct 出现在两个字段之前,表示两个字段联合起来去重(即作为一个整体)
select distinct job,depto from emp;
# 案例--统计工作岗位的数量
select count(distinct(job)) from emp;
子查询
/*
什么是子查询?
select 语句中嵌套select的语句,被嵌套的select语句称为子查询
子查询都可以出现在哪里
select
..(select).
from
..(select).
where
..(select).
注意:对于select 后面的子查询只能返回1条结果,多于1条就报错了
*/
-- 案例
/*
查询大于最低工资的
思路:
1.先查询出最低工资是多少
select min(sal) from emp;
*/
select * from emp where sal > (select min(sal) from emp);
union并集
完成两个结果集的拼接
union的效率要比表连接的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积
完成两个结果集的拼接
union的效率要比表连接的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积
/*
注意事项:
1.union在进行结果集合并的时候,要求两个结果集的列数必须相同,且列和列的数据类型也要相同(mysql中可以不相同,oracle中则必须相同),但列名则不一定需要相同;oracle会将第一个结果的列名作为结果集的列名
2.我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序
3.union 和 union all的区别
都是取结果的交集
union对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序;
union all:对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复。
*/
/*
案例:查询工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job in ('MANAGER','SALESMAN')
*/
select ename,job from emp where job = MANAGER
union
select ename,job from emp where job = SALESMAN
交集、差集
/*
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
*/
limit
limit是将查询结果集的一部分取出来,通常使用在分页查询当中
limit是将查询结果集的一部分取出来,通常使用在分页查询当中
/*
完整用法: limit startIndex,length
startIndex 是起始下标且是从0开始,length是长度
缺省用法:limit 5;这是取前5
-- 案例1:按照薪资降序,取出排名在前5名的员工?
select * from emp order by sal desc limit 5
等价于
select * from emp order by sal desc limit 0,5
-- 案例2:取出工资排名在[3-5]名的员工?
select * from emp order by sal desc limit 2,3
2:表示起始位置从下标2开始,也就是第三条记录
3:表示长度(即:从下标3,4,5)
-- 案例3:取出工资排名在[5-9]名的员工
select ename,sal from emp order by sal desc limit 4,5
第5名的下标位置是4
5-9名一共5条记录,所以是4,5
*/
通用分页
通用公式:
limit (pageNo-1) * pageSize , pageSize
通用公式:
limit (pageNo-1) * pageSize , pageSize
/*
每页显示3条记录:
第1页:limit 0,3 [0,1,2]
第2页:limit 3,3 [3,4,5]
第3页:limit 6,3 [6,7,8]
第4页:limit 9,3 [9,10,11]
每条显示pageSize条记录
第pageNo页:limit (pageNo-1) * pageSize , pageSize
public static void main(String[] args){
// 用户提交过来一个页码,以及煤业显示的记录条数
int pageNo = 5; //第5页
int pageSize = 10; //每页显示10条
int startIndex = (pageNo - 1) * pageSize;
String sql = "select ... limit" + startIndex + "," + pageSize;
}
*/