让我看看
# 让我看看哪些苦逼周6还要上班!
![b54155958bdc4b05fcf1b9ac72ee1790.webp](/download/010020549d9091ec4bf0a62e3bf20e32b530.webp)
# 让我看看关于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
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
意思就是,将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,那么带入内查询作检验的这一行数据,便会作为结果显示出来,反之则不显示
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
例如:表A(小表),表B(大表)
select * from A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引; select * from A where exists(select cc from B where cc=A.cc) -->效率高,用到了B表上cc列的索引。
相反的:
select * from B where cc in(select cc from A) -->效率高,用到了B表上cc列的索引 select * from B where exists(select cc from A where cc=B.cc) -->效率低,用到了A表上cc列的索引。
- LIKE
关于LIKE:个人感觉LIKE更加像包含,就像A LIKE B 和 B LIKE A 是不一样的,一个是A包含B,一个是B包含A。
比如字符串 .1001.1002.1003. 可以LIKE .1001.甚至.1002.或.1002.1003.
但是 .1001.却无法LIKE.1001.1002.1003.
- UNION
union 去重 union all 不去重 多个查询集合union就不要用distinct了,直接union会自动去重
- ERP死锁
```sql
--死锁
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'
--死锁原因:
DBCC INPUTBUFFER (115)
exec sp_who2 115
--杀死死锁
kill 115
```
- SQL除数为0
select 1/0 会报错,解决方法 select 1/nullif(0,0) 相当于拿0和0比较,如果两个值相等它就返回null,1/null = null ,这样就会避免SQL异常。任何数和null进行运算都是null。
- ERP修改字段长度
```sql
ALTER TABLE T_GYInterfaceLog ALTER COLUMN F_RDPB_INPUTJSON NVARCHAR(MAX)
ALTER TABLE T_GYInterfaceLog DROP CONSTRAINT DF__T_GYInter__F_RDP__7D37FFCD
ALTER TABLE T_GYInterfaceLog ALTER COLUMN F_RDPB_OUTPUTJSON NVARCHAR(MAX)
ALTER TABLE T_GYInterfaceLog_s ALTER COLUMN F_RDPB_GYJSON NVARCHAR(MAX)
ALTER TABLE T_GYInterfaceLog_s DROP CONSTRAINT DF__T_GYInter__F_RDP__00146C78
```
- ERP单据转换关联表
FLINKID: 关联关系主键
FSBILLID: 源单内码
FSID: 源单行内码
FENTRYID: 目标单行内码
FRUIDID: 转换规则ID
FSTABLENAME: 源单转换实体表名
对接注意:多张下游单据同时和一张源单关联时切不可以多线程,否则可能会造成反写源单冲突。
对应自动执行的单据转换规则,比如自动生成应收单,是默认执行第一条已启用的单据转换且无视启动条件!
双休的签到
双休的签到
签到
周六上班的签到
同意!
让我看看
# 让我看看哪些苦逼周6还要上班!![b54155958bdc4b05fcf1b9ac72ee1790.webp](/download/010020549d9091ec4bf0a62e3bf20e32b530.webp)# 让...
点击下载文档
本文2024-09-16 17:13:54发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-14374.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章