常見SQL面試題整理(實時更新)
1) 有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條SQL語句查詢出這三條記錄並按以下條件顯示出來: 大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。
select (case when 語文 >= 80 then '優秀' when 語文 >= 60 and 語文 < 80 then '及格' else '不及格' end) as 語文, (case when 數學 >= 80 then '優秀' when 數學 >= 60 and 數學 < 80 then '及格' else '不及格' end) as 數學, (case when 英語 >= 80 then '優秀' when 英語 >= 60 and 英語 < 80 then '及格' else '不及格' end) as 英語 from [table]
2)一張table-t表,裡面有三個欄位:英語,其中有三條記錄分別表示語文70分,數學80分,英語58,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來:大於或等於80表優秀,大於等於60表及格,小於60表不及格顯示格式:及格 優秀 不及格
select case when 語文>=80 then '優秀' when 語文>=60 then '及格' else '不及格' end 語文 , case when 數學>=80 then '優秀' when 數學>=60 then '及格' else '不及格' end 數學 , case when 英語>=80 then '優秀' when 英語>=60 then '及格' else '不及格' end 英語 from table_t
3)表結構和資料
date result
2011-02-01 勝
2011-02-01 負
2011-02-01 勝
2011-02-02 勝
2011-02-02 負
查詢出來的結果:
date 勝 負
2011-02-01 2 1
2011-02-02 1 1
請寫出SQL語句:
SELECT date,
( SELECT count( * ) FROM table1 WHERE date = t.date AND result = '勝' ) AS '勝',
( SELECT count( * ) FROM table1 WHERE date = t.date AND result = '負' ) AS '負'
FROM table1 AS t GROUP BY date;
4)已知商品的關係模型:G(GNO,GNAME,GSALES,GPRICE,GTIME),GNO為商品編碼,GNAME為商品名稱,GSALES為商品銷售量,GPRICE為商品價格,GTIME為商品上架時間。按要求寫SQL語句,假設資料庫是mysql。建立這張商品表的sql。取商品銷售額排前5名的商品名稱和上架時間。
建立表
CREATE TABLE `G` (
`GNO` varchar(10) NOT NULL,
`GNAME` varchar(20) NULL,
`GSALES` decimal(10, 2) NULL,
`GPRICE` decimal(10, 2) NULL,
`GTIME` datetime(0) NULL,
PRIMARY KEY (`GNO`)
);
查詢銷售額前5的商品名稱和上架時間
select GNAME,GTIME from g order by GSALES desc limit 0,5
5)用SQL語句查詢每門課都大於80的學生姓名
name kecheng fenshu
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 語文 81
王五 數學 100
王五 英語 90
方法一:
思路:如果能獲得一張表,由學生姓名,語文成績,數學成績,英語成績的表,剩下的就是在WHERE條件中篩選及可以獲得想要的結果。
具體辦法:通過自連線的辦法,以“姓名”為連線條件,自連線三次,便可以獲得包含又姓名和三門課程成績的資料行。雖然可以得到想要的資料列。但會有很多冗餘重複列!
點評:此方法是根據題目,依題解題,中規中矩! 不過多張表連線非常耗費時間。而且SQL語句也比較複雜,需要注意事項很多。
SELECT D.name FROM (
SELECT S.name,S.score AS ITEM1,S1.score AS ITEM2,S2.score AS ITEM3
FROM Student S
inner join Student S1 on S.name = S1.name and S.course <> S1.course
inner join Student S2 on S.name = S2.name and S.course <> S2.course
WHERE S.score>=80 and S1.score>=80 and S2.score>=80
) D
GROUP BY D.name
方法二:
思路:採用逆向思維想想。。。。。。求三門成績都大於80的人,也可以是使先查出有成績小於80 的人,再除去這些人不就是三門成績都大於80的人了麼? 以前學過的數學邏輯逆向思維還真是有用的阿!!
具體辦法:先掃描表,查出有成績小於80的人的姓名,然後再次掃描表,用not in 或not exists 方法。
點評:此方法採用逆向思維,能快速寫出高效且簡單的 SQL語句。
//not in
SELECT DISTINCT A.name FROM Student A
WHERE A.name not in(
SELECT Distinct S.name FROM Student S WHERE S.score <80)
//not exists
SELECT DISTINCT A.name From Student A
where not exists (SELECT 1 From Student S Where S.score <80 AND S.name =A.name)
方法三:
SELECT S.name
FROM Student S
GROUP BY S.name
Having MIN(S.score)>=80
6)刪除除了自動編號不同,其他都相同的學生冗餘資訊
有如下學生表
自動編號 學號 姓名 課程編號 課程名稱 分數
1 2005001 張三 0001 數學 69
2 2005002 李四 0001 數學 89
3 2005001 張三 0001 數學 69
要求:刪除除了自動編號不同,其他都相同的學生冗餘資訊
DELETE from score where
(name,kecheng,fenshu)
in
(
select
name,kecheng,fenshu from score GROUP by name,kecheng,fenshu
having
count(name) > 1) ;
7)資料庫表如下,寫出sql語句求出每個人的平均成績,格式為【姓名,平均成績】
tbl_score
id 學生ID 課程名稱 成績
1 1 數學 99
2 2 數學 100
3 1 語文 80
4 2 語文 96
tbl_student
id 姓名 年齡
1 張三 12
2 李四 13
select
s.姓名,avg(t.`成績`) 平均成績
from tbl_score t
left join tbl_student s on t.`學生ID`=s.id
group by s.id