group by 系名
4 对于计算字段的分组应用 查询出计算机系学生数和其它系的学生数
select count(*),( case when 系_ID=1 then 'jsjx' else 'qt' end )
from dbo.学生 group by ( case when 系_ID=1 then 'jsjx' else 'qt' end )
5 分组条件having的用法 系人数在10人以上的系
select count(*) as shu ,系_ID from dbo.学生 group by 系_ID
having count(*) >10 或写成 select * from (
select count(*) as shu ,系_ID from dbo.学生 group by 系_ID ) linshi
where linshi.shu >10
order by集锦
1. 对单个字段的排序(asc升序可省略 desc降序)
select 教师_ID, 教师名, 出生日期, 系_ID, 性别_ID, 职称_ID from dbo.教师 order by 教师名
2.多字段的排序(先按第一个字段排序,如果相同再按第二个字段排序) 写法1。
select 教师_ID, 教师名, 出生日期, 系_ID, 性别_ID, 职称_ID from dbo.教师
order by 性别_ID, 系_ID desc 写法2。
select 教师_ID , 教师名, 出生日期, 系_ID as xxx , 职称_ID from dbo.教师
order by 4, 性别_ID desc –4代表select 后面 第四个字段 3.按笔画排序
select 教师_ID, 教师名, 出生日期, 系_ID, 性别_ID, 职称_ID from dbo.教师
order by 教师名 Collate Chinese_PRC_Stroke_ci_as desc
4.order by 可按给定表达式计算结果排序 按教师年龄大小降序排序
select 教师_ID, 教师名, 出生日期, 系_ID, 性别_ID, 职称_ID from dbo.教师
order by DATEDIFF( yy, 出生日期,getdate() ) desc 将本年入学新生排在前面,老生排在后面
select 学生_ID, 姓名, 出生日期, 性别_ID, 籍贯_ID, 系_ID, 届, 班级, ( case when 届 = 2006 then 1 else 0 end )
from dbo.学生 order by ( case when 届 = 2006 then 1 else 0 end ) desc
5.随机排序
order by newid() 其它:
--union 合并
将本校学生与教师名字全部查询出来(去掉重复)。 select 教师名 from dbo.教师 union select 姓名 from dbo.学生
将本校学生与教师名字全部查询出来(不去掉重复)。 select 姓名 from dbo.学生 union all select 姓名 from dbo.学生 常用函数 --数学函数 select ABS(-9) select CEILING(9.00001) select FLOOR(9.9) select PI() select POWER(2,3) select SQRT(9) select SIGN(0) select ROUND( 892.35,1,7 ) select ROUND( 892.35,1,0 )
--绝对值
--比输入值大的最小整数 --比输入值小的最大整数 --派
--第一个参数的第二个参数次方 --平方根
--返回参数的正负
select 1+FLOOR( LOG10(48091) ) --随机数
select FLOOR(RAND()*10)
-----字符串函数------------------------------------------------------------------ select LEFT('aaaaa',2) --左截取 select RIGHT('123456',2) --右截取 select LEN('1') --字符长度 select LOWER('aaBN') --全小写 select UPPER('aaBN') --全大写 select rtrim( LTRIM(' aaa ') )+'**' --从右去掉空格,再从左去掉空格 select SUBSTRING('abcdefg',2,3) --从第2位开始截取3个字符 select REPLACE('aba','a','ccc') --把A换成CCC select STUFF( 'aaaaa',1,2,'bbbbbb' ) --从第1位开始2位换成BBBBBB ---------------------日期时间---------------------------- select GETDATE()
select YEAR( GETDATE() ) select month( GETDATE() ) select day( GETDATE() )
select DATEADD( mm,100 ,'1990-10-10' ) select DATEDIFF( yy, '1988-8-8',getdate() )
select 教师名 , DATEDIFF( yy, 出生日期, getdate() ) as 年龄 from dbo.教师
select DATENAME( yy,getdate() )+'年'
select DATEPART( yy, getdate() )
select DATENAME( yy,getdate() )+'年'+DATENAME( mm,getdate() )+'月'+ DATENAME( dd,getdate() )+'日' --本周/月/季/年的一 是 哪一天
select dateadd(day, 2- DATEPART(weekday,getdate()) ,getdate() )
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()) , 0) SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()) , 0) SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()) , 0) SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()) , 0) --上周/月/季/年 最后一天
SELECT dateadd(ms,-3,DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)) SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) SELECT dateadd(ms,-3,DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)) SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
--本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
--上个月 多少天 --上月 最后一天 declare @a datetime
set @a= dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
print 1+month(getdate())
print convert(char(2),1+month(getdate()) )+'-' --select dateadd(mm, DATEDIFF(mm,0,getdate()) ,0)
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
--通用时间差
declare @a datetime
set @a= dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
declare @b datetime
set @b= dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate())-1, 0))
print datediff(day, @b,@a);
-------转换函数-------------------------------------------------------------------------- select cast( '666' as int )+100
select convert(varchar(13),999 )+'***'--Integer.parseInt() select
convert(char(4),year( getdate() ))+'-'+convert(char(2),month( getdate() ))+'-'+convert(char(2),day( getdate() ) )
insert into 用法
1.向教师表中加入一个记录,字段的顺序与数目和表中一致 insert into 教师 values( ); 2. 字段的数目与顺序自己指定
Insert into 教师 (姓名,性别_id) values ( ‘张’,1) 3 . 从select检索中插入成批记录 insert into dbo.学生 ( 姓名) select 教师名 from dbo.教师
delete from dbo.xuesheng where ming like 'z%' update用法
1. 更新一个字段 Update 教师
Set 教师名=’李四’ Where 教师_id = 3; 教师基本工资上调5% Update 教师
Set 基本工资=基本工资*(1.05) 2. 多字段更新,每一个用 ,号隔开 Update 教师 Set 教师名=’李四’ , 性别_id = 1
Where 教师_id = 3;
集合论 交集 条件A AND 条件B select from A表 where exist (B查询)
SELECT语句A INTERSECT SELECT语句B 并集 条件A OR 条件B SELECT语句A UNION SELECT语句B 补集 NOT 条件A [HAVING] NOT 统计分组条件 SELECT语句A UNION SELECT语句B 差集 select from A表 where not exist (B查询)
--------------------------------------------------------------------------------------------------------------------------------------- 集合相等
集合包含 A包含B B中的元素 一定在A中 不在A中的元素 一定不在B中 1.用一句SQL语句获取 学生表中年龄最大的学生
--1.是一句SQL语句,
--2.绝对不能使用任何统计函数,如sum(),max(),min(),avg(),count()以及所有DBMS提供的函数。 方法一
select top 1 年龄 from 学生
order by 年龄 desc 方法二
select 年龄 from 学生
where 年龄 >= all (select 年龄 from 学生) 2.- 学生表中年龄第三大的学生
select top 1 年龄 from 学生
where 年龄 not in (
select top 2 年龄 from 学生
order by 年龄 desc )
order by 年龄 desc 3.分页sql
4. 删除除了自动编号不同,其他都相同的学生冗余信息
自动编号 学号 姓名 课程编号 课程名称 分数 1 2005001 张三 0001 数学 69 2 2005002 李四 0001 数学 89 3 2005001 张三 0001 数学 69
delete from tablename where 自动编号 not in (