在之前的學習和練習中,所有的操作都是在一張表中進行操作,實際工作中,我們期望得到的資料往往分散在不同的表中,今天我將帶大家一起學會從多張表中獲取資料。
表的加法在sql語句中用union表示,是按行將表中資料合併到一起。重複的資料只保留乙個。若想要保留表中重複的行,則使用union all。
如何合併兩個表?以之前的課程表(course)為例。
課程表(course)
右擊course表-複製表-結構和資料-重新命名表為course1後開啟表-修改資料:
課程表(course1)
合併後不保留重複值(union)結果:
合併後保留全部重複值(union all)結果:
表和表之間是通過對應的列產生關係,關係就是資料庫中資料對應的匹配,將資料庫中的表連線在一起的一種操作,即聯結(join)。
在之前的資料庫school中,4張表有下面的聯結關係:
常用的聯結有:
交叉聯結(cross join)、內聯結(inner join)、左聯結(left join)、右聯結(right join)、全聯結(full join)
1、交叉聯結
又稱為笛卡爾積。它是將乙個表中的每一行分別都與另一張表中的每一行合併在一起。交叉聯結後表的行數是兩張錶行數的乘積。
2、內聯結
即同時查詢出存在於兩張表中的資料。
內連線示例:
3、左聯結
即取出左側表中的所有資料。左側表中資料作為主資料,右側表只取出相關行。
若想要在左聯結基礎上去除兩表的公共資料,只取出左側表獨有資料,該怎麼做?
4、右聯結
對應上面的左聯結,即取出右側表的全部資料。左側表只選取相關行資料。
若想要在右聯結基礎上去除兩表的公共資料,只取出右側表獨有資料,該怎麼做?
5、全聯結
其查詢返回結果為左表和右表中的所有行。(注意一點,mysql不支援全聯結,了解即可)
一張圖總結sql連線(要牢記):
結合之前所學的業務分析方法,把聯結運用到實際案例中吧。
問題1:查詢所有學生的學號、姓名、選課數、總成績
step1:翻譯成大白話。
step2:寫出分析思路
由上可知,此處設計兩張表。需用到聯結(此處為查詢所有學生資訊。因此用左聯結)。把關鍵字和子句寫上,拆解到對應的字句,寫上分析思路。
step3:寫出sql語句並執行
問題2:查詢平均成績大於85的所有學生的學號、姓名和平均成績
問題3:查詢學生的選課情況:學號、姓名、課程號、課程名稱
case表示式相當於乙個條件判斷的函式,用來判斷每一行是否滿足某個條件。每次只返回乙個結果。
case表示式應用示例:判斷成績表中成績是否及格
練習1:查詢出每門課程 的及格人數和不及格人數
練習2:使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計:各分數段人數、課程號和課程名稱
使用case表示式的一些注意事項:
以上就是今天關於多表查詢的學習與練習,關鍵還是在多表查詢中使用哪種聯結的選擇上要多注意,以及通過哪個列進行聯結,另外,時刻要注意其中的對應關係,是一對一還是多對多,都要考慮清楚。總結的那張圖可經常拿出來回顧,做到了然於心。當然,還有最後學習的case表示式,當涉及到條件判斷時就要想到它。
繼續去sqlzoo練習今天的內容~
查詢去除空值 第二關 簡單查詢
1 查詢姓猴學生名單 select distinct 姓名 from student where 姓名 like 猴 去除distinct關鍵字 select 姓名 from student where 姓名 like 猴 2 查詢名中最後乙個字是 猴 的學生名單 select 姓名 from st...
SQL 多表查詢
不同的 sql join inner join 內連線 如果表中至少有乙個匹配,也從左表返回所有的行 left join 左連線 即使右表中沒有匹配,也從右表返回所有的行 right join 右連線 即使左表中沒有匹配,也從右表返回所有的行 full join 全連線 只有其中乙個表中存在匹配也從...
SQL 多表查詢
join操作符 1.笛卡爾積,rxs 可直接轉換為sql語句 2.等值連線,記作 可直接轉換為sql語句 3.自然連線,記作 可轉換為sql語句 4.左外連線和右外連線的表示方法及轉換為sql 注意若多個關係有同名屬性,則用 關係名.屬性名 指出重名屬性 連線也可以與投影,選擇等結合使用。1.查詢選...