孫曼曼 河北師范大學(xué)附屬民族學(xué)院
MySQL遵循SQL查詢的基本語法,但在某些細(xì)節(jié)方面還是與基本語法有所區(qū)別。下面討論在數(shù)據(jù)查詢、修改中遇到的問題,主要涉及到的語句有g(shù)roup by語句、update語句。
Group by語句的作用是對數(shù)據(jù)進(jìn)行分組。
select 列名1,列名2,......,聚合函數(shù)(列名)
from 表名
[where.........]
group by 列名1,列名2,......
1. group by 子句指定按照哪些列進(jìn)行分組。
2.可以按照一列進(jìn)行分組,也可以按照多列進(jìn)行分組。按多列分組時,各列名之間用逗號分隔。
3.在使用group by子句時,select子句中的任意一列要么包含在聚合函數(shù)中,要么必須在group by子句中出現(xiàn)過。
要求從teacher表中,查詢各個系男、女教師的人數(shù),其中teacher表的關(guān)系模式如下所示:teacher(tno, tname, cno, sal, dname, tsex, tage)
select dname, tsex, count (*) as人數(shù)
from teacher
2.2 干預(yù)前后兩組患者HAMA和HAMD評分比較 干預(yù)前兩組患者HAMA和HAMD評分比較,差異無統(tǒng)計(jì)學(xué)意義(P>0.05);干預(yù)后,觀察組患者HAMA和HAMD評分均較對照組降低,差異有統(tǒng)計(jì)學(xué)意義(P<0.05),見表2。
group by dname, tsex
order by dname
MySQL中的group by在應(yīng)用過程中并沒有嚴(yán)格的遵守:使用group by 子句時,select子句中的任意一列要么包含在聚合函數(shù)中,要么必須在group by中出現(xiàn)過。
例如:我們將上例做如下修改:
select tage, dname, tsex, count (*) as 人數(shù)
from teacher
group by dname, tsex
order by dname
分析:Select子句中的tage并沒有出現(xiàn)在group by子句中,也沒有包含在聚合函數(shù)內(nèi),但是該查詢語句仍能執(zhí)行并查出結(jié)果,系統(tǒng)并沒有提示語法錯誤。雖然語句正常執(zhí)行了,但是所查出的數(shù)據(jù)tage并沒有實(shí)際的意義。
在實(shí)際應(yīng)用中建議遵循:使用group by時,select子句中的任意一列要么包含在聚合函數(shù)中,要么必須在group by中出現(xiàn)過。
要求將所有教師的年齡增加1歲,同時給所有教師的工資增加10%。
要求:當(dāng)男教師的工資低于所有男教師的平均工資時,將該男教師的工資提高5%。
參考答案如下:
update teacher
set sal=sal*1.05
where tsex='男'and sal〈(select avg(sal)from teacher where tsex='男')
分析:在MySQL中執(zhí)行這條語句,系統(tǒng)提示錯誤。出現(xiàn)該錯誤的原因是:在MySQL中,在同一條查詢語句中不能直接從某表中查出數(shù)據(jù)再更新或刪除本表中的數(shù)據(jù)。
修改方法如下:
在MySQL數(shù)據(jù)中使用group by子句時,select子句中的任意一列要么包含在聚合函數(shù)中,要么必須在group by子句中出現(xiàn)過;在使用update語句時,在同一條查詢語句中不能直接從某表中查出數(shù)據(jù)再修改本表中的數(shù)據(jù)。