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

  MySQL中的各种JOIN 1. 笛卡尔积(交叉连接) MySQL中可以为CROSS JOIN或者省略CROSSJOIN,或者使用',' SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ONUSING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。 一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2. 内连接INNER JOIN MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件 MySQLCROSSINNER 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 RIGHTLEFT 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, ONUSING. -------------------------------------------- 看懂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 JOINtable_reference         ONconditional_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_JOINtable_factor ONcondition  table_reference LEFT [OUTER] JOINtable_referencejoin_condition  | table_reference NATURAL [LEFT [OUTER]] JOINtable_factor  |table_reference RIGHT [OUTER] JOIN table_referencejoin_condition  |table_reference NATURAL [RIGHT [OUTER]] JOINtable_factor //数据表的连接表达式join_table join_condition:     ONconditional_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.

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值