select 查询例子集

ast1.查询没有折扣的商店

a. 

use pubs
SELECT stor_id AS "store id" ,stor_name AS "Store Name"
FROM stores
WHERE stor_id NOT IN
(SELECT stor_id FROM discounts WHERE stor_id IS NOT NULL)

b.

SELECT stor_id AS "store id" ,stor_name AS "Store Name"
FROM stores
WHERE stor_id  in
(SELECT stor_id FROM discounts WHERE stor_id IS  NULL )

 

a 和 b 看似相同,但是a 有结果,而b却没有,因为stord_id如果是null 那怎把null值传递回去还是null

 

2.查询有订单的顾客的第一笔订单。

USE Northwind
select min(o.OrderID) AS ORDERID,o.CustomerID INTO #TEMP_ORDER
from Orders o
group by o.CustomerID
order by CustomerID
select o.OrderID ,o.CustomerID,o.OrderDate
from Orders o inner join #TEMP_ORDER b on o.OrderID=b.OrderID
order by o.CustomerID

#开头命名的表为临时表,存放在tempdb中,如用户使用完毕后不手动删除此临时表,只要断开northwind的连接(比如使用了其他数据库 pubs)则临时表自动被删除。

 

3. .查询有订单的顾客的第一笔订单,从未有过订单的显示‘NERVER ORDER’。

select cu.CompanyName,
isnull(cast((select MIN(o.orderdate)
from Orders o
where  o.CustomerID=cu.CustomerID)as varchar),'NERVER ORDERED'
) as "order date"
from Customers cu

 

ISNULL 函数,ISNULL(<expression to test>,<replacement value if null>)

其中还使用到了CAST,因为当‘order date’列第一列结果返回的是date类型,但是后面碰到第一列是没有订单的,即'NERVER ORDER'是varchar类型的,不能转换成date类型,所以需要cast来强制转换。cast 列 as 新类型。

 

4.寻找不仅订购了 chocolade并且订购了 Vegie-spread的用户。

use Northwind
select distinct c.CompanyName
from Customers as c
join
(
select customerid
from orders o
join [Order Details] od
on o.OrderID=od.OrderID
join Products p
on od.ProductID=p.ProductID
where p.ProductName='chocolade') as spen
on c.CustomerID=spen.CustomerID
join
(select customerid
from Orders o
join [Order Details] od
on o.OrderID=od.OrderID
join Products p
on od.ProductID=p.ProductID
where ProductName='vegie-spread') as spap
on c.CustomerID=spap.CustomerID

这个查询用到了派生表―――由一个查询结果集的列和行构成。

 

5.以MM/DD/YY 显示结果

use Northwind
select convert(varchar(10),HireDate,1) from Employees

CAST(expression AS data_type)

CONVERT(data_type,experession [,style])

convert 和cast相比,多了一些日期格式转换功能,但是convert不能代替cast!因为cast是ANSI兼容的,而convert 不是。

 

6.没有定过单的用户

use Northwind
select cu.CompanyName
from Customers cu
where   not exists  (select o.CustomerID
from orders o
where cu.CustomerID=o.CustomerID)

EXISTS 一般用于联合连接,因为需要外传递值进子查询,然后子查询返回 TRUE或者FALSE。

 

7. 用户订单总额超过25000美元,查出这些用户的前五条订单

select * from (
select *, row_number() over( PARTITION  by customerid order by orderdate desc) rowid
from (
select  o.CustomerID,o.OrderID,o.OrderDate
from Orders o inner join
(
select o.CustomerID,sum(temp.price) as tprice
from Orders o join
(select od.OrderID, sum(od.ProductID*od.Quantity*(1-od.Discount) )as price
from [Order Details] od
group by od.OrderID) as temp
on temp.OrderID=o.OrderID
group by o.CustomerID
having SUM(temp.price)>25000
)tmp
on o.CustomerID=tmp.CustomerID
) aa
)bb
where rowid<=5

说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
语法:ROW_NUMBER () 
OVER ( [ <partition_by_clause> ]<order_by_clause> ) 。
备注:
ORDERBY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:
<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:
bigint 。

你可能感兴趣的:(查询语句)