
# 让我看看哪些苦逼周6还要上班!

# 让我看看关于SQL的一些笔记
```sql
--左连接之后的where是对查完之后的数据进行过滤,所以要注意最外层左连接
--left join 完,行数一定等于左表行数吗? 不一定!!大部分情况是一样,但是最后加了where就会变少,如果左连接表的连接字段由重复值(1对n),会查询比左表数据量更多的数据(解决方法:group by 字段1)
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno order by e.empno;
--inner join 意思是内连接 把匹配的信息全部查出来,就是等值连接
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e inner join dept d on e.deptno=d.deptno order by e.empno;
--left join 左连接 意思是包含左边表所有记录,右边所有的匹配的记录,如果没有则用空补齐
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e left join dept d on e.deptno=d.deptno order by e.empno;
--right join 右连接 意思是包括右边表所有记录,匹配左边表的记录,如果没有则以空补齐
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e right join dept d on e.deptno=d.deptno order by e.empno;
--full join 全连接 意思是左右表所有的记录全部显示出来
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e full join dept d on e.deptno=d.deptno order by e.empno;
--+在左边 为右连接
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e,dept d where e.deptno(+)=d.deptno order by e.empno;
--+在右边 为左连接
select e.empno,e.ename,e.job,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno(+) order by e.empno;
```
- 下面是偶然看到对SQL执行数据的分析
SQL书写顺序select-->from-->where-->group by-->having-->order by
执行顺序 from-->where-->group by-->having-->select-->order by
所以来自from中的表别名可用使用,select后的字段别名不能用来当做任何环节的条件
提出质疑:select goods_category_id,avg(good_price) as ag from sw_goods group by goods_category having ag>1000 ag是条件,所以是否执行顺序是否是
from-->where-->group by-->select-->having-->order by
- ROW NUMBER
row_number()窗口函数只允许在select语句与order by语句中使,并且是在where、group by、having执行得到结果之后,在order by、limit、select distinct 执行之前运行
- GROUP BY
where 和 having 的区别 就是 筛选的字段是表中的还是select后面跟的字段。
或者理解为 where 可以操作表中的数据 having可以操作select后面的数据(包括使用聚合函数操作它们)
“Where”是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
where后面之所以不能使用聚合函数是因为where的执行顺序在聚合函数之前。
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。
注意:如果在mysql中测试分组的sql中少关联表会大大提高查询速度。可以先按最小粒度进行分组最后再关联其它表。
- 子查询
SQL 一般先执行子查询,再执行主查询,但是相关子查询除外。
相关子查询无法独立于外部查询独立存在
例如要查询BOOKS表中大于各种类别图书的各平均价格的图书
SELECT FROM Books As a
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books AS b
WHERE a.类编号=b.类编号
)
GO
与前面介绍过的子查询不同,相关子查询无法独立于外部查询而得到解决。该子查询需要一个“类编号”的值。而这个值是个变量,
随SQLSever检索Books表中的不同行而改变。下面详细说明该查询执行过程:
先将Books表中的第一条记录的“类编号”的值“2”代入子查询中,子查询变为:
SELECT AVG(价格)
FROM Books AS b
WHERE b.类编号=2
子查询的结果为该类图书的平均价格,所以外部查询变为:
SElECT 图书名,出版社,类编号,价格
FROM Books As a
WHERE 价格 > 34
如果WHERE条件为True,则第一条结果包括在结果集中,则否不包括。对Books表中的所有行运行相同的过程,最后形成的结果集及最后返回结果。
Q:是否可以理解为要获取相关子查询的结果需要先从父查询中获取参数值。
- in和exists
select * from a where exists (select 1 from b where b.b_id = a.id);
exists 的意思是用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXIS