数据库笔记(二)

来源:互联网 发布:庞培法布拉大学知乎 编辑:程序博客网 时间:2024/06/05 23:50


一、聚合函数

l MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)

l 聚合函数对null值不计算。

l 如果一行的数据都是nullcount(*)包含对空值行、重复行的统计。

COUNT(*) 返回组中的项数。包括 NULL 值和重复项。

COUNT(ALL expression对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression对组中的每一行都计算 expression 并返回唯一非空值的数量。

对于大于 2^31-1 的返回值,COUNT 生成一个错误。这时应使用 COUNT_BIG

--聚合函数

select * from TblScore

--求英语成绩

select 英语总分=SUM(tEnglish) from TblScore

--求数学总分

select 数学总分=SUM(tMath) from TblScore

--求英语平均分

select 英语平均分=AVG(tEnglish) from TblScore

--有多少条

select 考试总人数=COUNT(*) from TblScore

--英语成绩最高分

select 英语最高分=MAX(tEnglish) from TblScore==================

--聚合函数不要随意加列m容易出错,只有一行也不行

select tSId,MAX(tEnglish) tMath from TblScore

===================================

select tSId,tSName+tSGender+tSAddress as信息 from TblStudent

update TblScore settEnglish=93 where tScoreId=2

select SUM(tEnglish) from TblScore

select AVG(tEnglish) from TblScore

select COUNT(tEnglish) from TblScore

二、带条件的查询

l  Select…from…where …

l  Between…and …在之间

建议:优先使用between … and …,而不是“列>=1 and <=2 ”between … and …已做过优化处理,效率高。

--查询没有及格的学生的学号

select tScoreId fromTblScore where tMath<60

--查询年龄在-30岁之间的男学生

select * from TblStudent where tSAge>20 and tSAge<30 and tSGender='男'

select * from TblStudent where tSAge between 20 and 30这个简单

=============================

select * from Customers

select * from Customers where Country='UK' or Country='USA'

select * from Customers where Country in('UK','USA')

三、模糊查询(都是针对字符串操作的)

l  模糊查询关键字 like 

 Select * from student where sName like '张%'

所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生

Select  * from student where sName like %%

l  _       %     []     ^   --这些通配符

l  ^只有MSSQL Server支持,其他DBMSnot like

l  通配符 %多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符

l  通配符单字符匹配,它匹配单个出现的字符

l  [] 只匹配一个字符  并且这个字符必须是[]范围内的    [0-9] [a-z]

l  notlike一起使用:not like ….

要通配_%[^这些字符怎么办?[_][%][ [ ]^(不需要放到中括号里,因为^只有放到中括号中才认为是通配符)

--模糊查询

select * from tblstudent

--找张什么什么的

--%表示任意字符多个字

select * from TblStudent where tSName like '张%'

--(-)表示任意字符一次

select * from TblStudent where tSName like '张__'

select * from TblStudent where tSName like '张%' and LEN(tSName)=3

select * from TblStudent where tSName like '张[a-z]_'

select * from TblStudent where tSName like '张[0-9]_‘

select * from TblStudent where tSName like'张[^0-9]_

select * from TblStudent where tSName like '张%[%]%‘

select * from TblStudent where tSName like'%[_]%'

四、空值处理

l  数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。

l  select * fromscore where english = null 

l  select * fromscore where english != null ;都没有任何返回结果,因为数据库也“不知道”。

l  SQL中使用is nullis not null来进行空值判断: select *from score where english is null  select *from score where english is not null 

select * from TblScore where tEnglish is null  查null

select * from TblScore where tEnglish is not null  查不是null

五、数据排序

l ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列,ASC)还是降序(从大到小排列,DESC)。

l 按照年龄升序排序所有学生信息的列表:SELECT * FROM  Student ORDER BY sAge ASC

l 按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序 SELECT * FROM Score ORDER BY english DESC,math DESC

l ORDER BY子句要放到WHERE子句之后  SELECT * FROM  Score where english>=60 and math>=60ORDER BY english DESC,math DESC

l Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。

l 表中数据是集合,集合是没有顺序的。Order by 返回的数据是有顺序的,故此我们把order by 以后返回的数据集合叫“游标”。

--英语成绩高的按数学成绩拍

select *from TblScore order by tEnglish desc,tMath desc

--按照总分来排,用的是表达式,如果为null最后了

select *from TblScore order by (tEnglish+tMath) desc

select *,总分=(tEnglish+tMath) from TblScoreorder by (tEnglish+tMath) desc

Order by所有语句写在最后,可以写表达式

六、数据分组

l  在使用select查询的时候,有时需要对数据进行分组汇总(即:将现有的数据按照某列来汇总统计),这时就需要用到group by语句。select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。//分组一般都和聚合函数连用。

l  GROUP BY子句必须放到WHERE语句的之后 ,Group ByOrder By都是对筛选后的数据进行处理,而Where是用来筛选数据的。

l  没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)

l  错误 select sClassId,count(sName),sAge from student group by sClassId

l  正确 select sClassId,count(sName),avg(sAge) from student group by sClassId

select tSClassIdas 班级id,  COUNT(*) as班级人--对组进行统计

from TblStudentgroup by tSClassId

================================

select tSClassIdas 班级id,

     COUNT(*) as班级人数

from TblStudentwhere tSGender='男'group by tSClassId

====================================

select tSClassId, count(*)as 人数 from TblStudent groupby tSClassIdhavingCOUNT(*)>5    

 --分组前筛选用where  分组后筛选用having

================================

备注1

select   tSClassId as 班级Id,    count(*) as 班级人数from TblStudent GROUPby TSClassId

备注2

select

tSClassIdas 班级Id,

count(*) as 班级人数

from TblStudent

where tSGender='男'

group byTSClassId

可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息按照group by 子句中指定的表达式的值分组查询结果。

--当在一个查询语句中使用group by语句的时候,

--在select语句的选择列里面,只能包含group by 语句中出现的列,或者是聚合函数,

--不能包括其他列。

七、Having语句(对组的筛选)

l  对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?→ having

l  查询班级人数超过三个人的班级。(见备注1

l  注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。

l  Having Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)

l  Where中不能使用聚合函数,必须使用HavingHaving要位于Group By之后。

l  Having的使用几乎是与where一样的,也可以用in

 Having count(*) in (5,8,10)

备注1

select

    tSClassId as 班级Id,

    count(*) as 班级人数

from TblStudent

group by TSClassId

having count(*)>3

========================================

select sClassId,count(sName) from student where count(sName)>group by sClassId

聚合函数不应出现在WHERE 子句中 

select sClassId,count(sName) from student group by sClassId having count(sName)>3

 

Group by 前可以有where是对筛选过后的数据进行分组

select sClassId,count(sName) from student where sSex='男' groupby sClassId 

select sClassId,count(sName) from student group by sClassId having sAge>30

//having是对分组后信息的过滤能用的列和select中能用的列是一样

//having无法代替where 

八、SQL语句执行顺序

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE  WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

九、类型转换

l  CAST ( expressionAS data_type)

l  CONVERT ( data_type, expression,[style])

l  Select ‘您的班级编号’+ 1  //错误这里+是数学运算符

l  对日期的转换。转换成各种国家格式的日期。

l   select convert(varchar(20),getdate(),104)

   Style的格式,查sql帮助。(输入convert函数查询)

   将日期转换为指定格式的字符串。日期→字符串

select '日期为'+99

select '考试成绩为'+ cast(99 as varchar(10));

select '考试成绩为'+CONVERT(varchar(10),99);

select * from T2

update T2 set uname='凤姐'

select * from T2 order by convert(int, uId) desc

======================================

select GETDATE()

select CONVERT(nvarchar(10),GETDATE(),120)

select  isnull(convert(varchar(10),tEnglish),'缺考')from TblScore

select '平均成绩是' + cast(30 as varchar(3))

select cast(9.85as int)  舍去小数

ROUND() 4舍5入

在SQL语句中两个连续的 单引号 表示 一个单引号 。(单引号的转义符。) 

select convert(varchar(100),getdate(),20)

select convert(varchar(100),getdate(),21)

select convert(varchar(100),getdate(),23) 

Syntax for CAST:CAST ( expression AS data_type [ (length ) ])

Syntax for CONVERT:CONVERT ( data_type [ ( length ) ] , expression [ , style ])

=========================================================

扩展知识自己学习

SELECT FIdNumber,

CAST(RIGHT(sNo,3)AS INTEGER) as 后三位的整数形式,

CAST(RIGHT(sNo,3)AS INTEGER)+as 后三位加1,

CONVERT(INTEGER,RIGHT(sNo,3))/2as 后三位除以2

FROM student

对编号排序但编号是字符串类型121132136

十、联合结果集union(集合运算符)

l  集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果)

l  联合(union)与连接(join)不一样

l  简单的结果集联合(老师、学生)

select tName,tSex from teacher union select sName,sSex from student

l  基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。

select tName,tSex,-from teacher union select sName,sSex,sClassId from student

l  联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)union all

UNION 去除重复数据    UNION ALL不会去除

union一次插入多条数据

insert into Score(studentId,english,math)

select 1,80,100 union all

select 1,80,100 union all

select 3,50,59 union all

select 4,66,89 union

select 5,59,100

此处如果用union all同样会去除重复数据

十一、一次插入多条数据

l  --把现有表的数据插入到新表(表不能存在),为表建备份。

l  --select * intonewStudent from studentnewStudent表在select查询的同时自动建立。)

   --把现有表的数据复制到一个已存在的表

   通过这种方式复制,只能复制表中的数据,以及列的名字和数据类型。对于约束,不会复制过来。

l  Select * intonewTbl from oldTbl where 1<>1,这样做可以只复制表结构,但效率并不高。建议:select top 0 *into newTbl from oldTbl

l  =========如果表已经存在了===============

   --insert into backupStudent select * fromstudents(backupStudent表必须提前建好)

十二、日期函数

l  GETDATE() :取得当前日期时间

l  DATEADD (datepart ,number, date ),计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY,3,date)为计算日期date3天后的日期,而DATEADD(MONTH,-8,date)为计算日期date8个月之前的日期 

   (入职一年以上的员工发1000$,入职日期+1<当前时间

   Sql2005中只有DateTime类型,2008中有datedatetimedatetime2 等类型。

l  DATEDIFF ( datepart ,startdate , enddate ) :计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd

l  统计不同入学年数的学生个数:

   select DateDiff(year,sInDate,getdate()),count(*)from student Group by DateDiff(year,sInDate,getdate())

l  DATEPART (datepart,date):返回一个日期的特定部分

l  Month()year()day()来代替。

l  统计学生的生日年份个数:

   select DatePart(year,sBirthday),count(*)

   from student

   group by DatePart(year, sBirthday)

 


一、聚合函数

l MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)

l 聚合函数对null值不计算。

l 如果一行的数据都是nullcount(*)包含对空值行、重复行的统计。

COUNT(*) 返回组中的项数。包括 NULL 值和重复项。

COUNT(ALL expression对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression对组中的每一行都计算 expression 并返回唯一非空值的数量。

对于大于 2^31-1 的返回值,COUNT 生成一个错误。这时应使用 COUNT_BIG

--聚合函数

select * from TblScore

--求英语成绩

select 英语总分=SUM(tEnglish) from TblScore

--求数学总分

select 数学总分=SUM(tMath) from TblScore

--求英语平均分

select 英语平均分=AVG(tEnglish) from TblScore

--有多少条

select 考试总人数=COUNT(*) from TblScore

--英语成绩最高分

select 英语最高分=MAX(tEnglish) from TblScore==================

--聚合函数不要随意加列m容易出错,只有一行也不行

select tSId,MAX(tEnglish) tMath from TblScore

===================================

select tSId,tSName+tSGender+tSAddress as信息 from TblStudent

update TblScore settEnglish=93 where tScoreId=2

select SUM(tEnglish) from TblScore

select AVG(tEnglish) from TblScore

select COUNT(tEnglish) from TblScore

二、带条件的查询

l  Select…from…where …

l  Between…and …在之间

建议:优先使用between … and …,而不是“列>=1 and <=2 ”between … and …已做过优化处理,效率高。

--查询没有及格的学生的学号

select tScoreId fromTblScore where tMath<60

--查询年龄在-30岁之间的男学生

select * from TblStudent where tSAge>20 and tSAge<30 and tSGender='男'

select * from TblStudent where tSAge between 20 and 30这个简单

=============================

select * from Customers

select * from Customers where Country='UK' or Country='USA'

select * from Customers where Country in('UK','USA')

三、模糊查询(都是针对字符串操作的)

l  模糊查询关键字 like 

 Select * from student where sName like '张%'

所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生

Select  * from student where sName like %%

l  _       %     []     ^   --这些通配符

l  ^只有MSSQL Server支持,其他DBMSnot like

l  通配符 %多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符

l  通配符单字符匹配,它匹配单个出现的字符

l  [] 只匹配一个字符  并且这个字符必须是[]范围内的    [0-9] [a-z]

l  notlike一起使用:not like ….

要通配_%[^这些字符怎么办?[_][%][ [ ]^(不需要放到中括号里,因为^只有放到中括号中才认为是通配符)

--模糊查询

select * from tblstudent

--找张什么什么的

--%表示任意字符多个字

select * from TblStudent where tSName like '张%'

--(-)表示任意字符一次

select * from TblStudent where tSName like '张__'

select * from TblStudent where tSName like '张%' and LEN(tSName)=3

select * from TblStudent where tSName like '张[a-z]_'

select * from TblStudent where tSName like '张[0-9]_‘

select * from TblStudent where tSName like'张[^0-9]_

select * from TblStudent where tSName like '张%[%]%‘

select * from TblStudent where tSName like'%[_]%'

四、空值处理

l  数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。

l  select * fromscore where english = null 

l  select * fromscore where english != null ;都没有任何返回结果,因为数据库也“不知道”。

l  SQL中使用is nullis not null来进行空值判断: select *from score where english is null  select *from score where english is not null 

select * from TblScore where tEnglish is null  查null

select * from TblScore where tEnglish is not null  查不是null

五、数据排序

l ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列,ASC)还是降序(从大到小排列,DESC)。

l 按照年龄升序排序所有学生信息的列表:SELECT * FROM  Student ORDER BY sAge ASC

l 按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序 SELECT * FROM Score ORDER BY english DESC,math DESC

l ORDER BY子句要放到WHERE子句之后  SELECT * FROM  Score where english>=60 and math>=60ORDER BY english DESC,math DESC

l Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。

l 表中数据是集合,集合是没有顺序的。Order by 返回的数据是有顺序的,故此我们把order by 以后返回的数据集合叫“游标”。

--英语成绩高的按数学成绩拍

select *from TblScore order by tEnglish desc,tMath desc

--按照总分来排,用的是表达式,如果为null最后了

select *from TblScore order by (tEnglish+tMath) desc

select *,总分=(tEnglish+tMath) from TblScoreorder by (tEnglish+tMath) desc

Order by所有语句写在最后,可以写表达式

六、数据分组

l  在使用select查询的时候,有时需要对数据进行分组汇总(即:将现有的数据按照某列来汇总统计),这时就需要用到group by语句。select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。//分组一般都和聚合函数连用。

l  GROUP BY子句必须放到WHERE语句的之后 ,Group ByOrder By都是对筛选后的数据进行处理,而Where是用来筛选数据的。

l  没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)

l  错误 select sClassId,count(sName),sAge from student group by sClassId

l  正确 select sClassId,count(sName),avg(sAge) from student group by sClassId

select tSClassIdas 班级id,  COUNT(*) as班级人--对组进行统计

from TblStudentgroup by tSClassId

================================

select tSClassIdas 班级id,

     COUNT(*) as班级人数

from TblStudentwhere tSGender='男'group by tSClassId

====================================

select tSClassId, count(*)as 人数 from TblStudent groupby tSClassIdhavingCOUNT(*)>5    

 --分组前筛选用where  分组后筛选用having

================================

备注1

select   tSClassId as 班级Id,    count(*) as 班级人数from TblStudent GROUPby TSClassId

备注2

select

tSClassIdas 班级Id,

count(*) as 班级人数

from TblStudent

where tSGender='男'

group byTSClassId

可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息按照group by 子句中指定的表达式的值分组查询结果。

--当在一个查询语句中使用group by语句的时候,

--在select语句的选择列里面,只能包含group by 语句中出现的列,或者是聚合函数,

--不能包括其他列。

七、Having语句(对组的筛选)

l  对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?→ having

l  查询班级人数超过三个人的班级。(见备注1

l  注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。

l  Having Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)

l  Where中不能使用聚合函数,必须使用HavingHaving要位于Group By之后。

l  Having的使用几乎是与where一样的,也可以用in

 Having count(*) in (5,8,10)

备注1

select

    tSClassId as 班级Id,

    count(*) as 班级人数

from TblStudent

group by TSClassId

having count(*)>3

========================================

select sClassId,count(sName) from student where count(sName)>group by sClassId

聚合函数不应出现在WHERE 子句中 

select sClassId,count(sName) from student group by sClassId having count(sName)>3

 

Group by 前可以有where是对筛选过后的数据进行分组

select sClassId,count(sName) from student where sSex='男' groupby sClassId 

select sClassId,count(sName) from student group by sClassId having sAge>30

//having是对分组后信息的过滤能用的列和select中能用的列是一样

//having无法代替where 

八、SQL语句执行顺序

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE  WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

九、类型转换

l  CAST ( expressionAS data_type)

l  CONVERT ( data_type, expression,[style])

l  Select ‘您的班级编号’+ 1  //错误这里+是数学运算符

l  对日期的转换。转换成各种国家格式的日期。

l   select convert(varchar(20),getdate(),104)

   Style的格式,查sql帮助。(输入convert函数查询)

   将日期转换为指定格式的字符串。日期→字符串

select '日期为'+99

select '考试成绩为'+ cast(99 as varchar(10));

select '考试成绩为'+CONVERT(varchar(10),99);

select * from T2

update T2 set uname='凤姐'

select * from T2 order by convert(int, uId) desc

======================================

select GETDATE()

select CONVERT(nvarchar(10),GETDATE(),120)

select  isnull(convert(varchar(10),tEnglish),'缺考')from TblScore

select '平均成绩是' + cast(30 as varchar(3))

select cast(9.85as int)  舍去小数

ROUND() 4舍5入

在SQL语句中两个连续的 单引号 表示 一个单引号 。(单引号的转义符。) 

select convert(varchar(100),getdate(),20)

select convert(varchar(100),getdate(),21)

select convert(varchar(100),getdate(),23) 

Syntax for CAST:CAST ( expression AS data_type [ (length ) ])

Syntax for CONVERT:CONVERT ( data_type [ ( length ) ] , expression [ , style ])

=========================================================

扩展知识自己学习

SELECT FIdNumber,

CAST(RIGHT(sNo,3)AS INTEGER) as 后三位的整数形式,

CAST(RIGHT(sNo,3)AS INTEGER)+as 后三位加1,

CONVERT(INTEGER,RIGHT(sNo,3))/2as 后三位除以2

FROM student

对编号排序但编号是字符串类型121132136

十、联合结果集union(集合运算符)

l  集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果)

l  联合(union)与连接(join)不一样

l  简单的结果集联合(老师、学生)

select tName,tSex from teacher union select sName,sSex from student

l  基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。

select tName,tSex,-from teacher union select sName,sSex,sClassId from student

l  联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)union all

UNION 去除重复数据    UNION ALL不会去除

union一次插入多条数据

insert into Score(studentId,english,math)

select 1,80,100 union all

select 1,80,100 union all

select 3,50,59 union all

select 4,66,89 union

select 5,59,100

此处如果用union all同样会去除重复数据

十一、一次插入多条数据

l  --把现有表的数据插入到新表(表不能存在),为表建备份。

l  --select * intonewStudent from studentnewStudent表在select查询的同时自动建立。)

   --把现有表的数据复制到一个已存在的表

   通过这种方式复制,只能复制表中的数据,以及列的名字和数据类型。对于约束,不会复制过来。

l  Select * intonewTbl from oldTbl where 1<>1,这样做可以只复制表结构,但效率并不高。建议:select top 0 *into newTbl from oldTbl

l  =========如果表已经存在了===============

   --insert into backupStudent select * fromstudents(backupStudent表必须提前建好)

十二、日期函数

l  GETDATE() :取得当前日期时间

l  DATEADD (datepart ,number, date ),计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY,3,date)为计算日期date3天后的日期,而DATEADD(MONTH,-8,date)为计算日期date8个月之前的日期 

   (入职一年以上的员工发1000$,入职日期+1<当前时间

   Sql2005中只有DateTime类型,2008中有datedatetimedatetime2 等类型。

l  DATEDIFF ( datepart ,startdate , enddate ) :计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd

l  统计不同入学年数的学生个数:

   select DateDiff(year,sInDate,getdate()),count(*)from student Group by DateDiff(year,sInDate,getdate())

l  DATEPART (datepart,date):返回一个日期的特定部分

l  Month()year()day()来代替。

l  统计学生的生日年份个数:

   select DatePart(year,sBirthday),count(*)

   from student

   group by DatePart(year, sBirthday)

 


0 0