首页 > 数据库 >sql基础之from和ansi join一起使用(parse)总结

sql基础之from和ansi join一起使用(parse)总结

时间:2023-01-28 10:38:25浏览次数:47  
标签:insert join car into parse temp1 values sql aid


create table temp1
(
aid VARCHAR(5) not null,
car VARCHAR(10) not null
);

create table temp2
(
bid VARCHAR(5) not null,
username VARCHAR(10) not null
);

create table temp3
(
cid VARCHAR(5) not null,
dogname VARCHAR(10) not null
);

insert into temp1(aid,car) values('001','benz');
insert into temp1(aid,car) values('001','BMW');
insert into temp1(aid,car) values('001','ford');
insert into temp1(aid,car) values('001','jeep');
insert into temp1(aid,car) values('002','jeep');
insert into temp1(aid,car) values('003','hongqi');

insert into temp2(bid,username) values('001','mayun');

insert into temp3(cid,dogname) values('001','lily');
insert into temp3(cid,dogname) values('001','lucy');
insert into temp3(cid,dogname) values('002','xiaohua');

SQL的逻辑顺序如下:

1. FROM 
  1.1. JOIN 
  1.2. ON 
2. WHERE 
3. GROUP BY 
4. WITH CUBE or WITH ROLLUP 
5. HAVING 
6. SELECT 
7. DISTINCT 
8. ORDER BY 
11. TOP 

在实际中,ANSI JOIN的优先级高于FROM平铺连接的优先级,对于外关联,通常但不绝对会先生成子查询。JOIN中NATURAL,USING,ON只能三者选一,而且是语法解析器控制,对于NATURAL,语法分析器会自动加上对应的USING。有了USING后,就会填充qual等值过滤条件。如果写了USING,则写了啥就是啥、和WHERE一样。

示例,

select * from temp2 a2,temp1 a1 left join temp3 a3 on a1.aid=a3.cid where a1.aid=a3.cid;

通过on过滤,left join就近连a1表,之后生成临时表,和a2一起参与where。所以,结果为:

sql基础之from和ansi join一起使用(parse)总结_SQL

  对于语句,这结果为:

sql基础之from和ansi join一起使用(parse)总结_优先级_02

 无论是mysql、oracle还是postgresql,结果是一样的。 

 from 平铺定义在SQL 89中,ANSI JOIN定义在SQL 92中,见​​iso sql高级特性及定义的版本​​。



标签:insert,join,car,into,parse,temp1,values,sql,aid
From: https://blog.51cto.com/zhjh256/6024724

相关文章

  • MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket
    MySQL报错:ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息:1、直接使用......
  • SQLSERVER 事务日志的 LSN 到底是什么?
    一:背景1.讲故事大家都知道数据库应用程序它天生需要围绕着数据文件打转,诸如包含数据的.mdf,事务日志的.ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能......
  • java多线程基础小白指南--关键字识别(start,run,sleep,wait,join,yield)
    在学习java多线程基础上,会遇到几个关键字,理解并识别它们是掌握多线程的必备知识,下面,我将通过源码或者程序演示给出我对这几个关键字的理解,如果有不同意见,欢迎在评论区或者......
  • (转)SQLServer全局变量
    @@CONNECTIONS:返回自上次启动SQLServer以来连接或试图连接的次数,用其可让管理人员方便地了解今天所有试图连接服务器的次数。@@CPU_BUSY:返回自SQLServer最近一次启......
  • MySQL在线DDL gh-ost使用总结
    背景:作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库,在rowbinlo......
  • SQL优化
    SQL优化一、插入数据insert插入如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。insertintotb_testvalues(1,'tom');insertintotb_test......
  • 一分钟带你了解mySql执行SQL的内部原理
    1、把MySQL当个黑盒子一样执行SQL语句我们知道执行了insert语句之后,在表里会多出来一条数据;执行了update语句之后,会对表里的数据进行更改;执行了delete语句之后,会把表里的......
  • SQL271 牛客的课程订单分析(一)
    题目描述有一个订单信息表(order_info),请你写出一个sql语句查询在2025-10-15以后状态为购买成功的C++课程或者Java课程或者Python的订单,并且按照order_info的id升序排序......
  • mysql触发器
    --mysql触发器触发器是想要某条语句或某些语句在事件发生时自动执行,而执行的时间可以在"事件发生"之前或之后。创建触发器需要唯一的触发器名;触发器关联的表(即该表被......
  • sql server恢复bak数据库并改名
    sqlserver从bak文件恢复数据库有时会遇到数据库同名的情况,为了能够正常还原数据库必须将要还原数据库的逻辑文件名和物理文件名一起改掉。假设数据库是:Test备份......