多个inner join执行顺序(SQL语句中表的先后顺序由什么决定)
本文目录
- SQL语句中表的先后顺序由什么决定
- 查询的顺序,是先left join还是先inner join
- inner join 顺序问题
- SQL语句到底是怎么执行的
- inner join多表关联的时候,表联接的先后顺序对效率有影响吗
- sql中用join连接3个表有顺序吗
- mysql的关键词执行顺序
- sql中left join on 和where的执行顺序
SQL语句中表的先后顺序由什么决定
如果写join 系统默认 的是 inner join 内连接,就是完全匹配的意思,这个就没有先后顺序,哪个写前面都一样, 如果是 left join 左连接 ,就是已前面一个表即 左边的表为 基础,左边的数据会全部保留,如果右边没有匹配的则 对应字段 补null right join 则相反
查询的顺序,是先left join还是先inner join
inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录INNER JOIN 语法:INNER JOIN 连接两个数据表的用法:SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号INNER JOIN 连接三个数据表的用法:SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号INNER JOIN 连接四个数据表的用法:SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号INNER JOIN 连接五个数据表的用法:SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号
inner join 顺序问题
在SQL里面两个语句应该是一样的效果呀,VFP里面要怪一点,与当前工作区有关:下面的语句能输出数据:select stock_slselect stock_name.股票简称,stock_sl.现价,stock_sl.买入价,stock_sl.持有数量; from stock!stock_name inner join stock!stock_sl ; on stock_name.股票代码=stock_sl.股票代码
SQL语句到底是怎么执行的
下面先给出上面的SQL语句的执行顺序,然后进行讲解:(8) select (9) distinct (11) top 1(6) Table1.id,COUNT(Table1.name) as nameCount (1) from Table1(3) inner join Table2(2) on Table1.id=Table2.id(4) where Table1.id《4(5) group by Table1.id(7) having Table1.id《3(10) order by Table1.id desc 红色序号给出了执行的顺序:(1)from:对Table1和Table2执行笛卡尔积,也就是两个表的行的各种组合,共5*5=25行,生成虚拟表VT1(2)on:选择VT1中的那些Table1.id=Table2.id的所有行,生成虚拟表VT2。(3)inner join:这里是内部连接,直接就是VT2,如果是outer join,如left join、right join、full join,那么还需要按照外部连接的规则,把VT1中没有匹配的行添加到VT2,生成VT3.(4)where:选出VT3中Table1.id《4的表格,给虚拟表VT4.(5)group by:按照Table1.id进行分组。(6)COUNT:执行聚合函数,选出对应Table1.id的行数,生成的结果给虚拟表VT5(7)having:选择VT5中Table1.id《3的所有结果,给虚拟表VT6(8)select:选择VT6中相应的列,给虚拟表VT7(9)distinct:将VT7中重复的行去除,生成VT8(10)order by:将VT8的结果按照Table1.id进行排序,这里没有生成一个新的表VT9,而是生成游标VC9。(11)top:从游标VC9的开始处选择指定的行数,这里是1行,生成虚拟表VT10. 经过上面的过程,最终的SQL语句将VT10返回给用户使用。所以以后再写SQL语句的时候,可以按照上面的顺序写SQL语句了,读SQL语句也可以按照上面的顺序去读,做到心里明白。
inner join多表关联的时候,表联接的先后顺序对效率有影响吗
你好,据我了解是没有影响的。影响效率的是你是否选对了合适的列做关联,相应的列上是不是有适合的索引。
sql中用join连接3个表有顺序吗
sql中用join连接3个表没有顺序参考以下原因如果只是join(即内连接,等同于inner join),则这里表的顺序是没有要求的,但如果是left join或right join则是有顺序要求的
mysql的关键词执行顺序
①From:对from左边的表和右边的表计算笛卡尔积,产生虚拟表c1() ②On:对c1中的数据进行on过滤,只有符合过滤条件的数据记录才会记录在虚拟表c2中 ③Join:若指定了连接条件(left、right),主表中的未匹配的行就会作为外部行添加到c2中,生成虚拟表c3 ④Where:对虚拟表c3中的数据进行条件过滤,符合过滤条件的记录插入到虚拟表c4中 ⑤Group by:根据group by子句中的列,对c4中的记录进行分组操作,生成c5 ⑥Having:对虚拟表c5中的记录进行having过滤,符合筛选条件的记录插入虚拟表c6中 ⑦Select:执行select操作,选择指定的列,插入到虚拟表c7中 ⑧Distinct:对c7中的数据去重,生成虚拟表c8 ⑨Order by:对虚拟表c8中的数据按照指定的排序规则进行排序,生成虚拟表c9 ⑩Limit:取出指定的记录,产生虚拟表c10,将结果返回 上面是我看他们博客都这样写的!但是我觉得不适合我理解。可能是我太菜,我就以我写的sql理解下执行过程。 1、首先是找到from字段和join字段后面的所有表,形成笛卡尔积。student、English、class形成笛卡尔积。 2、然后是哪种(inner、join、right)join并且根据on字段对笛卡尔积做改变(这个改变因on改变行的条数,因为join类型去重某些行和置空某些列)。 3、是根据where字段去再次筛选上步得到的笛卡尔积。 4、然后group by去分组。 5、之后select 列结构(列结构就此不变) 6、因为distinct只能对单个列字段去重,所以肯定的在select后再去执行(行结构就此不变)。 7、order by是排序,能排序就说明整个表的行的条数不会发生改变了。 8、limit字段是最后从上面结果选一部分出去。 执行顺序只是相对的,在mysql优化器语法分析器分析优化的时候会给我们优化,在保证语义不变的情况下,进行语义等价转换。所以上面的顺序只是一般情况下可以这样分析。
sql中left join on 和where的执行顺序
(8)SELECT (9)DISTINCT (11)《Top Num》 《select list》(1)FROM (3)《join_type》 JOIN 《right_table》(2)ON 《join_condition》(4)WHERE 《where_condition》(5)GROUP BY 《group_by_list》(6)WITH 《CUBE | RollUP》(7)HAVING 《having_condition》(10)ORDER BY 《order_by_list》逻辑查询处理阶段简介FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1ON:对VT1应用ON筛选器。只有那些使《join_condition》为真的行才被插入VT2。OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。WHERE:对VT3应用WHERE筛选器。只有使《where_condition》为true的行才被插入VT4.GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.HAVING:对VT6应用HAVING筛选器。只有使《having_condition》为true的组才会被插入VT7.SELECT:处理SELECT列表,产生VT8.DISTINCT:将重复的行从VT8中移除,产生VT9.ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。
更多文章:
ultra video splitter(为什么用Ultra Video Splitter软件听不到声音)
2024年7月7日 08:41
线程同步互斥锁和读写锁的区别和各自适用场景?线程同步:何时互斥锁不够,还需要条件变量
2024年7月7日 12:01
代码onclick是什么意思(onclick中的on是什么意思)
2024年7月23日 03:16
python新手代码练习(python新手练习写的代码帮忙精简下 最好给下说明)
2024年7月18日 07:32
浮点运算指令对用于科学计算机是很必要的(为什么计算机中会有浮点运算)
2024年7月12日 14:32
verify password(centos怎么更改vncserver的密码)
2024年7月9日 01:50
进入setup怎么恢复(急急急,开机后出现ThinkPad setup界面进不了系统,怎么办)
2024年8月30日 14:35
creations(柏品By Creations属于什么档次)
2024年7月8日 08:32
swept away是什么意思?sweep和swept的区别
2024年8月27日 13:15
java和ui(对于没有学历的人,ui和java,哪个学习起来更容易,找工作的门槛会低一些)
2023年9月30日 22:20
html5教程 如何实现隐藏地址栏(怎么样把网页的地址一栏隐藏)
2023年12月27日 00:00
default null(Oracle中data_default列为null和不为null,分别代表什么含义)
2024年7月1日 21:20