`
guiqing85
  • 浏览: 162705 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

T-SQL复杂一点的查询

阅读更多

一:inner join
inner join   是在做排除,如果任一行在两个表中不匹配,则注定将从最终的结果中排除掉

例子1:
select * from employee e inner join employee m on e.managerid = m.employeeid
这是从一个表里查询了两次
得到的一行记录将包括两个employee的信息  前面的是经理  后面的是打工的
注意from哪个表  哪个表的信息就在前面
其中e和m分别是表的别名,这里的别名和列的别名不同,不用写as

例子2  
select  e.employeeid,  ce.firstname,  m.employeeid as managerid,  cm.firstname as managerfirst   
from employee e inner join  employee m on e.managerid = m.employeeid
inner join contact ce on e.contactid = ce.contactid
inner join contact cm on m.contactid = cm.contactid
第一个联接是把一个表与他自身进行连接  这个叫自引用(注意表的别名)
第二个连接得到经理的名字
第三个连接得到雇员的名字 
看似很复杂的连接  其实很简单
最后说一点inner join 是默认的连接类型   inner 关键字是可选的

二:outer join
先看例子
select e.employeeid,   m.employeeid  as managerid from employee e 
left outer join employee m  on e.managerid = m.employeeid
无论左侧表(e)中的行是否与右侧表中的行相匹配都要显示
如果左侧表中的行在右侧表中找不到相匹配的数据,  那么右侧表的数据为null

right outer join 也类似   outer是可以忽略的

三:full  join  与  cross  join
这两个其实都不必多说
full  join  是  left join  和  right join 的结合
full  join将包含位于连接两侧的表的所有行
不存在的行就用null补齐

cross join  没有on操作符
得到的是两测表中所有行的  笛卡儿积
就是把两册的行排列组合一下
一般不会存在null的行
这是相当罕见的用法
只有科学家或者来搞样本数据的才会用到这个用法

四:union
union更像是从一个查询直接向另一个查询进行的数据追加(差别还是有的)
join更像是水平的合并数据(添加更多的列),union是垂直的合并数据(添加更多的行)
先看例子:select col2 from table1 union  all select col4 from table2
1:select 列表中字段的数量必须相同
2:字段的数据类型必须隐士兼容
3:返回的结果集的标头取自第一个查询
4:默认返回方式是distinct,union  alll返回全部的集合


五:子查询返回单个值
先看例子:
declare @hits int
select  @hits = min(hitnum) from articles
select  distinct A.title from articles A join users U on A.uid = U.id where A.hitnum = @hits

这是完全可行的,但是我们可以用另一种形式:
select distinct A.title from articles A join users U on U.id = A.uid where A.hitnum = (select min(hitnum) from articles )
这就是子查询

六:子查询返回多个值
接着看例子(子查询里返回多个值)
use  database
select  A.title from articles A join users U on A.uid = U.id where A.id in (select id from articles where istop = 'true')

再看一个例子(用子查询找出孤立的记录)
select  A.title from article A join users U on A.uid = U.id where A.id not in (select id from articles where istop = 'true')
这个例子写的有点牵强
但是这里注意  not in 子查询得到的字段  不能有null直 存在,如果有  那么整个句子将返回空

细心的人大概看出来了,前面提到的两个子查询的例子几乎都可以用内联(join)的方式替换掉
出于性能上的考虑,我们应该首先选择联结的解决方案  而不是子查询

七:any  some  和  all
any与some功能上是相同的,推荐用some
any与some一般都是和比较运算符一起使用的(>=  <=  <>  !> 等  )
>some (1,2,3)意味着大于1    >some就是大于最小的一个值
=some和in  起的作用是一样的
not in (a,b,c)展开为  <>a and  <>b and <>c
<>some (a,b,c)展开为  <>a or <>b  or <> c
>all (1,2,3)意味着大于3

八:where子句中的相关子查询(外部查询和内部查询)
先看个例子

use adventureworks
drop table #MinOrderdates

select CustomerID, min(OrderDate)as orderdate 
into #MinOrderdates
from Sales.SalesOrderHeader
group by CustomerID
order by CustomerID

select o.CustomerID,o.SalesOrderID,o.OrderDate
from Sales.SalesOrderHeader o
join #MinOrderdates t
on o.CustomerID = t.CustomerID
and o.OrderDate = t.orderdate
order by o.CustomerID

drop table #MinOrderdates 


每个顾客在系统中的第一张定单的orderid 和orderdate
用到了临时表,执行了两次查询
看下面的例子

select o1.CustomerID,o1.SalesOrderID,o1.OrderDate
from Sales.SalesOrderHeader o1
where o1.OrderDate = 
(
select min(o2.OrderDate) 
from Sales.SalesOrderHeader o2
where o2.CustomerID = o1.CustomerID 
)
order by CustomerID 


执行了一次查询
注意内部查询对外部查询有一个显示的引用  o2.CustomerID = o1.CustomerID
当然外部查询也可以引用内部查询中的列
第二个例子

select c.LastName,
(
select min(OrderDate) 
from Sales.SalesOrderHeader o
where o.ContactID = c.ContactID
) as orderdate
from Person.Contact c 



九:派生表


先看例子:
订购过某种特定产品的顾客列表

use AdventureWorks;
select c.FirstName,c.LastName
from Person.Contact As c
join Sales.SalesOrderHeader as soh
on c.ContactID = soh.ContactID
join Sales.SalesOrderDetail as sod
on soh.SalesOrderID = sod.SalesOrderID
join Production.Product as p
on sod.ProductID =p.ProductID
where p.Name = 'Minipump'


查找顾客的名字以及首次订购的日期

90行受影响
现在我们想查找即订购过Minipump又订购过AWC Logo Cap的顾客
如果最后是
where p.Name = 'Minipump' or p.Name = 'AWC Logo Cap'
2412行受影响
这样做是错误的
这样得到的结果是订购过Minipump和订购过AWC Logo Cap的顾客
下面来看我们的解决方法
use AdventureWorks
select distinct c.FirstName,c.LastName
from Person.Contact As c
join 
(
select ContactID from Sales.SalesOrderHeader As soh
join Sales.SalesOrderDetail as sod
    on soh.SalesOrderID = sod.SalesOrderID
join Production.Product As p
    on sod.ProductID = p.ProductID
    where p.Name = 'Minipump' 
) pumps
on c.ContactID = pumps.ContactID
join 
(
select ContactID from Sales.SalesOrderHeader as soh
join Sales.SalesOrderDetail as sod
    on soh.SalesOrderID = sod.SalesOrderID
join Production.Product as p
    on sod.ProductID = p.ProductID
    where p.Name = 'AWC Logo Cap' 
) caps
on c.ContactID = caps.ContactID
把select出的内容当成一个表用
这就是派生表

分享到:
评论

相关推荐

    T-SQL学习笔记.chm

    一:简单的语法知识 二:简单的增 删 改 查和一些相关子句 三:复杂一点的查询 四:约束 五:create drop alter 六:视图 七:存储过程与用户自定义函数 八:触发器 九:全文索引 十:游标

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    说通俗一点就是:如果用 EXEC 执行一条动态 SQL 语句,由于每次传入的参数不一样,所以每次生成的 @sql 就不一样,这样每执行一次SQL SERVER 就必须重新将要执行的动态 Sql 重新编译一次 。但是SP_EXECUTESQL 则不...

    Toad 使用快速入门

    使用Toad,我们可以通过一个图形化的用户界面快速访问数据库,完成复杂的SQL和PL/SQL代码编辑和测试工作。Toad由Oracle开发专家专门为开发人员而设计,是一个功能强大、结构紧凑的专业化PL/SQL开发环境。 Toad 主要...

    springmybatis

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan ...

    jpivot学习总结.doc

    uniqueMembers 该属性用于优化产生的 SQL ,如果你知道这个级别和其父级别交叉后的值或者是维度表中给定的级别所有的值是唯一的,那么就可以设置该值为 true ,否则为 false 。 levelType 该 Level 的类型,默认...

    ssh(structs,spring,hibernate)框架中的上传下载

    可以确定的一点是:BlobByteArrayType不可能逾越Blob天生的操作方式,原来是BlobByteArrayType数据类型本身具体数据访问的功能,它通过LobHandler将两次数据访问的动作隐藏起来,使Blob字段的操作在表现上和其他一般...

    java常用工具类的使用

    比如现在木工做家具,已经不存在自己砍树、加工木板、一点一点的雕刻了,如果需要木板,直接到市场上购买,需要各种图案,直接到市场购买,木工的工作就是把这些木板修理一下组装成一套家具即可。“工欲善其事,必先...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 ...for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。...

    网管教程 从入门到精通软件篇.txt

    IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 IST:数字跟踪设备文件 ISU:InstallShield卸装脚本 IT:脉冲跟踪系统音乐模块(MOD)...

    二十三种设计模式【PDF版】

    o m m u n i c a t i n go b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复用性更 好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个...

Global site tag (gtag.js) - Google Analytics