摘自:https://dev.mysql.com/doc/refman/5.7/en/join.html

Mysql中使用使用逗号隔开多张表生成的表实例 等价于 使用Join、Inner Join、Cross Join,而在标准sql中,它们并不等价,Inner Join 和 on 一起使用,Cross Join则使用其它方式;

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

is equivalent to:

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)

INNER JOIN, (逗号)在没有连接条件的情况下在语义上是等价的:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都连接到第二个表中的每一行)。

然而,逗号运算符的优先级低于的INNER JOINCROSS JOINLEFT JOIN。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现表单错误,如:Unknown column 'col_name' in 'on clause'。

JOIN优先级高于逗号运算符(,),因此连接表达式 t1, t2 JOIN t3被解释为 (t1, (t2 JOIN t3)),而不是((t1, t2) JOIN t3)。这会影响使用ON子句的语句, 因为该子句只能引用连接操作数中的列,并且优先级会影响对这些操作数的解释。eg:

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
INSERT INTO t3 VALUES(1, 1);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

JOIN优先级比逗号高,所以对于操作数ON 子句t2t3。因为t1.i1不是任何一个操作数中的列,结果是Unknown column 't1.i1' in 'on clause'错误。

要启用联接,请使用以下任一策略:

  • 使用括号显式地对前两个表进行分组,以使ON 子句的操作数为(t1, t2)和 t3:

    SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
  • 避免使用逗号运算符JOIN而是使用 :

    SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

优先级相同的解释也适用于与混合逗号操作语句INNER JOINCROSS JOINLEFT JOIN,并且RIGHT JOIN,所有这些都具有比逗号操作符更高的优先级。

Mysql中使用逗号隔开多张表生成的表实例相关推荐

  1. mysql中获取逗号前边的内容,冒号后边的内容

    每天一点点,记录工作中实操可行 mysql中获取逗号前边的内容 表名: table_a 字段 : comment 字段comment 的内容: 支付宝充值,流水号: 2000513798T157196 ...

  2. 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)

    一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...

  3. mysql字段中有逗号隔开_在MySQL字段中使用逗号分隔符

    大多数开发者应该都遇到过在mysql字段中存储逗号分割字符串的经历,无论这些被分割的字段代表的是id还是tag,这个字段都应该具有如下几个共性.被分割的字段一定是有限而且数量较少的,我们不可能在一个字 ...

  4. 在MySQL中如何用SQL命令创建数据库及数据表

    HRELLO 大家好! 上期给大家讲解了,MySQL数据库常用的管理命令.现在,给大家讲解,如何用SQL命令在MySQL中创建一个数据库及数据表. 在学习前,我们首先要了解,SQL命令是什么? SQL ...

  5. mysql中更新的命令是_MySQL 语言中,更新表数据的命令是( )。_学小易找答案

    [简答题]MySQL 语言中包含数都定义语言.数据操纵语言和数据控制语言,分别有哪些功能? [单选题]查询员工工资信息时,结果按工资降序排列,正确的是( ). [简答题]arrayList测验 [填空 ...

  6. vue遍历输出列表中以逗号隔开的字符串

    问题描述 后台接口返回一个以逗号隔开的字符串,在列表中需要将逗号隔开的字符串便利并将对应的用户编号转换成为用户姓名 代码展示 列表代码 <el-table-columnprop="au ...

  7. Mysql 中的各种“删除”。删除数据库、删除表、删除字段

    一.数据库的删除 drop database + 数据库名 二.表的删除 1.drop table + 表名 注:此方式为删除整个表,包括表本身,注意与下一个区分 2.delete from + 表名 ...

  8. 查询MySQL中某个数据库中有多少张表

    SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES WHERE table_schema = '数据库' GROUP ...

  9. mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表 基本结构 from django.db importmodelsclassuserinfo(models ...

  10. Mysql中使用命令行导入.sql文件新建数据库表(图文)

    1.首先需要在Mysql命令行中先建好数据库,比如新建一个名字为"weibo2"的数据库: create database weibo2; 2.之后在命令行中输入:use weib ...

最新文章

  1. [LeetCode] 93. Restore IP Addresses_Medium tag: backtracking
  2. Oracle系统结构之修改oracle内存参数
  3. MySQL(11)数据库实现高可用架构之MMM
  4. vue从入门到精通之进阶篇(五)脚手架vue-cli
  5. 需求更大的--if条件判断
  6. php inputcsv,php excel格式(csv)数据导入导出(示例)
  7. 复选框java_java之swing实现复选框的方法
  8. gitlab的账号注册以及分组
  9. 推荐系统-基于用户的推荐在社交网络中的应用
  10. python脚本课程_python选课脚本
  11. Pocket PC 模拟器上网设置
  12. 如何看待程序员“面试造火箭、工作拧螺丝”?| 畅言
  13. sql语句查询某字段中包含某值(模糊查找)
  14. mysql数据库之ddl语句盘点
  15. Python使用大漠插件前的准备工作
  16. apache httpd.conf配置文件详解
  17. noip2013 总结
  18. 云悦智企业物联网官网源码
  19. 软考A计划-试题模拟含答案解析-卷五
  20. 看雪学院-解密入门教学(三)笔记

热门文章

  1. CANopen高级协议详解
  2. C语言中文网的资源的使用——链接索引
  3. 又是一江春水自东流!
  4. 千古兴亡多少事,一江春水向东流--转任总文章
  5. Android JNI学习-调用第三方SO库
  6. java高德地图api开发平台_示例中心
  7. MSN Messenger协议 【 very cool stuff 】
  8. ctf夏季集训结训赛-简单题writeup
  9. 权力纷争必须上演公章大战?其实duck不必
  10. 未能加载文件或程序集“FastReport