连接查询

若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,
包括:
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.SnoFROM Study AS Study1JOIN Study AS Study2ON Study1.Sno=Study2.SnoWHERE Study1.Cno='C601' AND Study2.Cno='C602'
)

  结果:

转载于:https://www.cnblogs.com/cthon/p/9075774.html

SQL连接查询和嵌套查询详解相关推荐

  1. java 查询sql语句_java执行SQL语句实现查询的通用方法详解

    完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...

  2. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  3. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

    学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...

  4. php mysql PDO 查询操作的实例详解

    php mysql PDO 查询操作的实例详解 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  5. pdo mysql 绑定查询_php mysql PDO 查询操作的实例详解

    php mysql PDO 查询操作的实例详解 php mysql PDO 查询操作的实例详解 这篇文章主要介绍了php mysql PDO 查询操作的实例详解的相关资料,希望通过本文能帮助到大家,需 ...

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

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

  7. SQL Server 数据库之嵌套查询

    嵌套查询 1. 概述 2. 普通子查询 2.1. 子查询执行后返回一个值时,可在子查询与父查询之间用比较运算符连接 2.2. 子查询执行后返回一组值时,不能直接用比较运算符连接子查询,可在比较运算符与 ...

  8. 数据库 - 连接查询、嵌套查询、集合查询

    连接查询 连接查询:同时涉及多个表的查询 连接条件或连接谓词:用来连接两个表的条件 一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2> ...

  9. 3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    文章目录 0.前言 1.思维导图 2.Student/SC/Course表数据及结构 3.SELECT语句的一般格式 4.单表查询 (1)选择表中的若干列 ① 查询指定列 ② 查询全部列 ③ 查询经过 ...

  10. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

最新文章

  1. oye pandora_我尝试了Pandora出色的功能优先级排序方法。 这是我学到的。
  2. dods 机器人_胜利之日机器人补丁
  3. LINQ体验(6)——LINQ语句之Join和Order By
  4. java面试宝典有用么_常见的Java面试题汇总
  5. Chapter5_Speaker_Verification
  6. 诗与远方:无题(八)
  7. 测试用例的八大设计方法
  8. sql server 替换有反斜杠的字符串_字符串提取,到底谁是你的菜?
  9. vc6 移植到vs2013
  10. 笔记 -凸函数 /KL距离
  11. Android免root字体,字体大师免root
  12. 睡眠障碍,正在“杀死”3亿中国人
  13. css文字闪光特效,利用js css3实现文字闪光滑过动画特效
  14. spark:Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解
  15. [回溯法] 和尚挑水问题-华为笔试
  16. 测试用例怎么写?不会测试用例的看过来,Web测试所涉及的主要测试点
  17. 2018年 吉林大学 软件工程 967考研经验分享
  18. 详解eNSP中Trunk端口和Access端口收发数据的区别
  19. 全球及中国氢化镁市场前景调研与投资可行性分析报告2022年版
  20. 输入三角形的三边长,如果能构成三角形,计算三角形的周长和面积

热门文章

  1. 从反编译的角度去观察C#6.0
  2. 2015年获得大数据顶尖职位必备的9项技能
  3. EasyNet.Solr架构
  4. 剪我一根头发,就要做我一天女人。
  5. python列表修改数据_使用列表理解修改数据框架列
  6. JAVA SE学习day_01:API、文档注释规范、String字符串的常用API
  7. 系统架构_Linux内核系统架构介绍
  8. 使用AppCompat项目模版
  9. Swift3.0语言教程使用URL字符串
  10. markdown 图片居中_Markdown常用语法汇总