浅谈 T-SQL高级查询

之前我们简单的了解了增、删、改、查这几类T-SQL语法来操纵数据表,但是为了更方便快捷地完成大量任务,SQL Server 提供了一些内部函数,可以和SQL Server 的SELECT语句来联合使用,进行类型转换、日期处理、数学计算、实现系统功能。


字符串在信息处理时有特殊的地位,几乎所有信息都需要转化成字符串才能正确显示,尤其是不同数据拼接起来显示的使用更加广泛。
字符串之间使用“+”拼接

select ‘运维工程师‘ + ‘姓名‘+‘的基本工资是:‘+ cast(基本工资 as varchar(10))+‘元‘
from *表名*   #“基本工资 as varchar(10)”是将基本工资列的类型转换为字符串
where 职务=‘运维工程师‘



例:
显示距离当前10天后的日期和时间:
select dateadd (DD,10,getdate())#“getdate()”取得当前系统日期,DD:单位为日

显示所有人的姓名和年龄:
select 姓名,datediff (yy,出生日期,getdate()) as 年龄 from ***表名***

显示表中所有90后的员工姓名和出生月份:

select 姓名,datename (year,出生日期) as 出生月份 # as 后可以配置别名(新生成的列名)
from *表名*
where 出生日期 between ‘1990-01-01‘ and ‘1999-12-31‘ # and:和、到


聚合函数:
用于对一组值执行计算,并返回单个值
如:求总和、平均值、最大或最小值等
SUN:求总和、AVG:求平均数、MAX和MIN:返回最大最小值
COUNT:返回非空值的计数

查询表中所有员工基本工资的综合:

select sum(基本工资) as 总工资
from *表名* 

查询表中所有员工的平均工资:

select avg(基本工资) as 平均工资
from *表名*

查询表中最高和最低的基本工资:

select max(基本工资) as 最高工资,min(基本工资) as 最低工资
from *表名*

查询表中90后员工的人数:

select count(基本工资) as ‘90后人数‘
from *表名*
where 出生日期>=‘1990-01-01‘

分组查询:
将表中的数据通过 group by 子句分类组合,再根据需要得到的统计信息,只显示限定条件的组,需要使用 HAVING 子句
查询表中每个职务的平均工资:

select 职务,avg(基本工资) as 职务基本工资
from *表名*
group by 职务

查询表中平均工资小于10000的职务:

select 职务,avg(基本工资) as 职务平均工资
from *表名*
group by 职务
having avg(基本工资)<10000


函数的综合应用:
查询未满30岁的员工的生日和年龄,并且计算出距离30岁的天数,最后用字符串拼接显示结果:
查询正确的结果

select 姓名,出生日期,DATEDIFF(YY,出生日期,GETDATE()) 年龄,
  DATEDIFF(DD,GETDATE(),DATEADD(YY,30,出生日期)) 距离三十岁的天数
  from test
  where DATEDIFF(YY,出生日期,GETDATE())<=30
  order by 出生日期

将结果用字符串拼接:

select ‘员工‘+姓名+‘的生日是:‘+CONVERT(varchar(10),出生日期,111)+
  ‘,现在年龄是‘+CAST(DATEDIFF(YY,出生日期,GETDATE()) AS varchar(10))
  +‘岁‘+‘,距离三十岁还有‘+
  CAST( DATEDIFF(DD,GETDATE(),DATEADD(YY,30,出生日期)) AS varchar(10))+‘天‘
  from employee
  where DATEDIFF(YY,出生日期,GETDATE())<=30
  order by 出生日期


使用 T-SQL 实现多表查询:

使用内联接在表A和表B中使用内联接查询学生姓名、学校和职业。(两种查询方式)

select a.name 姓名,a.school 学校,b.name,b.job
from A,B
where a.name=b.name

或:

select a.name 姓名,a.school 学校,b.name,b.job
from A inner join B on a.name=B.name 


使用左外联接查询在表A和表B中使用内联接查询学生姓名、学校和职业

select a.name 姓名,a.school 学校,b.name,b.job
from A left join B on a.name=B.name 


使用右外联接查询在表A和表B中使用内联接查询学生姓名、学校和职业。

select a.name 姓名,a.school 学校,b.name,b.job
from A right join B on a.name=B.name 

使用完整外联接查询在表A和表B中使用内联接查询学生姓名、学校和职业。

select a.name 姓名,a.school 学校,b.name,b.job
from A full join B on a.name=B.name 

以上四个案例,看似复杂,实则只是 inner、left、reght、full 这四个切换了一下而已
以下是一个实际实例:
源数据表如图所示:

查询出厂日期晚于2011年4月的水果信息:

select * from products
where 种类=‘水果‘
and 出厂日期>‘2011-04-01‘


分组查询所有水果、蔬菜、坚果的总成本:

select 种类,SUM(成本) from products
group by 种类


查询所有水果的名称和出厂日期,以特定格式拼接字符串,如:“西瓜的出厂日期是:2017/05/06”

select 种类+‘的出厂日期是:‘
+CONVERT(varchar(10),出厂日期,111)
from products


查询所有蔬菜的平均成本:

select 种类,AVG(成本)
from products
group by 种类
having 种类=‘蔬菜‘


多表查询的实例:
源数据表如图所示:


查询产品的名称、种类、成本、销售地点和销售价格:

select products.名称,products.种类,
products.成本,sales.销售地点,sales.销售价格
from products inner join sales
on products.名称=sales.名称


查询销往海南的产品名称、种类、成本和销售价格:

select products.名称,products.种类,
products.成本,sales.销售价格
from products inner join sales
on products.名称=sales.名称
and sales.销售地点=‘海南‘


查询销往北京的蔬菜名称、种类、成本和销售价格:

select products.名称,products.种类,
products.成本,sales.销售价格
from products inner join sales
on products.名称=sales.名称
and sales.销售地点=‘北京‘
where 种类=‘蔬菜‘

原文地址:https://blog.51cto.com/14227204/2409301

时间: 2024-10-21 03:23:32

浅谈 T-SQL高级查询的相关文章

SQL高级查询技巧

1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2. B, EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表

数据库管理及优化浅谈(MS SQL Server)

数据库管理 说起数据库管理——————首先要说的就是数据库设计,一个好的数据库设计理念能避免很多数据库引起的麻烦和后期维护的成本 1.首先要考虑的就是数据库权限和安全,首先有条件优先考虑的是将数据库部署在数据库集群,当然数据量不大冲从成本上考虑可以是不建议使用的 权限这个主要是登陆用户权限和架构合理搭配,最好一个架构对应一个用户名,方便后期规范和维护 2.说完数据库的权限下面当然是主要存储数据,数据怎么存,应该怎么规范,索引如何建立,后期数据量超大,该怎么分区,相信这些都是很多小伙伴心中的难题

SQL高级查询基础

1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2. B, EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表

SQL高级查询

高级查询: 一.多表链接 1,普通查询 select * from 表名,表名 where 表名.列名 = 表名.列名 2,join链接 select * from 表名 join 表名 on 表名.列名 = 表名.列名 二.多表联合 select * from 表名 where 列名='内容' union select * from 表名 where 列名='内容' 三.子查询(无关子查询) select * from 表名 where 列名 = (select 列名 from 表名 wher

SQL————高级查询

高级查询 --连接查询 select * from 表1,表2 ————形成笛卡尔积 select * from 表1,表2 where 表1.主键=表2.外键  ————主外键位置可以互换 --join on 内连接 格式: select * from 表1 join 外键 on 表1.主键 = 表2.外键 --查哪位学生的哪一门课考了多少分 select student.sname,course.cname,score.degree from student join score on sc

浅谈ORACLE SQL语句优化经验

(1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.

SQL(高级查询)

1.子查询在WHERE子句中 在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果 为了给查询提供数据而首先执行的查询语句叫做子查询 子查询嵌入在其它SQL语句中的SELECT语句,大部分出现在WHERE子句中 子查询嵌入的语句称作主查询或父查询 主查询可以是SELECT语句,也可以是其它类型的语句比如DML或DDL语句 根据返回结果的不同,子查询可分为单行子查询.多行子查询及多列子查询2.子查询在WHERE子句中(续1) 如果子查询返回多行,主查

浅谈!SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别

今天的工作学习之路是一个数据库的小知识,当时没有区分出所以然,特此记录分享一下子. 众所周知,数据库的表都是单独存在的,但是当我们进行联合查询(多表查询)时,我们获得数据库返回的值时就好像在一张表里一样,这是因为在进行联合查询时数据库会生成一个临时表返回给我们所想要的数据信息,这时我们都是通过LEFT JOIN 等语句进行相关联,并且我们也会为我们所想查询的数据进行一个筛选,这时我们就会用到过滤语句. LEFT JOIN ON WHERE:在临时表生成后,再对临时表的数据进行过滤,再返回左表.

浅谈My SQL引擎的对比

MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB),也常常可以使用.如果技术高超,还可以使用MySQL++ API自己做一个引擎.下面介绍几种数据库引擎:     ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作

SQL Server SQL高级查询语句小结(转)

--select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select distinct sex from student; --count 统计 select count(*) from student; select count(sex) from student; select count(distinct sex) from student; --top 取前N条记录 s