带有any/some的子查询

爱被打了一巴掌 2022-07-13 23:14 202阅读 0赞
  1. --数据库基本表的创建,插入,删除,更新操作
  2. --建立一个"学生"
  3. --学生的学号:Sno,类型是char(9)-->因为学生的学号是9位的定长的字符串;
  4. --学生的姓名:Sname,类型是varchar2(8)-->因此可以是2,3,4汉字,而本数据库中一个汉字对应两个字符;
  5. --学生的年龄:Sage,类型是smallint-->smallint占用的是两个字节,表示数的范围是,-32,768-->32,767;
  6. --学生的性别:Ssex,类型是char(2)-->学生的性别只有两种情况,'男'或者'女',因此使用2位的定长字符串表示;
  7. --学生的所属系别:Sdept,类型是varchar2(4)-->学生所属系别的长度是不确定的,假设最长4个字符;
  8. --学生表的主键为学生的学号;
  9. create table Student ( Sno char(9) primary key, Sname varchar2(8), Ssex char(2) not null, Sage smallint not null, Sdept varchar2(4) not null );
  10. --创建学生"课程"
  11. --课程的课程号:Cno,类型是char-->假设课程号是4位的定长字符;
  12. --课程的课程名:Cname,类型是varchar2-->首先课程的名字是一个字符串,假设课程名字最多有10个汉字,最多含有20个字符组成;
  13. --课程的先行课程号:Cpno,类型是char-->这个属性的数据类型应该和课程号的数据类型是一致的;
  14. --课程的学分:Ccredit,类型为smallint-->课程的学分是一个小正整数;
  15. --学生"课程"表中的主键是Cno;
  16. --学生"课程"表中的外键为Cpno;课程表中的Cpno引用自课程表中的Cno;
  17. create table Course ( Cno char(4) primary key, Cname varchar2(20) not null, Cpno char(4), Ccredit smallint not null, foreign key(Cpno) references Course(Cno) );
  18. --创建学生"选修"
  19. --学生的学号Sno,类型为char(9)-->学号的长度是9个数字的定长字符;
  20. --学生的课程号Cno,类型为char(4)-->课程号的长度是4个数字的定长字符;
  21. --学生的成绩Grade,类型为smallint-->这个整数在0->100之间的数字;
  22. --选修表的主键:CnoSno的组合;
  23. --选修表的外键:选修表中的Sno引用自学生表Student中的学号Sno;选修表中的Cno引用自学生表Courses中的课程号Cno;
  24. create table SC ( Sno char(9), Cno char(4), Grade smallint, primary key(Sno,Cno), foreign key(Sno) references Student(Sno), foreign key(Cno) references Course(Cno) );
  25. --查询到当前数据库的字符集,
  26. --如果value=ZHS16GBK,那么一个汉字占用2个字节,即一个汉字占用2个字符的大小;
  27. --如果value=AL32UTF8,那么一个汉字占用3个字节,即一个汉字占用3个字符的大小;
  28. select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
  29. alter user scott account unlock;
  30. alter user sys account unlock;
  31. alteruseruser_name account unlock identifiedby new_password;
  32. --查询的结果显示的value = ZHS16GBK,那就说明在本数据库中一个汉字是占用两个字节的.
  33. --向学生表中插入数据
  34. insert into Student values('201215121','李勇','男',20,'CS');
  35. insert into Student values('201215122','刘晨','女',19,'CS');
  36. insert into Student values('201215123','王敏','女',18,'MA');
  37. insert into Student values('201215125','张立','男',19,'IS');
  38. --违背实体的完整性
  39. insert into Student values('201215121','李白','男',20,'CS');
  40. insert into Student values('201215122','刘备','女',19,'CS');
  41. --违背实体的完整性
  42. insert into Student values(null,'张三','男',19,'CS');
  43. insert into Student values(null,'李四','男',20,'IS');
  44. --违背用户定义的完整性
  45. insert into Student values('201215126','张立','男',null,'IS');
  46. insert into Student values('201215126','张立',null,30,'IS');
  47. --查询学生的全部信息
  48. select * from Student;
  49. --删除学生表
  50. drop table Student;
  51. --向课程表中插入数据
  52. --注意插入数据时,可能会发生违背参照的完整性-->因为Cpno字段的值可能在表中还没有被插入;
  53. --注意插入数据式,还可能发生违背实体的完整性-->因为我们插入了一行之后,再次插入,主码和表中的重复;
  54. insert into Course values('2','数学',null,2);
  55. insert into Course values('6','数据处理',null,2);
  56. insert into Course values('4','操作系统','6',3);
  57. insert into Course values('7','PASCAl语言','6',4);
  58. insert into Course values('5','数据结构','7',4);
  59. insert into Course values('1','数据库','5',4);
  60. insert into Course values('3','信息系统','1',4);
  61. --违背了实体的完整性约束
  62. insert into Course values('1','数据库','5',5);
  63. insert into Course values('3','信息系统','1',4);
  64. --违背了实体的完整性
  65. insert into Course values(null,'数据库','5',4);
  66. insert into Course values(null,'数据结构','7',4);
  67. --违背了参照的完整性
  68. insert into Course values('8','数据结构','20',4);
  69. insert into Course values('9','数据结构','11',4);
  70. --违背了用户自定义完整性
  71. insert into Course values('10','数据结构','7',null);
  72. insert into Course values('13','操作系统','6',null);
  73. --说明在不违背子表中外码的值来自父表中主码已有的值的前提下,外码的值可以为空
  74. insert into Course values('2','数学',null,2);
  75. insert into Course values('6','数据处理',null,2);
  76. --对课程表进行的查询操作
  77. select * from Course;
  78. --删除课程表
  79. drop table Course;
  80. --向选修表中插入数据
  81. --在对选修表中的数据进行插入的时候,插入的学号和插入的课程号必须是学生表中,课程表中已经出现的值;
  82. --选修表中的主码是学号和课程号的的组合,这时候对单一的学号或者单一的课程号来看他们是可以重复的;
  83. --在进行数据的插入的时候组成主码的一个或者多个属性列,都不能为空
  84. insert into SC values('201215121','1',92);
  85. insert into SC values('201215121','2',85);
  86. insert into SC values('201215121','3',88);
  87. insert into SC values('201215122','2',90);
  88. insert into SC values('201215122','3',80);
  89. --insert into SC values('201215122','1',90);
  90. --违反参照的完整新,子表中外码的值不能是父表中主码中不存在的值
  91. insert into SC values('201215122','9',100);
  92. insert into SC values('201400644','1',70);
  93. --违背了实体的完整性,表中的主码的值必须是唯一的,不能够重复
  94. insert into SC values('201215122','3',90);
  95. insert into SC values('201215121','1',92);
  96. --违背实体的完整性,组成主码的各个属性列的值不能为空
  97. insert into SC values('201215122',null,90);
  98. insert into SC values(null,'2',70);
  99. --对选修表进行的查询操作
  100. select * from SC;
  101. --删除选修表基本表
  102. drop table SC;
  103. --带有any(some)或者all谓词的子查询
  104. --子查询返回单值时可以使用比较运算符,但返回多个值时要用any(有的系统使用some)或者all谓词
  105. --而使用any(some)或者all谓词时则必须同时使用比较运算符
  106. -->any 大于子查询结果中的某个值
  107. -->all 大于子查询结果中的所有值
  108. --<any 小于子查询结果中的某个值
  109. --<all 小于子查询结果中的所有值
  110. -->=any 大于或者等于子查询结果中的某个值
  111. -->=all 大于或者等于子查询结果中的所有值
  112. --<=any 小于或者等于子查询结果中的某个值
  113. --<=all 小于或者等于子查询结果中的所有值
  114. --=any 等于子查询结果中的的某个值
  115. --=all 等于子查询结果中的所有值
  116. --!=/<>any 不等于子查询结果中的某个值
  117. --!=/<>all 不等于子查询结果中的所有值
  118. --查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄
  119. --比计算机系任意一个学生年龄小即可,那么说明只需要比计算机系年龄最大的那个学生的年龄小即可
  120. --那么就意味着存在一个非计算机系的学生,他的年龄比计算机系中所有学生中某一个学生的年龄要小
  121. --至少是比计算机系年龄最大的那个学生的年龄要小
  122. --所有计算机系学生的最大的年龄
  123. select max(Sage) from Student where Sdept='CS';--->Max(Sage)=20
  124. --查询出非计算机系学生中比计算机系学生中最大的年龄20小的学生姓名,年龄
  125. select Sname,Sage from Student where Sage<20 and Sdept<>'CS';
  126. --将上面的两条SQL简单查询语句合并成一条嵌套查询
  127. --方式一:本查询也可以使用聚集函数来实现,首先使用子查询查找出CS系中的年龄最大值,
  128. --然后在父查询中查找出每个非CS系并且年龄小于20岁的学生姓名和年龄(该方法效率更高)
  129. select Sname,Sage from Student where Sage<( select max(Sage) from Student ) and Sdept<>'CS';
  130. --查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄
  131. --方式二(使用any谓词和比较运算符组合连接父查询和子查询)
  132. select Sname,Sage from Student where Sage<any (select Sage from Student where Sdept='CS' ) and Sdept<>'CS';
  133. --将any换成some,也是可以执行成功的,说明oracle数据库支持any/some
  134. --(使用some谓词和比较运算符组合连接内层查询和外层查询)
  135. select Sname,Sage from Student where Sage<some (select Sage from Student where Sdept='CS' ) and Sdept<>'CS';
  136. --关系数据库管理系统在执行此查询时,首先处理子查询,找出计算机系中所有学生的年龄
  137. --构成一个单值的集合;然后处理父查询,找出所有非计算机系学生并且年龄小于20或者19的学生
  138. --查询非计算机系中比计算机科学系所有学生年龄都要小的学生姓名和年龄
  139. --方式一:(使用all谓词和比较运算符组合连接子查询和父查询)
  140. select Sname,Sage from Student where Sdept<>'CS' and Sage<all (select Sage from Student where Sdept='CS' );
  141. --方式二:(使用聚集函数来实现)
  142. --查询非计算机系中比计算机科学系所有学生年龄都要小的学生姓名和年龄
  143. --比计算机系的所有学生的年龄都要小,<==>这时候只需要比计算机系的所有学生年龄最小的
  144. --那个学生的年龄小即可
  145. select Sname,Sage from Student where Sage< (select min(Sage) from Student where Sdept='CS' ) and Sdept<>'CS';
  146. --事实上,使用聚集函数实现子查询通常比直接使用any(some)或者all查询效率要高.

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读

    相关 查询-表查询

    1:子查询(表子查询) 1:表子查询:子查询返回的结果是多行多列的二维表(子查询的返回的结果当做一个二维表来使用) 2:案例演示 需要:找出每个班最高的一个学生 1:确

    相关 查询/查询

    逻辑查询处理:11步骤 笛卡尔 on join 添加某些行 where 还没分组(分组函数不能用),还未选列(列别名不能用) groupby null在一组