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