mysql 左,右,內連接

左右連接


全相乘方法(效率很低)

mysql> select * from test10;

+------+-------+

| id   | sname |

+------+-------+

|    1 | 雲彩     | 

|    2 | 月亮      | 

|    3 | 星星      | 

+------+-------+

3 rows in set (0.00 sec)


mysql> select * from test11;

+--------+-------+

| cat_id | cname |

+--------+-------+

|     95 | 猴子      | 

|     96 | 老虎     | 

+--------+-------+

2 rows in set (0.00 sec)


數據庫中實現兩表*的效果

mysql> select * from test10,test11;

+------+-------+--------+-------+

| id   | sname | cat_id | cname |

+------+-------+--------+-------+

|    1 | 雲彩     |     95 | 猴子      | 

|    1 | 雲彩     |     96 | 老虎     | 

|    2 | 月亮      |     95 | 猴子      | 

|    2 | 月亮      |     96 | 老虎     | 

|    3 | 星星      |     95 | 猴子      | 

|    3 | 星星      |     96 | 老虎     | 

+------+-------+--------+-------+

6 rows in set (0.03 sec)


分析:

test10看成集合有三個元素

test11看成集合有兩個元素


test10*test11得到新集合是有六個元素

行 兩個錶行數相乘

列 兩個表列數相加(可以重複)


多表查詢時候列名重複的情況時候,需要明確指出取得是那個表

mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category limit 3;

+----------+--------+--------------------+--------+----------+

| goods_id | cat_id | goods_name         | cat_id | cat_name |

+----------+--------+--------------------+--------+----------+

|        1 |      4 | KD876              |      1 | 手機類型        | 

|        4 |      8 | htcN85原裝充電器           |      1 | 手機類型        | 

|        3 |      8 | 諾基亞原裝5800耳機            |      1 | 手機類型        | 

+----------+--------+--------------------+--------+----------+



技巧 :創建一個同樣結構的表  create table [新表名] like [舊錶名]

create table minigoods like goods;


複製一部分表的內容

mysql> insert into minigoods

    -> select * from goods limit 3;


取得有意義的兩個表的對應 minigoods.cat_id=category.cat_id

mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category where minigoods.cat_id=category.cat_id ;

+----------+--------+--------------------+--------+----------+

| goods_id | cat_id | goods_name         | cat_id | cat_name |

+----------+--------+--------------------+--------+----------+

|        1 |      4 | KD876              |      4 | 3G手機      | 

|        4 |      8 | htcN85原裝充電器           |      8 | 耳機         | 

|        3 |      8 | 諾基亞原裝5800耳機            |      8 | 耳機         | 

+----------+--------+--------------------+--------+----------+

3 rows in set (0.00 sec)


左連接語法

a表在左,不動

b表在右,動

a表和b表通過一個關係(自己設定),來篩選a所需要的b的行


a left join b on [條件]  ----條件爲真,取出b的行


a left join b on [條件] 結果集也可以看成表(假設爲c表),可以對其再查詢 


mysql> select goods_id,goods_name,cat_name  

    -> from

    -> (minigoods left join category on minigoods.cat_id=category.cat_id); 

+----------+--------------------+----------+

| goods_id | goods_name         | cat_name |

+----------+--------------------+----------+

|        1 | KD876              | 3G手機      | 

|        4 | htcN85原裝充電器           | 耳機         | 

|        3 | 諾基亞原裝5800耳機            | 耳機         | 

+----------+--------------------+----------+


[minigoods left join category on minigoods.cat_id=category.cat_id 看做c表]

驗證:就是後面依然可以使用where 等等過濾條件


mysql> select goods_id,goods_name,cat_name from 

(minigoods left join category on minigoods.cat_id=category.cat_id )

where 1 order by goods_id desc limit 2; 

+----------+--------------------+----------+

| goods_id | goods_name         | cat_name |

+----------+--------------------+----------+

|        4 | htcN85原裝充電器           | 耳機         | 

|        3 | 諾基亞原裝5800耳機            | 耳機         | 

+----------+--------------------+----------+

2 rows in set (0.00 sec)


可以多張表左連接,就是把結果看成表 

         看做一張表

{{a left join b on [條件]}  left join c on [條件]} 


mysql> select goods.goods_id,goods.goods_name,goods.cat_id,cat_name

    -> from

    -> minigoods left join category on minigoods.cat_id=category.cat_id

    -> left join goods on minigoods.cat_id=4 limit 4;

+----------+--------------------+--------+----------+

| goods_id | goods_name         | cat_id | cat_name |

+----------+--------------------+--------+----------+

|        1 | KD876              |      4 | 3G手機      | 

|        4 | htcN85原裝充電器           |      8 | 3G手機      | 

|        3 | 諾基亞原裝5800耳機            |      8 | 3G手機      | 

|        5 | 索愛原裝M2卡讀卡器               |     11 | 3G手機      | 

+----------+--------------------+--------+----------+




左右連接的區別===================================================================================================


a left join b on 意思是查詢的時候以a爲基準查詢

a right join b on 意思是查詢的時候以b爲基準查詢


a left join b on  等同於 b right join a (都是以a爲基準查詢)


技巧:處於移植兼容性和理解上來說,最好一律使用左連接實現


create table boy(

bname varchar(20),

other char(1)

)engine myisam charset utf8;


insert into boy

values

('屌絲','A'),

('李四','B'),

('王五','C'),

('高富帥','D'),

('鄭七','E');



create table girl(

gname varchar(20),

other char(1)

)engine myisam charset utf8;



insert into girl

values

('空姐','B'),

('大S','C'),

('阿嬌','D'),

('張柏芝','D'),

('林黛玉','E'),

('寶釵','F');



取出所有男生的配偶(左連接)

select boy.*,girl.* from

boy left join girl on

boy.other=girl.other;


+--------+-------+--------+-------+

| bname  | other | gname  | other |

+--------+-------+--------+-------+

| 屌絲      | A     | NULL   | NULL  | 

| 李四       | B     | 空姐      | B     | 

| 王五       | C     | 大S      | C     | 

| 高富帥     | D     | 阿嬌       | D     | 

| 高富帥     | D     | 張柏芝     | D     | 

| 鄭七      | E     | 林黛玉       | E     | 

+--------+-------+--------+-------+


取出所有女生的配偶(左連接)

mysql> select girl.*,boy.* from

    -> girl left join boy on 

    -> boy.other=girl.other;

+--------+-------+--------+-------+

| gname  | other | bname  | other |

+--------+-------+--------+-------+

| 空姐      | B     | 李四       | B     | 

| 大S      | C     | 王五       | C     | 

| 阿嬌       | D     | 高富帥     | D     | 

| 張柏芝     | D     | 高富帥     | D     | 

| 林黛玉       | E     | 鄭七      | E     | 

| 寶釵       | F     | NULL   | NULL  | 

+--------+-------+--------+-------+


取出所有女生的配偶(右連接,和上面左連接一致)

mysql> select girl.* ,boy.* from

    -> boy right join girl on

    -> boy.other=girl.other;

+--------+-------+--------+-------+

| gname  | other | bname  | other |

+--------+-------+--------+-------+

| 空姐      | B     | 李四       | B     | 

| 大S      | C     | 王五       | C     | 

| 阿嬌       | D     | 高富帥     | D     | 

| 張柏芝     | D     | 高富帥     | D     | 

| 林黛玉       | E     | 鄭七      | E     | 

| 寶釵       | F     | NULL   | NULL  | 

+--------+-------+--------+-------+



內連接===================================================================================================


取出有配偶的


select girl.*,boy.* from

boy inner join girl on 

boy.other=girl.other;

+--------+-------+--------+-------+

| gname  | other | bname  | other |

+--------+-------+--------+-------+

| 空姐      | B     | 李四       | B     | 

| 大S      | C     | 王五       | C     | 

| 阿嬌       | D     | 高富帥     | D     | 

| 張柏芝     | D     | 高富帥     | D     | 

| 林黛玉       | E     | 鄭七      | E     | 

+--------+-------+--------+-------+


內連接是左右連接的交集

(外連接是左右連接的並集,mysql不支持)可以使用用union實現



左連接應用===================================================================================================

create table match_t(

match_id int primary key auto_increment,

host_team_id int,

guest_team_id int,

match_result varchar(20),

match_time date

)engine myisam charset utf8;


insert into match_t

values

(1,1,2,'2:0','2006-05-21'),

(2,2,3,'1:2','2006-06-21'),

(3,3,1,'2:5','2006-07-21'),

(4,1,1,'3:2','2006-08-21');


create table team_t(

team_id int primary key auto_increment,

team_name varchar(20)

)engine myisam charset utf8;


insert into team_t

values

(1,'恆大'),

(2,'國安'),

(3,'申花'),

(4,'大連');



mysql> select * from match_t;

+----------+--------------+---------------+--------------+------------+

| match_id | host_team_id | guest_team_id | match_result | match_time |

+----------+--------------+---------------+--------------+------------+

|        1 |            1 |             2 | 2:0          | 2006-05-21 | 

|        2 |            2 |             3 | 1:2          | 2006-06-21 | 

|        3 |            3 |             1 | 2:5          | 2006-07-21 | 

|        4 |            4 |             1 | 3:2          | 2006-08-21 | 

+----------+--------------+---------------+--------------+------------+


mysql> select * from team_t;

+---------+-----------+

| team_id | team_name |

+---------+-----------+

|       1 | 恆大          | 

|       2 | 國安          | 

|       3 | 申花        | 

|       4 | 大連          | 

+---------+-----------+


技巧 :善與給表其別名


2006-06-21日期之後 把表中對戰換成隊名 

select host_t.team_name,guest_t.team_name,match_result,match_time from

match_t left join (team_t as host_t) on match_t.host_team_id=host_t.team_id

left join (team_t as guest_t) on match_t.guest_team_id=guest_t.team_id


where match_time>='2006-06-21';


+--------------+-----------+---------------+-----------+--------------+------------+

| host_team_id | team_name | guest_team_id | team_name | match_result | match_time |

+--------------+-----------+---------------+-----------+--------------+------------+

|            1 | 恆大          |             2 | 國安          | 2:0          | 2006-05-21 | 

|            2 | 國安          |             3 | 申花        | 1:2          | 2006-06-21 | 

|            3 | 申花        |             1 | 恆大          | 2:5          | 2006-07-21 | 

|            4 | 大連          |             1 | 恆大          | 3:2          | 2006-08-21 | 

+--------------+-----------+---------------+-----------+--------------+------------+


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章