SQL自連線查詢和case when詳解

2021-09-07 21:03:18 字數 2671 閱讀 3576

今天在逛論壇,突然看到了一條sql語句,裡面用了case和when,感覺自己以前沒有學過這個知識點啊,就蒐集了一些資料,下面是一些總結。

首先準備資料:

-- 建立資料庫hivedemo

create database hivedemo;

use hivedemo;

-- 建立course表

create table `course` (

`id` int,

`sid` int ,

`course` varchar(20),

`score` int

) ;-- // 字段解釋:id, 學號, 課程, 成績

insert into `course` values (1, 1, 'yuwen', 43);

insert into `course` values (2, 1, 'shuxue', 55);

insert into `course` values (3, 2, 'yuwen', 77);

insert into `course` values (4, 2, 'shuxue', 88);

insert into `course` values (5, 3, 'yuwen', 98);

insert into `course` values (6, 3, 'shuxue', 65);

需求:查詢出所有數學課程成績 大於 語文課程成績的學生的學號和各科成績

第一反應就是用自連線查詢,就是把這乙個表看成兩張表,然後這兩張表裡分別只有數學成績和語文成績,在利用多表查詢的知識,很完美就解決問題了。

自連線方法:

select 

c1.sid,-- 學號

c1.course,-- shuxue課程

c1.score,-- 成績

c2.course,-- yuwen課程

c2.score-- 語文成績

from

course c1,-- c1表只有shuxue成績

course c2-- c2表只有yuwen成績

where

c1.sid=c2.sid-- 相當於外來鍵關係(自己想象)

andc1.course="shuxue"-- 保證c1表的成績只有shuxue成績的條件

andc2.course="yuwen"-- 保證c2表的成績只有yuwen成績的條件

andc1.score>c2.score;-- shuxue成績大於yuwem成績

結果:

我個人還是感覺自連線查詢更簡單易懂,下面是這個題的case ...when版本(個人感覺超級複雜,此處只是為了演示)

第一步:-- 使用case...when...將不同的課程名稱轉換成不同的列

-- 使用case...when...將不同的課程名稱轉換成不同的列

create view tmp_course_view as

select sid, case course when "shuxue" then score else 0 end as shuxue,

case course when "yuwen" then score else 0 end as yuwen from course;

-- 檢視轉換後的表

select * from tmp_course_view;

第二步:-- 以sid分組合併取各成績最大值

-- 以sid分組合併取各成績最大值

create view tmp_course_view1 as

select aa.sid, max(aa.shuxue) as shuxue, max(aa.yuwen) as yuwen from tmp_course_view aa group by sid;

-- 檢視

select * from tmp_course_view1;

第三步:--  比較結果

--  比較結果

select * from tmp_course_view1 where shuxue > yuwen;

結果都沒問題,那個更好用更好理解自己體會吧。

更新和查詢

/*更新*/

update table

set 欄位1=case

when 條件1 then 值1

when 條件2 then 值2

else 值3

end

where ……

/*查詢*/

select 欄位1, 欄位2,

case 欄位3

when 值1 then 新值

when 值2 then 新值

end as 重新命名欄位3的名字

from table

where ……

order by ……

SQL自連線查詢

問題 表testcolor title color sign a 紅 111 b 紅 222 a 綠 333 c 紅 444 轉檢視 title 紅 綠 a 111 333 b 222 null c 444 null 解答 declare sql nvarchar 1000 set sql sele...

SQL查詢 內連線 外連線 自連線查詢

先建立2個表 學生表和教師表 在每個表中找出符合條件的共有記錄。x inner join y on.第一種寫法 只用where select t.teacher name,s.student name from teacher t,student s where t.id s.teacher id ...

mysql自連線查詢 Mysql自連線查詢例項詳解

自連線查詢 假想以下場景 某一電商 想要對站內產品做層級分類,乙個類別下面有若干子類,子類下面也會有別的子類。例如數碼產品這個類別下面有筆記本,台式電腦,智慧型手機等 筆記本,台式電腦,智慧型手機又可以按照品牌分類 品牌又可以按照 分類,等等。也許這些分類會達到乙個很深的層次,呈現一種樹狀的結構。那...