TuringShine

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

 

 


     2017.11.13

聚合函数:
 COUNT(*)统计表中元组个数
 COUNT(属性名)统计一列中列值的个数 //不统计空值
 SUM计算一列值的总和(此列必须是数值行)
 AVG计算一列的平均值(此列必须是数值行)
 MAX求一列值中的最大值
 MIN求一列值中的最小值
    元组:每一条数据
 
 例1.求计算机专业学生的平均年龄:
  select avg(sage) as 平均年龄 from student where sdept='计算机'
 
 例2.统计学校共开设课多少们课程:
  select count(*) from course
  select count(cno) from course

 例3.统计交了学费的学生人数:
  select count(*) from course --统计所有的记录:交了的没交的都被统计了
  select count(fees) from course  --统计交了的学生个数,没交的不统计

 例4:如何去掉重复的项目再统计:
  如:查询选修了课程的学生人数
   select count(distinct sno) from sc
    注:用distinct以避免重复计算学生人数
     (在access中不能用这种结构,在SQL server2008中可以)

 ex:查询选修课成绩最高分,最低分和平均分,(查询的列注意重命名为:最高分,最低分,平均分,
    结果存放在新表abc中)
  select MAX(grade) as 最高分 ,MIN (grade)最低分,AVG(grade) as 平均分 into abc from sc
 
order by 子句: 

  例5:将课程按学分升序排序:
  select * from course order by credit
  select * from course order by ccredit desc(降序)

 例6:查询选修了2课程的学生的学号和成绩,查询结果按成绩降序排序:
  select cno, sno,grade from sc where cno=2 order by grade desc
 
 例7:查询电子,计算机专业学生的姓名,专业名,结果按专业名升序,姓名降序排序:
  order by后面可以跟多个字段进行排序:
       用A1代表第一个字段,A2代表第二个字段
   1.order by A1,A2 desc    --A1升序,A2降序
   2.order by A1 asc,A2 desc     --A1升序,A2降序   asc可省略
   3.order by A1 desc,A2 desc    --A1,A2降序
  select sname AS 姓名,sdept AS 系名 from student where sdept in('电子','计算机') order by sdept,sname desc
  
group by 子句(分组之后进行统计):

 例8:查询各门课程的选修人数:
  select cno,count(*) from sc group by cno

 例9:统计男女生各有多少人:
  select ssex,count(ssex) as 人数 from student group by ssex
 
 例10:求学生的总分:
  select sno,sum(grade) as 总分 from sc group by sno

having 子句(已经分组后的元组,并不针对整张表,一般接到group by后使用):

 例11:求选课在2门以上的学生,并统计平均成绩:
  select sno, avg(grade) as average from sc group by sno having count(*)>=2
  
 例12:求选课在2门以上并且成绩及格的学生,并统计平均成绩:
  select sno,avg(grade) as average from sc where grade>=60 group by sno having count(*)>=2  --这是错误的写法
  select sno,avg(grade) as average from sc group by sno having count(*)>=2 and min(grade)>=60 --对的
  

 

----所用的表是博客文件"student表"

练习:

-- 一、在商场销售数据库“Customer”中书写SQL代码进行查询:
use Customer
go

--1、查询顾客姓名以及联系方式。
select 姓名,联系方式 from 顾客

--2、查询所有商品类别(结果中不能有重复的商品类别)。
select distinct 商品类别 from 商品

--3、查询单价在100到200之间的商品名。
select 商品名 from 商品 where 单价>100 and 单价<200

--4、查询单价在300以上的鞋类的商品名。
select 商品名 from 商品 where 商品类别='鞋子' and 单价>300

--5、查询购买了C101,D201或E301商品号的顾客号(结果中顾客号不能有重复)。
select distinct 顾客号 from 购买 where 商品号 in('C101','D201','E301')

--6、查询姓王的的顾客姓名和联系方式。
select 姓名,联系方式 from 顾客 where 姓名 like '王%'

--7、查询除姓刘的以外的顾客姓名和联系方式。
select 姓名,联系方式 from 顾客 where 姓名 not like '刘%'


--二.在students数据库中(已给出)用SQL查询完成下面查询:(书写sql语句)
use students
go
--1、查询考试成绩有不及格学生的学号。
select sno from sc where grade<60

--2、将课程按学分升序排序。
select * from course order by ccredit

--3、查询2号课程的成绩在前3名学生的学号 。
select top 3 sno from sc  where cno=2  order by grade desc

--4、查询各门课程的选修人数。
select cno,count(*)as 人数 from sc group by cno

--5、统计男女生各有多少人。
select ssex,count(ssex) as 人数 from student group by ssex

--6、求各学生的总分。
select sno,sum(grade) as 总分 from sc group by sno

--7、求选课在2门以上并且成绩及格的学生,并统计平均成绩。
select sno,avg(grade) as average from sc group by sno having count(*)>=2 and min(grade)>=60

--8、查询选修了2课程的学生的学号、课程号和成绩,查询结果按成绩降序排序。
select sno,cno,grade from sc where cno=2 order by grade desc

--9、查询专业人数少于2人的专业名称及人数。
select sdept,COUNT(*) as 人数 from student group by sdept having COUNT(sdept)<2

--10、查询女学生的姓名、专业名,结果按姓名升序排序,专业名降序。
select sname AS 姓名,sdept as 专业名 from student where ssex in('女')order by sname,sdept desc

 

posted on 2017-11-16 12:21  TuringShine  阅读(556)  评论(0编辑  收藏  举报