今天在逛論壇,突然看到了一條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自連線查詢例項詳解
自連線查詢 假想以下場景 某一電商 想要對站內產品做層級分類,乙個類別下面有若干子類,子類下面也會有別的子類。例如數碼產品這個類別下面有筆記本,台式電腦,智慧型手機等 筆記本,台式電腦,智慧型手機又可以按照品牌分類 品牌又可以按照 分類,等等。也許這些分類會達到乙個很深的層次,呈現一種樹狀的結構。那...