实验三、数据高级查询实验

该实验详细展示了如何使用SQL进行高级查询,包括IN嵌套查询、EXISTS嵌套查询、FROM子句中的嵌套查询以及集合查询(交、并、差)。实验涉及TPC-H数据库,通过Navicat工具执行查询,并解决了查询结果重复、数据类型不匹配等问题。实验强调了多表查询和子查询在实际问题中的应用价值。
摘要由CSDN通过智能技术生成

实验名称:实验3 数据高级查询实验

实验目的和要求:

   ·实验目的和要求

掌握SQL嵌套查询和集合查询等各种高级查询的设计方法等。

实验软硬件要求:

计算机、MySQL,Navicat

实验内容、实验过程、所遇问题及其解决方法

  • 实验内容:

针对TPC-H数据库,正确分析用户查询要求,设计各种嵌套查询和集合查询。

  • 实验过程

(1)IN嵌套查询

法1:

  • 代码

SELECT custkey,name

FROM customer

WHERE custkey in(

                      SELECT O.custkey

                      FROM lineitem L,part P,orders O,partsupp PS

                      WHERE

                               O.orderkey=L.orderkey AND

                             L.partkey=PS.partkey AND

                               L.suppkey=PS.suppkey AND

                               PS.partkey=P.partkey AND

                               P.mgfr='赫努巴夫汽车配饰厂' AND

                               P.name='安全带'

       );

  • 结果

法2:

  • 代码

SELECT custkey,name

FROM customer

WHERE custkey in(

                       SELECT O.custkey

                       FROM lineitem L,part P,orders O,customer C

                       WHERE

                                 L.partkey=P.partkey AND

                               

                                O.orderkey=L.orderkey AND

                                O.orderkey=C.custkey AND

                                P.mgfr='赫努巴夫汽车配饰厂' AND

                                P.name='安全带'

         );

  • 结果

(2)单层EXSIT嵌套查询

   ·代码

SELECT custkey,name

FROM customer C

WHERE NOT EXISTS(SELECT O.custkey

                      FROM lineitem L,part P,orders O,partsupp PS

                      WHERE C.custkey=O.custkey AND

                               O.orderkey=L.orderkey AND

                               L.partkey=PS.partkey AND

                               L.suppkey=PS.suppkey AND

                               PS.partkey=P.partkey AND

                               P.mgfr='赫努巴夫汽车配饰厂' AND

                               P.name='安全带'

      );

  • 结果

(3)双层EXISTS嵌套查询

查询至少购买过顾客“王小五”购买过的全部零件的顾客姓名。

  • 代码

SELECT ca.name

FROM customer ca

WHERE not exists

      (select *

         from customer cb,orders ob,lineitem lb

         where cb.custkey=ob.custkey and

         ob.orderkey=lb.orderkey and

         cb.name='王小五' and

         not exists(select *

                       from orders oc,lineitem lc

                        where ca.custkey = oc.custkey and

                        oc.orderkey=lc.orderkey and

                        lb.suppkey=lc.suppkey and

                        lb.partkey=lc.partkey

                        )

)

  • 结果

(4)FROM子句中的嵌套查询

查询订单平均金额超过1000元的顾客中的中国籍顾客信息。

代码

SELECT C.*

FROM Customer C,(SELECT custkey

               FROM Orders

               GROUP BY custkey

               HAVING AVG(totalprice)>1000) B,nation N

   where C.Custkey=B.custkey and

   C.nationkey=N.nationkey and

   N.name='中国';

结果

(5)集合查询(交)

查询至少购买过顾客“ 白鹭谣”和“王小五”度订购过的全部零件的信息。

  ·代码

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='王小五';

INTERSECTion     

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='白鹭谣';

  • 结果

(6)集合查询(并)

查询顾客“王小五”和“白鹭谣”订购的全部零件的信息。

代码

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='白鹭谣';

union      

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='王小五';

  • 结果

(7)集合查询(差)

查询顾客“白鹭谣”订购过“王小五”订购的全部零件的信息。

  • 代码

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='白鹭谣';

except

SELECT P.*

FROM Customer C,Orders O,Lineitem L,Partsupp PS,Part P

WHERE C.custkey=o.custkey and o.orderkey=l.orderkey and

      l.suppkey=ps.suppkey and l.partkey=ps.partkey and

      ps.partkey=p.partkey and c.name='王小五';

  • 结果

  • 遇到的问题与解决的方法

    • 问题1:查询结果字段重复或丢失

解决方法:使用DISTINCT关键字去除重复记录,等关联查询方式避免数据丢失。

    • 问题3:MySQL只支持Union(并集)集合运算,好像也是4.0以后才有的;但是对于交集Intersect、差集Except,就没有实现了
    • 问题4:查询结果数据类型不匹配

解决方法:将查询结果强制转换为所需的数据类型,例如使用CAST或CONVERT函数进行数据类型转换。

    • 查询结果中包含NULL值

解决方法:使用IS NULL或IS NOT NULL操作符筛选出包含或不包含NULL值的结果。可以使用IFNULL函数将NULL值替换为指定的值。

实验总结及心得体会

①多表查询:在实际应用中,一个查询往往需要涉及到多个表。这时可以使用多表查询,将多个表连接起来,实现跨表查询。

②子查询:子查询是将一个查询语句嵌套在另一个查询语句中,以实现更复杂的查询。子查询可以出现在where子句、from子句、select子句中,具体使用可以根据实际情况灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值