欢迎光临散文网 会员登陆 & 注册

数据库原理与应用(9)嵌套子查询、联合查询、交叉连接、自然连接

2022-05-18 17:32 作者:洛溪い  | 我要投稿

(1)嵌套子查询

【知识点】

  子查询是指在一个查询里嵌套了其他的若干查询,即在一个select语句的where或having或from子句中包含了另一个select查询语句。外层查询语句称为主查询(或父查询),内层查询语句称为子查询。

  根据内层查询的条件是否依赖于外层查询,子查询分为相关子查询和不相关子查询。

  子查询必须用小括号括起来,子查询与父查询嵌套时需要相应的运算符,包括比较运算符、in、any(some)、all、exists等。运算符的选择取决于子查询的返回结果。

比较运算符

  运算符ALL和ANY常与某个关系比较运算符结合在一起使用,以便测试子査询的结果。它们会测试比较值与子查询返回的全部或部分值是否匹配。SOME是ANY的同义词。

  EXISTS后面的参数是一个任意的子查询。其只会测试某个子査询是否返回了行。如果有返回,则EXISTS的结果为真,而NOT EXISTS的结果为假。

  当子查询返回多行时使用in运算符引出子查询,用等号引出的子查询都可以用in替换。

  对于比较复杂的查询要求,可以使用select语句实现子查询的多重嵌套。

【例题】

·判断题

(1)一个SELECT语句只能嵌套在一个SELECT中。F

(理论上可以嵌套n层,假设不考虑运行效率的话)

(2)子查询的SELECT语句中不能使用ORDER BY子句。T

(3)如果子查询的返回值多个,那么可以使用比较运算符 ‘=’。F

(这个时候必须用in引出子查询)

·选择题

(1)在SQL语言中,子查询是嵌入到另一个查询语句之中的查询语句。

(2)SQL的嵌套子查询,可以嵌套n层。

(3)已知S(S#,SN,AGE,SEX), S# 学号,SN 姓名。若要检索所有比'丁真'年龄大的学生姓名、年龄和性别,正确的SELECT语句是SELECT SN, AGE, SEX FROM S WHERE AGE>(SELECT AGE FROM S WHERE SN='丁真');

(4)中间连接不属于连接种类。

(5)子查询的结果可以是1或多个值。

(6)子查询和父查询可以使用两张或更多不同的表,也可以共用一张表。

·填空题

(1)

某公司的员工关系employees(工号,姓名,工资,部门,主管ID,工种ID),现需查询工资比何平高的员工的工号,姓名、工资。那么请完成下面SQL语句:

select 工号,姓名,工资 from employees where 工资 >( select 工资 from employees where 姓名='何平');

(2)

某工程项目的部分关系如下:
职工(职工编号,姓名,性别,居住城市)
项目(项目编号,项目名称,状态,城市,负责人编号)
职工项目(职工编号,项目编号)
其中:职工可以同时参加多个项目,一个项目需要多个职工参加。
那么如何查询职工编号为'000015',参加的项目名称和城市。

select 项目名称,城市 from 项目 where 项目编号 in (select 项目编号 from 职工项目 where 职工编号='000015');

·编程题

(1)查询信息学院学生所选修的课程号和成绩。

select cno,score from sc where sno in (select sno from students where sdept='信息学院');

(2)查询与“陆毅”同一个系的同学姓名。

select sname from students where sdept=(select sdept from students where sname='陆毅') and sname!='陆毅';

(3)查询“19信管2”班的学生所选修的课程号。

select cno from sc where sno in (select sno from students where class='19信管2');

(4)查询“陈晓东”同学所选课程的课号及成绩。

select cno,score from sc where sno in (select sno from students where sname='陈晓东');

(5)查询选修了课号为“0000034”的学生学号和姓名。

select sno,sname from students where sno in (select sno from sc where cno='0000034');

(6)查询“0000008”号课程不及格的学生信息。

select * from students where sno in (select sno from sc where cno='0000008' and score<60);

(7)查询李小鹏同学所选课程名称。

select cname from course where cno in (select cno from sc where sno in (select sno from students where sname='李小鹏'));

(8)查询“王珊”老师所授课程的课程名称。

select cname from course where cno in (select cno from teaching where tno in (select tno from teachers where tname='王珊'));

(9)查询“陆以宁”所购商品产地所有商品的编号。

select gno from goods where place in (select place from goods where gno in (select gno from sale where vno in (select vno from vip where vname='陆以宁')));

(10)查询与“得力铅笔”同一公司生产的的商品的信息。

select * from goods where company in (select company from goods where gname='得力铅笔');

(11)查询售价最高的商品的名称。

select gname from goods where price in(select max(price) from goods);

(12)查询陆以宁购买的商品名称。

select gname from goods where gno in (select gno from sale where vno in (select vno from vip where vname='陆以宁'));

(13)查询购买舒肤佳沐浴露商品产地所有商品的会员姓名。

select vname from vip where vno in (select vno from sale where gno in (select gno from goods where place in (select place from goods where gname='舒肤佳沐浴露')));

(14)查询购买陆以宁所购买商品产地所有商品的会员姓名。

select vname from vip where vno in (select vno from sale where gno in (select gno from goods where place in (select place from goods where gno in(select gno from sale where vno in (select vno from vip where vname='陆以宁')))));


(2)联合查询

  union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。

  联合查询由多条select语句构成,每条select语句获取的字段数相同,但与字段类型无关。

  【例】

select * from class

union distinct / all

select * from class;


(3)交叉连接

  交叉连接(cross join)为不带连接条件的查询,返回被连接的两个表所有数据行的笛卡尔积,即用左表中的每一行与右表中的每一行分别进行连接。因此,结果集中的行数是左表的行数乘以右表的行数(排列数)。

  交叉连接没有特定的实际含义,通常用于测试所有的可能情况。

  【例】select * from students cross join course;


(4)自然连接

  自然连接(nature join)连接条件忽略不写。

  【例】select * from students nature join register;

数据库原理与应用(9)嵌套子查询、联合查询、交叉连接、自然连接的评论 (共 条)

分享到微博请遵守国家法律