最近剛好在頭條寫了三篇關于MySQL的SQL語法實戰文章,這里大概列舉其中部分練習題,文末附全部文章鏈接,有興趣的可以跳轉閱讀。
演示數據我們將以下面演示數據為例開展相關SQL語法練習,演示數據涉及學生信息表、教師信息表、課程信息表、成績信息表,具體建表語句及數據如下:
學生信息表
我們向學生信息表中插入如下4條數據:
教師信息表
我們向教師信息表中插入如下3條數據:
課程信息表
我們向課程信息表中插入如下3條數據:
成績信息表
我們向成績信息表中插入如下11條數據:
通過上述SQL我們可以創建 學生、教師、課程、成績信息表,并插入樣例數據,產生如下演示數據:練習如下1 查詢所有同學的學生編號、學生姓名、選課總數、所有課程的平均成績。
上述SQL執行結果如下:
2 查詢平均成績高于60 分的學生編號和學生姓名和平均成績。
上述SQL執行結果如下:
在該例子中用到了 any_value 函數,該函數有什么作用呢,如下:
自 MySQL5.7版本之后,sql_mode 中 only_full_group_by 模式默認為打開狀態。only_full_group_by 就是確定 select target list 中的所有字段都是明確語義,即在此模式下 select target list 中的字段 要么是來自于聚合函數(sum、avg、max等)的結果,要么是來自于 group by 中的表達式的值,除此之外都將觸發異常。因此,MySQL提供了any_value 函數來抑制 only_full_group_by 值被拒絕,any_value 會選擇被分到同一組的數據里第一條數據的指定字段值作為返回數據。使用內連接,同樣可以實現查詢平均成績高于60 分的學生編號和學生姓名和平均成績,如下。
3 獲取各課程的平均成績,降序排列,若平均成績相同時,按課程編號升序排列。
上述SQL執行結果如下:
4 獲取數學(Math)課程成績不低于90分的學生學號、姓名班級、成績信息。
上述SQL執行結果如下:
5 獲取語文(Chinese)課程成績不超過60分的學生學號、姓名班級、成績信息,按分數降序排列的學生信息。
上述SQL執行結果如下:
6 獲取班級的數學(Math)課程平均成績大于90分的班級。
上述SQL執行結果如下:
7 獲取沒有缺考的學生的學號、姓名、班級信息。
上述SQL執行結果如下:
8 獲取所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
相關閱讀:
學以致用,語法基礎實戰: https://www.toutiao.com/i6743064663044407815/
學以致用,語法進階實戰: https://www.toutiao.com/i6743066018496659981/
學以致用,語法強化實戰: https://www.toutiao.com/i6743141851047395854/