兩個表需要有共同的字段用來做對應關系,假定表a 的ab字段和表b 的bc字段意義是一樣的:
成都創新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于做網站、成都網站制作、將樂網絡推廣、微信小程序開發、將樂網絡營銷、將樂企業策劃、將樂品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯為所有大學生創業者提供將樂建站搭建服務,24小時服務熱線:028-86922220,官方網址:m.kartarina.com
新建兩張表:
表a:ab ac ad
1 1 2
2 3 4
3 5 6
表b: bc bd be
1 7 8
3 9 10
4 11 12
(此時這樣建表只是為了演示連接SQL語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。)
一、外連接
外連接可分為:左連接、右連接、完全外連接。
1、左連接 left join 或 left outer join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執行結果以ab行為準:
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
其中b表bc第二行的值在ab中沒有對應的所以左連無法找出來,同理右連會變成這樣:
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a left join 表b on 表a.ab=表b.bd執行結果以bd行為準:
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
0 0 0 4 11 12
左外連接包含left join左表所有行,如果左表中某行在右表沒有匹配,則結果中對應行右表的部分全部為0.
注:此時我們不能說結果的行數等于左表數據的行數。當然此處查詢結果的行數等于左表數據的行數,因為左右兩表此時為一對一關系。
右外連接包含right join右表所有行,如果左表中某行在右表沒有匹配,則結果中對應左表的部分全部為0。
注:同樣此時我們不能說結果的行數等于右表的行數。當然此處查詢結果的行數等于左表數據的行數,因為左右兩表此時為一對一關系。
3、完全外連接 full join 或 full outer join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a full join 表b on 表a.ab=表b.bd執行結果:
表:ab ac ad bc bd be
1 1 2 1 7 8
2 3 4 0 0 0
3 5 6 3 9 10
0 0 0 4 11 12
完全外連接包含full join左右兩表中所有的行,如果右表中某行在左表中沒有匹配,則結果中對應行右表的部分全部為0,如果左表中某行在右表中沒有匹配,則結果中對應行左表的部分全部為0。
二、內連接 join 或 inner join
SQL語句:select 表a.ab,表a.ac,表a.ad,表b.bc,表b.bd,表b.be from 表a inner join 表b on 表a.ab=表b.bdinner join 是比較運算符,只返回符合條件的行。
表:ab ac ad bc bd be
1 1 2 1 7 8
3 5 6 3 9 10
三、交叉連接 cross join
1.概念:沒有 WHERE 子句的交叉聯接將產生連接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小。
表a: ab
星期一
星期二
星期三
表b: cd
張三
李四
王五
SELECT a.ab,b.cd FROM 表a CROSS JOIN 表b
ab cd
星期一 張三
星期一 李四
星期一 王五
星期二 張三
星期二 李四
星期二 王五
星期三 張三
星期三 李四
星期三 王五
一共3張表 knowledge , knowledge_question , knowledge_answer ,數據在 6000~10000 之間。
執行的語句:
執行時間約 10分鐘 ,查看執行計劃如下:
全部都是全表掃描,根據MySQL聯表查詢的算法 Nested-Loop Join ,MySQL查詢的結果集是3張表的笛卡爾積,所以效率特別低。
耗時變成 20毫秒
給Where條件建立索引,并不一定會使用。
比如:在表 knowledge 的字段 update 上建立索引 idx_time :
結果執行上來看,并沒有使用索引 idx_time 。
如果where條件從 k.update_time'2019-01-03 12:00:00' 修改為 k.update_time='2019-01-03 12:00:00' (從 變成 = )
則會使用索引 idx_time
在建立索引的時候,會遇到 Table Metadata Lock 的問題,可以先 show processlist ,找到占用表鎖的連接,然后 kill 。
select * from 表1 inner join 表2 on 關聯條件
select * from 表1 left outer join 表2 on 關聯條件
select * from 表1 right outer join 表2 on 關聯條件
select * from 表1 cross join 表2 on 關聯條件
MYSQL查詢
查詢平均成績大于70分的同學的學號和平均成績
SELECT s.id,AVG(sc.score) FROM student s,studentcourse sc WHERE s.id=sc.student_id GROUP BY s.id HAVING ?AVG(sc.score)70;
查詢所有同學的學號、姓名、選課數、總成績
SELECT id,NAME
FROM student
WHERE id NOT IN (SELECT student_id
FROM studentcourse
WHERE course_id IN (SELECT course.id
FROM teacher,course
WHERE teacher.id=course.teacher_id
AND teacher.name=’關羽’));
查詢學生信息和平均成績
SELECT s.id,s.name,s.city,s.age, c.name,sc.score,t.name
FROM student s,studentcourse sc,course c,teacher t
WHERE s.id=sc.student_id AND c.id=sc.course_id AND c.teacher_id=t.id GROUP BY s.id;?
文章標題:mysql怎么做連表查詢,mysql 連表
網站路徑:http://m.kartarina.com/article12/hegjgc.html
成都網站建設公司_創新互聯,為您提供網站設計、定制開發、關鍵詞優化、搜索引擎優化、面包屑導航、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯