连接查询

查询结果或条件涉及多个表的查询称为连接查询
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数据连接查询的更多相关文章

  1. SQL表连接查询(inner join、full join、left join、right join)

    SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...

  2. [.NET] SQL数据分页查询

    [.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...

  3. SQL表连接查询

    SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...

  4. 浅谈sql之连接查询

    SQL之连接查询 一.连接查询的分类 sql中将连接查询分成四类: 内链接 外连接 左外连接 右外连接 自然连接 交叉连接 二.连接查询的分类 数据库表如下: 1.学生表 2.老师表 3.班级表 表用 ...

  5. oracle (6)---SQL 数据关联查询

    SQL 数据关联查询 Structure Query Language 从多(n)张表查询对应记录信息,必须有至少n-1个关联条件,否则会出现笛卡尔积的情况.1. 等值连接:没有连接关系的数据不会被查 ...

  6. 【SQL】各取所需 | SQL JOIN连接查询各种用法总结

    前面 在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊.回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也 ...

  7. SQL各种连接查询详解(左连接、右连接..)

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的.语句1:隐式 ...

  8. Access数据库多表连接查询

    第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...

  9. SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)

    先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...

随机推荐

  1. November 14th, 2017 Week 46th Tuesday

    Eternity is said not to be an extension of time but an absence of time. 永恒不是时间的无限延伸,而是没有时间. What is ...

  2. php可逆加密解密函数

    很多PHP程序员调试使用echo.print_r().var_dump().printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的 ...

  3. 关于JRebel启动tomcat访问上次工程的index.jsp

    检查了一下,原来我把上次配置文件包括JRebel配置文件一起复制过来,用JRebel启动时tomcat访问JRebel配置文件的目录下 这个是我上次文件的路径,把JRebel配置文件删除了,然后 di ...

  4. kubernetes 垃圾回收机制

    一:前言 Kubernetes系统在长时间运行后,Kubernetes Node会下载非常多的镜像,其中可能存在很多过期的镜像.同时因为运行大量的容器,容器推出后就变成死亡容器,将数据残留在宿主机上, ...

  5. 【转】Python 可视化神器-Plotly Express

    转自:https://mp.weixin.qq.com/s/FNpNJSMK5Vs8pwi0PbbBzw 说明:图片无法直接复制,请查看原文 导读:Plotly Express 是一个新的高级 Pyt ...

  6. OpenCV——颜色缩减、计时函数、访问像素

    //颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...

  7. jQuery封装自定义事件--valuechange(动态的监听input,textarea)之前值,之后值的变化

    jQuery封装自定义事件--valuechange(动态的监听input,textarea)之前值,之后值的变化 js监听输入框值的即时变化 网上有很多关于 onpropertychange.oni ...

  8. JAVA 第三周学习总结

    20175308 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 本周的学习内容为整个第四章的内容,学习中感觉知识点既多又杂,故在总结时尽量选用重要的或高度概 ...

  9. Jmeter—控件

    Jmeter有许多控件,可以在我们模拟测试请求时使用. Jmeter共有这8类控件: 配置元件—Http请求默认值 作用:仅设置一次目标URL服务器地址,之后不需要每次请求都写完整的,仅写相对地址就可 ...

  10. 蓝桥杯之大臣的旅费(两次dfs)

    Description 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个 ...