带有in谓词的子查询
来源:互联网 发布:php utf8 编码 编辑:程序博客网 时间:2024/06/08 21:01
--数据库基本表的创建,插入,删除,更新操作--建立一个"学生"表--学生的学号:Sno,类型是char(9)-->因为学生的学号是9位的定长的字符串;--学生的姓名:Sname,类型是varchar2(8)-->因此可以是2,3,4汉字,而本数据库中一个汉字对应两个字符;--学生的年龄:Sage,类型是smallint-->smallint占用的是两个字节,表示数的范围是,-32,768-->32,767;--学生的性别:Ssex,类型是char(2)-->学生的性别只有两种情况,'男'或者'女',因此使用2位的定长字符串表示;--学生的所属系别:Sdept,类型是varchar2(4)-->学生所属系别的长度是不确定的,假设最长4个字符;--学生表的主键为学生的学号;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);--创建学生"课程"表--课程的课程号:Cno,类型是char-->假设课程号是4位的定长字符;--课程的课程名:Cname,类型是varchar2-->首先课程的名字是一个字符串,假设课程名字最多有10个汉字,最多含有20个字符组成;--课程的先行课程号:Cpno,类型是char-->这个属性的数据类型应该和课程号的数据类型是一致的;--课程的学分:Ccredit,类型为smallint-->课程的学分是一个小正整数;--学生"课程"表中的主键是Cno;--学生"课程"表中的外键为Cpno;课程表中的Cpno引用自课程表中的Cno;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));--创建学生"选修"表--学生的学号Sno,类型为char(9)-->学号的长度是9个数字的定长字符;--学生的课程号Cno,类型为char(4)-->课程号的长度是4个数字的定长字符;--学生的成绩Grade,类型为smallint-->这个整数在0->100之间的数字;--选修表的主键:Cno和Sno的组合;--选修表的外键:选修表中的Sno引用自学生表Student中的学号Sno;选修表中的Cno引用自学生表Courses中的课程号Cno;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));--查询到当前数据库的字符集,--如果value=ZHS16GBK,那么一个汉字占用2个字节,即一个汉字占用2个字符的大小;--如果value=AL32UTF8,那么一个汉字占用3个字节,即一个汉字占用3个字符的大小;select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';alter user scott account unlock;alter user sys account unlock;alteruseruser_name account unlock identifiedby new_password;--查询的结果显示的value = ZHS16GBK,那就说明在本数据库中一个汉字是占用两个字节的.--向学生表中插入数据insert into Student values('201215121','李勇','男',20,'CS');insert into Student values('201215122','刘晨','女',19,'CS');insert into Student values('201215123','王敏','女',18,'MA');insert into Student values('201215125','张立','男',19,'IS');--违背实体的完整性insert into Student values('201215121','李白','男',20,'CS');insert into Student values('201215122','刘备','女',19,'CS');--违背实体的完整性insert into Student values(null,'张三','男',19,'CS');insert into Student values(null,'李四','男',20,'IS');--违背用户定义的完整性insert into Student values('201215126','张立','男',null,'IS');insert into Student values('201215126','张立',null,30,'IS');--查询学生的全部信息select * from Student;--删除学生表drop table Student;--向课程表中插入数据--注意插入数据时,可能会发生违背参照的完整性-->因为Cpno字段的值可能在表中还没有被插入;--注意插入数据式,还可能发生违背实体的完整性-->因为我们插入了一行之后,再次插入,主码和表中的重复;insert into Course values('2','数学',null,2);insert into Course values('6','数据处理',null,2);insert into Course values('4','操作系统','6',3);insert into Course values('7','PASCAl语言','6',4);insert into Course values('5','数据结构','7',4);insert into Course values('1','数据库','5',4);insert into Course values('3','信息系统','1',4);--违背了实体的完整性约束insert into Course values('1','数据库','5',5);insert into Course values('3','信息系统','1',4);--违背了实体的完整性insert into Course values(null,'数据库','5',4);insert into Course values(null,'数据结构','7',4);--违背了参照的完整性insert into Course values('8','数据结构','20',4);insert into Course values('9','数据结构','11',4);--违背了用户自定义完整性insert into Course values('10','数据结构','7',null);insert into Course values('13','操作系统','6',null);--说明在不违背子表中外码的值来自父表中主码已有的值的前提下,外码的值可以为空insert into Course values('2','数学',null,2);insert into Course values('6','数据处理',null,2);--对课程表进行的查询操作select * from Course;--删除课程表drop table Course;--向选修表中插入数据--在对选修表中的数据进行插入的时候,插入的学号和插入的课程号必须是学生表中,课程表中已经出现的值;--选修表中的主码是学号和课程号的的组合,这时候对单一的学号或者单一的课程号来看他们是可以重复的;--在进行数据的插入的时候组成主码的一个或者多个属性列,都不能为空insert into SC values('201215121','1',92);insert into SC values('201215121','2',85);insert into SC values('201215121','3',88);insert into SC values('201215122','2',90);insert into SC values('201215122','3',80);--insert into SC values('201215122','1',90);--违反参照的完整新,子表中外码的值不能是父表中主码中不存在的值insert into SC values('201215122','9',100);insert into SC values('201400644','1',70); --违背了实体的完整性,表中的主码的值必须是唯一的,不能够重复insert into SC values('201215122','3',90);insert into SC values('201215121','1',92);--违背实体的完整性,组成主码的各个属性列的值不能为空insert into SC values('201215122',null,90);insert into SC values(null,'2',70); --对选修表进行的查询操作select * from SC; --删除选修表基本表drop table SC;
--在SQL语句中,一个select-from-where语句称为一个查询块.--将一个查询块嵌入在另一个查询块的where子句或者Having短语或者from子句的条件中的查询为嵌套查询;--选修1号课程的学生姓名以及学号--方式一:使用嵌套查询--1>首先,可以在选修表中查询出选修了1号课程的 学生学号select Sno from SCwhere Cno='1';--2>然后,可以在学生表中查询出该学号的对应的 学生学号以及学生姓名select Student.Sno,Snamefrom Studentwhere Sno in('201215121','201215122');--将上面的两条查询语句合并成一个嵌套查询select Student.Sno,Sname --->外层查询或者父查询from Studentwhere Sno in (select Sno --->内层查询或者子查询 from SC where Cno='1' );--方式二:使用连接查询--选修1号课程的学生姓名以及学号select Student.Sno,Snamefrom Student,SCwhere Student.Sno=SC.Sno and Cno='1'; --方式三:使用内连接查询select Student.Sno,Snamefrom Student inner join SCon Student.Sno=SC.Snowhere Cno='1';--SQL语言支持多层嵌套查询,即一个子查询中还可以嵌套其他的子查询--需要特别指出的是:子查询的select语句不能够使用order by子句,--order by子句只能对最后的查询结果排序,嵌套查询可以使多个简单查询构成复杂的查询--带有In谓词的子查询:在嵌套查询中,子查询的结果往往是一个单值或者是单值的集合,--所以In谓词是嵌套查询中最经常使用的查询谓词--查询与"刘晨"在同一个系学习的学生学号以及姓名--1>确定"刘晨"所在的系别.select Sdeptfrom Studentwhere Sname='刘晨';--2>确定该系别的学生姓名和学生学号,学生系别select Sname,Sno,Sdeptfrom Studentwhere Sdept='CS';--将上面分步进行的SQL语句合并成嵌套查询select Sno,Sname,Sdeptfrom Studentwhere Sdept in(select Sdept from Student where Sname='刘晨');--子查询的查询条件不依赖于父查询,成为不相干子查询,一种求解方法就是由里及外处理--先执行子查询,子查询的结果用于建立其父查询的查找条件.得到如下的查询select Sno,Sname,Sdeptfrom Studentwhere Sdept in('CS');--方式二:使用自身连接查询--自身连接使用场景:(1)所有需要查询的数据都在一个表中(2)但是一次简单查询无法得出结果--查询与"刘晨"在同一个系学习的学生学号以及姓名,所在系别select Second.Sno,Second.Sname,Second.Sdeptfrom Student First,Student Secondwhere First.Sname='刘晨' and First.Sdept=Second.Sdept;--方式三:使用内连接查询select Second.Sno,Second.Sname,Second.Sdeptfrom Student First inner join Student Secondon First.Sdept=Second.Sdept and First.Sname='刘晨';--由此可见实现同一个查询请求可以有多种实现方式,不同的实现方式的效率是不同的,甚至差别可能会--很大,这就需要数据库编程人员应该掌握的数据库性能调优技术.--查询选修了课程名为"信息系统"的学生学号和学生姓名--本查询涉及到三个表的属性,首先,我们可以在课程表中查询课程名为"信息系统"这门课程的课程号select Cnofrom Coursewhere Cname='信息系统';--->Cno=3--然后,可以根据查询到的课程号在SC表中找到选修了这个课程号的学生的学号select Snofrom SCwhere Cno='3';--->Sno='201215121'或者Sno='201215122'--最后,根据这个学号在Student表中找到我们需要的学生姓名和学生学号select Sno,Snamefrom Studentwhere Sno in('201215121','201215122');--将上面的三条SQL语句合并成一条嵌套的查询语句--方式一:使用嵌套查询SQLselect Student.Sno,Student.Snamefrom Studentwhere Sno in (select Sno from SC where Cno in (select Cno from Course where Cname='信息系统' ) );--方式二:使用内连接查询SQLselect Student.Sno,Student.Snamefrom Student inner join SCon Student.Sno=SC.Sno,Course inner join SCon Course.Cno=SC.Cnowhere Course.Cname='信息系统';--去掉重复的行select distinct Student.Sno,Student.Snamefrom Student inner join SCon Student.Sno=SC.Sno,Course inner join SCon Course.Cno=SC.Cnowhere Course.Cname='信息系统';--方式三:使用内连接查询SQLselect Student.Sno,Student.Snamefrom Student,Course,SCwhere Student.Sno=SC.Sno and Course.Cno=SC.Cno and Cname='信息系统';--有些嵌套查询可以使用连接运算替代,有些不能够替代的,查询涉及到多个关系时,用嵌套查询求解层次--清楚,易于构造,具有结构化程序设计的优点.但是相比于连接运算,目前商用的关系数据库管理系统对--嵌套查询的优化做得还不够完善,所以在实际应用中,能够使用连接运算表达的查询尽量用连接运算
0 0
- 带有in谓词的子查询
- sql2000嵌套查询01--带有IN谓词的子查询
- 嵌套查询 带有in谓词,比较运算符,any或all谓词的子查询
- 带有EXISTS谓词的子查询
- 带有EXISTS谓词的子查询
- 带有EXISTS谓词的子查询
- 带有exists谓词的子查询 嵌套查询
- sql2000嵌套查询04--带有EXISTS谓词的子查询
- 带有ANY(SOME)或ALL谓词的子查询
- Mysql中IN子查询带有limit
- mysql带有子查询的like查询
- SQL中带有NOT IN 子查询改写
- SQL语句,多表查询,连接查询,嵌套查询,集合操作,有IN谓词,有比较运算符,有ANY\EXIST谓词的查询
- in子查询的问题
- Delete 语句带有子查询的sql优化
- 行为诡异的子查询与非常用谓词ANY/ALL/SOME
- 10g中注意子查询里主表谓词过滤的位置
- in子查询、exists子查询、连接,效率的探讨
- 使用spring cloud实现分布式配置管理
- 计数器作业提交-李京会-1692200810J2002-新媒体研究院-新媒体
- Android ValueAnimator使用方法
- mapreduce中最简单的wordcount程序
- PAL文件(Palette,调色板)及格式
- 带有in谓词的子查询
- 对话框 Dialog
- 两道企业面试题(1)-死锁的应用
- Struts2中redirect基本以及取不到参数值的问题解决
- 通过命令修改windows服务的描述信息
- 软件工程(C编码实践篇)
- css3中的background的新特性background-origin,background-clip,background-size详解
- 两道企业面试题(2)-生产者消费者问题
- TEST 和 TEST_F 区别