CoderPeng

## 一.写在前面的话

面对大河我无限惭愧，

我年华虚度，空有一身疲倦，

和所有以梦为马的诗人一样，

岁月易逝，一点不剩。

------ 摘自《海子的诗》

## 二.查询缺少值的查询

``````1  select distinct orderdate,count(*) as N'每日订单量' from sales.orders
2  where orderdate between '20080101' and '20081231'
3  group by orderdate``````

``````1  create table nums
2  (
3    n int
4  );
5
6  select * from nums;``````

``````1  declare @i int;
2  set @i=0;
3  while @i<400
4  begin
5  set @i=@i+1;
6  insert into nums(n) values(@i);
7  end``````

sqlserver学习笔记1：http://www.cnblogs.com/liupeng61624/p/4354983.html

sqlserver学习笔记2：http://www.cnblogs.com/liupeng61624/p/4367580.html

sqlserver学习笔记3：http://www.cnblogs.com/liupeng61624/p/4375135.html

sqlserver学习笔记4：http://www.cnblogs.com/liupeng61624/p/4388959.html

``````1  select dateadd(day,n,'20071231')
2  from nums;``````

``````1  select dateadd(day,f.n,'20071231'),count(orderid) as N'每日订单数量'
2  from nums f  left join sales.orders m on
4   group by dateadd(day,f.n,'20071231')
5   order by dateadd(day,f.n,'20071231')``````

（2）子查询，即查询结果可以作为一个查询条件。

``````1   select max(birthdate) as N'生日'
2   from hr.employees``````

``````1   select birthdate,lastname
2   from hr.employees
3   where birthdate=
4   (
5       select max(birthdate)
6       from hr.employees
7   )``````

1. 首先找出订单最贵的信息
``````1
2   select max(val) as N'最贵订单'
3   from Sales.OrderValues``````

2.   然后找出最贵订单的顾客ID是多少

``````1   select custid from Sales.OrderValues
2   where val=(
3   select max(val) as N'最贵订单'
4   from Sales.OrderValues
5   )``````

3.   接着我们就可以在顾客表里面找出ID等于查询来的这个ID，同时查找出所在国家。

`````` 1   select custid,contactname,country
2   from sales.customers where custid=
3   (
4               select custid from Sales.OrderValues
5               where val=
6             (
7               select max(val) as N'最贵订单'
8                from Sales.OrderValues
9              )
10   )``````

## 三.相关子查询，即查询的嵌套另一个查询，其中有涉及到相互关联的条件。

1.用group......by分组

``````1   select custid, count(*) as N'订单数量' from sales.orders
2   group by custid order by custid``````

2.利用count.....over

``````1   select distinct custid,count(*)  over (partition by custid) as N'订单数量'
2   from sales.orders``````

第三种方式我们就用相关子查询来解决，可以这样理解：就是我们没查一位顾客的订单数量就是去订单表里面顾客Id相同的都取出来，然后利用聚合函数求和。顾客ID我们可以从顾客表里面取出来，然后这个ID就等于订单表里面的ID。所以根据分析我们写sql如下：

``````1   select n.custid,n.contactname,
2   (
3   select count(*)
4   from sales.orders m
5   where m.custid=n.custid
6   ) as N'订单数量'
7   from sales.customers n``````

## 四.多值子查询

``````1
2   select distinct m.country from sales.customers m
3   where m.country  not in
4   (
5       select n.country from production.suppliers n
6   )``````

``````1   select distinct m.country from sales.customers m
2   where  not exists
3   (
4       select n.country from production.suppliers n
5       where   n.country= m.country
6   )``````

## 五.复杂子查询

（1）例如：假如我们要查询所有订单当前订单的前一个订单和后一个订单信息，这里我们先分析：

1.首先我们先可以查询出所有的订单。

``````1   select distinct  custid
2   from sales.orders``````

2.然后查询比当前订单Id小于的订单，同时这个订单是小于当前订单中最大的那个订单（即紧挨着的订单）。

``````1   select distinct
2   (
3      select max(custid) from
4      sales.orders m where m.custid< n.custid
5   ) as N'前一个订单',n.custid as N'当前订单'
6
7   from sales.orders n``````

3.同理，可以查出大于当前订单的那个紧挨着的那个订单。

`````` 1   select distinct
2   (
3      select max(custid) from
4      sales.orders m where m.custid< n.custid
5   ) as N'前一个订单',n.custid as N'当前订单',
6     (
7      select min(custid) from
8      sales.orders p where p.custid> n.custid
9   ) as N'后一个订单'
10   from sales.orders n``````

（2）累计聚合

``1 select * from  Sales.OrderTotalsByYear``

``````1 select n.orderyear,
2 (
3    select sum(qty)
4    from  Sales.OrderTotalsByYear  m
5    where m.orderyear<=n.orderyear
6 ) as N'累计订单数量'
7  from  Sales.OrderTotalsByYear n
8  order by n.orderyear;``````

### CoderPeng

【用jersey构建REST服务】系列文章

1.用Jersey构建RESTful服务1--HelloWorldhttp://www.waylau.com/jersey-restful-helloworld/2.用Jersey构建RESTful服务2--JAVA对象转成XML输出http://www.waylau.com/jersey-restful-java-x......

waylau
2014/08/23
1K
1

UltraSQL
2018/07/30
0
0
Jeasyframe 开源框架 V1.X Final 版发布

2013/12/20
1K
2
php连接sqlserver2005

charley158
2014/01/02
104
1
MSSQL(SQL Server) on Linux 简明部署与使用

04/14
0
0

Java 文件类操作API与IO编程基础知识

boonya
16分钟前
2
0
SDKMAN推荐一个好

hotsmile
41分钟前
8
0

Garphy
44分钟前
5
0

10
0
debian10使用putty配置交换机console口

W_Lu

12
0