MySQL - 常见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_t3)表結構和數據
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,55)用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 ITEM3FROM Student Sinner join Student S1 on S.name = S1.name and S.course <> S1.courseinner join Student S2 on S.name = S2.name and S.course <> S2.courseWHERE S.score>=80 and S1.score>=80 and S2.score>=80) DGROUP BY D.name 方法二:思路:采用逆向思維想想。。。。。。求三門成績都大于80的人,也可以是使先查出有成績小于80 的人,再除去這些人不就是三門成績都大于80的人了么? 以前學過的數學邏輯逆向思維還真是有用的阿!!具體辦法:先掃描表,查出有成績小于80的人的姓名,然后再次掃描表,用not in 或not exists 方法。點評:此方法采用逆向思維,能快速寫出高效且簡單的 SQL語句。//not inSELECT DISTINCT A.name FROM Student AWHERE A.name not in(SELECT Distinct S.name FROM Student S WHERE S.score <80)//not existsSELECT 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.nameFROM Student SGROUP BY S.nameHaving MIN(S.score)>=806)刪除除了自動編號不同,其他都相同的學生冗余信息
有如下學生表
自動編號?學號??姓名?課程編號?課程名稱?分數
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?
總結
以上是生活随笔為你收集整理的MySQL - 常见SQL笔试题整理(长期更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用offsetof对结构体指针偏移操作
- 下一篇: matlab simulink笔记05