您的位置:首页 > 数据库

SQL查询---联接---嵌套---计算---分类汇总---量词---谓词---合并

2016-06-07 12:19 477 查看
SQL复杂查询

     SQL联接查询

     SQL嵌套查询

     SQL计算查询

     SQL分类汇总查询

     SQL量词查询

     SQL谓词查询

     SQL合并查询

一、SQL联接查询

    联接(或称连接)是关系运算中的基本 操作之一,联接查询是一种基于多个关系的查询。例如,在“订货管理”数据库中找出工资多于1230元的职工号和他们所在的城市。

这里所要求查询的信息分别出自职工(职工号字段)和仓库(城市字段)两个关系,这样的查询肯定是基于多个关系的,此类查询一般用联接查询来实现。

    Select 职工号,城市 from 仓库,职工 Where 仓库.仓库号=职工.仓库号 and  工资>1230

    Select 职工号,城市  from 仓库  join 职工 on 仓库.仓库号=职工.仓库号  where  工资>1230

[注意] 若from之后的多个表中含有相同字段,在引用这些字段时,必须在字段前加上表名前缀。

试用SQL查询出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市。

Select  职工号,城市  from 仓库  join 职工  on 仓库.仓库号=职工.仓库号  where  面积>400

 

二、SQL嵌套查询

嵌套查询也是基于多个关系的查询,不同的是这类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。换句话说就是,当查询关系X中的元组时,它的查询条件却是依赖相关的关系Y中的元组属性值,这时使用SQL的嵌套查询功能将非常方便。

例如:在“订货管理”数据库中查询工资为1250元的职工所在仓库的仓库号以及他们工作所在的城市?

Select  仓库号,城市  from 仓库  where  仓库号  in ( select 仓库号  from  职工  where  工资=1250 )

 

可以看到,在这个命令中含有两个select-from-where查询模块,即内层查询块和外层查询块,内层查询块查询到的仓库号的值是WH1和WH2,这样就可以写出等价的命令:Select  仓库号,城市  from 仓库  where  仓库号  in (“WH1”, “WH2”)

试用SQL查询出所有职工的工资都多于1210元的仓库的信息。<注意>该查询要求也可以描述为:查询没有一个职工的工资少于或等于1210元的仓库的信息。

    Select *   from 仓库  where  仓库号  not  in ( select 仓库号  from  职工  where  工资<=1210 )

<注意>如果仔细分析和操作,我们将发现刚才的查询出现了错误,尽管“武汉”的“WH4”仓库还没有职工,但该仓库的信息也被查询出来了。所以必须认真分析查询要求,写出正确的SQL命令。

    如果要求排除那些还没有职工的仓库,查询要求可以叙述为:查询所有职工的工资都多于1210元的仓库的信息,并且该仓库至少要有一名职工。

Select  *   from 仓库  where  仓库号  not  in( select  仓库号  from  职工  where  工资<=1210)   and  仓库号  in  ( select 仓库号  from  职工 )


试用SQL查询出和职工E4挣相同工资的所有职工的职工号

    Select 职工号   from 职工  where  工资 = (select  工资   from  职工  where  职工号 = “ E4 ” )

 

三、SQL计算查询

SQL语言是完备的。也就是说,只要数据是按关系方式存入数据库的,就能构造合适的SQL命令把它查询出来。事实上,SQL不仅具有一般的查询能力,而且还有计算方式的查询,比如查询职工的平均工资,查询某个仓库中职工工资的最高工资值等。用于计算查询的函数有:

 ① Count :计数函数       ② Sum  :求和函数

 ③ Avg  :求平均值函数     ④ Max/Min :求最大/最小值函数

这些函数用在Select短语中对查询结果进行计算。

1、 找出供应商所在地的数目

Select  count(distinct 地址)   from 供应商

 

[分析] 从表中看出,共有3个地址:北京、西安和郑州,所以结果为3。注意,除非对表中的记录个数进行统计,一般count函数应该使用distinct。

2、求出支付的工资总数。

Select  sum(工资)   from 职工

 

[分析] 这个结果是职工表中的工资值的总和,它并不管是否有重复值。这时若使用命令distinct将得到错误的结果。

3、求北京和上海的仓库职工的工资总和

Select  sum(工资)   from 职工  where  仓库号  in (select 仓库号 from 仓库  where  城市=“北京”  or 城市=“上海”;

 

4、求所有职工的工资都多于1210元的仓库的平均面积。

Select  avg(面积)   from 仓库  where  仓库号  not in (select 仓库号 from 职工  where  工资<=1210 )  and  仓库号  in  (select仓库号 from 职工)

 

5、求在WH2仓库工作的职工的最高工资值。

    Select max(工资)   from 职工  where  仓库号=“WH2”

[分析] 与max函数相对应的是min函数,求最小值

 

四、SQL分类汇总查询

之前的函数计算针对的是整个关系,而利用Groupby子句进行的是分组计算查询,即先对整个关系进行分组,再对每一个组别进行计算,所以称为分类汇总查询。

分组时,可以使用having子句进一步限定分组的条件。Having子句和where子句不矛盾,在查询中是先用where子句限定元组,然后进行分组,最后再用having子句限定分组。

1、求每个仓库的职工的平均工资,查询结果需要显示仓库号和对应的平均工资。

 Select  仓库号, avg(工资)   from 职工  group by 仓库号

[分析] 在分组查询时,有时要求分组满足某个条件时才检索,这时可以用having子句来限定分组。

2、 求至少有两个职工的每个仓库的平均工资。查询结果需要显示仓库号、职工人数和对应的平均工资

Select 仓库号, count(*),avg(工资) from 职工group  by 仓库号 having  count(*) >=2

五、SQL量词查询

 前面已经用过和嵌套查询有关的运算符in和not  in 。除此之外还有量词查询具有同嵌套查询相同的格式。Any 、All 、Some 是量词,其中Any和Some是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果就为真;而All 则要求子查询中的所有行都使结果为真时,结果才为真。

1、检索有职工的工资大于或等于WH1仓库中任何一名职工工资的仓库号。

Select  distinct 仓库号   from 职工  where  工资 >=  any   (select工资  from  职工  where  仓库号=“WH1” )

2、检索有职工的工资大于或等于WH1仓库中所有职工工资的仓库号。

Select  distinct 仓库号   from 职工  where  工资 >=  all(select 工资  from  职工  where  仓库号=“WH1” )

 

六、SQL谓词查询

前面已经用过和嵌套查询有关的运算符 in和 not  in 。除此之外还有谓词查询具有同嵌套查询相同的格式。Exists 和Not  Exists 是量词,用来检查子查询中是否有结果返回,即存在元组或不存在元组。

 

       [注意] 胃词只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较。

 

1、 检索那些仓库中还没有职工的仓库的信息

Select  *  from仓库  where  not exists (select *  from 职工  where  仓库号=仓库 .  仓库号 )

2、检索那些仓库中至少已经有一个职工的仓库的信息。

        Select *   from 仓库  where exists  (select *  from 职工  where  仓库号=仓库 .  仓库号 )

 

七、SQL合并查询

 

SQL支持集合的并运算(Union),即可以将两个select语句的查询结果通过并运算合并成一个查询结果。为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应字段的值要出自同一个值域,即具有相同的数据类型和取值范围。例如,如下语句的结果是城市为北京和上海的仓库的信息:

Select *   from 仓库  where  where  城市=“北京” Union Select  *   from仓库  where  where  城市=“上海”

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: