create database library
use library
create table 借书卡(
借书卡号 int not null primary key,
姓名 char(10),
性别 char(2)  not null check(性别='男' or 性别='女'),
班级 int ,
状态 char(4) not null check(状态='有效' or 状态='停用')) create table 图书 (
书号 char(20)  not null primary key,
书名 char(50),
出版社 char(50),
作者 char(20),
出版日期 datetime,
语种  char(2),
单价  decimal(6,2),
状态 char(4)  not null check (状态='外借'or 状态='在馆' or 状态='报废'))create table 借还记录(
借书卡号 int 
foreign key references 借书卡(借书卡号)
on delete no action,
书号 char(20)
foreign key references 图书(书号)
on delete no action,
借书日期 datetime,
预还日期 datetime,
还书日期 datetime, 
借还  char(4))
insert 借书卡 values (100,'孙华','男',063341,'有效')
insert 借书卡 values (101,'陈明','男',063341,'有效')
insert 借书卡 values (102,'程西','女',063341,'有效')
insert 借书卡 values (103,'孙天宇','女',063342,'有效')
go
insert 图书 values ('1','水浒','人民文学出版社','斯奈恩','1998','中',23.00,'外借')
insert 图书 values ('2','数据库原理','高等教育出版社','','1998','中',33.00,'外借')
insert 图书 values ('3','大学英语六级考试教程','机械工业出版社','齐乃政编','2002','中',10.00,'外借')
insert 图书 values ('5','新视野大学英语(第册)','外语教学与研究出版社','扬跃等总主编','2002','中',16.80,'外借')
insert 图书 values ('6','国际投资学','上海财经大学出版社','杨大楷主编','1998','中',19.50,'在馆')
insert 图书 values ('7','解读美国经济指标','中国经济出版社','李早航等著','2003/2/01','中',25.00,'在馆')
insert 图书 values ('8','伦理学问题','商务印书馆','(德)石里克著','1997','中',9.10,'外借')
insert 图书 values ('4','数据库原理','高等教育出版社','','1998','中',33.00,'在馆')
insert 图书 values ('9','水浒','人民文学出版社','斯奈恩','1998','中',23.00,'外借')
go
insert 借还记录 values (100,'1','2008-2-20','2008-3-20','2008-3-10','已还')
insert 借还记录 values (100,'1','2008-2-25','2009-3-25',null,'未还')
insert 借还记录 values (100,'2','2008-2-25','2008-3-25',null,'未还')
insert 借还记录 values (100,'3','2008-2-25','2008-3-25',null,'未还')
insert 借还记录 values (100,'5','2008-2-25','2008-3-25',null,'未还')
insert 借还记录 values (101,'9','2008-2-25','2008-3-25',null,'未还')
insert 借还记录 values (101,'8','2008-2-25','2008-3-25',null,'未还')
insert 借还记录 values (101,'7','2008-2-25','2008-3-25','2008-3-26','已还')
题是   查询借阅排行榜,输出卡号、姓名、借还册数。
这个是我写的
select 借书卡.借书卡号,姓名,count(借还记录.借还)as 借还书数
from 借书卡,借还记录
where 借书卡.借书卡号 = 借还记录.借书卡号 
GROUP BY  借书卡.借书卡号,借书卡.姓名

这个是老师给的答案
select 借还记录.借书卡号,姓名,count(*) as'借图书册数'
from 借书卡,借还记录
where 借书卡.借书卡号=借还记录.借书卡号 
group by 借还记录.借书卡号,姓名
order by count(*) desc
我写的 count里面是要返回的指定列名的行数
老师说不用在里面加写什么列名 直接用*代替就行我一点不理解为啥要这么写 还有一个题跟这个差不多我写的
select  借书卡.借书卡号,姓名, count(借还记录.书号) as 所借图书册数
from 图书,借书卡,借还记录
where 借书卡.借书卡号 = 借还记录.借书卡号 and 借还记录.书号=图书.书号
GROUP BY 借书卡.借书卡号,借书卡.姓名
having count(借还记录.书号)>3

老师给的答案
select 借还记录.借书卡号,姓名,count(*) as'借图书册数'
from 借书卡,借还记录
where 借书卡.借书卡号=借还记录.借书卡号 and 借还记录.借还='未还'
group by 借还记录.借书卡号,姓名
having count(*)>3
count 这个的用法到底是*还是在里面写列名啊??
如果是*,这个count是怎么返回行数的?是所以的行数?但名字之类的也不一样啊?

解决方案 »

  1.   

    Count
    返回集合中项目的数量(具体数目取决于集合)。语法
    维度
    Dimensions.Count返回多维数据集中的维度数,其中包括 [Measures] 维度。级别
    «Dimension»|«Hierarchy».Levels.Count返回维度或层次结构中的级别数,包括 [All] 级别(如果适用)。集合 - 语法 1
    Count(«Set»[, ExcludeEmpty | IncludeEmpty])返回集合中的单元数。该语法允许分别使用 ExcludeEmpty 或 IncludeEmpty 标志来排除或包含空单元。集合 - 语法 2
    «Set».Count返回集合中的单元数,其中包括空单元。元组
    «Tuple».Count返回元组中的维度数。说明  默认状态下计算空的单元数。默认情况下,OLE DB 中可比较的 Count 函数不包含空单元。 
    注释
    若要从集合计数中排除空单元,请使用可选的 ExcludeEmpty 关键字。 示例
    如果 Time 包含级别 Year 和 Month,Year 的成员是 1994 和 1995,那么下面的示例返回 24:集合 - 示例 1
    Count({Time.Month.Members})集合 - 示例 2
    Time.Month.Members.Count
      

  2.   

    COUNT
    返回组中项目的数量。 语法
    COUNT ( { [ ALL | DISTINCT ] expression ] | * } ) 参数
    ALL对所有的值进行聚合函数运算。ALL 是默认设置。DISTINCT指定 COUNT 返回唯一非空值的数量。expression一个表达式,其类型是除 uniqueidentifier、text、image 或 ntext 之外的任何类型。不允许使用聚合函数和子查询。*指定应该计算所有行以返回表中行的总数。COUNT(*) 不需要任何参数,而且不能与 DISTINCT 一起使用。COUNT(*) 不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT(*) 返回指定表中行的数量而不消除副本。它对每行分别进行计数,包括含有空值的行。重要  当使用 CUBE 或 ROLLUP 时,不支持区分聚合,例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用了,Microsoft® SQL Server™ 将返回错误信息并取消查询。
    返回类型
    int注释
    COUNT(*) 返回组中项目的数量,这些项目包括 NULL 值和副本。COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。示例
    A. 使用 COUNT 和 DISTINCT
    下面的示例查找作者所居住的不同城市的数量。USE pubs
    GO
    SELECT COUNT(DISTINCT city)
    FROM authors
    GO下面是结果集:----------- 
    16          (1 row(s) affected)B. 使用 COUNT(*)
    下面的查询查找图书和书名的总数:USE pubs
    GO
    SELECT COUNT(*)
    FROM titles
    GO下面是结果集:----------- 
    18          (1 row(s) affected)C. 与其它聚合函数一起使用 COUNT(*)
    下面的示例显示可以与选择列表中的其它聚合函数结合使用的 COUNT(*)。USE pubs
    GO
    SELECT COUNT(*), AVG(price)
    FROM titles
    WHERE advance > $1000
    GO下面是结果集:----------- -------------------------- 
    15          14.42                      (1 row(s) affected)
      

  3.   

    COUNT(*) 返回组中项目的数量,这些项目包括 NULL 值和副本。COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。
      

  4.   

    COUNT(*) 返回指定表的行数,并将重复的行也计算在内。它会单独计算每一行,包括包含 NULL 值的行
      

  5.   

    返回结果集的总行数
    用count(1)也是一样的
      

  6.   

    --当你的count()计算到有空值的列上时,就会出现不同的结果.--题是  查询借阅排行榜,输出卡号、姓名、借还册数。 
    --这个是我写的 
    select 借书卡.借书卡号,姓名,count(借还记录.借还)as 借还书数 , count(还书日期) 有空值的
    from 借书卡,借还记录 
    where 借书卡.借书卡号 = 借还记录.借书卡号 
    GROUP BY  借书卡.借书卡号,借书卡.姓名 
    /*
    借书卡号        姓名         借还书数        有空值的        
    ----------- ---------- ----------- ----------- 
    100         孙华         5           1
    101         陈明         3           1(所影响的行数为 2 行)
    */--这个是老师给的答案 
    select 借还记录.借书卡号,姓名,count(*) as'借图书册数' , count(还书日期) 有空值的
    from 借书卡,借还记录 
    where 借书卡.借书卡号=借还记录.借书卡号 
    group by 借还记录.借书卡号,姓名 
    order by count(*) desc 
    /*
    借书卡号        姓名         借图书册数       有空值的        
    ----------- ---------- ----------- ----------- 
    100         孙华         5           1
    101         陈明         3           1(所影响的行数为 2 行)
    */
      

  7.   

    你的老师有点教条主义了,呵呵
    SQL的写法很灵活,在实际的表上一运行就知道了。
      

  8.   

    我们学校的服务器不好使了,请问你们都怎么自学的?自己装sql server吗?推荐一下我怎么入门吧!谢谢!
      

  9.   

    count(字段):不包含该字段为null的记录
    count(*):为null的也统计在内。当然自己装sql server啦!
    sql的安装和部署也是一门学问哦,可以会有很多问题……
      

  10.   

    count(字段):不包含该字段为null的记录 
    count(*):为null的也统计在内。 
      

  11.   

    count(字段):不包含该字段为null的记录 
    count(*):为null的也统计在内。 正解
      

  12.   

    不加WHERE限制条件的情况下,COUNT(*)与COUNT(字段)基本可以认为是等价的
    但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(字段)快非常多