日期:2014-05-16  浏览次数:20745 次

说说MySQL的join查询和索引

1 关于join查询

下面是例子分析
表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?
(所影响的行数为 5 行)

结果说明:?
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join(相等联接或内联接)

sql语句如下:?
SELECT * FROM a?
INNER JOIN b?
ON a.aID =b.bID

等同于以下SQL句:?
SELECT *?
FROM a,b?
WHERE a.aID = b.bID