上次我们介绍了:SQL Server实践性练习之子查询实例,本文我们主要介绍一些SQL Server实践性练习的一些高级SQL查询的实例,接下来就让我们来一起了解一下这部分内容。

–3.6.2 检索没有通过代理商a05订货的所有顾客的名字

    selectcnamefromcustomersexcept (selectcnamefromcustomers,orderswherecustomers.cid=orders.cidandorders.aid='a05')

–这时except是关键

—3.6.3 检索对同一产品至少订购了两次的所有顾客的名字

    selectcnamefromcustomerswherecidin (selectcidfromordersgroupbycid,pidhavingcount(pid)>=2)

–答案:

    selectdistinctcnamefrom(selecto.cidasspcidfromorderso,ordersxwhereo.cid=x.cid ando.pid=x.pidando.ordno<>x.ordno)y,customerscwherey.spcid=c.cid;

–3.6.4 检索至少订购了一件价格低于¥0.50 的商品的所有顾客的姓名 –答案:我没做出来,下面这种方法运行没通过 select distinct cname from (orders join products using(pid)) join customers using(cid) where price<0.50

–法2:将3个表直接连接起来就可以了 select distinct cname from (orders o join products p on o.pid=p.pid) join customers c on o.cid=c.cid where p.price<0.5

–3.7.1 求出所有订货交易的总金额 select sum(dollars) as totaldollars from orders;

–3.7.2 求出产品p03的订购总量 select pid,count(pid) as 订购总量 from orders where pid=’p03′ group by pid –错误的,没理解题意

–答案: select sum(qty) as total from orders where pid=’p03′

–3.7.3 求出顾客总数的查询 select count(*) as 顾客总数 from customers

–3.7.4 求出有顾客居住的城市的数目 select count(distinct city) as 有顾客居住的城市数目 from customers

–3.7.5 列出折扣值小于***折扣值的所有顾客的cid值

    selectcid,cname,discntfromcustomerswherediscnt<(selectmax(discnt)fromcustomers)

–实际上那条空值的记录没有选进来

–3.7.6 找出至少被两个顾客订购的所有产品(可以推广到多于两个顾客的情况) select pid from orders group by pid having count(cid)>=2 –我的思路是 select pid from orders –select pid,count(cid) as 产品被几个顾客订购 from orders group by pid having count(cid)>=2

–答案如下: select p.pid from products p where 2<=(select count(distinct cid) from orders where pid=p.pid)

–3.7.7 insert into customers (cid,cname,city) values (‘c009′,’Windix’,’Dallas’);

select * from customers where discnt<=10 or discnt>10 –显然,没有查出所有记录

–使用特殊谓词is null select * from customers where discnt is null or discnt<=10 or discnt>10

–3.8 SQL中行的分组 –3.8.1 创建一个计算每样产品被每个代理商订购的总量的查询 select aid,pid,sum(qty) as 每个代理商订购的总量 from orders group by aid,pid

3、执行效率的分析

–题4:找出订购了产品p05的顾客的名字 select cname from customers where cid in (select cid from orders where pid=’p05′)

–答案用最直接的SQL语句来解决该查询问题 select distinct cname from customers,orders where customers.cid = orders.cid and orders.pid=’p05′; –用连接也能达到相同的效果,重要的是拆解题目的意思 select distinct cname from customers inner join orders on customers.cid = orders.cid and orders.pid=’p05′;

–那么我们来看一下三种情况的执行效率

    SETANSI_NULLSON GO SETQUOTED_IDENTIFIERON GO --============================================= --Author:<Author,,Name>--Createdate:<CreateDate,,>--Description:<Description,,>--============================================= alterPROCEDUREa @pidvarchar(10) AS BEGIN --selectcnamefromcustomerswherecidin(selectcidfromorderswherepid=@pid)16ms --selectdistinctcnamefromcustomers,orderswherecustomers.cid=orders.cidandorders.pid=@pid;3ms --selectdistinctcnamefromcustomersinnerjoinordersoncustomers.cid=orders.cidandorders.pid=@pid;3ms END GO DBCCFREEPROCCACHE--清除缓存,以免下次计算时间 declare@begindatetime declare@Enddatetime set@begin=getdate() execa'p05' set@End=getdate() selectdatediff(ms,@begin,@End)as执行时间(毫秒)

–由此可见,一般情况下这种题目能直接写的就直接用连接的方法,用in的效率极低。

关于SQL Server数据库实践性练习之高级SQL查询的实例介绍就到这里了,希望本次的介绍能够对您有所帮助。

SQL Server数据库实践性练习的相关文章:

SQL Server实践性练习之子查询实例

SQL Server实践性练习之创建库表及条件查询

【编辑推荐】

    SQL Server 2008数据库学习笔记SQL Server 2005数据库nolock使用详解SQL Server如何启用Ad Hoc Distributed Queries?SQL Server 2008用存储过程实现插入更新数据的实例含有GROUP BY子句的查询中如何显示COUNT()为0的结果