189 8069 5689

mysql交叉怎么连接 mysql交叉连接与内连接的联系

mysql两表联合查询

两个表需要有共同的字段用来做对应关系,假定表a 的ab字段和表b 的bc字段意义是一样的:

创新互联建站于2013年开始,先为慈利等服务建站,慈利等地企业,进行企业商务咨询服务。为慈利企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

新建两张表:

表a:ab ac ad

1 1 2

2 3 4

3 5 6

表b: bc bd be

1 7 8

3 9 10

4 11 12

(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)

一、外连接

外连接可分为:左连接、右连接、完全外连接。

1、左连接 left join 或 left outer join

SQL语句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd执行结果以ab行为准:

表:ab ac ad bc bd be

1 1 2 1 7 8

2 3 4 0 0 0

3 5 6 3 9 10

其中b表bc第二行的值在ab中没有对应的所以左连无法找出来,同理右连会变成这样:

SQL语句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd执行结果以bd行为准:

表:ab ac ad bc bd be

1 1 2 1 7 8

3 5 6 3 9 10

0 0 0 4 11 12

左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为0.

注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为0。

注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

3、完全外连接 full join 或 full outer join

SQL语句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a full join 表b on 表a.ab=表b.bd执行结果:

表:ab ac ad bc bd be

1 1 2 1 7 8

2 3 4 0 0 0

3 5 6 3 9 10

0 0 0 4 11 12

完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为0,如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为0。

二、内连接 join 或 inner join

SQL语句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a inner join 表b on 表a.ab=表b.bdinner join 是比较运算符,只返回符合条件的行。

表:ab ac ad bc bd be

1 1 2 1 7 8

3 5 6 3 9 10

三、交叉连接 cross join

1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

表a: ab

星期一

星期二

星期三

表b: cd

张三

李四

王五

SELECT a.ab,b.cd FROM 表a CROSS JOIN 表b

ab cd

星期一 张三

星期一 李四

星期一 王五

星期二 张三

星期二 李四

星期二 王五

星期三 张三

星期三 李四

星期三 王五

mysql内连接 比默认笛卡尔积 效率高在哪儿?

1. 多表连接类型

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被划分在一起。 join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]

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

例子:

user表:

id | name

———

1 | libk

2 | zyfon

3 | daodao

user_action表:

user_id | action

—————

1 | jump

1 | kick

1 | jump

2 | run

4 | swim

sql:

select id, name, action from user as u left join user_action a on u.id = a.user_id

result:

id | name | action

——————————–

1 | libk | jump ①

1 | libk | kick ②

1 | libk | jump ③

2 | zyfon | run ④

3 | daodao | null ⑤

分析:

注意到user_action中还有一个user_id=4, action=swim的纪录,但是没有在结果中出现,

而user表中的id=3, name=daodao的用户在user_action中没有相应的纪录,但是却出现在了结果集中

因为现在是left join,所有的工作以left为准.

结果1,2,3,4都是既在左表又在右表的纪录,5是只在左表,不在右表的纪录

工作原理:

从左表读出一条,选出所有与on匹配的右表纪录(n条)进行连接,形成n条纪录(包括重复的行,如:结果1和结果3),如果右边没有与on条件匹配的表,那连接的字段都是null.然后继续读下一条。

引申:

我们可以用右表没有on匹配则显示null的规律, 来找出所有在左表,不在右表的纪录, 注意用来判断的那列必须声明为not null的。

如:

sql:

select id, name, action from user as u left join user_action a on u.id = a.user_id where a.user_id is NULL

注意:

1.列值为null应该用is null 而不能用=NULL

2.这里a.user_id 列必须声明为 NOT NULL 的.

上面sql的result:

id | name | action

————————–

3 | daodao | NULL

——————————————————————————–

一般用法:

a. LEFT [OUTER] JOIN:

除了返回符合连接条件的结果之外,还需要显示左表中不符合连接条件的数据列,相对应使用NULL对应

复制代码 代码如下:SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column

b. RIGHT [OUTER] JOIN:

RIGHT与LEFT JOIN相似不同的仅仅是除了显示符合连接条件的结果之外,还需要显示右表中不符合连接条件的数据列,相应使用NULL对应

复制代码 代码如下:SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column

Tips:

1. on a.c1 = b.c1 等同于 using(c1)

2. INNER JOIN 和 , (逗号) 在语义上是等同的

3. 当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。

如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。

通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。

可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。如:

mysql SELECT * FROM table1 USE INDEX (key1,key2) - WHERE key1=1 AND key2=2 AND key3=3; mysql SELECT * FROM table1 IGNORE INDEX (key3) - WHERE key1=1 AND key2=2 AND key3=3;

2. 表连接的约束条件

添加显示条件WHERE, ON, USING

1. WHERE子句

mysql

复制代码 代码如下:SELECT * FROM table1,table2 WHERE table1.id=table2.id;

2. ON

mysql

复制代码 代码如下:SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id

LEFT JOIN table3 ON table2.id=table3.id;

3. USING子句,如果连接的两个表连接条件的两个列具有相同的名字的话可以使用USING

例如:

SELECT FROM LEFT JOIN USING ()

连接多于两个表的情况举例:

mysql

SELECT artists.Artist, cds.title, genres.genre FROM cds LEFT JOIN genres N 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.

3. MySQL如何优化LEFT JOIN和RIGHT JOIN

在MySQL中,A LEFT JOIN B join_condition执行过程如下:

1)· 根据表A和A依赖的所有表设置表B。

2)· 根据LEFT JOIN条件中使用的所有表(除了B)设置表A。

3)· LEFT JOIN条件用于确定如何从表B搜索行。(换句话说,不使用WHERE子句中的任何条件)。

4)· 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外。如果出现循环依赖关系,MySQL提示出现一个错误。

5)· 进行所有标准WHERE优化。

6)· 如果A中有一行匹配WHERE子句,但B中没有一行匹配ON条件,则生成另一个B行,其中所有列设置为NULL。

7)· 如果使用LEFT JOIN找出在某些表中不存在的行,并且进行了下面的测试:WHERE部分的col_name IS NULL,其中col_name是一个声明为 NOT NULL的列,MySQL找到匹配LEFT JOIN条件的一个行后停止(为具体的关键字组合)搜索其它行。

RIGHT JOIN的执行类似LEFT JOIN,只是表的角色反过来。

联接优化器计算表应联接的顺序。LEFT JOIN和STRAIGHT_JOIN强制的表读顺序可以帮助联接优化器更快地工作,因为检查的表交换更少。请注意这说明如果执行下面类型的查询,MySQL进行全扫描b,因为LEFT JOIN强制它在d之前读取:

SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;

在这种情况下修复时用a的相反顺序,b列于FROM子句中:

SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;

MySQL可以进行下面的LEFT JOIN优化:如果对于产生的NULL行,WHERE条件总为假,LEFT JOIN变为普通联接。

例如,在下面的查询中如果t2.column1为NULL,WHERE 子句将为false:

复制代码 代码如下:SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,可以安全地将查询转换为普通联接:

复制代码 代码如下:SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

这样可以更快,因为如果可以使查询更佳,MySQL可以在表t1之前使用表t2。为了强制使用表顺序,使用STRAIGHT_JOIN。

MySQL中的交叉连接、内连接、外连接

学生student表:

课程course表:

交叉连接:

结果为两张表的笛卡尔积:

内连接(inner join ,inner 可以省略)

显示内连接和隐示内连接获得的查询结果是一样的,都是A表和B表的交集(例:A.id = B.id),但是只能查到有关系的信息,如果A表的一条数据的与B表关联的字段没有对应的信息(如:A.id = null),即:这条数据在B表中没有对应的信息,则无法获得。

外连接(outer join,outer可以省略)

左外连接获得的查询结果是左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息。

右外连接获得的查询结果是右边的表B的全部信息和A,B两张表的交集,右边B表的全部包含B表中在A表中没有对应关系的信息。

MySQL连接5种方式

SQL中的 join 可以根据相应条件把指定的表给结合起来并将数据返回。

内连接是基于连接谓词将俩张表(如A和B)的列组合到一起产生新的结果表,在表中存在至少一个匹配时,INNER JOIN 关键字返回行

左外连接Left join关键字会从左表那里返回所有的行,即使是在右表中没有匹配到的行 

右外连接关键字Right join会从右表那里返回所有的行,即使是在左表中没有匹配到的行 

全连接的关键字Full join,只要其中某个表中存在匹配,Full join 就会返回行

交叉连接一般使用的比较少,交叉连接又称笛卡尔连接或者叉乘连接,如果,A和B是俩个集合,他们的交叉连接就是A*B 


分享文章:mysql交叉怎么连接 mysql交叉连接与内连接的联系
文章出自:http://cdxtjz.cn/article/dopicog.html

其他资讯