在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的(“+”号)弄得糊涂了.
在SQL标准中规划的(Join)联结大致分为下面四种:
1,内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2,外联结:分为外左联结和外右联结.
左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
Select A.name B.name From A Left Join B On A.id=B.id
和Select A.name B.name From B Right Join A on B.id=A.id执行后的结果是一样的。
3,全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结,这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大.
4,无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法.
这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。
MySQL左连接left join:
一个简单的连接和一个MySQL左连接是不同的。一个MySQL LEFT JOIN提供了额外的考虑到在左边的表。
如果做了LEFT JOIN,得到的所有记录以同样的方式相匹配,此外,得到一个额外的记录每个不匹配的记录,在左表中的联接 - 从而保证了每一个作者得到关联(本例子中):
实例,试试下面的例子就明白了LEFT JOIN:
- root@host# mysql -u root -p password;
- Enter password:*******
- mysql> use TUTORIALS;
- Database changed
- mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
- -> FROM tutorials_tbl a LEFT JOIN tcount_tbl b
- -> ON a.tutorial_author = b.tutorial_author;
- +
- | tutorial_id | tutorial_author | tutorial_count |
- +
- | 1 | John Poul | 1 |
- | 2 | Abdul S | NULL |
- | 3 | Sanjay | 1 |
- +
- 3 rows in set (0.02 sec)
需要做更多的实践才能熟悉JOINS,这是一个复杂的概念,在MySQL/SQL将变得更加清晰.
mysql 全连接 join full
以使用多个表中的单一SQL查询。在MySQL中联接(join)行为是指两个或多个表到一个表中可以使用连接在SELECT,UPDATE和DELETE语句中加入MySQL表。我们将看到一个例子LEFT JOIN简单的MySQL连接。
在命令提示符使用联接:假设我们两个表的教程tcount_tbl和tutorials_tbl的完整列表如下.
例子,试试下面的例子:
- root@host# mysql -u root -p password;
- Enter password:*******
- mysql> use TUTORIALS;
- Database changed
- mysql> SELECT * FROM tcount_tbl;
- +
- | tutorial_author | tutorial_count |
- +
- | mahran | 20 |
- | mahnaz | NULL |
- | Jen | NULL |
- | Gill | 20 |
- | John Poul | 1 |
- | Sanjay | 1 |
- +
- 6 rows in set (0.01 sec)
- mysql> SELECT * from tutorials_tbl;
- +
- | tutorial_id | tutorial_title | tutorial_author | submission_date |
- +
- | 1 | Learn PHP | John Poul | 2007-05-24 |
- | 2 | Learn MySQL | Abdul S | 2007-05-24 |
- | 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
- +
- 3 rows in set (0.00 sec)
- mysql>
现在,加入这两个表我们可以编写一个SQL查询,这个查询会选择所有的作者从表tutorials_tbl,从tcount_tbl会拿起相应数量的教程.
- mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
- -> FROM tutorials_tbl a, tcount_tbl b
- -> WHERE a.tutorial_author = b.tutorial_author;
- +
- | tutorial_id | tutorial_author | tutorial_count |
- +
- | 1 | John Poul | 1 |
- | 3 | Sanjay | 1 |
- +
- 2 rows in set (0.01 sec)
- mysql>
补充一文章,下面是例子分析,表A记录如下:
- aID aNum
- 1 a20050111
- 2 a20050112
- 3 a20050113
- 4 a20050114
- 5 a20050115
表B记录如下:
- bID bName
- 1 2006032401
- 2 2006032402
- 3 2006032403
- 4 2006032404
- 8 2006032408
创建这两个表SQL语句如下:
- CREATE TABLE a
- aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,
- aNum char( 20 )
- )
- CREATE TABLE b(
- bID int( 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
- bName char( 20 )
- )
-
- INSERT INTO a
- VALUES ( 1, 'a20050111' ) , ( 2, 'a20050112' ) , ( 3, 'a20050113' ) , ( 4, 'a20050114' ) , ( 5, 'a20050115' ) ;
-
- INSERT INTO b
- VALUES ( 1, ' 2006032401' ) , ( 2, '2006032402' ) , ( 3, '2006032403' ) , ( 4, '2006032404' ) , ( 8, '2006032408' ) ;
实验如下:
1.left join(左联接),sql语句如下:
- SELECT * FROM a
- LEFT JOIN b
- ON a.aID =b.bID
- //结果如下:
- aID aNum bID bName
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- 5 a20050115 NULL NULL
- (所影响的行数为 5 行)
结果说明:left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
2.right join(右联接),sql语句如下:
- SELECT * FROM a
- RIGHT JOING b
- ON a.aID = b.bID
- aID aNum bID bName
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- NULL NULL 8 2006032408
-
结果说明:仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
3.inner join(相等联接或内联接),sql语句如下:
- SELECT * FROM a
- INNER JOIN b
- ON a.aID =b.bID
-
-
- SELECT *
- FROM a,b
- WHERE a.aID = b.bID
-
-
- aID aNum bID bName
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
结果说明:很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录,使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即
使在第二个(右边)表中并没有相符值的记录.
语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
说明:table1, table2参数用于指定要将记录组合的表的名称。
field1,field2参数指定被联接的字段的名称,且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的.
名称:compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误. |