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

本文深入解析Mysql中JOIN、InnerJoin、CrossJoin等连接类型的区别与应用,包括逗号连接的优先级问题及如何避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘自: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,所有这些都具有比逗号操作符更高的优先级。

 

### 使用 Sqoop 进行多张的全量导入至 Hive #### 配置环境与准备 为了成功执行 Sqoop 命令,确保已经安装并配置好 Sqoop 环境[^1]。 #### 执行导入操作 对于将 MySQL 数据库中的多个格一次性全部导入到 Hive 中的操作,可以利用 `import-all-tables` 参数来简化这一过程。此参数允许用户指定要连接的目标 MySQL 数据库以及必要的认证信息,并可以选择性地覆盖已存在的 Hive 格或排除某些特定格不参与此次迁移工作[^4]。 具体命令如下所示: ```bash sudo -u hdfs \ sqoop import-all-tables \ --connect jdbc:mysql://<MySQL服务器地址>:<端口号>/<数据库名>?tinyInt1isBit=false \ --username <用户名> \ --password <密码> \ --hive-import \ --hive-overwrite \ --exclude-tables table1,table2,... \ -m 1 ``` 上述命令中: - `<MySQL服务器地址>` 替换为实际 MySQL 主机 IP 地址; - `<端口号>` 修改为目标 MySQL 实例监听的服务端口,默认情况下为 3306; - `<数据库名>` 更改为待同步的数据源名称; - `<用户名>` 和 `<密码>` 分别设置成具有相应权限访问该 MySQL 数据库账户凭证; - 如果不需要排除任何格,则省略 `--exclude-tables` 及其后的列项;反之,在这里列举想要忽略掉不做处理的关系型数据的名字,各名字间用英文状态下的逗号隔开来; - `-m 1` 设置并发度为单线程模式运行作业流程,可根据实际情况调整这个数值大小以优化性能现。 完成以上步骤之后,即可启动任务让 Sqoop 自动抓取来自远程关系型数据库管理系统内的结构化资料集并且按照既定规则映射存储于分布式文件系统之上供后续分析挖掘所用。 #### 创建目标 Hive 数据库 (如果尚未存在) 在正式开始之前,还需确认目的位置是否存在名为 `sqoop_test` 的 Hive 数据库实例。如果没有的话可以通过下面这条 SQL 语句来进行初始化创建动作[^2]: ```sql CREATE DATABASE IF NOT EXISTS sqoop_test; ``` 随后可通过以下查询指令检验是否正确建立了新的 schema 对象及其内部对象概况情况: ```sql SHOW DATABASES; SHOW TABLES IN sqoop_test; ``` 最后,当所有准备工作都完成后就可以放心大胆地去尝试批量转移业务逻辑所需的各种维度事实型实体记录啦!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值