MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER]

MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER] JOIN)

php青蛙 /hainuo 
MySQL中的各种JOIN

1. 笛卡尔积(交叉连接)
在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 
如
SELECT * FROM table1 CROSS JOIN table2 
SELECT * FROM table1 JOIN table2
SELECT * FROM table1,table2

由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。
一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 

2. 内连接INNER JOIN
在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件
在MySQL中CROSS和INNER JOIN被划分在一起,不明白。
参看MySQL帮助手册
http://dev.mysql.com/doc/refman/5.0/en/join.html
join_table:
    table_reference  [INNER | CROSS] JOIN table_factor [join_condition]

3. MySQL中的外连接,分为左外连接和右连接,
即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL对应。

a. LEFT [OUTER] JOIN 
SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column
除了返回符合连接条件的结果之外,还需要显示左表中不符合连接条件的数据列,相对应使用NULL对应

b. RIGHT [OUTER] JOIN
SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column
RIGHT与LEFT JOIN相似不同的仅仅是除了显示符合连接条件的结果之外,还需要显示右表中不符合连接条件的数据列,相应使用NULL对应


--------------------------------------------
添加显示条件WHERE, ON, USING
1. WHERE子句
2. ON
3. USING子句,如果连接的两个表连接条件的两个列具有相同的名字的话可以使用USING
例如
SELECT <column_name> FROM <table1> LEFT JOIN <table2> USING (<column_name>)

连接多余两个表的情况
举例:
mysql> SELECT  artists.Artist, cds.title, genres.genre 
    -> FROM cds
    -> LEFT JOIN genres 
    -> ON cds.genreID = genres.genreID 
    -> LEFT JOIN artists 
    -> ON cds.artistID = artists.artistID;
或者
mysql> SELECT artists.Artist, cds.title, genres.genre 
    -> FROM cds
    -> LEFT JOIN genres 
    -> ON cds.genreID = genres.genreID 
    -> LEFT JOIN artists 
    -> ON cds.artistID = artists.artistID 
    -> WHERE (genres.genre = 'Pop');
-------------------------------------------- 

另外需要注意的地方

在MySQL中涉及到多表查询的时候,需要根据查询的情况,想好使用哪种连接方式效率更高。
1. 交叉连接(笛卡尔积)或者内连接
[INNER | CROSS] JOIN
2. 左外连接LEFT [OUTER] JOIN或者右外连接RIGHT [OUTER] JOIN 

注意指定连接条件WHERE, ON,USING.

--------------------------------------------
看懂MySQL手册定义的MySQL各种JOIN的用法:
//看懂如下的定义方式
table_references:
table_reference [,
table_reference
] ...

//不同的JOIN EXPRESSION之间使用','分割
A table reference is also known as a join expression.


table_reference
:
table_factor
| join_table


//每个JOIN EXPRESSION由数据表table_factor以及JOIN表达式构成join_table


table_factor:

tbl_name
[[AS] alias] [index_hint)]
| ( table_references )
| { OJ
table_reference
LEFT OUTER JOIN table_reference
ON conditional_expr }


//数据表table_factor,注意其递归定义的table_references



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_table

join_condition:
ON conditional_expr

| USING (column_list)

//连接表达式的连接条件定义使用ON或者USING


index_hint:
USE {INDEX|KEY} [FOR JOIN] (index_list
)
| IGNORE {INDEX|KEY} [FOR JOIN] (index_list)
| FORCE {INDEX|KEY} [FOR JOIN] (index_list)


index_list
:
index_name [, index_name] ...

MySQL手册中提到的JOIN需要注意的地方:

1. 
In MySQL,  CROSS JOIN is a syntactic equivalent to  INNER JOIN (they can replace each other). In standard SQL, they are not equivalent.  INNER JOIN is used with an  ON clause,  CROSS JOIN is used otherwise.
手册中提到
标准SQL中CROSS JOIN交叉连接(笛卡尔积)和内连接INNER JOIN不同,但是MySQL中两者是相同的,即有[CROSS | INNER] JOIN,两者可以互相替代,而且可以只使用JOIN

2. A table reference can be aliased using  tbl_name AS alias_name or  tbl_name alias_name:
SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
可以对数据表使用别名

3. ,运算符
例如
SELECT * FROM table1,table2
由于在MySQL中INNER JOIN与CROSS JOIN相同,INNER JOIN和 , 在MySQL也相同,都是产生两个表的笛卡尔积Cartesian Product
(等于两个表格的行数乘积)

但是,号的优先级要低于INNER JOIN, CROSS JOIN, LEFT JOIN

因此
If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur.

4. 什么时候使用ON,什么时候使用WHERE
ON应该用户数据表连接的时候指定连接条件;

WHERE用于用户限制所选取的列

例如ON a.column=b.column
WHERE a.column='hello'

5. 可以使用LEFT JOIN查看,两个连接的表中,不符合连接条件的部分,因为不符合条件的部分LEFT JOIN之后会显示为NULL
If there is no matching row for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table. You can use this fact to find rows in a table that have no counterpart in another table:


SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;

This example finds all rows in left_tbl with an id value that is not present in right_tbl (that is, all rows in left_tbl with no corresponding row in right_tbl). This assumes that right_tbl.id is declared NOT NULL.


6.
当别连接的表指定连接条件的列举有相同的名称的时候,不需要
ON a.column=b.column不同的时候才使用ON a.column_a=b.column_b
可以使用USING (column)
当然也可以使用多个USING (c1,c2,c3)

The USING(column_list) clause names a list of columns that must exist in both tables. If tables a and b both contain columns c1, c2, and c3, the following join compares corresponding columns from the two tables:


a LEFT JOIN b USING (c1,c2,c3)

7.
其他的:
#
The NATURAL [LEFT] JOIN of two tables is defined to be semantically equivalent to an INNER JOIN or a LEFT JOIN with a USING clause that names all columns that exist in both tables.

#
RIGHT JOIN works analogously to LEFT JOIN. To keep code portable across databases, it is recommended that you use LEFT JOIN instead of RIGHT JOIN.
#
The { OJ ... LEFT OUTER JOIN ...} syntax shown in the join syntax description exists only for compatibility with ODBC. The curly braces in the syntax should be written literally; they are not metasyntax as used elsewhere in syntax descriptions.

#
STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.



参考资料
http://www.w3schools.com/sql/sql_join.asp
http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.php 
http://dev.mysql.com/doc/refman/5.0/en/join.html

 
回复转发
 

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1910062


标签:  mysql , join
实例讲解MySQL的join、inner join、out join、left join、right join的区别 一、初始化 构造数据: 班级表t_class:3行数据,c1、c2、c4,其中c4是t_student中未包含的。 学生表t_student:6行数据,t1~t6,其中t6是t_class中未包含的。 CREATE TABLE `t_class` ( `cname` char(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '班级名', `teacher` char(200) CHARACTER SET utf8 DEFAULT NULL COMMEN 阅读详情

相关推荐

MySQL基本操作(三)分组、查询、联结

MySQL分组、查询、联结 1、分组 1.1 创建分组数据 GROUP BY、ROLLUP、CUBE SELECT vend_id,COUNT(*) AS num_prods FROM Products Group BY vend_id;# 返回每个供应商及产品种类 SELECT vend_id,COUNT(*) AS num_prods FROM Products Group BY vend_i...

Do the next right thing! 498

mysql outer join的用法_MySQL中join的用法

JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。这里描述先甩出一张用烂了的图,然后插入测试数据。笛卡尔积:CROSS JOIN要理解各种JOIN首先要理解笛卡尔积。笛卡尔积就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录。t_blog表有10条记录,t_t...

weixin_42168230的博客 1万+

线结构光三维重建(二):光平面标定与激光轮廓提取的实战优化

本文深入探讨了线结构光三维重建中的光平面标定与激光轮廓提取两大核心环节的实战优化。详细介绍了从棋盘格标定板法到自动化高鲁棒性标定的流程优化,并分享了针对复杂工业场景(如低对比度、高反光表面)的激光轮廓提取组合策略,旨在提升三维重建系统的整体精度与稳定性。

weixin_29057237的博客 331

Mybatis Plus——以XML方式使用 Wrapper 自定义SQL时IDEA错误[**expected, got ‘${‘]解决方案

问题描述 '(', ',', CROSS, FOR, GROUP, HAVING, INNER, INTO, JOIN, LEFT, LIMIT, LOCK, NATURAL, ORDER, PROCEDURE, RIGHT, STRAIGHT_JOIN, UNION, WHERE, WINDOW or '[' expected, got '${' 官方文档 https://mp.baomidou.com/guide/wrapper.html#使用-wrapper-自定义sql 问题分

无限迭代中...... 6845

谷歌(Google) Pixel 8/9 Pro(xl)如何获取 root 权限

谷歌(Google)Pixel8/9Pro(xl)等系列手机破解后,会在你的init_boot.img同路径生成一个magisk_patched.img,把这个文件拷贝到adb目录下,稍后还得把它刷回手机,这样手机才能获得Root权限,因为安卓14、15以后的内核结构调整,和Pixel7及以下的6、5、4、3、2等系列手机破解稍微不一致。因为ROOT权限的获取,需要使用ROM中的内核文件,个人强烈建议在官网下载ROM,直接刷最新版,其他地方的ROM如果没有校验码,请自行斟酌是否使用。

bugsycrack的博客 3488

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何利用MLC-LLM框架在安卓设备上编译与部署大语言模型。从环境搭建、模型获取与量化编译,到最终的安卓应用打包与调试,提供了完整的实战流程。重点介绍了如何通过MLC-LLM将大型模型优化为适合移动端运行的格式,实现本地、低延迟、隐私安全的AI应用部署。

weixin_29251337的博客 475

MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER] JOIN)

  MySQL中的各种JOIN1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用, 如SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2SELECT * FROM table1,table2由于其返回的结果为被连接的两个数

winer2008的专栏 1706

图像加密与解密(附matlab代码)

详细介绍了三种图像加密解密原理,并基于matlab开发了一套相应系统。

2441

mysql select left [outer] join_MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER]

MySQL中的各种JOIN1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用’,’如SELECT * FROM table1 CROSS JOIN table2SELECT * FROM table1 JOIN table2SELECT * FROM table1,table2由于其返回的结果为被连接的两个数据表的乘积,因此当有W...

weixin_29119475的博客 163

IGS精密星历高效获取与解析指南

本文详细介绍了IGS精密星历在高精度定位中的核心作用,对比了IGS Final、IGR和IGU等不同产品的精度与时效性差异。指南提供了从武汉大学、NASA CDDIS等数据中心高效下载数据的实战方法,并深入解析了SP3文件格式,帮助用户掌握精密星历的获取、解析与自动化处理技巧,以支持厘米级定位应用。

garlic的博客 839

/proc/sys/vm/max_map_count耗尽时,调用glibc 2.11.3 free()导致程序crash,问题追踪和解决

1. 问题 在客户环境下,当我们的程序消耗较大内存时,会偶尔crash。 通过gdb分析,程序core dump在malloc/free函数内。 当把/proc/sys/vm/max_map_count 从65530增加到131070,程序再也不crash。 相关命令 echo 131073 > /proc/sys/vm/max_map_count 2.  core

万大胖博客,苦并快乐着 4430

mysql cross join的用法_MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER] JOIN) | 学步园...

1.In MySQL,CROSS JOINis a syntactic equivalent toINNER JOIN(they can replace each other). In standard SQL, they are not equivalent.INNER JOINis used with anONclause,CROSS JOINis used otherwise.手册中提到标准...

weixin_32259697的博客 335

IIR数字滤波器原理,设计方法及嵌入式应用

基于STM32的二阶直接II型巴特沃斯低通滤波器设计方法及应用

weixin_38342580的博客 1万+

SQL inner join、left join、right join、full outer join、union、union all的区别

假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同 一、inner join SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name 2.full[outer] join(MySQL不支持全关联) SELECT * FROM TableA FULL OUTER JOIN T...

Markble 6911

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2569

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SQL 中 JOIN 的 7 种用法详解:INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 一文搞懂

SQL 中 JOIN 的 7 种用法详解:INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 一文搞懂

m0_56366694的博客 367

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL主要支持7种JOIN方式:

FULL OUTER JOIN:返回左表和右表中所有的行。但需要注意的是,MySQL本身不直接支持FULL OUTER JOIN,可以通过UNION将LEFT JOIN和RIGHT JOIN的结果合并来模拟这一行为。RIGHT JOIN(右连接):返回右表的所有行,即使左表没有匹配项。LEFT JOIN(左连接):返回左表的所有行,即使右表没有匹配项。CROSS JOIN(交叉连接):返回左表的每一行与右表的每一行的笛卡尔积,即所有可能的组合。INNER JOIN(内连接):返回两个表中键相匹配的行。

m0_68921558的博客 482

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL之连接查询

连接查询是数据库使用中最常见的操作之一,用于在两张表(或多张表)之间进行匹配操作。在MySQL中提供了对连接操作的支持,包括的功能主要有交叉连接(CROSS JOIN)、内连接(INNER JOIN)和外连接(OUTER INNER)。本文中将对MySQL中支持的这三种连接查询做简单介绍。 一、CROSS JOIN CROSS JOIN 为交叉连接,是对两个表执行笛卡尔积操作,返回的结

DoubleH的博客 499
上一篇: 使用命令行配置启动windows服务
下一篇: 动感101 肯德基音乐早餐节目录音
mlxia
博客等级 码龄26年 28粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值