SQL管理工具
1.查询某字段内容重复的记录----
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
select id,count(*) from tb group by id having count(*)>1
select * from (select count(id) as count from tb group by id) t where t.count>1
2.存储查询结果到另一个表 -- 赋值表内容到另一张表
select 字段列表 into 新表名 from 表名
eg: select sno,cno,degree into score_kkk from score
select sno,cno,degree into db.#score_kkk from score
注意:#为虚拟表,可以跨数据库创建
3.分组查询 --- group by 子句
select 字段名列表|聚合函数 from 表名 [where 条件表达式] group by 字段名 having [筛选表达式]
eg:select cno, avg(degree) as 成绩 from score group by cno having avg(degree)>80
注意:字段名列表包含聚合函数事,则计算每组的汇总值
特别注意:
1. 如果使用group by子句,字段名列表中任一非聚合表达式内的所有列,都必须包含在group by列表中,
或者group by表达式必须与选择列表表达式完全匹配 --- 即 gourp by 的字段 都必须在 select的字段名列表中
2. 筛选查询<Having子句> <Having子句对Group by子句分组后的结果进行筛选,看其是否满足条件。 故此Having只能配合group by子句使用。>
当Where子句,Group by子句,Having子句同时使用时,其顺序如下:
①执行Where子句,从表中选取行;
②由Group By分组;
③执行Having子句选取满足的分组条件。
聚合函数:使用聚合函数,实现数据统计。
AVG:计算平均数
Count(*):统计查询输出的记录总数
Count():统计指定列中选择的记录总数
Max:最大值
Min:最小值
Sum:计算总和
Stdev:计算统计标准偏差
Var:统计方差
4.Having对分组尽心过滤
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中显示的任意项。
查询table表查询每一个班级中年龄大于20,性别为男的人数
select COUNT(*)as '>20岁人数',classid from Table1 where sex='男' group by classid,age having age>20
--需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
--执行where子句查找符合条件的数据;
--使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
--having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
5.显示每个地区的总人口数和总面积,一总人口数排序
select sum(population) as 总人口,sum(area) as 总面积 from content group by region order by 总人口
显示每个地区以及的该地区国家总人口数不少于1000万的国家总数
select region,count(name) 国家数 from content group by region having sum(population)>1000万
显示每个地区的总人口数和总面积.以总人口来排序.仅显示那些面积超过1000000的地区
select sum(population),sum(area) from content group by region having sum(area)>1000000 order by sum(population) desc
6.学生成绩表查询
求出每门科目总分,平均分,最高,最低分
select course,sum(score),avg(distinct score),max(score),min(score) from t_student group by course
求出每门科目的总分,平均分,最高分,最低分,要求只显示平均分大于70的最后再按平均分由高到低排序
SELECT SUM(s_score),AVG(s_score),MAX(s_score),MIN(s_score) FROM t_student GROUP BY s_course HAVING AVG(s_score)>70 ORDER BY AVG(s_score) DESC;