`
isiqi
  • 浏览: 16353097 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
MySQL中的各种JOIN

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

SELECT * FROM table1 CROSS JOIN table2
SELECT * FROM table1 JOIN table2
SELECT * FROM table1,table2

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

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

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

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

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


------------------------------<wbr></wbr>--------------
添加显示条件WHERE, ON, USING
1. WHERE子句
2. ON
3. USING子句,如果连接的两个表连接条件的两个列具有相同的名字<wbr></wbr>的话可以使用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');
------------------------------<wbr></wbr>--------------

另外需要注意的地方

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

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

------------------------------<wbr></wbr>--------------
看懂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以及JOI<wbr></wbr>N表达式构成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<wbr></wbr>_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查看,两个连接的表中,不符合连接条件的部分<wbr></wbr>,因为不符合条件的部分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<wbr></wbr>/sql_join.asp
http://www.keithjbrown.co.uk<wbr></wbr>/vworks/mysql/mysql_p5.php
http://dev.mysql.com/doc<wbr></wbr>/refman/5.0/en/join.html

回复 转发
分享到:
评论

相关推荐

    Mysql之innerjoin,leftjoin,rightjoin详解.pdf

    inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner join inner join 又称等值连接,是指从两个表中选择公共列的记录。只有当两个表中的列值相等时,才会返回结果集。例如: ...

    SQL联合查询inner join、outer join和cross join的区别详解

    在SQL查询中,联合查询是将两个或多个表格的数据结合在一起的一种方法,主要涉及三种类型的联合:INNER JOIN、OUTER JOIN(包括LEFT JOIN、RIGHT JOIN和FULL JOIN)以及CROSS JOIN。理解这些概念对于数据库开发人员...

    mysql join所有方法总结

    INNER JOIN(内连接):是所有Join中最常见的类型。使用INNER JOIN后,只有两个表中能够相互匹配的记录才会出现在结果集中。例如,从上述内容中可以看出,当使用INNER JOIN时,会从employee_table(员工表)和issue...

    Mysql中的join操作

    3. **全外联结(FULL OUTER JOIN)**:MySQL不直接支持全外联结,但可以通过组合LEFT JOIN和RIGHT JOIN来实现相同的效果,展示左表和右表中所有匹配和不匹配的记录。 ```sql SELECT * FROM java LEFT JOIN mysql...

    MySQL中join语句的基本使用教程及其字段对性能的影响

    在MySQL中,如果没有指定ON条件,INNER JOIN和CROSS JOIN的结果相同,都是笛卡尔积。 字段字符集编码对性能的影响不容忽视。不同的字符集可能会导致不同的存储需求和处理速度。例如,如果一个JOIN操作涉及到两个...

    万里长城第一步-先来学好数据库之MySQL上.docx

    在这个学习资源中,我们将学习七种基本的Join查询类型:inner join、left join、right join、full join、left outer join、right outer join和cross join。 3. 创建表: 在学习Join查询之前,我们需要了解如何创建...

    MySQL中基本的多表连接查询教程

    在MySQL中,INNER JOIN和CROSS JOIN是等价的。例如: ```sql SELECT * FROM table1 INNER JOIN table2 ON table1.key = table2.key; ``` 这里,`key`是连接条件,只有当table1和table2的`key`值相等时,记录才会被选...

    SQL之join使用1

    - 外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。 - **左外连接**(Left Join)保留左表(在JOIN语句中位于前面的表)的所有行,即使在右表中没有匹配的行...

    MySQL表与表之的连接和查询.pdf

    本文档还提及了一些高级特性,例如在LEFT JOIN或RIGHT JOIN中,如何指定在连接时使用特定的索引,或者如何使用STRAIGHT_JOIN优化查询性能。STRAIGHT_JOIN可以强制MySQL按照在语句中给出的顺序来处理表的连接。 在...

    【表119,,促销计划执行表】 mysql 多表查询 执行计划.doc

    4. **选择正确的JOIN类型**:根据需求,选择最合适的JOIN类型,有时INNER JOIN比OUTER JOIN更快。 5. **避免使用SELECT ***:明确指定需要的列可以减少数据传输量,提高性能。 四、执行计划分析 MySQL提供EXPLAIN...

    可能是史上最全的-------mysql连结查询精炼.pdf

    - **左外连接 (LEFT OUTER JOIN)**:返回左表的所有行,即使在右表中没有匹配的行,对于右表中不存在的匹配行,结果为NULL。 - **右外连接 (RIGHT OUTER JOIN)**:与之相反,返回右表的所有行,左表中没有匹配的行...

    Mysql join连接查询的语法与示例

    - 外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN),但在MySQL中,全外连接不被支持。 - **左外连接(LEFT JOIN)**:返回左表的所有行,即使右表没有匹配的行,右表的...

    Joins_MySQL:学习和实践JOIN

    在MySQL数据库管理系统中,JOIN操作是连接不同表的关键技术,用于检索来自两个或更多相关表的数据。本资源“Joins_MySQL”很显然是为了帮助用户深入理解和实践MySQL中的JOIN操作。下面将详细介绍JOIN的不同类型及其...

    mysql关联查询

    MySQL关联查询是数据库操作中的重要概念,用于在多个表之间建立连接,以便从不同表中检索相关数据。关联查询能够让我们在单个SQL语句中处理来自多个表的数据,极大地提高了数据查询的效率和灵活性。这里我们将深入...

    数据库连接表查询

    例如,在 MySQL 中并不直接支持全外连接,但在其他如 Oracle 或 SQL Server 中,则可以直接使用 `FULL OUTER JOIN`。 **注意事项:** - `WHERE` 子句和 `ON` 子句的区别:通常建议将连接条件放在 `ON` 子句中,而将...

    数据库表连接(内外、左右连接).docx

    - 左外连接(LEFT OUTER JOIN 或 LEFT JOIN):返回左表的所有行,即使在右表中没有匹配的行。对于右表中不存在的匹配,结果将填充NULL值。 - 右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN):与左外连接相反,返回右表...

    sql多表查询语句与方法

    在例子中,`SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city`,这个查询会返回authors表和publishers表中城市相同的作者和出版社的所有信息。 2. **LEFT JOIN(左外连接)**: LEFT JOIN...

Global site tag (gtag.js) - Google Analytics