日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL笔试经典50题及答案解析(题目41-50)

發布時間:2023/12/10 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 考慮并列的排名,如果第一名或者第二名有并列,全部找出來

#考慮并列的排名,如果第一名或者第二名有并列,全部找出來 SELECT * FROM (SELECT *,dense_rank() over (PARTITION BY cid ORDER BY score DESC) AS srank FROM sc ) AS tmp WHERE tmp.srank<=2

運行結果:

從上述結果看出,這種情況考慮并列結果,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,返回值為后者-前者

# 方法1:TIMESTAMPDIFF函數規定返回值類型是YEAR,返回值為后者-前者 SELECT *,TIMESTAMPDIFF(YEAR,sage,CURRENT_TIMESTAMP()) AS age FROM student

方法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() 函數
# 求12月后面的1個月,結果是'2020-01-01' SELECT DATE_ADD('2019-12-1',INTERVAL 1 MONTH)

總結

以上是生活随笔為你收集整理的SQL笔试经典50题及答案解析(题目41-50)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。