Select-sql周周谈-第三周

2001年8月8日 第三周

A.1997年度与公司有业务往来的客户

所谓有业务往来就是与企业有销售关系,是否有销售关系可以从Orders表中得到,于是大家很容易想到使用字查询的技术来解决问题。

我们可以通过如下查询得到有销售关系客户编号:

SELECT ORDERS.CUSTOMERID FROM ORDERS WHERE ORDERS.ORDERDATE BETWEEN '19970101' AND '19971231'

由于需要得到更详细的客户信息,所以必须使用到Customers表。于是在SQL Server中最终代码代码如下:

SELECT CUSTOMERS.CUSTOMERID,CUSTOMERS.COMPANYNAME,CUSTOMERS.CITY,CUSTOMERS.COUNTRY
FROM CUSTOMERS WHERE CUSTOMERS.CUSTOMERID IN
(SELECT ORDERS.CUSTOMERID FROM ORDERS WHERE ORDERS.ORDERDATE BETWEEN '19970101' AND '19971231')

在Visual FoxPro中实现起来代码也是一样的:

SELECT CUSTOMERS.CUSTOMERID,CUSTOMERS.COMPANYNAME,CUSTOMERS.CITY,CUSTOMERS.COUNTRY ;
FROM CUSTOMERS WHERE CUSTOMERS.CUSTOMERID IN;
(SELECT ORDERS.CUSTOMERID FROM ORDERS WHERE ORDERS.ORDERDATE BETWEEN {^1997-01-01} AND {^1997-12-31})

就本例来说还有更高效的方法解决问题,SQL Server中有这样一个说法:连接比子查询更有效率。那么这里我们是不是可以用表与表的连接来解决问题呢?可以的,在SQL Server中我们首先会写出这样的代码:

SELECT CUSTOMERS.CUSTOMERID,CUSTOMERS.COMPANYNAME,CUSTOMERS.CITY,CUSTOMERS.COUNTRY
FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.CUSTOMERID=ORDERS.CUSTOMERID
WHERE ORDERS.ORDERDATE BETWEEN '19970101' AND '19971231'

这样是否完成了需要?没有,运行一下看看结果你就知道了:原来一个客户在97年度中可能与公司发生数次销售关系,这样在Orders表中就会产生多条销售信息,通过Oreders 表与Customers的连接,一个客户可能对应到数张订单,于是产生了客户信息的重复,这显然非我们所愿,这时就必须保证:客户标号相同的数据行只显示其中的一条,用关键字:DISTINCT可以实现。在SQL Server中实现如下:

SELECT DISTINCT CUSTOMERS.CUSTOMERID,CUSTOMERS.COMPANYNAME,CUSTOMERS.CITY,CUSTOMERS.COUNTRY
FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.CUSTOMERID=ORDERS.CUSTOMERID
WHERE ORDERS.ORDERDATE BETWEEN '19970101' AND '19971231'

在Visual FoxPro中同样可以实现:

SELECT DISTINCT CUSTOMERS.CUSTOMERID,CUSTOMERS.COMPANYNAME,CUSTOMERS.CITY,CUSTOMERS.COUNTRY ;
FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.CUSTOMERID=ORDERS.CUSTOMERID;
WHERE ORDERS.ORDERDATE BETWEEN {^1997-01-01} AND {^1997-12-31}

B.列出单价高于平均价的产品

这是一个必须使用子查询的例子,为什么不能用连接来实现呢?原来平均价格的产生必须通过“压缩”记录集来实现,既然记录集被压缩了,其他的表就不能连接到这个被压缩的记录集了,在SQL Server中平均价格是这样求得的:

SELECT AVG(UNITPRICE) FROM PRODUCTS

看这个记录集就只有一个字段、一条记录,其他的表与它连接是不可能的,在SQL Server中本例的最终实现如下:

SELECT PRODUCTS.PRODUCTNAME,PRODUCTS.UNITPRICE FROM PRODUCTS WHERE PRODUCTS.UNITPRICE>(SELECT AVG(UNITPRICE) FROM PRODUCTS)

在Visual FoxPro中的实现如下:

SELECT PRODUCTS.PRODUCTNAME,PRODUCTS.UNITPRICE FROM PRODUCTS WHERE PRODUCTS.UNITPRICE>;
(SELECT AVG(UNITPRICE) FROM PRODUCTS)

C.列出价格最高的10中产品

本例没有过多的技巧,这是一个定式,一定要记住。在SQL Server中可以这样实现:

SELECT TOP 10 PRODUCTNAME,UNITPRICE FROM PRODUCTS ORDER BY UNITPRICE DESC

整个过程其实是这样的:数据集先按照一定的顺序(本例是按单价降序排列),然后SQL Server检索最前面的10条记录给用户。在Visual FoxPro中这样实现:

SELECT TOP 10 PRODUCTNAME,UNITPRICE FROM PRODUCTS ORDER BY UNITPRICE DESC

D.列出价格最低的产品(希望得到的产品数量为总产品数量的5%)

在SQL Server中这样实现:

SELECT TOP 5 PERCENT PRODUCTNAME,UNITPRICE FROM PRODUCTS ORDER BY UNITPRICE

在Visual FoxPro中也一样实现:

SELECT TOP 5 PERCENT PRODUCTNAME,UNITPRICE FROM PRODUCTS ORDER BY UNITPRICE

E.列出员工间的隶属关系(一层关系即可)

这是一个自连接的典型,自连接是比较容易搞混脑袋的事情,其实我们完全可以把它想象成为两个表之间的连接,而不要把目光囿于一个表,情况或许会好些。在SQL Server中可以这样实现:

SELECT A.EMPLOYEEID AS 领导工号,A.FIRSTNAME+' '+A.LASTNAME AS 领导姓名,A.TITLE AS 领导头衔,B.EMPLOYEEID AS 下属工号,B.FIRSTNAME+' '+B.LASTNAME AS 下属姓名,B.TITLE AS 下属头衔 FROM EMPLOYEES A INNER JOIN EMPLOYEES B ON A.EMPLOYEEID=B.REPORTSTO ORDER BY A.EMPLOYEEID

在Visual FoxPro中用同样的代码实现:

SELECT A.EMPLOYEEID AS 领导工号,A.FIRSTNAME+' '+A.LASTNAME AS 领导姓名,A.TITLE AS 领导头衔,;
B.EMPLOYEEID AS 下属工号,B.FIRSTNAME+' '+B.LASTNAME AS 下属姓名,B.TITLE AS 下属头衔;
FROM EMPLOYEES A INNER JOIN EMPLOYEES B ON A.EMPLOYEEID=B.REPORTSTO ORDER BY A.EMPLOYEEID

这一周的实验做完了,不知您有什么体会?我的感觉就是学习SQL-Select一定要多加理解,有时死做死练是不起效果的,而一瞬间的开朗会使你踏破玄关!对于Visual FoxPro的程序员来说,对SQL-Select可能是又爱又恨:我们有很棒的数据操作语言、很棒的光标,所以我们不用写很长很烦的很难理解的SQL-Select也能解决问题,虽然Visual FoxPro对SQL-Select的支持也很棒(到现在为止只要SQL Server能实现的,Visual FoxPro基本上不用改变代码就能使用)。现在所有的开发工具、数据库都支持SQL-Select,特别是Visual FoxPro两层、三层构架的流行以后,SQL会越来越重要,所以不学不行!下周再见!

时间: 2024-12-29 21:31:30

Select-sql周周谈-第三周的相关文章

Oracle Database 10g:最佳新特性(第三周:表空间管理)

oracle 第三周:表空间管理 名字中包含了什么?:改善的表空间管理 表空间管理得到了重大的改进,这可以归因于一个 sparser SYSTEM.为用户定义一个默认表空间的支持.新的 SYSAUX.甚至重命名 您曾经多少次因用户在 SYSTEM 表空间中创建了非 SYS 和 SYSTEM 的段而伤透脑筋? 在 Oracle9i Database 之前,如果在创建用户时没有指定默认表空间,那么它将默认为 SYSTEM 表空间.如果用户在创建一个段时没有显式地指定一个表空间,那么这个段将在 SYS

C++程序设计三周教学记录

从第五周到第八周,除去第七周的国庆,C++共上了三周的课.大一新生三周能学会些什么?他们已经能输出漂亮的星号图了.身为老师的我,和这群大孩子一样高兴.同学们的努力令我感动,自己的不少非常规的想法和做法在他们的配合下正在起着作用,我已经感觉到,他们中的绝大多数将就此找到感觉,不光是专业学习,而是整个大学生活,在忙碌和不断出现的困难中,在快乐和不断冲破束缚的过程中,享受大学带来的一切. 原先安排第四周开始讲课,三次课后才上机,我已经计划好有充足的时间先"纸上谈兵".程序设计的功夫在上机之外

3月第三周全球五大顶级域名总量新增11.4万个

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 据国外域名统计机构WebHosting.info公布的最新数据显示,截至2012年3月19日,全球五大顶级域名 (.COM..NET..ORG..INFO和BIZ)的总量达130,368,299个.环比上周新增了113,723个.下面,IDC评述网与大家一 起关注这五大顶级域名的最新动态. (图1)全球五大顶级域名注册总量分布图(截至2012

多晶硅新增需求趋平现货价横盘已三周

周二多晶硅概念股再次成为市场热点,当日其板块指数上涨幅度位居两市板块第三位.7月以来国内多晶硅现货价格快速上涨,3个月时间内价格已经翻番,直接刺激了相关个股表现. 不过,昨日每日经济新闻记者从中国有色金属工业协会硅业分会了解到,多晶硅现货价格在9月26日当周攀升到70万~77万元/吨,国庆长假后小幅升至70 万~79万元/吨,但是未能突破80万元/吨.10月12日和10月18日,硅业分会发布的数据显示,这两周现货主流报价分别为68万~79万元/吨. 65万~79万元/吨.此前,7月国内多晶硅现货

5月第三周中国域名净增5.5万居首 香港增156个

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 IDC评述网(idcps.com)05月23日报道:根据域名统计机构WebHosting.info最新数据,截至3721.html">2014年5月19日,我国域名总量已增至8,147,285个,仅次于美国,排名全球第二.但在5月第三周域名净增量统计上,中国域名新增55,440个,是20家上榜国家中域名净增量最大的.而中国香港

9月第三周域名网站Top15:易名中国跃升至第3

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 中国IDC评述网09月20日报道:据Alexa公布的最新数据显示,9月第三周(9月10日-9月16日),国内域名主机网站用户覆盖数排名前三的是中国万网,达1220.而新网和易名中国分列二.三名,用户覆盖数分别为550和440. (图1)域名主机网站周均用户覆盖数统计排名 如图1所示,在统计期间,用户覆盖数排名前十五位的域名主机网站是:中国万网

三周内增加千条外链

摘要: 刚刚接触SEO的第一天.因为我是一个门外汉,所以第一件事就是百度一下,了解了SEO是什么以后,才开始发外链的.才开始发外链的第一天,我只知道单纯的在什么博客啊,论坛啊,可 刚刚接触SEO的第一天.因为我是一个门外汉,所以第一件事就是百度一下,了解了SEO是什么以后,才开始发外链的.才开始发外链的第一天,我只知道单纯的在什么博客啊,论坛啊,可以后留言的地方留下一个网址.当时不知道什么才能算是一个好的外链,什么外链会被删除,等第二天起来我看外链的数量的时候,我很开心,第一次发的都算了.心里想

索尼第一财季意外盈利 推动股价创三周来最大涨幅

索尼 北京时间8月1日消息,据外媒报道,游戏部门的复苏帮助索尼第一财季净利润远超分析师预期,维护了公司CEO平井一夫(Kazuo Hirai)重点发展媒体和娱乐业务的策略,推动索尼股价创下三周来的最大涨幅. 索尼股价今天在东京交易所最高上涨3.5%至3397日元,创下了自7月11日以来的最大盘中涨幅,使得索尼股价今年以来的累计涨幅增加到13%,好于大盘表现.东证股价指数(TOPIX)今年以来已经累计下跌了16%. 索尼过去几年一直在收缩手机.电视等业务,第一财季意外盈利.截至6月30日的第一财季

艾尚团购疑为诈骗网站维权团三周增至200人

图为记者打开艾尚团购网站.(图片来源:济南日报)200多名受骗者组团声讨"艾尚团购" "山寨网站"不断出现 "钓鱼诈骗"屡屡发生□本报记者 王宝泓消费者在艾尚团购付款后仍显示未付款.(王宝泓 摄)"在艾尚团购网站购买电影票,钱都付了,过了半个小时还显示未付款,打 客服电话竟是空号!"近日,关于艾尚团购的维权团在网络迅速扩散.在团购吧,关于到艾尚团购买东西受骗的帖子被跟帖上百条,大部分跟帖者都有被骗经历.而且,一个"艾