实验六.-多表查询doc

 

实验六 多表查询

实验目的

1、 掌握嵌套查询的概念

2、 掌握连接查询

3、 进一步掌握分组操作

4、 掌握Union的使用

实验环境

硬件环境:PC机一台

软件环境:SQL Server 2008/2005

实验内容

在供应商数据库中

上述各属性的含义是:供应商号(SNO)、供应商名(SNAME)和地址(ADDR),零件号(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)、单价(PRICE)、工程项目号(JNO)、工程项目名称(JNAME)、城市(CITY)、余额(BALANCE)、供应数量(QTY)。

供应商

m

供应pn

项目价格供应量零件

1、 查询供应商的名字,以及各自负责的项目数,结果要求按照项目

数的降序排列(连接、分组、排序)

Select sname, count(distinct JNO)

From S, SPj

Where S.sno = SPJ .sno

Group by sname

Select sname, count(distinct JNO)

From s, spj

Where S.sno = spj.sno

Group by sname

Order by count(distinct JNO)

2、 查询重量比螺栓重的零件名称,零件重量(子查询或自身连接) Select pname,weight

From P

Where weight >

(Select weight

From P

Where pname = ‘螺栓’)

Select a.name,a.weight

from P a, P b

where a.weight > b.weight

and b.pname=’ 螺栓’

3、 查询P(零件)表中各种颜色及其对应的零件种类的数目(分组和聚集查询)

Select color, count(PNO)

From P

Group by color

4、 统计天津地区的项目使用零件的种数(超过3种)和零件总数量。要求查询结果按零件的种数升序排列,种数相同时按总数量降序排列。(连接、分组、聚集函数、排序)

Select JNO, count(PNO),sum(qty) From J,SPJ

Where J.jno = spj.jno and city=’天津’ Group by JNO

Having count(PNO)>3

5、查询既供应P1零件又供应P2零件的供应商编号,供应商名称(多重条件查询)

6、查询每个供应商供应零件的情况,要求列出供应商名称,零件名称,供应数量,并按供应数量的升序排序(连接、分组、聚集函数、排序)

7、查询与“万胜”供应商在同一城市的供应商的详细资料(子查询)

8、查询供应商品种类最多的供应商编号、供应商名。

9、查询既生产螺母,也生产螺栓的供应商编号和供应商名。

10、查询生产螺丝刀但不生产螺母的供应商名

11、查询“万胜”和“精益”两个供应商的供货情况,查询结果中包括供应商名、项目名、零件名和供应数量。用两个select语句实现查询,并用union将两个语句的查询结果合并在一起。

三、实验步骤

1、对文件夹中的‘SPJ’数据库进行附加还原。

2、按照以上要求完成题目。

3、要求写出查询代码并将查询结果截图附在代码后。

参考解答

1、查询供应商的名字,以及各自负责的项目数,结果要求按照项目数的降序排列(连接、分组、排序)

解题思路:

1)本题要查询供应商名,这项数据仅在供应商表(S)中才有,而要统计每个供应商向几个项目供货,则需要对SPJ表中的数据进行统计。 这里需要对S和SPJ进行连接,两表的共同字段是SNO,用该字段进行连接。

SELECT SNAME,JNO,PNO

FROM S,SPJ

WHERE S.SNO=SPJ.SNO

代码执行结果:

图1-1

说明:该结果表明,这些供应商向项目提供零件的信息,这里项目和零件都用编号表示。

2)这还没有达到题目要求的效果。题目要求统计每个供应商负责的项目数。这里需要分组。用供应商名进行分组,计算每个组中项目号的

数目。这里请注意,“万胜”这个供应商的供应记录有6条,但是仔细看,不难发现,他供应的项目其实是4个,这里需要考虑到项目编号重复的情况(由于供应商每向一个项目供一种零件,数据库中都会产生相应的记录。)因此,对代码再进行修改。

SELECT SNAME,COUNT(JNO)

FROM S,SPJ

WHERE S.SNO=SPJ.SNO

GROUP BY SNAME

执行结果:

GROUP BY SNAME

ORDER BY COUNT(DISTINCT JNO) DESC

执行结果:

'

图2-1螺栓的重量

2)将第一步查询中的重量作为外层查询的条件。

SELECT PNAME,WEIGHT

FROM P

WHERE WEIGHT>(

SELECT WEIGHT

FROM P

WHERE PNAME='螺栓'

FROM P A,P B

WHERE A.WEIGHT>B.WEIGHT AND B.PNAME='螺栓

'

图2-2

说明:在自身连接时,需将一个表理解成两个表。在本题中,将P理解成A,B两表,用B表查询螺栓的重量,再用A表找出重量比它重的零件信息。

3、查询P(零件)表中各种颜色及其对应的零件种类的数目(分组和

聚集查询)

SELECT COLOR,COUNT(PNO)

FROM P

GROUP BY

FROM J,SPJ

WHERE J.JNO=SPJ.JNO AND CITY='天津

FROM J,SPJ

WHERE J.JNO=SPJ.JNO AND CITY='天津'

GROUP BY J.JNO,

JNAME

图4-2

5、查询既供应P1零件又供应P2零件的供应商编号,供应商名称(多重条件查询)

解题思路:题目要求查询供应商号和供应商名,这两项信息要通过供应商表(S)获得,同时,还需要供应的一些具体情况,这时就要用到SPJ。这题可以用子查询或连接查询实现。本例用子查询。

1) 先到SPJ表中查询供应’P1’零件的供应商号:

SELECT SNO FROM SPJ WHERE PNO=

)

图5-3

思考:本题如果用以下语句是否可以实现

SELECT SNO,SNAME

第11 / 18页

FROM S

WHERE SNO IN(SELECT SNO FROM SPJ WHERE PNO='P1' AND PNO='P2')

6、查询每个供应商供应零件的情况,要求列出供应商名称,零件名称,供应数量,并按供应数量的升序排序(连接、分组、聚集函数、排序) 解题思路:

1)本题要求查询供应商名字、零件名称、数量,从题目要求的字段可以看出,本题需要连接供应商表(S),零件表(P)和供应情况表(SPJ) SELECT SNAME,PNAME,JNO,QTY

FROM S,P,SPJ

WHERE S.SNO=SPJ.SNO AND P.PNO=SPJ.

PNO

图6-1

这个查询步骤显示供应商名,零件名,项目号,以及这次供应零件的数量。按照题目的要求,要统计每个供应商提供的某一类零件的总数

量,比如,“精益”供应的螺母总量是200+100+700+100.

2)还需要用供应商名和零件名共同分组,并排序。

SELECT SNAME,PNAME,SUM(QTY) '供应数量'

FROM S,P,SPJ

WHERE S.SNO=SPJ.SNO AND P.PNO=SPJ.PNO

GROUP BY SNAME,PNAME

ORDER BY SUM(QTY

图7-1

2)用第一步中的结果作为外层查询的条件。

SELECT * FROM S

WHERE CITY=(SELECT CITY FROM S WHERE SNAME='万胜') AND SNAME!='万胜'

FROM S,SPJ

WHERE S.SNO=SPJ.

SNO

图8-1

2)对第一步中的查询结果进行目测,可以得知,S1供应2种零件,S2供应2种,所以,这里要用供应商进行分组,统计每组的零件类别数。

SELECT DISTINCT S.SNO,SNAME,COUNT(DISTINCT PNO) FROM S,SPJ

WHERE S.SNO=SPJ.SNO

GROUP BY S.SNO,

FROM S,SPJ

WHERE S.SNO=SPJ.SNO

GROUP BY S.SNO,SNAME

HAVING COUNT(DISTINCT PNO)>=ALL(SELECT

COUNT(DISTINCT PNO)

FROM S,SPJ

WHERE S.SNO=SPJ.SNO

GROUP BY S.SNO,SNAME)

第15 / 18页

http://www.99jianzhu.com/包含内容:PDF/word/ppt 流程,表格,案例,最新作文 数学 英语 考试题库等内容免费下载。


TOP最近更新内容

    高考历史三轮复习:考前提分冲刺练2
    人教版小学语文五年级下册《草原》上课实录
  • 上一篇:english
  • 下一篇:儿童诗欣赏