实验6 高级查询.docx
- 文档编号:9446771
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:15
- 大小:506.78KB
实验6 高级查询.docx
《实验6 高级查询.docx》由会员分享,可在线阅读,更多相关《实验6 高级查询.docx(15页珍藏版)》请在冰豆网上搜索。
实验6高级查询
实验6 高级查询
【实验目的与要求】
⏹掌握基本的连接查询操作
●等值连接
●非等值连接
●自身连接
●外连接
⏹掌握嵌套查询操作
【实验内容与步骤】
思考问题:
如何使用SQL来创建数据库表?
准备工作:
若上个实验的数据库表还没有创建,请先创建之,并按照实验要求输入测试数据。
6.1连接
连接查询主要包括:
⏹等值连接
⏹非等值连接
⏹自身连接
⏹外连接
1.等值连接
以等于运算符(=)为基础的连接称为等值连接。
通常情况下,所有连接都是等值连接。
等值连接的语法如下:
SELECT
FROM
WHEREmon_column=mon_columnAND
mon_column=mon_column;
实验6-1查询所有产品的名称、类别名称和库存量等数据。
请给出结果截图:
实验6-2查询所有订单的订单代号、客户公司名称和运货费,查询结果按订单代号的升序排列。
请给出结果截图:
实验6-3查询由北京客户订购的运货费等于于8元的订单的订单代号、客户公司名称和运货费。
请给出结果截图:
等值连接可在两个表上执行,也可在多个表上执行。
在一个连接中使用四个表:
实验6-4查询每一客户的客户代号、公司名称及其订单的订单代号、订购日期、产品名称和数量等数据。
请写出查询结果:
练习6-1修改实验6-4中给出的语句并以如下方式给出,然后观察发生什么情况。
SELECTCno,Company,Ono,Order_date,Pname,Qty
FROMCustomer,Orders,Order_items,Product
WHERECustomer.Cno=Orders.CnoAND
Orders.Ono=Order_items.OnoAND
Order_items.Pno=Product.Pno;
给出上面的选择语句后,会出现“Columnambiguouslydefined”(列定义模糊不清)的出错信息。
这是因为“Ono”存在于两个表(即Orders表和Order_items表)之中。
我们需要明确指定要从哪个表选择Ono。
在这种情况下,可以从任何一个表中选择Ono。
2.非等值连接
实验6-5查询所有单价介于20和35元之间的产品的名称、类别名称、单价和库存量等数据。
请给出结果截图:
3.自身连接
自身连接是连接的另一种形式。
在这种情况下,连接是在单个表上进行的,就像它是两个独立的表。
表的每个行都与其本身组合,并与表的所有行组合。
实验6-6查询单价正好相差0.5倍的每一对产品的名称及其单价。
请给出结果截图:
注意:
在进行表的自身连接时,须在FROM子句中给同一个表取不同的别名,并在书写SELECT语句的其它子句时把这些代表同一表的不同别名看成是具有相同数据的“不同表”(读者在理解自身连接查询时,可以将它们看成不同的表,但实际上只有一个表)。
练习6-2查询与“DuWei”客户在同一城市的其他客户的姓名及其电话。
写出相应的SQL语句,并给出查询的结果:
4.外连接
前面介绍的查询都是内连接。
内连接不选择表中不符合查询条件的记录。
这些值可通过外连接获得,外连接利用运算符加号(+)。
语法如下:
SELECT(column_names)
FROM(tablenames)
WHERE(table1.column1=table2.column2)(+);
实验6-7查询所有客户的代号、姓名以及其订单的代号和订购日期与订单状态,查询结果按客户代号的升序排列。
先请看下面的SQL语句及其查询结果:
请给出结果截图:
上面的查询是一个内连接,由于客户“C0003”和“C0004”没有订单,他们都不满足查询条件,因此他们的信息没有出现在查询结果中;如果我们想让这两个客户的信息也出现在查询结果中就需要使用下面的外连接语句:
请给出结果截图:
试比较上面的两个查询语句中查询结果有何区别?
6.2嵌套查询
嵌套查询是指将一个SELECT-FROM-WHERE查询块嵌套在另一个查询块的WHERE或HAVING短语的条件中的查询。
1.带有比较运算符的子查询
实验6-8 查询与“DuWei”客户在同一城市的其他客户的姓名及其电话。
请给出结果截图:
本查询包括了两个SELECT-FROM-WHERE查询块,其中下层的查询块嵌套在上层的查询块中。
我们将上层的查询块称为父查询,而把下层的查询块称为子查询。
子查询的处理先于父查询。
本嵌套查询的过程如下:
⑴先通过子查询,在Customer表中找到“DuWei”客户所在的城市,结果为“Shanghai”;
⑵利用子查询得到的City值“Shanghai”,求出父查询中位于“Shanghai”的客户的姓名及其电话。
2.带有IN谓词的子查询
当子查询的查询结果包含多个值时,经常会使用谓词IN来连接子查询和父查询。
实验6-9查询订购了单价比“3004”号产品大的那些产品的订单的代号。
请给出结果截图:
本查询嵌套了两个SELECT子查询,其中最内层的子查询找出了“3004”号产品的单价,结果是单值30,在该子查询前可以使用比较运算符“>”,而其上一层的子查询找出了单价大于30的产品的代号,结果有多个值,故在该子查询前需用谓词“IN”。
3.带有ANY或ALL谓词的子查询
当子查询的查询结果包含多个值时,光用谓词“IN”来连接子查询和父查询是不够的,有时会用到前置了比较运算符(>、>=、=、<、<=、<>)的谓词“ANY”或“ALL”。
其中“ANY”代表子查询结果中的某个值,“ALL”代表子查询结果中的所有值。
这样,“>ANY”表示大于子查询结果中的某一个值,“>ALL”表示大于子查询结果中的所有值。
其它如“>=ANY”、“=ANY”、“
实验6-10查询价格大于所有1号类产品的产品的名称及其价格。
请给出结果截图:
实验6-11查询其它类中、价格大于某个1号类产品的产品的名称及其价格。
请给出结果截图:
4.带有EXISTS谓词的子查询
EXISTS运算符检查两个表中是否存在值。
它只可用于子查询,即没有像存在测试的简单比较测试。
EXISTS运算符不能返回NULL值。
实验6-12查询没有订购“1001”号产品的订单的代号。
请给出结果截图:
从上面的查询可以看出,带有EXISTS谓词的子查询与前面的几类子查询是有区别的,主要区别有以下两点:
⑴前几类子查询返回的是某一列的值(单值或多值),而带有EXISTS谓词的子查询返回的是逻辑值真或假。
当在子查询的FROM子句的表中找到满足条件的元组时,子查询返回逻辑真值,否则返回逻辑假值。
⑵前几类子查询的WHERE子句中的条件与父查询是无关的,而带有EXISTS谓词的子查询的WHERE条件的值却依赖于父查询的某个(或某些)属性列的值,如上例子查询的结果是真还是假就依赖于父查询中的Orders.Ono属性列的当前值。
6.3集合操作
6.3.0准备工作
创建如下表X和Y
6.3.1union
执行以下语句:
写出运行结果:
6.3.2minus:
执行以下语句:
写出运行结果:
6.3.3intersect:
执行以下语句:
写出运行结果:
6.4实验练习
1.练习:
完成下列查询,写出相应的SQL语句
1)列出至少有一个雇员的所有部门。
select*fromdepwherecount(cno)>0;
2)列出薪金比“SMITH”多的所有雇员。
select*fromdepwhereemp>(selectempfromdepwherecname=’SMITH’);
3)列出所有雇员的姓名及其上级的姓名。
seelctcname,csnamefromdep;
4)列出入职日期早于其直接上级的所有雇员。
找出所有雇员的入职日期和上级的编号,然后查找上级编号的表的入职日期,最后进行比较筛选数据
5)列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门。
利用COUNT关键字
6)列出所有“CLERK”(办事员)的姓名及其部门名称。
Where条件
7)列出各种类别的最低薪金,以使最低薪金大于1500。
having跟groupby
8)列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号。
Where条件
9)列出薪金高于公司平均水平的所有雇员。
利用where条件,加上average关键字
10)列出与“SCOTT”从事相同工作的所有雇员。
可以利用in关键字
2.练习:
完成书本P149-151实验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验6 高级查询 实验 高级 查询