去重、合并结果集、通用分页()

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;

    }
*/