连接查询

查询结果或条件涉及多个表的查询称为连接查询
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. Django商城项目笔记No.1项目准备工作

    Django商城项目笔记No.1项目准备工作 一.本项目商城属于B2C商业模式 二.项目采用前后端分离的应用模式 前端使用Vue.js 后端使用Django REST framework 1.创建gi ...

  2. 【Ansible 文档】【译文】配置文件

    这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...

  3. 修改Lotus notes默认浏览器

    notes收到的邮件里面的链接,点了以后会自动在notes里打开,但notes很弱,加载页面总是有问题.怎么才能让他默认用ie浏览器打开呢,怎么设置,请教达人. 右下角有个office->Edi ...

  4. div宽度随屏幕大小变化

    题目: 一个页面上两个div左右铺满整个浏览器, 要保证左边的div一直为100px,右边的div跟随浏览器大小变化, 比如浏览器为500,右边div为400,浏览器为900,右边div为800. 方 ...

  5. uniform_tree以及其变体

    //判断一棵树是不是uniform-tree bool uniform_tree(TreeNode* root){ if(root == NULL) return true; return unifo ...

  6. OpenCV——基本图形绘制(椭圆、圆、多边形、直线、矩形)

    //绘制椭圆 void DrawEllipse(Mat img, double angle) { ; ; ellipse(img, Point(WINDOW_WIDTH / , WINDOW_WIDT ...

  7. jmeter接口测试4-使用数据库mysql构造参数

    jmeter测试中,测试数据一般和测试用例分离 测试数据一般可以使用csv构造,进行参数化 但也可以使用mysql等数据库构造 方案一:一个线程循环调用mysql数据,不是并发,不适用于性能测试,更适 ...

  8. PAT B1008 数组元素循环右移问题 (20 分)

    一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A ...

  9. windows10+Python3.6+Anaconda3+tensorflow1.10.0配置和安装

    windows10+Python3.6+Anaconda3+tensorflow1.10.0# Anaconda3安装自行下载安装,之后dos或Anaconda Prompt终端查看Anaconda3 ...

  10. easyui validatebox textbox 使用例子

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormTextbox ...