日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

查询去除空值_SQL数据处理(五):SQL多表查询

發布時間:2024/7/5 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查询去除空值_SQL数据处理(五):SQL多表查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 表的加法

加法(union)。合并兩張數據表course和course1/去除重復行重合

【select 課程號,課程名稱 from course union select 課程號,課程名稱 from course1;】 輸出結果兩個表合并的數據

若要保留重復的行數據(union all)

【select 課程號,課程名稱 from course union all select 課程號,課程名稱 from course1;】 輸出結果兩個表合并的數據,保留重復數據

二. 表的聯結

2.1 交叉聯結(cross jion):笛卡爾積指將表中的每一行逗魚另一個表中的每一行合并在一起

例如課程表(crouse)和課程表1(crouse1)進行交叉聯結得到6行數據

2.2 內聯結(inner jion):

  • 查找出同時存在于兩張表中的數據
  • 例如學生表(student)和成績表(score)同時存在學號0001
  • 內聯結運行會取出符合條件的行數據
  • 將取出的數據通過交叉聯結進行合并
  • on 表示某個表的某列與另一個表的某列進行聯結的
    • 學生表與成績表通過學號進行內聯結合并為一張表
    【select a.學號,a.姓名,b.課程號 from student as a inner join score as b on a.學號 = b.學號;】 輸出結果 0001=李彥宏=0001、0001=李彥宏=0002

    2.3 左聯結(left jion):

  • 將左側的表作為主表,將左側表中的數據全部讀取出來
  • 將右側的表中只讀取與左側表同時存在的數據行
  • 進行交叉聯結(合并數據),因為0002學號在右側表沒有對應的數據行顯示為空值
  • -- 學生表與成績表通過學號進行左聯結合并為一張表

    【select a.學號,a.姓名,b.課程號 from student as a left join score as b on a.學號 = b.學號;】 輸出結果 0001=李彥宏=0001、0001=李彥宏=0002、0002=李彥宏=空值

    獲取因為左聯結忽略的數據

    【select a.學號,a.姓名,b.課程號 from student as a left join score as b on a.學號 = b.學號 where 課程號 is Null;】 輸出結果0002=李彥宏=空值

    2.4 右聯結(right jion):

  • 將右側的表作為主表,將右側表中的數據全部讀取出來
  • 將左側的表中只讀取與左側表同時存在的數據行
  • 進行交叉聯結(合并數據),因為0005學號在右側表沒有對應的數據行顯示為空值
  • -- 學生表與成績表通過學號進行右聯結合并為一張表

    【select a.學號,a.姓名,b.課程號 from student as a right join score as bon a.學號 = b.學號 where b.學號 = Null;】 輸出結果 0001=李彥宏=0001、0001=李彥宏=0002、空值=空值=0003

    獲取因為右聯結忽略的數據

    【select a.學號,a.姓名,b.課程號 from student as a right join score as b on a.學號 = b.學號 where a.學號 is Null;】 輸出結果空值=空值=課程號

    2.5 全聯結(full jion):

  • 全聯結會返回左表和右表中的所有數據行
  • 當兩個表中的數據存在匹配的數據行時會進行合并
  • 若兩個表中的數據存在沒有匹配的數據行,不存在的值會用空值表示
  • 三. 聯結應用案例

    • 查詢所有學生的學號,姓名,選課數,總成績
    【select a.學號,a.姓名,count(b.課程號) as 選課數,sum(b.成績) as 總成績 from student as a left join score as b on a.學號 = b.學號 group by a.學號;】 輸出結果0001=李彥宏=2=170、0002=李彥宏=0=空值
    • 查詢平均成績大于60的所有學生的學號、姓名和平均成績
    【select a.學號,a.姓名,avg(b.成績) as 平均成績 from student as a left join score as b on a.學號 = b.學號 group by a.學號 having avg(b.成績)>60;】 輸出結果0001=李彥宏=85
    • 查詢學生的選課情況:學號,姓名,選課號,課程名稱
    【select a.學號,a.姓名,c.課程號,c.課程名稱 from student a inner join score b on a.學號=b.學號 inner join course c on b.課程號=c.課程號;】 輸出結果0001=李彥宏=0001=語文、0001=李彥宏=0002=數學

    四. case表達式

    4.1 定義:

    使用case表達式可以解決復雜的條件判斷,用來判斷每一行數據是否滿足指定條件

    case when <判斷表達式> then <表達式>when <判斷表達式> then <表達式>when <判斷表達式> then <表達式>......else <表達式> end

    若滿足“when判斷表達式”條件則執行“then表達式”,若不滿足則執行下一個“when判斷表達式”。若不滿足所有的“when判斷表達式”則執行“else表達式”

    4.2 注意事項

  • else子句可以不寫,此時默認為空值
  • case子句可以寫才SQL語句的子句里面
  • 當有多種需要條件判斷時使用case表達式
  • 4.3 練習題

    • 定義成績數據表中的成績數據是否及格
    【select 學號,課程號,成績, (case when 成績>60 then '及格'when 成績<=60 then '不及格'else null end) as 是否及格 from score;】 輸出結果0001=0001=80=及格、0001=0002=90=及格、0005=0003=60=不及格
    • 查詢每門課程的及格人數和不及格人數
    【select 課程號, sum(case when 成績>=60 then 1else 0end) as 及格人數, sum(case when 成績 < 60 then 1else 0end) as 不及格人數 from score group by 課程號;】 輸出結果0001=1=0、0002=1=0、0003=1=0
    • 使用分段[100-85],(85-70],(70,60],(60,-]來統計各科成績,分別統計:各分數段的人數,課程號,和課程名稱
    【select a.課程號,b.課程名稱, sum(case when 成績 between 85 and 100 then 1 else 0 end) as '[100-85]', sum(case when 成績>=70 and 成績<85 then 1 else 0 end) as '[85-70]', sum(case when 成績>=60 and 成績<70then 1 else 0 end) as '[70-60]', sum(case when 成績<60 then 1 else 0 end) as '[<60]' from score as a right join course as b on a.課程號=b.課程號 group by a.課程號,b.課程名稱;】

    四. 聯結總結

    文氏圖:SQL的聯結形式

    總結

    以上是生活随笔為你收集整理的查询去除空值_SQL数据处理(五):SQL多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。