第4部分 T-SQL高级查询

一.在查询中使用的函数,根据用途,把函数分为四类
1.字符串函数:用于控制返回给用户的字符串
(1)Charlndex:用来寻找一个指定的字符串在另一个字符串的起始位置
列如:select charlndex(‘accp’,’my accp course’,1)
例如:4
(2)len:返回传递给它的字符串长度
列如:select len(‘SQL Server课程’)
例如:12
(3)upper:把传递给它的字符串转化成大写
例如:select upper(‘SQL Server课程’)
返回:SQL SERVER课程
(4)ltrim:清除字符左边的空格
例如:select ltrim(‘ 周智宇 ’)
返回:周智宇
(5)rtrim:清除字符右边的空格
例如:select rtrim(‘ 周智宇 ’)
返回: 周智宇
(6)right:从字符右边返回指定数目的字符
例如:select right(‘中国,人民’3)
返回:,人民
(7)replace:替换一个字符串中的字符
例如:select replace(‘莫乐可切,杨可’‘可’,‘兰’)
返回:莫乐兰切,杨兰
(8)stuff:在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符
例如:select stuff(‘ABCDEFG’,2,3,‘我的音乐’)
返回:A我的音乐EFG
2.日期函数
(1)getdate:取得当前的系统日期
例如:select getdate()
返回:今天的日期
(2)dateadd:将指定的数值添加到指定的日期部分后的日期
例如:select dateadd(mm,4,‘01/01/1999’)
返回:以当前的日期格式返回05/01/1999
(3)datediff:两个日期之间的指定日期部分的区别
例如:select datediff(mm,‘01/01/1999’,‘05/01/1999’)
返回:4
(4)datename:日期中指定日期部分的字符串形式
例如:select datename(dw,‘01/01/2000’)
返回:saturday
(5) datepart:日期中指定日期部分的整数形式
例如:select datepart(day,‘01/15/2000’)
返回:15
3.数学函数
(1)abs:取数值表达式的绝对值
例如:select abs(-43)
返回:43
(2)ceiling:取大于或等于指定数值,表达式的最小整数
例如: select ceiling(43.5)
返回:44
(3)floor:取小于或等于指定表达式的最大整数
例如:select floor(43.5)
返回:44
(4)power:取数值表达式的幂值
例如:lelect power(5,2)
返回: 25
(5)round:将数值表达式四舍五入为指定精读
例如:select round(43.543,1)
例如:43.5
(6)sign:对于正数返回+1,对于负数返回-1,对于0返回0
例如:select sign(-43)
返回:43
(6)sqrt:取浮点表达式的平方根
例如:select sqrt(9)
返回:3
4.系统函数
(1)convert:数据类型转换
例如:select convert(varchar(5)),12345)
返回:字符串12345
(2)cast:数据类型转换,与couvert相比起语法比较简单些,
例如:select cast(‘2009-03-17’as datetime)
返回:2009-03-17 00:00:00.000
(2) current_user:返回当前用户的名字
例如:select current_user
返回你登录的用户名
(3)datalength:返回用于指定表达式的字节数
例如:select datalength(‘中国A联盟’)
返回:5
(4)host_name:返回当前用户所登录的计算机的名字
例如:select host_name()
返回:你所登录的计算机的名字
(5)system_user:返回当前所登录的用户名
例如:select system_user
返回:你当前所登录的用户名
(6)user_name:从给定的用户ID中返回用户名
例如:select user_name(1)
返回:从任意数据中返回“dbo”
二.SQL Server中的聚合函数
1.sum:返回表达式中所有数值的总和,只能用于数字类型的列,不能够汇总字符
例如:查询用户13701418965的合计欠费金额
实现方法如下
use tariffsmall
go
select sum(charge)
from accountbill
where ispaid=0 and phonenumber='13701418965'
注意:这种查询只能返回一个数值,因此,不能够直接与可能返回多行的列一起使用来进行查询
例如:use tariffsmall
go
select phonenumber,sum(charge)
from accountbill
where ispaid=0 and phonenumber='13701418965'
2.avg:返回表达式中所有数值的平均值,只能用于数字类型的列
列如:查询历史账单中2008年6月份的用户平均话费
实现语句如下:
select avg(charge) as 平均成绩
from "history-accountbill"
where accounttime between '2008-06-01 00:00:00'
and '2008-06-30 23:59:59'
注意:如果表名包含了非字母,数字,下划线字符的,在引用时请使用双引号括起来
3.max和min:max返回表达式中的最大值;min返回表达式中的最小值,它们都可以用于数字型,字符型以及日期型/时间性的列
例如:查询2008年6月份电话话费中单笔最高费用和单笔最低费用
实现语句如下:
select max(charge) as 单笔最高话费,
min(charge) as 单笔最底话费
from "history-accountbill"
where accounttime between '2008-06-01 00:00:00'
and '2008-06-30 23:59:59'
4.count:返回表达式中非空值的计数,count可用于数字和字符类型的列
例如一:查询欠费账单数,需要统计账单个数
实现如下:
select count(*) as 欠费帐单数
from accountbill
where ispaid=0
例如二:查询欠费用户数,需要统计不同用户号码的数量
实现如下:
select count(distinct phonenumber) as 欠费用户数
from accountbill
where ispaid=0
三.分组查询
1.使用Group By进行分组查询
2.使用Having子句进行分组筛选
注意:having和where子句可以在同一select语句中使用,使用时应按照where-group by-having的顺序。Where子句从数据源中去掉不符合其搜索条件的数据;group by子句搜索数据行到各个组中,统计函数为各个组计算统计值;having子句去掉不符合其族搜索条件的各组数据行
三.多表联接查询
1.内联接:根据表中共同的列来进行匹配,只有匹配条件的数据才能够被查询出来.内联接使用inner join关键字或者直接在where条件里通过表达式来进行表之间的关联
例如:在dbo.Title和dbo.Publishers表中通过内联接查询
实现方式一:在where子句中指定联接条件,写法如下
use book
go
select dbo.Title.Title_id,dbo.Title.Title,
dbo.Publishers.Pub_name,dbo.Title.Pub_id
from dbo.Title,dbo.Publishers
where dbo.Title.Pub_id=dbo.Publishers.Pub_id
实现方式二:在from子句中使用join……on来实现,写法如下
select a.Title_id,a.Title,
b.Pub_name,a.Pub_id
from dbo.Title as a inner join dbo.Publishers as b
on (a.Pub_id=b.Pub_id)
2.外联接:不仅显示两个表关联字段匹配的记录,同时不匹配的记录根据外联接类型也会显示,
(1)左外联接:left join或left outer join.左外联接的结果集包括left join子句中指定的左表的所有行,而不仅仅是连接列所匹配的行,如果左表的某行在右表没有匹配行,则在相关联的结果集行中,右表的所有选择列均为空值
(2)有外联接:right join或right outer join.右外联接是左外联接的反向联接,将返回右表的所有行,如果右表的某行在左表中没有匹配行,则将为左表返回空值
(3)完整外联接:full join或full outer join.完整外联接返回左表和右表的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列包含空值,如果表之间没有匹配行,则整个结果集包含基表的数据值
3.交叉联接:交叉联接就是表之间没有任何关联条件,查询将返回左表与右表挨个联接的所有行,就是左表中的每一行与右表中的所有行再一一组合,相当于两个表相乘

 

本文出自 “张书兴” 博客,转载请与作者联系!

你可能感兴趣的:(数据库,查询,自动,保存,高级)