孫曼曼 河北師范大學附屬民族學院
MySQL遵循SQL查詢的基本語法,但在某些細節方面還是與基本語法有所區別。下面討論在數據查詢、修改中遇到的問題,主要涉及到的語句有group by語句、update語句。
Group by語句的作用是對數據進行分組。
select 列名1,列名2,......,聚合函數(列名)
from 表名
[where.........]
group by 列名1,列名2,......
1. group by 子句指定按照哪些列進行分組。
2.可以按照一列進行分組,也可以按照多列進行分組。按多列分組時,各列名之間用逗號分隔。
3.在使用group by子句時,select子句中的任意一列要么包含在聚合函數中,要么必須在group by子句中出現過。
要求從teacher表中,查詢各個系男、女教師的人數,其中teacher表的關系模式如下所示:teacher(tno, tname, cno, sal, dname, tsex, tage)
select dname, tsex, count (*) as人數
from teacher
2.2 干預前后兩組患者HAMA和HAMD評分比較 干預前兩組患者HAMA和HAMD評分比較,差異無統計學意義(P>0.05);干預后,觀察組患者HAMA和HAMD評分均較對照組降低,差異有統計學意義(P<0.05),見表2。
group by dname, tsex
order by dname
MySQL中的group by在應用過程中并沒有嚴格的遵守:使用group by 子句時,select子句中的任意一列要么包含在聚合函數中,要么必須在group by中出現過。
例如:我們將上例做如下修改:
select tage, dname, tsex, count (*) as 人數
from teacher
group by dname, tsex
order by dname
分析:Select子句中的tage并沒有出現在group by子句中,也沒有包含在聚合函數內,但是該查詢語句仍能執行并查出結果,系統并沒有提示語法錯誤。雖然語句正常執行了,但是所查出的數據tage并沒有實際的意義。
在實際應用中建議遵循:使用group by時,select子句中的任意一列要么包含在聚合函數中,要么必須在group by中出現過。

要求將所有教師的年齡增加1歲,同時給所有教師的工資增加10%。

要求:當男教師的工資低于所有男教師的平均工資時,將該男教師的工資提高5%。
參考答案如下:
update teacher
set sal=sal*1.05
where tsex='男'and sal〈(select avg(sal)from teacher where tsex='男')
分析:在MySQL中執行這條語句,系統提示錯誤。出現該錯誤的原因是:在MySQL中,在同一條查詢語句中不能直接從某表中查出數據再更新或刪除本表中的數據。
修改方法如下:

在MySQL數據中使用group by子句時,select子句中的任意一列要么包含在聚合函數中,要么必須在group by子句中出現過;在使用update語句時,在同一條查詢語句中不能直接從某表中查出數據再修改本表中的數據。