数据库3.2 查询语句

4、自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,称为表的自身连接。

定义第一课程,第二课程,限制条件,第一课程的先行课等于第二课程,查询的是第一课程和第二课程的先行课。即可查询课程的先行课

查询和B学生和其他学生同院系的学生信息,其他院系用A学生代替,查询A学生的学号,姓名,在学生A和学生B中查询,限制条件学生A的院系与学生B的院系相同,而且学生B姓名为李勇。

--查询课程的间接先修课,即先修课的先修课
SELECT  FIRST.Cno, SECOND.Pre_Cno
FROM  Course  FIRST, Course  SECOND
WHERE FIRST.Pre_Cno = SECOND.Cno;

--查询和李勇同一院系的学生学号及姓名
SELECT  A.Sno, A.Sname
FROM  Student  A, Student  B
WHERE A.Sdept = B.Sdept
AND B.Sname='李勇';

查询选修了1号和5号课程的学生学号,此查询在3.1出现过,这里给出了使用内连接的方法。把A加入到B中,只需要查询A即可。查询选修了两门课也是把A加入到B中,只查询A即可。

--查询选修了1号和5号课程的学生学号
SELECT A.Sno
FROM SC A JOIN SC B
ON A.Sno=B.Sno
AND A.Cno='1'
AND B.Cno='5';
--查询至少选修了两门课的学生学号
SELECT DISTINCT A.Sno
FROM SC A JOIN SC B
ON A.Sno=B.Sno
AND A.Cno<>B.Cno;

5.外连接

查询所有学生学号,姓名,选课记录,将学生表与课程表通过LEFT OUTER JOIN连接起来,都放在Student.Sno表中

--查询所有学生的学号、姓名及选课记录
SELECT Student.Sno,Sname,Cno,Grade
FROM Student LEFT OUTER JOIN SC
ON Student.Sno=SC.Sno
ORDER BY Student.Sno;

--查询所有学生、课程、及选课信息
SELECT Student.Sno,Sname,
Course.Cno,Cname,Credits,Grade
FROM Student LEFT OUTER JOIN SC
ON Student.Sno=SC.Sno
FULL OUTER JOIN Course
ON SC.Cno=Course.Cno
ORDER BY Course.Cno;
  • 嵌套查询

一个SELECT-FROM-WHERE语句称为一个查询块。

将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。

SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。

子查询不能使用ORDER BY子句。

1、不相关子查询

子查询的查询条件不依赖于父查询,由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。子查询是被嵌套的,子查询不依赖于父查询,子查询只是父查询的查找条件,查询的是学号和姓名,条件是和李勇在同一院系。查询的是学生学号,条件是选修了数据库这门课。

--查询和李勇同一院系的学生学号及姓名
SELECT Sno,Sname
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= '李勇');

--查询选修了“数据库”这门课的学生学号和姓名
SELECT Sno,Sname FROM Student 
WHERE Sno  IN
(SELECT Sno FROM SC
WHERE Cno IN
(SELECT Cno FROM Course
WHERE Cname= '数据库')
);
--查询选修了1号课程且成绩最高的学生学号和分数
SELECT Sno,Grade
FROM SC
WHERE Grade>=ALL
(SELECT Grade
FROM SC
WHERE Cno='1')
AND Cno='1';

SELECT Sno,Grade
FROM SC
WHERE Grade>=
(SELECT Max(Grade)
FROM SC
WHERE Cno='1')
AND Cno='1';
以上两种写法功能相同。
--查询选修了1号课程且成绩不是垫底的学生学号和分数
SELECT Sno,Grade
FROM SC
WHERE Grade>ANY
(SELECT Grade
FROM SC
WHERE Cno='1')
AND Cno='1'
ORDER BY Grade DESC;

SELECT Sno,Grade
FROM SC
WHERE Grade>
(SELECT Min(Grade)
FROM SC
WHERE Cno='1')
AND Cno='1'
ORDER BY Grade DESC;
以上两种写法功能相同。

2、相关子查询

子查询的查询条件依赖于父查询,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组,重复这一过程,直至外层表全部检查完为止。

查询课程号和具体分数,从Y表中查询满足条件的分数

--查询学生超过他选修课程平均分的课程号和具体分数。
SELECT Sno, Cno,Grade
FROM SC X
WHERE Grade >
(SELECT AVG(Grade) 
FROM  SC Y
WHERE Y.Sno=X.Sno);

--查询成绩比该课程平均分低的学生学号和分数
SELECT Sno, Cno,Grade
FROM SC X
WHERE Grade <
(SELECT AVG(Grade) 
FROM  SC Y
WHERE Y.Cno=X.Cno);

EXISTS谓词

存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“TRUE”或逻辑假值“FALSE”

若内层查询结果非空,则外层的WHERE子句返回真值。

若内层查询结果为空,则外层的WHERE子句返回假值。

EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。

EXISTS之后是嵌套查询,内查询语句为真返回TRUE,为假返回FALSE

内查询的查询带*查询所有的内容。

--查询选修了1号课程的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE EXISTS
(SELECT * FROM SC
WHERE Sno=Student.Sno 
AND Cno='1');

--查询和李勇同一院系的学生学号及姓名
SELECT Sno,Sname 
FROM Student S1
WHERE EXISTS
(SELECT * FROM Student S2
WHERE S2.Sdept = S1.Sdept 
AND S2.Sname = '李勇
--查询没有学生选修的课程号和课程名
SELECT Cno,Cname
FROM Course
Where NOT EXISTS
(SELECT *
From Student
WHERE EXISTS
(SELECT *
From SC
WHERE SC.Sno=Student.Sno 
AND SC.Cno=Course.Cno));

--查询选修了17203号学生选修的所有课程的学生学号
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = '17203'  
AND NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
  • 集合查询
  • 并操作UNION
  • 交操作INTERSECT
  • 差操作EXCEPT

参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同

集合操作,和用交INTERSECT,或用并UNION,在两个并列查询语句之间使用。

--查询选修了1号和5号课程的学生学号
SELECT SNO FROM SC
WHERE CNO='1'
INTERSECT 
SELECT SNO FROM SC
WHERE CNO='5';

--查询选修了1号或5号课程的学生学号
SELECT SNO FROM SC
WHERE CNO='1'
UNION
SELECT SNO FROM SC
WHERE CNO='5';
--查询选修了1号但没有选修5号课程的学生学号
SELECT SNO FROM SC
WHERE CNO='1'
EXCEPT
SELECT SNO FROM SC
WHERE CNO='5';

--查询计算机系年龄不大于20岁的学生信息
  SELECT *
  FROM Student
  WHERE Sdept='计算机'
  EXCEPT
  SELECT *
  FROM Student
  WHERE Sage>20;

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录   数据库通用查询系统 23 题目简介: 23 2.1 设计的内容、要求和目标 23 2.2 总体设计 23 3.1 操作界面设计 25 3.2 类成员变量及方法设计 26 3.3 数据库设计 28 3.4 源代码分析 29 3.4.1 DatabaseServer类 29 3.4.2 ServerThread 类 30 3.4.3 DatabaseClient类 32 4 系统运行及使用说明 36 总 结 36 数据库通用查询系统 题目简介: JAVA Applet(or JFrame)通过套接字连接和服务器端的JAVA应用程序实现通信。程序将表的名字、表字 段的个数及查询条件提交给服务器,服务器端的JAVA程序进行查询操作,并将查询结果 返回给JAVA Applet(or JFrame)程序。当仅查询数据表的记录时,我们可以不必知道表字段的属性,因为无 论字段是何种属性,总可以使用getString(int coiumnIndex)或getString(String columnName)方法返回字段值的字符表示。另外,无论字段是何种属性,SQL语句的LIKE 子语句允许字段值以字符串形式与其他字符串比较。 主要内容: 设计要求 总体设计 详细设计 代码调试 软件开发 课程设计题目 2.1 设计的内容、要求和目标 当仅仅查询数据库的记录时,我们可以不必知道表字段的属性,因为无论字段还 是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的字符串表示。另外,无论字段是何种属性,SQL语句的L IKE子语句允许字段值以字符串形式与其他字符串进行匹配比较。 基于以上所述,要求设计一个B/S模式的数据库通用查询系统,具体要求如下: (1)客户端Java Applet程序从加载该Java Applet程序的html文件获取数据库的表的名字、表的字段名字以及表字段的个数 。这样一来,当需要修改html文件,而不必修改Java Applet程序,使得Java Applet在查询数据库时具有了通用性。 (2)Java Applet通过套接字连接和服务器端的Java应用程序实现通信。Java Applet程序将表的名字、表字段的个数以及查询条件提交给服务器,服务器端的Java 应用程序进行查询操作,并将查询结果返回Java Applet程序。 2.2 总体设计 在设计数据库通用查询系统时,需要编写3个Java源文件:DatabaseServer.java、Serv erThread.java和DatabaseClient.java。其DatabaseServer.java和ServerThread.ja va为服务器端Java程序编译产生所需要的类;DatabaseClient.java为客户端Java Applet程序编译产生所需要的类。数据库通用查询系统除了需要编写3个Java源文件所编 译产生的类外,还需要Java系统提供的一些重要的类。数据库通用查询系统所用到的一 些重要的类以及它们之间的组合关系如图12.1和图12.2所示。 图12.1 客户端类之间的组合关系 图12.2 服务器端类之间关系 2.1 数据库(服务器端) 设计的数据库的名字是book.mdb,在该库所创建的表是bookform。 2.2 DatabaseServer.java(服务器端主类) DatabaseServer类创建的对象负责响应客户请求,该类含有main方法,服务器端从该类 开始执行。DatabaseServer类的成员变量有3种重要类型的对象:ServerSoket、Soke t和ServerThread对象。运行效果如下图所示 DatabaseServer类运行效果 2.3 ServerThread.java(服务器端) ServerThread类是Thread类的子类,在Server类负责为请求连接的用户启动一个线程 对象。 2.4 DatabaseClient.java(客户端主类) DatabaseClient是Applet类的子类,尽管DatabaseClient类需要驻留在服务器端,但它 需要下载到客户端的浏览器来运行,因此Java Applet是客户端程序。DatabaseClient类的成员变量有四种重要类型的对象:Choice 、Checkbox、TextArea和Socket对象。运行效果如下图所示: 图2.4 DatabaseClient创建的JFrame及主要的成员对象3 详细设计及实现 3.1 操作界面设计 a) 客户端运行效果 (b)服务器端运行效果 3.2 类成员变量及方法设计 图12.1 N

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值