连接查询

若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,
包括:
1、等值连接查询
2、自然连接查询
3、非等值连接查询
4、自身连接查询
5、外连接查询
6、复合条件查询
 
等值与非等值连接查询:
比较运算符主要有=、>、<、>=、<=、!=(或<>)等。
 
下面来看一个例子:
假设有一个学生数据库,其中有三张表,即学生信息表(Student)、课程表(Course)、选课表(Study),三张表中的信息如下:
 
 
 
例1:要求查询选修了课程的学生的信息
 
很显然,需要用连接查询,学生的情况存放在student表中,学生的选课情况存放在Study表中,所以查询实际涉及Student和Study这两个表。这两个表之间的联系是通过公共属性Sno实现的。
 
考虑下列等值连接查询语句
SELECT Student.*,Study.*
FEOM Student,Study
WHERE Student.Sno=Study.Sno /*将Student与Study中同一学生的元祖连接起来*/

得到的结果:

 
 
 
 
 
 
我们发现,上述查询语句按照把两个表中学号相等的元祖连接起来。
 
系统执行的连接过程:首先在表Student中找到一个元祖,然后从头开始扫描Study表,逐一查找与Student第一个元祖的Sno相等的元祖,找到后就将Student表中的第一个元祖与该元祖拼接起来,形成结果表中的一个元祖,Stdudy表全部查找完后,再找Student中的第二个元祖,重复上述过程,直至Student表中的全部元祖处理完。
 
自然连接:在等值连接中把目标中重复的属性列去掉的连接查询
 
下面考虑用自然连接实现上述例子:
SELECT Student.Sno,SName,SSex,Sdept,Cno,Grade
FROM Student,Study
WHERE Student.Sno=Study.Sno

结果:

自身连接查询:当查询的结果涉及同一个表中两个或以上的列时,考虑用自身连接查询
 
例2:查询每一门课的间接先行课(即先行课)
SELECT C1.Cpno
FEOM Course AS C1,Course AS C2 <span style="white-space:pre;"> </span>--为Course表起两个别名C1、C2
WHERE C1.Pcno=C2.Cno --两个Course表的连接

结果:

外连接查询:
分为左外连接,右外连接,
左外连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
 
例3:查询缺少成绩的的学生号和课程号:
SELECT Student.Sno,Cno
FROM Student
LEFT JOIN Study
ON Student.Sno=Study.Sno
WHERE Grade IS NULL

结果:

例4:查询所有学生的学号姓名、成绩
--左外连接
SELECT Student.Sno AS 学号,SName AS 姓名, Grade AS 成绩
FROM Student
LEFT JOIN Study<span style="white-space:pre;"> </span>
ON Student.Sno=Study.Sno

  

相当于:
 
--右外连接
SELECT Student.Sno AS 学号,SName AS 姓名, Grade AS 成绩
FROM Study
RIGHT JOIN Student
ON Study.Sno=Student.Sno

 结果:

 

左外连接列出左边关系,右外连接列出右外关系中所有的元祖
 
多表连接查询:
--1、WHRER 语句
--2、INNER JOIN.. 语句
 
例:查询选修了C601号课程的学生姓名、分数、课程名
 
这个查询三个涉及了表学生表、课程表和学习表’
SELECT Student.SName AS 学生姓名,Grade AS 成绩,CName AS 课程名
FROM Student
INNER JOIN Study ON Student.Sno=Study.Sno
INNER JOIN Course ON Study.Cno=Course.Cno
WHERE Course.Cno='C601'

相当于自然连接查询:

SELECT Student.SName AS 学生姓名,Grade AS 成绩,CName AS 课程名 
FROM Student,Course,Study 
WHERE Student=Study.Sno AND Study.cno=Course.Cno ADN Course.Cno=C601  

  

嵌套查询

嵌套查询又称子查询,是指在父查询的where条件语句中再插入一个子查询语句,连接查询都可以用子查询完成,反之不然。
 
例1:找出至少一门课程的成绩在90分以上的女学生的姓名
 
分析:已知的是分数大于90分这个条件,通过这个条件找出Study表中大于90分所对应的Sno,再通过连接查询Study表中对应Sno的SName
SELECT SName
FROM Student
WHERE Sex='女' AND Sno NOT IN
(
SELECT Sno
FROM Stduy
WHERE Grade<90
)

  

注意:这里子查询返回的Sno可能有多个,所以要用到谓词 IN,如果用 =,则报错,因为 = 表示子查询的返回值是唯一的。
 
 
子查询的一个原则:根据已知得出未知
 
 
例2:查询选修了课程名为 ‘’高等数学” 的学生学号和姓名
根据Course表中的高等数学得到课程号,再在Study表中找到选修了该课程号的学号,最后根据学号Sno在Student表中找出对应的学生的姓名。一层层嵌套,由已知得到未知。
SELECT Sno,SName
FROM Student
WHERE Sno IN
(
SELECT Sno
FROM Study
WHERE Cno IN
(
SELECT Cno
FROM Course
WHERE CName='高等数学'
)

  相当于连接查询:

SELECT Student.Sno,SName
FROM Student,Course,Study
WHERE Student.Sno=Study.Sno AND Course.Cno=Study.Cno AND Course.CName='高等数学'

结果:

 

例3:找出至少学了C601和C602两门课程的学生姓名。
 
这里涉及到两门课程,都来自Course表,涉及到同一个表中两个或以上的元祖,考虑子查询用自身连,子查询根据课程号返回学号,父查询再根据学号查询姓名。
SELECT SName FROM Student
WHERE Sno IN
(
SELECT Study1.Sno
FROM Study AS Study1
JOIN Study AS Study2
ON Study1.Sno=Study2.Sno
WHERE Study1.Cno='C601' AND Study2.Cno='C602'
)

  结果:

 
 

SQL连接查询和嵌套查询详解的更多相关文章

  1. (修改)oracle11g监听多台主机配置,用pl/sql连接操作多个数据库详解

    很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它. 首先是进入oracle的 Net  Mananger:

  2. Oracle中的SQL分页查询原理和方法详解

    Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006

  3. Sql Server系列:嵌套查询

    嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...

  4. SQL数据查询之——嵌套查询

    一.概念描述 在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块.将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询.例如: ...

  5. SQL Server 之 子查询与嵌套查询

    当由where子句指定的搜索条件指向另一张表时,就需要使用子查询或嵌套查询. 1 子查询 子查询是一个嵌套在select.insert.update或delete语句或其他子查询中的查询.任何允许使用 ...

  6. SQL基础--查询之三--嵌套查询

    SQL基础--查询之三--嵌套查询

  7. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  8. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  9. SQL Server数据库ROW_NUMBER()函数使用详解

    SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...

  10. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...

随机推荐

  1. xshell登陆腾讯云服务器

    2016-12-11   00:17:36 前段时间在同学的介绍下关注了一下腾讯云:然后里面有学生优惠可以拿到免费的域名和云服务器.所以感兴趣就实验了一下,今天中午抢到了“1元特惠的学生包”,里面有免 ...

  2. 网页Tab控件

    网页Tab控件 找到:http://www.open-open.com/ajax/2_Tabs.htm 页面,查看了若干Tab控件, 找到了:http://www.open-open.com/ajax ...

  3. C# 线程中更新ListView某单元格导致闪烁问题的解决

    项目中需要用线程处理一些事务.处理结果(已经处理的比例)随时显示在ListView的某区域. 由于线程循环动作较快,导致被更新的单元格甚至所在行都有闪烁现象. 后来考虑到线程算的值整数部分未必变化很快 ...

  4. 转帖:HttpStatusCode状态说明C#版

    Continue 等效于 HTTP 状态 100.Continue 指示客户端可能继续其请求. SwitchingProtocols 等效于 HTTP 状态 101.SwitchingProtocol ...

  5. 如何使用Medieval CUE Splitter分割ape,合并ape,制作cue

    1 下载并运行这个软件,点击打开CUE文件,然后找到需要打开的CUE文件.   2 软件会立即弹出一个再次要求打开APE文件的对话框.打开之后会发现APE音乐已经被分割成了一小段一小段.   3 点击 ...

  6. Cookie学习笔记二:Cookie实例

    今天说说刚刚学到的两个Cookie的最经典应用:自己主动登录和购物车设置 一:自己主动登录 须要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp ...

  7. Effective C++ 条款一 视C++为一个语音联邦

    1.C语言         区块.语句.预处理器.内置数据类型.数组.指针等内容 2.OC++       类.封装.继承.多态.virtual函数 等 3.Template C++       泛型 ...

  8. adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式

    在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 以下我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方式 ...

  9. 基于multiprocessing和threading实现非阻塞的GUI界面显示

    ========================================================= 环境:python2.7.pyqt4.eric16.11 热点:multiproce ...

  10. 【转】IDA 调试 Android

    最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...