魂屁,东西发这里了关于Left Join,Right Join的

在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的(“+”号)弄得糊涂了。

在SQL标准中规划的(Join)联结大致分为下面四种:

1. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。

2. 外联结:分为外左联结和外右联结。

左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录。

右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:

Select A.name B.name From A Left Join B On A.id=B.id

和Select A.name B.name From B Right Join A on B.id=A.id执行后的结果是一样的。

3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大)。

4.无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法。

这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。

MySQL支持Select和某些Update和Delete情况下的Join语法,具体语法上的细节有:

table_references:

table_reference [, table_reference] …

table_reference:

table_factor

| join_table

table_factor:

tbl_name [[AS] alias]

[{USE|IGNORE|FORCE} INDEX (key_list)]

| ( table_references )

| { OJ table_reference LEFT OUTER JOIN table_reference

ON conditional_expr }

join_table:

table_reference [INNER | CROSS] JOIN table_factor [join_condition]

| table_reference STRAIGHT_JOIN table_factor

| table_reference STRAIGHT_JOIN table_factor ON condition

| table_reference LEFT [OUTER] JOIN table_reference join_condition

| table_reference NATURAL [LEFT [OUTER]] JOIN table_factor

| table_reference RIGHT [OUTER] JOIN table_reference join_condition

| table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

join_condition:

ON conditional_expr | USING (column_list)

上面的用法摘自权威资料,不过大家看了是否有点晕呢?呵呵,应该问题主要还在于table_reference是什么,table_factor又是什么?这里的table_reference其实就是表的引用的意思,因为在MySQL看来,联结就是一种对表的引用,因此把需要联结的表定义为table_reference,同时在SQL Standard中也是如此看待的。而table_factor则是MySQL对这个引用的功能上的增强和扩充,使得引用的表可以是括号内的一系列表,如下面例子中的JOIN后面括号:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

这个语句的执行结果和下面语句其实是一样的:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)

ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

这两个例子不仅让我们了解了MySQL中table_factor和table_reference含义,同时能理解一点CROSS JOIN的用法,我要补充的是在MySQL现有版本中CROSS JOIN的作用和INNER JOIN是一样的(虽然在SQL Standard中是不一样的,然而在MySQL中他们的区别仅仅是INNER JOIN需要附加ON参数的语句,而CROSS JOIN不需要)。

既然说到了ON语句,那就解释一下吧,ON语句其实和WHERE语句功能大致相当,只是这里的ON语句是专门针对联结表的,ON语句后面的条件的要求和书写方式和WHERE语句的要求是一样的,大家基本上可以把ON当作WHERE用。

大家也许也看到了OJ table_reference LEFT OUTER JOIN table_reference这个句子,这不是MySQL的标准写法,只是为了和ODBC的SQL语法兼容而设定的,我很少用,Java的人更是不会用,所以也不多解释了。

转载于:https://www.cnblogs.com/CHEUNGKAMING/p/4092671.html

MySQL Left Join,Right Join相关推荐

  1. mysql join null_Mysql Join语法以及性能优化

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: 代码如下: FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona tabl ...

  2. Mysql 优化器内部JOIN算法hash join On-Disk Hash Join Grace Hash Join Hybrid hash join过程详解

    Mysql 各种hash join算法讲解 hash join的概述 提到hash join之前自然得说Nest loop join,以两个表的关联为例,它其实是个双层循环,先遍历外层的表(n条),再 ...

  3. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解

    Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...

  4. mysql中的各种join整理

    Join可以分为两种 ①implicit join ②explicit join 举例如下: 类型 SQL举例 explicit join SELECT * FROM A a JOIN B b ON ...

  5. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  6. mysql 多表查询 join on_MySQL多表查询Left Join,Right Join学习笔记

    http://my.oschina.net/adamboy/blog MySQL多表连接查询Left Join,Right Join php开源嘛 在讲MySQL的Join语法前还是先回顾一下联结的语 ...

  7. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  8. mysql到底可不可以使用join_《Mysql 到底可不可以使用 Join ?》

    一:Join 的问题? - 在实际生产中,使用 join 一般会集中在以下两类: - DBA 不让使用 Join ,使用 Join 会有什么问题呢? - 如果有两个大小不同的表做 join,应该用哪个 ...

  9. mysql 或hive left join不加关联条件

    mysql left join不加关联条件 create table if not exists u1 (id int,name varchar(20) ) ENGINE = MyISAMDEFAUL ...

  10. mysql left outer join_关于mysql中的left join和left outer join的区别

    关于mysql中的left join和left outer join的区别 LEFT JOIN是LEFT OUTER JOIN的简写版; 内连接(INNER JOIN) :只连接匹配的行; 左外连接( ...

最新文章

  1. Processing 状态量控制动画技巧
  2. “极致”神话和产品观念_转自“蜗窝科技”
  3. Scala模式匹配(类似Java的switch)
  4. php 微信开发 菜单,微信公众号中个性化菜单的开发实例
  5. ITK:二进制图像的最小和最大曲率流
  6. TreeMap的讲解
  7. python实现冒泡排序算法的非递归版本_冒泡排序以及python代码实现(递归+非递归)...
  8. 迁移分支_资料 | 迁移学习简明手册
  9. Python+sklearn使用逻辑回归算法预测期末考试能否及格
  10. C# 运行时中的泛型
  11. html设置字体 圆体,css font-family字体大合集
  12. Boom 2 for Mac(音频助推器及均衡器) v1.6.7中文激活版
  13. 公务员备考(七)行测 资料分析(20题28分钟,正确率80%)
  14. 经验总结 | PBS系统的使用
  15. python不是内部命令或外部命令,也不是可执行程序解决方案”解决方法
  16. nginx反向代理与正向代理
  17. 计算机考试用远程桌面,远程桌面客户端对服务器身份的验证
  18. 连续仨月霸占牛客榜首,京东T8呕心巨作:700页JVM虚拟机实战手册
  19. 控制系统数学模型的matlab仿真,第7章 控制系统的MATLAB仿真
  20. Wine-Staging 5.6 修补游戏补丁

热门文章

  1. PHP 微信小程序支付实现
  2. PHP获取每个订单下订单商品的数量
  3. 呼吁成立中国FreeType联盟
  4. LINUX C正确遍历environ
  5. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
  6. 重装系统解决:CUPS服务未启动,不能管理打印机
  7. 以后所有经济时事的点评都不在这里
  8. 正负电子碰撞湮灭,电荷哪里去了
  9. Anaconda的下载地址
  10. 管理感悟:需要什么样的技术文档