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

歡迎訪問 生活随笔!

生活随笔

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

数据库

sql 两表数据合并_多表查询SQL语句

發布時間:2025/3/12 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql 两表数据合并_多表查询SQL语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章中主要講述以下內容:

一、表的加法

合并兩張表的過程:

然后運用sql語句:

select 課程號,課程名稱 from course union select 課程號,課程名稱 from course1

以上子句會把兩個表中重復數據刪除。要想不刪除重復的行,則需要在上面子句union的后面加一個all,變成union all。

二、表的聯結

關系數據庫里各表之間相互聯結建立關系。

1. 交叉聯結 cross join

交叉聯結也稱笛卡爾積,當a表有x行,b表有y行時,交叉聯結就是x行與y行的所有組合組成的新表。在實際運用中,運用較少。

2.內聯結 inner join

select a.學號,a.姓名,b.課程號 from student as a inner join score as b on a.學號= b.學號;

3. 左聯結 left join

左聯結是以左表為基礎,根據on后給出的兩表的條件將兩表連接起來,結果會將左表所有的查詢信息列出,而右表只列出on后條件與左表滿足的部分。

select a.學號,a.姓名,b.課程號 from student as a left join score as b on a.學號=b.學號;

在左聯結的基礎上,去掉兩表的公共部分:

select a.學號,a.姓名,b.課程號 from student as a left join score as b on a.學號=b.學號 where b.學號 is not null;

4.右聯結 right join

右聯結是以右表為基礎,根據on后給出的兩表的條件將兩表連接起來,結果會將右表所有的查詢信息列出,而左表只列出on后條件與右表滿足的部分。

select a.課程號,b.學號,b.姓名 from score as a right join student as b on a.學號=b.學號;

select a.學號,a.姓名,b.課程號 from student as a right join score as b on a.學號=b.學號 where b.學號 is not null;

5. 全聯結 full join

完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。

6.SQL運行順序:

1.先運行子查詢

2.每個查詢語句里的運行順序:

1)先運行from where group by 和having子句 2)select 子句 3)最后運行order by和limit子句.

三、聯結應用案例(常見面試題)

問題1:查詢所有學生的學號、姓名、選課數、總成績。

1.翻譯成大白話就是:

1)學號、姓名(學生表student)

2)選課數(每個學生的選課數目:成績表score,按學號分組,對課程號計數count)

3)總成績(每個學生的總成績:成績表score,按學號分組,對成績求和sum)

2.分析思路:

查詢所有學生的學號,姓名、每個學生的選課數目、每個學生的總成績。

3.將分析思路寫成sql語句:

select a.學號,a.姓名,count(b.課程號) as選課數,sum(b.成績) as總成績 from student as a left join score as b on a.學號=b.學號 group by a.學號;

問題2:查詢平均成績大于85的所有學生的學號、姓名和平均成績。

1.翻譯成大白話就是:

1)查找所有學生的學號、姓名和平均成績,學號、姓名在學生表student中,平均成績可通過成績表score中。

2)查找平均成績>85

2.分析思路

3.將分析思路寫成sql語句:

select a.學號,a.姓名,avg(b.成績) as平均成績 from student as a left join score as b on a.學號=b.學號 group by a.學號 having avg(b.成績)>85;

問題3*:查詢學生的選課情況:學號,姓名,課程號,課程名稱。(涉及三張表的聯結。)

1.翻譯成大白話就是:

1)學號,姓名(學生表student)

2)課程號,課程名稱(課程表course)

2.分析思路

這里學生表和課程表無法直接聯結,因此需要通過成績表score聯結,那么這里就涉及到三張表的聯結了。

3.將分析思路寫成sql語句:

select a.學號,a.姓名,c.課程號,c.課程名稱 from student as a inner join score as b on a.學號=b.學號 inner join course as c on b.課程號= c.課程號;

四、case表達式

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

舉例:

select 學號,課程號,成績, (case when 成績>=60 then'及格' when 成績<60 then'及格' else null end) as 是否合格 from score;

1.查詢出每門課程的及格人數和不及格人數

select 課程號, sum(case when 成績 >= 60 then 1 else 0 end) as 及格人數, sum(case when 成績<60 then 1 else 0 end) as 不及格人數 from score group by 課程號;

case表達式注意事項

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

case表達式中else子句可以不寫,默認為空值,但一般情況下還是要寫上。case表達式可放在任意子句上。

2.使用分段[85-100],[70-85],[60-70],[<60]來統計各科成績,分別統計:各分數段人數,課程號和課程名稱。

select a.課程號,b.課程名稱, sum(case when 成績>85 and 成績<100 then 1 else 0 end) as '[85-100]', sum(case when 成績>70 and 成績<85 then 1 else 0 end) as '[70-85]', sum(case when 成績>60 and 成績<70 then 1 else 0 end) as '[60-70]', sum(case when 成績<60 then 1 else 0 end) as '[<60]' from score as a right join course1 as b on a.課程號=b.課程號 group by a.課程號,b.課程名稱;

sqlzoo習題:

The JOIN operation/zh?sqlzoo.net

注意:外國人姓名順序

注意:distinct為保留唯一值。

總結:注意區分左聯結、右聯結、內聯結、distinct、 “%”、及case子句。

封面圖片來源于網絡。

總結

以上是生活随笔為你收集整理的sql 两表数据合并_多表查询SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。

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