SQL笔试经典50题及答案解析(题目41-50)
前言
最近博主在準備數據分析崗位的筆試和面試,其中的考察重點就是SQL。聽說練了這50道題目(題目和數據來源參考:互聯網校招SQL筆試經典50題及答案解析),什么現場手撕SQL統統都不怕,我就趕緊來練習了!壯士們,練完以后就什么都不怕啦~
我看了原博主的查詢語句,有些不夠簡潔,有些或許存在問題。下面都是我自己寫的查詢語句,保證在Navicat上跑得通,但是不排除存在寫的不對不好的地方,歡迎大家提出來,一起學習,共同進步。
環境:
Navicat Premium 12
說明:
本篇練習的是題目41-50,哪怕不簡單,大家也不用害怕,take it easy~
其余題目請參考鏈接:
SQL筆試經典50題及答案解析(題目1-10)
SQL筆試經典50題及答案解析(題目11-20)
SQL筆試經典50題及答案解析(題目21-30)
SQL筆試經典50題及答案解析(題目31-40)
文章目錄
- 創建表
- 表說明
- 表創建
- 表顯示
- 題目
- 題目42(重要)
- 題目43
- 題目44
- 題目45
- 題目46
- 題目47(重要)
- 題目48
- 題目49
- 題目50(重要)
創建表
表說明
本次創建的表有四張:
- 學生表(student): 包含 學生號,學生姓名,出生年月,性別 四個字段
- 教師表(teacher): 包含教師號,教師姓名 兩個字段
- 成績表(sc): 包含學生號,課程號,成績 三個字段
- 課程表(course): 包含課程號,課程名,教師號 三個字段
表創建
# 創建學生表 create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); insert into Student values('01' , '趙雷' , '1990-01-01' , '男'); insert into Student values('02' , '錢電' , '1990-12-21' , '男'); insert into Student values('03' , '孫風' , '1990-05-20' , '男'); insert into Student values('04' , '李云' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吳蘭' , '1992-03-01' , '女'); insert into Student values('07' , '鄭竹' , '1989-07-01' , '女'); insert into Student values('08' , '王菊' , '1990-01-20' , '女');# 創建課程表 create table Course(cid varchar(10),cname varchar(10),tid varchar(10)); insert into Course values('01' , '語文' , '02'); insert into Course values('02' , '數學' , '01'); insert into Course values('03' , '英語' , '03');# 創建教師表 create table Teacher(tid varchar(10),tname varchar(10)); insert into Teacher values('01' , '張三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五');# 創建成績表 create table SC(sid varchar(10),cid varchar(10),score decimal(18,1)); insert into SC values('01' , '01' , 80); insert into SC values('01' , '02' , 90); insert into SC values('01' , '03' , 99); insert into SC values('02' , '01' , 70); insert into SC values('02' , '02' , 60); insert into SC values('02' , '03' , 80); insert into SC values('03' , '01' , 80); insert into SC values('03' , '02' , 80); insert into SC values('03' , '03' , 80); insert into SC values('04' , '01' , 50); insert into SC values('04' , '02' , 30); insert into SC values('04' , '03' , 20); insert into SC values('05' , '01' , 76); insert into SC values('05' , '02' , 87); insert into SC values('06' , '01' , 31); insert into SC values('06' , '03' , 34); insert into SC values('07' , '02' , 89); insert into SC values('07' , '03' , 98);表顯示
學生表如下:
教師表如下:
成績表如下:
課程表如下:
題目
題目42(重要)
查詢每門功課成績最好的前兩名
情況1: 考慮并列的排名,如果第一名或者第二名有并列,全部找出來
運行結果:
從上述結果看出,這種情況考慮并列結果,80分排名是第一,因此,所有排名第一的同學都被取了出來;接下來是76分排名第二,所以所有76分的同學都被取了出來。
情況2: 不考慮并列的排名,就取2人
#不考慮并列的排名,就取2人 SELECT * FROM (SELECT *,ROW_NUMBER() over (PARTITION BY cid ORDER BY score DESC) AS srankFROM sc ) AS tmp WHERE tmp.srank<=2運行結果:
從上述結果可以看出,這種做法不考慮并列,僅僅是取出2名同學的信息。
題目43
統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT cid,COUNT(DISTINCT sid) AS cnt FROM sc GROUP BY cid HAVING cnt>5 -- 知識點:having里面可以使用select里面定義的別名,但是where不行 ORDER BY cnt DESC,cid ASC注意事項:
- having子句里面可以使用select里面定義的別名,但是where子句就不行,因為執行順序where靠前,select靠后。
運行結果:
題目44
檢索至少選修兩門課程的學生學號
SELECT sid,COUNT(DISTINCT cid) AS cnt FROM sc GROUP BY sid HAVING COUNT(DISTINCT cid)>=2運行結果:
題目45
查詢選修了全部課程的學生信息
SELECT sid FROM sc GROUP BY sid HAVING COUNT(DISTINCT cid) = (SELECT COUNT(DISTINCT cid) FROM sc)運行結果:
題目46
查詢各學生的年齡
方法1: TIMESTAMPDIFF函數規定返回值類型是YEAR,返回值為后者-前者
方法2: 使用year提取年份
# 方法2:# 使用year提取年份 SELECT *,YEAR(CURRENT_DATE())-YEAR(sage) AS age FROM student注意事項:
- TIMESTAMPDIFF函數使用方法為:
- TIMESTAMPDIFF(unit,date1,date2)
- 規定返回值類型是unit
- 返回值為后者-前者
- 考察時間函數的使用,常見的提取時間的函數:
- YEAR(DATE) 提取年份
- MONTH(DATE) 提取月
- DAY(DATE) 提取日
運行結果:
題目47(重要)
查詢本周過生日的學生
# 同一天,在不同的年份,可能不是同一周,例子很多 SELECT WEEKOFYEAR('2020-03-17') AS week1,WEEKOFYEAR('2018-03-17') AS week2 # 運行結果:week1是12,week2是11# 解決辦法:放在同一年進行比較 SELECT * FROM student WHERE WEEKOFYEAR(CONCAT('2020-',SUBSTR(sage, 6,5))) = WEEKOFYEAR(CURDATE())注意事項:
- 同一天,在不同的年份,可能不是同一周,例子很多
- 解決辦法:使用substr函數把原來的月份和日提取出來,然后使用concat函數和今年的年份連接起來,這樣就做到了在同一年比較,然后再比較結果,這種做法合理一點。
題目48
查詢下周過生日的學生
SELECT * FROM student WHERE WEEKOFYEAR(CONCAT('2020-',SUBSTR(sage, 6,5))) = WEEKOFYEAR(DATE_ADD(CURDATE())+1注意事項:
題目49
查詢本月過生日的學生
# 使用month提取月份 SELECT * FROM student WHERE MONTH(sage) = MONTH(CURRENT_DATE())注意事項:
- 和下一道題對比學習
題目50(重要)
查詢下月過生日的學生
SELECT sid,sname,sage FROM student WHERE MONTH(sage) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))注意事項:
- 一般大家都會想到給當前月份+1,就是下個月。但是碰到12月也加一就有問題了,畢竟沒有13月呀!
- 解決辦法:使用DATE_ADD/ DATE_SUB函數,就能給當前日期加上或者減去固定的時間,比如求12月后面的1個月,可以得到結果是一月。
- 知識點:MySQL DATE_SUB() 函數
總結
以上是生活随笔為你收集整理的SQL笔试经典50题及答案解析(题目41-50)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ANSYS——命令流学习(材料属性设置、
- 下一篇: Oracle数据库锁表查询