SQL-分组聚合-子查询

-- having前面必须有group by
select e.deptno
,sum(e.sal) as sum_sal
,min(e.sal) as min_sal
,max(e.sal) as max_sal
,avg(e.sal) as avg_sal
,count(e.ename) as ct1
from emp e
group by e.deptno
having e.deptno = 20
;

-- 因为null值不做统计,所以用count(1)统计效率更高
select count(1) from emp;


-- 正序 asc 、 倒叙 desc
select *
from emp e
order by e.sal; --(asc/desc)

-- 指定空值的位置 (在前 nulls first)(在后 nulls last)
select *
from emp e
order by e.eomm nulls first;

-- group by 和 distinct 都是去重,但是group by还有分组聚合的职能。


-- primary key 主键约束 、 foreign key 外键
-- (一张表想要指向另一张表,需要设置主键外键)

-- 删除 先子后父 、 添加 先父后子


-- 关联 join...on... 是标准写法的固定语法 (内关联只显示关联得了的数据)
-- 关联的本质:从一张表中依次取一条数据和另一张表的每一条数据进行一次匹配
-- 内关联 (同一张表可以多次使用,例如 emp e 、 emp b)
select *
from emp e
join dept b on e.deptno = b.deptno;

-- 外关联 为了符合阅读习惯,只写左外 (主表数据不丢失)
select e.*,d.*
from emp e
left join dept d on e.deptno = d.deptno;

-- 关联的条件写在where后面就是取数条件,写在on后面则是关联条件
--(建议把条件写在on后面,这样性能好一点)

-- 多表关联 语法
select *
from emp a
join emp b on a.deptno = b.deptno
join emp c on a.deptno = b.deptno
join dept d on a.deptno = b.deptno;

-- 笛卡尔积 服务器突然变慢的原因之一


-- 子查询 (查询套查询)(子查询是可以单独执行的)
-- 单行子查询 不反回或返回一行结果的查询
-- 多行子查询 返回0行、一行或多行的查询

select -- 标量子查询 字段子查询
from -- 表子查询(把一个查询结果集视为一张表)
where -- 条件子查询 (子查询返回了两个值,条件用 = 会报错,用in 或 not in)

-- 子查询
select *
from emp e
where sal > ( select avg(sal) from emp);

-- 表子查询
select e.deptno,avg(sal) as avg_sal
from emp e
group by e.deptno;

-- 两个表关联起来就可以看成一张表,通过分组聚合取数
select *
from emp a
join (select e.deptno,avg(sal) as avg_sal from emp e group by e.deptno ) b -- 要给表达式命别名
on a.deptno = b.deptno
where a.sal > b.avg_sal;

-- 标量子查询
select e.*
,(select avg(sal) from emp) as avg_sal
,(select max(sal) from emp) as max_sal
from emp e;

-- 字段子查询这里返回了多个字段
select e.*
,(select avg(sal),max(sal) from emp) as avg_sal
from emp e;

-- 多行子查询
select *
from emp e
where e.sal in ( select sal from emp where ename in ('MARTIN','SCOTT') );

posted @ 2022-03-05 17:10  oNice  阅读(133)  评论(0编辑  收藏  举报