类型转换函数
l CAST ( expression AS data_type)
l CONVERT ( data_type, expression,[style])
l Select ‘您的班级编号’+ 1 错误这里+是数学运算符
l SELECT FIdNumber,
l CAST(RIGHT(sNo,3) AS INTEGER) as 后三位的整数形式,
l CAST(RIGHT(sNo,3) AS INTEGER)+1 as 后三位加1,
l CONVERT(INTEGER,RIGHT(sNo,3))/2 as 后三位除以2
l FROM student
l 对编号排序,但编号是字符串类型。1、2、11、3、21、36…
l 对日期的转换。转换成各种国家格式的日期。
- selectconvert(varchar(20),getdate(),104)
- Style的格式,查sql帮助。(输入convert函数查询)
- 将日期转换为指定格式的字符串。日期→字符串
Cast(‘1’ as int)
Convert(INT,‘123’)
Convert(nvarchar,getdate(),120)//Convert可以指定转换的风格
+号只有两边都是字符串 才会连接字符 只要有一边是数值类型的 会将另外一
边尝试转换 转换失败就报错
联合结果集union(集合运算符)
l 集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果)
l 联合(union)与连接(join)不一样
l Union 是合并结果集 会去掉重复的行(所有列相同)
l 简单的结果集联合(老师、学生):
- select tName,tSex from teacher union
- select sName,sSex from student
l 基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。 或者满足自动转换条件
- select tName,tSex,-1 from teacher union
- select sName,sSex,sClassId from student
l 联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)、union all(不会去除重复的行)
l 常见应用:底部汇总。
- select tName,tSex from teacher union
- select sName,sSex from student
UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条
- select tName,tSex from teacher union all
- select sName,sSex from student
Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
--在使用union连接数据的时候,必须保证对应的列的数据类型是一致的,
--如果数据类型不一致,则报错。
--类型转换:cast() convert()
底部有统计总人数功能(在结果集里面仔添加一行)
Select * from Classer
Union all
Select (‘总人数’,‘2333’,getdate())
l 查询每位老师的信息,包括姓名、工资,并且在最后一行加上平均工资和最高工资
l 底部汇总:
select Name,Salary from Teacher
union all
select '平均工资',avg(Salary) from Teacher
union all
select '最高工资',Max(Salary) from Teacher
*一次插入多条数据
l --把现有表的数据插入到新表(表不能存在),为表建备份。
l --select * into newStudent from student(newStudent表在select查询的同时自动建立。)新表在执行语句之前 不存在,在select查询的同时自动建立
- --把现有表的数据复制到一个已存在的表
- 通过这种方式复制,只能复制表中的数据,以及列的名字和数据类型。对于约束,不会复制过来。
l Select * into newTbl from oldTbl where 1<>1,这样做可以只复制表结构,但效率并不高。建议:select top 0 * into newTbl from oldTbl
l --insert into backupStudent select * from students(backupStudent表必须提前建好,注意列对应 数据类型要一致)
l 可以通过导入导出数据为两张表导入导出数据
字符串函数(*)
l LEN() :计算字符串长度(字符的个数。)len(‘asdf’)4 len(‘我爱中国’) 4
l datalength();//计算字符串所占用的字节数,不属于字符串函数。
- 测试varchar变量与nvarchar变量存储字符串a的区别。见备注1.
l LOWER() 、UPPER () :转小写、大写
l LTRIM():字符串左侧的空格去掉
l RTRIM () :字符串右侧的空格去掉
l LTRIM(RTRIM(' bb '))
l LEFT()、RIGHT() 截取取字符串
- SELECT LEFT('abcdefg',2) //从0开始截取2个字符
l SUBSTRING(string,start_position,length),索引从1开始。没有0
参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。SELECT SUBSTRING('abcdef111',2,3)
尝试使用SQLServer的帮助。
日期函数(重点)
l GETDATE() :取得当前日期时间
l DATEADD (datepart , number, date ),计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期 。(入职一年以上的员工发1000$)
DATEADD(Day,1,getdate())//第一个参数指的是加的的部分(day,month,year,mm
,ss) 如果要减 就加个负数
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 1990年出生的人的个数? Select count(*) from P where year(birthday)=1990
Datepart可选值
取值 别名 说明
Year yy,yyyy 年份
quarter qq,q 季度
month mm,m 月份
dayofyear dy,y 当年度的第几天
day dd,d 日
week wk,ww 当年度的第几周
weekday dw,w 星期几
hour hh 小时
minute mi,n 分
second ss,s 秒
millisecond ms 毫秒
日期部分 缩写 yearyy, yyyyquarterqq, qmonthmm, mdayofyeardy, ydaydd, dweekwk, wwweekdaydw, whourhhminutemi, nsecondss, smillisecondms