##概述
本篇blog主要講解多表查詢,包括連接查詢和子查詢,連接又分爲交叉連接,內連接,外連接,外連接又分爲左外連接和右外連接。
本篇blog主要以student表和score表爲例說明多表查詢的操作。
student表結構如下:
create table student (
id int(11) primary key auto_increment,
name varchar(100) default '',
age int(11) default 0
);
student表的測試數據如下:
score表結構如下:
create table student (
id int(11) primary key auto_increment,
student_id int(11),
type varchar(100) default '',
score int(11) default 0
);
score表的測試數據如下:
##交叉查詢
交叉查詢使用cross join關鍵詞。使用示例如下:
select * from student cross join score
得到的結果如下:
說明:此時得到的數據共12行,7列。這是一種笛卡爾積運算,即行數爲兩錶行數相乘,列說爲之前兩列相加。
這種用戶顯然沒有絲毫意思,但我們添加where條件後,就變得有意義了,如下:
select * from student st cross join score sc where st.id = sc.student_id
結果如下:
此時可以清晰的看到每個學生的各個成績。
在開發中最常用的是下面語句:
select st.name,st.age,sc.type,sc.score from student st,score sc where st.id = sc.student_id
說明:
- 此時分別給student和score分別起了別名st和sc。
- 此時cross join關鍵詞可以省略,使用逗號隔開即可。
- 此時查詢我們需要的字段即可。
##內連接查詢
內連接使用關鍵詞inner join。sql示例如下:
select * from student st inner join score sc on st.id = sc.student_id
此時得到的結果如下:
注:這種方式與交叉連接得到的結果相同。所以這種方式很少使用。
##外連接查詢
外連接分爲左外連接和右外連接。
##左外連接
左外連接使用關鍵詞:left outer join。示例如下:
select * from student st left outer join score sc on st.id = sc.student_id
得到的結果如下:
說明:左外連接會獲取左邊的所有數據。
##右外連接
左外連接使用關鍵詞:right outer join。示例如下
select * from student st right outer join score sc on st.id = sc.student_id
得到的結果如下:
說明:右外連接會獲取右邊的所有數據。
##嵌套查詢
嵌套查詢也叫子查詢,示例如下:
select * from score where student_id in (select id from student where name='guoxiang')
得到的結果如下:
說明:此時先根據name從student表中獲取id,然後根據student_id獲取score表中的數據。