SQL語句實戰學習

来源:https://www.cnblogs.com/lxxduang/archive/2022/07/23/16512481.html
-Advertisement-
Play Games

10 | MySQL為什麼有時候會選錯索引? 使用哪個索引是由 MySQL 來確定的 可能遇到的情況:一條本來可以執行得很快的語句,卻由於 MySQL 選錯了索引,而導致執行速度變得很慢 先建一個簡單的表,表裡有 a、b 兩個欄位,並分別建上索引: CREATE TABLE `t` ( `id` i ...


參考:https://zhuanlan.zhihu.com/p/38354000
再次感謝作者的整理!!

1.數據已提前準備好了,已知有如下4張表:
學生表:student 

成績表:score(學號,課程號,成績)

 課程表:course

教師表:teacher

 

 2.1 簡單查詢

2.1.1 查詢姓"曹"的學生名單

SELECT * FROM student WHERE `name` LIKE '曹%'

 

 

2.1.2 查詢姓名中最後一個是"玉"的學生名單

SELECT * FROM student WHERE `name` LIKE '%玉'

 

 

2.1.3 查詢姓名中帶"星"的學生名單

SELECT * FROM student WHERE `name` LIKE '%星%'

 

 

2.2 彙總查詢

2.2.1 查詢課程編號為"0002"的總成績

SELECT SUM(grade) as '總成績' FROM score WHERE course_id='0002'

 

2.2.2 查詢選了課程的學生人數

SELECT COUNT(DISTINCT stu_id)  as '選了課程的學生人數' FROM score # DISTINCT  去重

 

 

2.3 分組查詢

2.3.1 查詢各科成績最高和最低得分

SELECT MAX(grade) as '最高分',MIN(grade) as '最低分' FROM score ORDER BY grade

 

 

2.3.2 查詢每門課程被選修的學生數

SELECT course_id as '課程號' ,COUNT(stu_id) as '學生人數' FROM score GROUP BY course_id  

2.3.3 查詢學生中男、女人數

SELECT sex,COUNT(sex) as '人數' FROM student GROUP BY sex

 

 

2.4 帶條件的分組查詢

2.4.1 查詢平均成績大於60分學生的學號和平均成績

SELECT stu_id as '學號', AVG(grade) as '平均成績' FROM score GROUP BY stu_id HAVING AVG(grade) > 60 

 

2.4.2 查詢至少選修兩門課程的學生學號以及課程數目

SELECT stu_id as '學生學號', COUNT(course_id) as '課程數目' FROM score GROUP BY stu_id HAVING COUNT(course_id) > 2

2.4.3 查詢同名同姓學生名單並統計同名人數

SELECT name as '學生名單' ,COUNT( name) as '同名人數' FROM student GROUP BY `name`

 

2.4.4 查詢不及格的課程並按照課程號從大到小排序

SELECT course_id,grade from score WHERE grade < 85 ORDER BY grade DESC

 

2.4.5 查詢每門課程的平均成績,結果按照平均成績升序排序,平均成績相同時,按照課程好降序排序

SELECT course_id as '課程號',AVG(grade) as '平均成績' from score GROUP BY course_id ORDER BY AVG(grade) and course_id

 

2.4.6 查詢其中課程編號為"0003"且分數小於90的學生學號,結果按照分數降序排列

SELECT course_id , stu_id, grade from score WHERE course_id='0003' AND grade < 90 ORDER BY grade DESC

2.4.7 查詢課程號和選修此課程人數,查詢結果按照人數排序降序,若人數相同,按照課程號升序排序

SELECT course_id as '課程號', COUNT(course_id) as '課程人數' from score GROUP BY course_id ORDER BY COUNT(course_id) DESC,course_id ASC

 

2.4.8 查詢兩門以上成績不滿85分的同學的學號及其平均成績

SELECT stu_id as '學號', AVG(grade) as '平均成績' from score WHERE grade <= 85 GROUP BY stu_id HAVING COUNT(course_id) >= 2 

2.4.9 查詢各科成績前兩名的記錄

(SELECT *  from score WHERE course_id = '0001' ORDER BY grade DESC LIMIT 2) union
(SELECT *  from score WHERE course_id = '0002' ORDER BY grade DESC LIMIT 2) union
(SELECT *  from score WHERE course_id = '0003' ORDER BY grade DESC LIMIT 2);

 

2.5 彙總查詢

 

2.5.1 查詢學生的成績併進行排名

 

SELECT stu_id , SUM(grade) FROM score GROUP BY stu_id ORDER BY SUM(grade)

 

2.5.2 查詢平均成績大於80分的學生的學號和平均成績

SELECT stu_id ,AVG(grade) FROM score GROUP BY stu_id HAVING AVG(grade) > 80  

 

2.5.3 查詢所有課程成績小於85分的學生的學號、姓名

SELECT id , name  FROM student WHERE  id in (SELECT stu_id  FROM score GROUP BY stu_id HAVING AVG(grade) < 85);

 

2.5.3 查詢沒有學全所有課程的學生的學號、姓名

SELECT id , name  FROM student WHERE  id in ( SELECT stu_id  FROM score GROUP BY stu_id HAVING COUNT(course_id) < 3);

 

2.5.4 查詢1996年出生的學生名單

SELECT * FROM student WHERE year(brith) = 1996

 

2.5.5 查詢各學生的年齡

SELECT id,`name`,TIMESTAMPDIFF(year,brith,now()) from student;

 

 

2.6 多表查詢

2.6.1 查詢所有學生的學號、姓名、選課數、總成績

SELECT s1.id , s1.`name`, COUNT(s2.course_id) as 'count', SUM(grade) FROM student as s1 JOIN score as s2 WHERE s1.id = s2.stu_id GROUP BY s2.stu_id

 

2.6.2 查詢平均成績大於85分的所有學生的學號、姓名、平均成績

SELECT s1.id , s1.`name`, AVG(grade) FROM student as s1 JOIN score as s2 WHERE s1.id = s2.stu_id GROUP BY s2.stu_id HAVING  AVG(grade) > 85

 

2.6.3 查詢學生的選課情況:學號、姓名、課程號、課程名稱

SELECT s1.id as '學號', s1.`name` as '姓名', s2.course_id as '課程號' ,c1.`name` as '課程名稱' FROM student as s1 JOIN score as s2 JOIN course as c1 WHERE s1.id = s2.stu_id  and s2.course_id = c1.id;

 

2.6.4 查詢出每門課程的大於80得人數和不大於80的人數

SELECT course_id, SUM(CASE WHEN grade > 80 THEN 1 ELSE 0 END) as '大於80', SUM(CASE WHEN grade <= 80 THEN 1 ELSE 0 END) as '小於80' FROM score  GROUP BY course_id

 

2.6.5 使用分段[90,100],[80-90),[70,80),[60,70)區間統計各科成績,統計各分段人數和,課程號,課程名稱

 

SELECT s.course_id as '課程號',c1.`name` as '課程號',
sum(case when s.grade >= 60 and s.grade < 70 then 1 else 0 end) as '[60,70)',
sum(case when s.grade >= 70 and s.grade < 80 then 1 else 0 end) as '[70,80)',
sum(case when s.grade >= 80 and s.grade < 90 then 1 else 0 end) as '[80,90)',
sum(case when s.grade >= 90 and s.grade < 100 then 1 else 0 end) as '[90,100)'
from score as s join course as c1 where s.course_id = c1.id group by s.course_id;  

 

 

 

2.6.6. 查詢課程編號為"0003"且課程成績在90分以上的學生的學號和姓名

SELECT  s2.id as '學號',s2.`name` as '姓名'
from score as s1 join student as s2 where s1.stu_id = s2.id AND s1.course_id = '0003' AND s1.grade > 90;

 

 

2.6.7 數據的行列如何互換?

# 使用max()聚合函數將三個結果中的最大的提取出
select stu_id, MAX(case course_id when
'0001' then grade else 0 end ) as '課程號0001', max((case course_id when '0002' then grade else 0 end)) as '課程號0002', max((case course_id when '0003' then grade else 0 end)) as '課程號0003' FROM score group by stu_id;

 

 

 

2.7 多表連接查詢

2.7.1 查詢課程號為"0001"的課程分數小於90的學生信息,按照分數降序排列

select s2.id,s2.name,s1.course_id,s1.grade FROM score as s1 JOIN student as s2 
WHERE s1.stu_id = s2.id AND s1.course_id = '0001' HAVING grade < 90 ORDER BY grade desc

 

 

2.7.2 查詢不同老師所教的不同課程的平均分從高到低顯示

select c1.teacher_id, s1.course_id, c1.`name`, avg(grade) 
FROM score as s1 JOIN course as c1
WHERE s1.course_id = c1.id GROUP BY c1.teacher_id ORDER BY AVG( s1.grade) DESC

 

 

2.7.3 查詢課程名稱為"數學",且分數低於90的學生姓名和分數

select s2.`name` as '學生姓名', s1.grade as '分數'
FROM score as s1 JOIN course as c1 JOIN student as s2
WHERE s1.course_id = c1.id AND s1.stu_id = s2.id
AND c1.`name` = '數學' and s1.grade < 90

 

 

2.7.4 查詢兩門及其以上課程小於85的同學的學號,姓名及其平均成績

select s1.id as '學號',s1.name as '姓名',avg(s2.grade) as '平均成績' 
from student as s1 join score as s2 on s1.id = s2.stu_id and s2.grade < 85 
group by s2.stu_id having count(s1.id) >= 2;

 

 

2.7.5 查詢不同課程成績相同的學生的學生編號、課程編號、學生成績

SELECT 
DISTINCT s1.stu_id as '學生編號', s1.course_id as '課程編號', s1.grade as '學生成績'
FROM score AS s1 JOIN score AS s2
ON s1.stu_id = s2.stu_id
WHERE s1.course_id != s2.course_id  AND s1.grade = s2.grade

 

 

2.7.6 查詢課程編號為“0002”的課程比“0001”的課程成績高的所有學生的學號

SELECT 
DISTINCT  a.stu_id,a.grade as '0002成績',b.grade as '0001成績'
FROM 
(SELECT stu_id,grade FROM score WHERE course_id = '0002' ) as a 
join
(SELECT stu_id,grade FROM score WHERE course_id = '0001' ) as b
ON a.stu_id = b.stu_id 
where a.grade > b.grade;

 

 

2.7.7 查詢學過編號為“0001”的課程並且也學過編號為“0002”的課程的學生的學號、姓名

SELECT 
a.stu_id as '學號',s1.`name` as '姓名'
FROM 
(SELECT stu_id FROM score WHERE course_id = '0002' ) as a 
join
(SELECT stu_id FROM score WHERE course_id = '0001' ) as b
ON a.stu_id = b.stu_id 
JOIN student as s1 on s1.id = b.stu_id

 

 

2.7.8 查詢學過“陳獨秀”老師所教的所有課的同學的學號、姓名

SELECT 
DISTINCT s1.stu_id as '學號',s2.`name` as '姓名'
FROM 
(SELECT course_id,t1.`name` FROM teacher as t1 JOIN score as s1 on t1.id = s1.course_id WHERE t1.`name` = '陳獨秀') as a
join
score as s1
JOIN 
student as s2
WHERE a.course_id = s1.course_id AND s1.stu_id = s2.id

 

 

2.7.9 查詢至少有一門課與學號為“0001”的學生所學課程相同的學生的學號和姓名`


SELECT
s1.id,s1.`name`
FROM student as s1
WHERE s1.id in
(SELECT DISTINCT(stu_id) from score WHERE course_id in (SELECT course_id FROM score WHERE stu_id = '0001'))
AND s1.id != '0001';

 

 

 

2.7.10 按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

SELECT
s1.stu_id as '學生號',
MAX(CASE WHEN c1.`name` = '語文' THEN s1.grade ELSE 0 END) as '語文',
MAX(CASE WHEN c1.`name` = '數學' THEN s1.grade ELSE 0 END) as '數學',
MAX(CASE WHEN c1.`name` = '英語' THEN s1.grade ELSE 0 END) as '英語',
avg(s1.grade) as '平均成績'
FROM course as c1 JOIN score as s1
ON c1.id = s1.course_id
GROUP BY s1.stu_id

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 技術群里有人發了一段代碼: 附言:兄弟們,這個單例怎麼樣? 我回覆:什麼鬼,看不懂啊?! 也有其他小伙伴表示看不懂,看來大家的C#基礎和我一樣並不全面。 我看不懂,主要是因為我沒用過TaskCompletionSource和Interlocked的CompareExchange方法,然後經過我1、2 ...
  • 1.Xshell遠程登錄Linux系統 在實際的項目部署工作中,遠程登錄到伺服器上是繞不開的彎。本文遠程登錄Linux系統選用工具的是目前最常用、最好用的Xshell。Xsheel是一個強大的安全終端模擬軟體,它支持SSH1、SSH2以及Windows系統的Telnet協議。它的運行速度流程並且完美 ...
  • 1.保障應用程式埠的連通性 通常情況下伺服器的防火牆通常都是開啟的狀態,所以我們需要保證我們部署應用程式的埠是開啟了相應的訪問許可權,否則我們的應用程式將無法被外界進行訪問。這裡為了快速測試應用程式的埠連通性,我們使用比較方便的Telnet工具進行測試,該工具的安裝包內置在Windows操作系統 ...
  • 一:背景 1. 講故事 前段時間有位朋友說他的程式 CPU 出現了暴漲現象,由於程式是買來的,所以問題就比較棘手了,那既然找到我,就想辦法幫朋友找出來吧,分析下來,問題比較經典,有必要和大家做一下分享。 二:WinDbg 分析 1. CPU 真的爆高嗎 一直關註這個系列的朋友應該知道,用 !tp 驗 ...
  • “don't worry”,部署ASP.NET Core應用可以和原來部署.NET Framework的ASP.NET應用一樣的簡單,還是“熟悉的配方,熟悉的味道”,甚至提供了更加便捷的Kestrel部署方式,下麵主要介紹在windows平臺下兩種常用部署方式: 方式一:Kestrel部署Web應用 ...
  • 前言 .NET在跨平臺後對於應用的部署而言,不在像.NET Framework的時候那麼單一化了,一個.NET Core應用的部署工作就可以涉及到很多知識點。 就對於windows而言,我們可以選擇使用IIS和Kestrel作為我們的Web伺服器。既可以把網站的部署用“進程內托管”方式插入IIS管道 ...
  • Linux 的應用安裝,升級和卸載 1.源碼安裝:太古老了,基本沒人用了 2.通過紅帽的包管理器安裝: 語法:rpm [參數] 軟體包名 (1)參數: i :安裝; U:升級; e:清除(卸載)軟體包; v:驗證包; h:顯示進度條; q:查詢選項; a:查詢/驗證所有包; (2)常用參數組合: - ...
  • 現象 在ubuntu上編譯內核時,apt-get source時出現如下warning: W: Download is performed unsandboxed as root as file '/var/cache/apt/archives/partial/samba-libs_2%3a4.5. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...