数据库——SQL数据连接查询
连接查询
查询结果或条件涉及多个表的查询称为连接查询
SQL中连接查询的主要类型
广义笛卡尔积
等值连接(含自然连接)
自身连接查询
外连接查询
一、广义笛卡尔积
不带连接谓词的连接
很少使用
例:
SELECT *
FROM Student, SC
二、等值与非等值连接查询
[例32] 查询每个学生及其选修课程的情况。
用WHERE子句指定连接条件:
SELECT *
FROM Student,SC
WHERE Student.Sno = SC.Sno;
结果表
Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade
95001 李勇 男 20 CS 95001 1 92
95001 李勇 男 20 CS 95001 2 85
95001 李勇 男 20 CS 95001 3 88
95002 刘晨 女 19 IS 95002 2 90
95002 刘晨 女 19 IS 95002 3 80
或,用FROM子句指定连接条件:
SELECT *
FROM Student JOIN SC ON Student.Sno=SC.Sno;
不建议使用JOIN方式。
前例是一种等值连接
等值连接: 连接运算符为 = 的连接操作
SELECT *
FROM Student,SC
WHERE Student.Sno = SC.Sno;
引用两表中同名属性时,必须加表名前缀区分。
将等值连接的目标列中重复的属性列去掉,就是自然连接。
[例33] 对[例32]用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage, Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
带有选择条件的连接查询
[例补充]查询选1号课的学生号, 学生名,成绩
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno /* 连接条件*/
AND Cno=;/* 选择条件 */
或:
SELECT Student.Sno,Sname,Grade
FROM Student JOIN SC ON Student.Sno=SC.Sno;
WHERE Cno=;
[例35]查询选修2号课程且成绩在90分以上的所有学生的学号、姓名
SELECT Student.Sno, Student.Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno /* 连接条件*/
AND Cno= /* 选择条件 */
AND Grade > ; /* 选择条件 */
三、自身连接
一个表与其自己进行连接,称为表的自身连接

[例34] 查询每一门课的先行课名
SELECT First.Cname 课名, Second.Cname 先行课名
FROM Course First,course Second
WHERE First.Cpno = Second.Cno;
课名 先行课名
数据库 数据结构
信息系统 数据库
。。。。。。。
自身连接注意问题:
1.需要给表起别名以示区别
2.由于所有属性名都是同名属性,因此必须使用别名前缀
四、外连接(Outer Join)
普通连接操作只输出满足连接条件的元组
SELECT * FROM Student,SC
WHERE Student.Sno = SC.Sno;
只输出满足Student.Sno = SC.Sno的行
外连接操作可以将指定表中不满足连接条件的元组一并输出
[例 33] 查询每个学生及其选修课程的情况
(包括没有选修课程的学生)
---用外连接操作
SELECT Student.Sno,Sname,Ssex, Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno *= SC.Sno;
查询结果:
Student.Sno Sname Ssex Sage Sdept Cno Grade
95001 李勇 男 20 CS 1 92
95001 李勇 男 20 CS 2 85
95001 李勇 男 20 CS 3 88
95002 刘晨 女 19 IS 2 90
95002 刘晨 女 19 IS 3 80
95003 王敏 女 18 MA null null
95004 张立 男 19 IS null null
本例中将左边的学生关系不满足连接条件的行输出,称为左外连接
用FROM子句指定连接条件:
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno = SC.Sno;
ORACLE: LEFT OUT JOIN
左外连接
将左边关系的不满足连接条件的行输出
WHERE 子句方式(*出现在左边):
WHERE R.A1 *= S.A1
FROM子句方式:
FROM R LEFT [OUTER] JOIN S ON R.A1=S.A1
右外连接
将右边关系的不满足连接条件的行输出
WHERE 子句方式(*出现在右边) :
WHERE R.A1 =* S.A1
FROM子句方式:
FROM R RIGHT [OUTER] JOIN S ON R.A1=S.A1
全外连接
将两边关系的不满足连接条件的行输出
WHERE 子句方式(*出现在两边) :
WHERE R.A1 *=* S.A1
FROM子句方式:
FROM R FULL [OUTER] JOIN S ON R.A1=S.A1
多表连接
[例36] 查询每个学生的学号、姓名、选修的课程名及成绩。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
结果:
Student.Sno Sname Cname Grade
95001 李勇 数据库 92
95001 李勇 数学 85
....................................
多表连接+选择条件
[例:补充]查询CS系选数据库课成绩>90的学生的学号、姓名、成绩。
SELECT Student.Sno,Sname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno
AND Sdept='CS'
AND Cname='数据库'
AND Grade>;
数据库——SQL数据连接查询的更多相关文章
- SQL表连接查询(inner join、full join、left join、right join)
SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...
- [.NET] SQL数据分页查询
[.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...
- SQL表连接查询
SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...
- 浅谈sql之连接查询
SQL之连接查询 一.连接查询的分类 sql中将连接查询分成四类: 内链接 外连接 左外连接 右外连接 自然连接 交叉连接 二.连接查询的分类 数据库表如下: 1.学生表 2.老师表 3.班级表 表用 ...
- oracle (6)---SQL 数据关联查询
SQL 数据关联查询 Structure Query Language 从多(n)张表查询对应记录信息,必须有至少n-1个关联条件,否则会出现笛卡尔积的情况.1. 等值连接:没有连接关系的数据不会被查 ...
- 【SQL】各取所需 | SQL JOIN连接查询各种用法总结
前面 在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊.回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也 ...
- SQL各种连接查询详解(左连接、右连接..)
一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的.语句1:隐式 ...
- Access数据库多表连接查询
第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...
- SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)
先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...
随机推荐
- gdb调试:
1 简介 GDB(GNU Debugger)是GCC的调试工具.其功能强大,现描述如下: GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的 ...
- [技术] OIer的C++标准库 : 字符串库
引入 上次我在博客里介绍了OI中可能用到的STL中的功能, 今天我们接着来发掘C++标准库中能为OI所用的部分. 点击传送至我的上一篇系列博文 众所周知, OI中经常用到字符串相关的处理, 这时善用字 ...
- 'javac' 不是内部或外部命令,也不是可运行的程序
今天在命令行中运行javac命令时发现 但是运行java命令却可以 查找jdk的安装路径发现,安装目录里面同时有jdk的文件夹和jre的文件夹 查看了jdk的目录发现jdk目录中也有一个jre文件夹 ...
- LeetCode 休闲计划
老年退役选手的 LeetCode 休闲之旅 前言 不知不觉两年多的大学时光悄然流逝,浑浑噩噩的状态似乎从来没有离开过自己. 这两年刷题似乎一直是常态.在退役之后的现在,深感有些东西一段时间没有接触,很 ...
- python闭包,看不懂请揍我
什么是闭包? 闭包就是一个个内嵌函数+内嵌函数里面引用了外部变量+返回这个内嵌函数(一般是这样) 为什么使用闭包? 有点类似与函数模板?.. 举一个实际的例子: class people: name ...
- 13.3SolrCloud集群使用手册之Zookeeper指令
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.upconfig java -classpath .:/home/solr/cloud/lib/* org ...
- 二、git版本回退
查看历史版本提交记录 git log git log --pretty=oneline Git用 HEAD表示当前版本 commit id(版本号),也就是最新的提交e4aa53d...43ae6f6 ...
- tarjan【模板】缩点
传送门:https://www.luogu.org/problemnew/show/P3387 首先呢,tarjan找一个图的强连通分量是基于对图的dfs的.这中间开了一个dfn[]代表dfs序,还有 ...
- [ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project SSMMavenPro: configfile D:\java\PermissionPro\src\main\resources\generatorCo
看看自己的generatorConfig.xml文件是否放错,反正我不小心resources文件放在src目录下,并没有放在main目录下,所有找不带该文件
- Oracle RMAN 恢复数据库到不同主机(二)
我们在recover database时报一个错误: RMAN-06054: media recovery requesting unknown archived log for thread 1 w ...