SQL之连接查询

连接查询

    • 概述
      • 为什么要使用连接查询?
    • 连接类型
    • 各种连接详讲和和示例
      • 1、等值与非等值连接查询
      • 2、自身连接查询
      • 3、外连接查询
      • 外连接的方式分类:
        • 3.1左外连接
        • 3.2右外连接
        • 3.3全外连接
      • 4、复合条件连接查询
      • 5、集合运算连接查询
    • 总结

概述

为什么要使用连接查询?

因为不同表之间的数据具有不同的用途和字段,连接查询可以将我们需要用到的两个表的不同字段进行关联,从而找到我们有用的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。

连接类型

SQL之连接查询_第1张图片

  1. 等值与非等值连接查询
  2. 自身连接查询
  3. 外连接查询
    3.1.左连接
    3.2.右连接
    3.3.全外连接
  4. 复合条件连接查询
  5. 集合运算连接查询

各种连接详讲和和示例

展示数据库中各个结构:

数据库:

SQL之连接查询_第2张图片

表结构:

SQL之连接查询_第3张图片

1、等值与非等值连接查询

用来连接两个表的条件称为连接条件或连接谓词,当连接运算符为 = 时,称为 等值连接 ,使用其他运算符时称为 非等值连接

一般格式如下:

表名1.列名 比较运算符 表名运算符 表名2.列名2

或者:

表名1.列名1 between 表名2.列名2 and 表名2.列名3

比较运算符主要的有:

> 、 < 、 = 、 > = 、 < = 、 ! = 。 > 、< 、= 、>=、<=、!=。 ><=>=<=!=

说明:

连接谓词中的列名称为连接字段。连接条件中的各个字段类型必须是可比的,单不必相同。例如,可以都是字符型,或者都是日期型;也可以一个是整形,另一个是实型,两者均为数值型,因此都是可比的。

查询学生及其选修课程的详细情况

select sname,sc.cno from sc,s where s.sno=sc.sno;

SQL之连接查询_第4张图片

自然连接

自然连接是等值连接运算中的一种特殊情况,即按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列

查询每个学生的学号、姓名、选修的课程号、课程名及成绩信息

select s.sno,sname,c.cno,cname,grade from s,c,sc where sc.sno=s.sno and sc.cno=c.cno;

SQL之连接查询_第5张图片

2、自身连接查询

自身连接是通过把一个表定义两个不同别名的方法(即把一个表映射成两个表)来完成自身连接的。

求每一门课程的间接先修课

select first.cno as 课程号,first.cname as 课程名,second.pro as 间接先修课程号 from c as first,c as second where first.pro = second.cno;

SQL之连接查询_第6张图片

3、外连接查询

引例:

(1)查询每位同学的学号、姓名、选修课程和成绩姓名

select s.sno,sname,cname,grade from sc,s,c where sc.sno=s.sno and c.cno=sc.cno;

SQL之连接查询_第7张图片

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在引例(1)的结果表中没有关于091502、091505、091506三位学生的信息,原因在于他们没有选课,在选课表中没有相应的元组。

那么假设,我们一定要以学生表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况,其余选课情况为空值即可。此时我们就需要使用外连接(outer join)。

外连接的方式分类:

THETA方式:

THETA方式是使用where条件进行连接,对于THETA方式,为了与内连接区分开,必须通过在where子句中设置特殊的字符来实现对外部连接的处理。

ANSI方式:

ANSI方式则是使用outer join、on 等关键字配合连接条件完成连接查询操作。

3.1左外连接

from1 left outer join2 on1.=2.

左外连接的结果是显示表1中的所有记录和表2中与 表1.列 相同的记录

查询所有学生信息及选修课程的情况

select s.*,sc.cno from s left outer join sc on sc.sno=s.sno;

SQL之连接查询_第8张图片

3.2右外连接

from1 right outer join2 on1.=2.

右外连接的结果是显示表2中的所有记录和表1中与 表2.列 相同的记录

查询学生的详细信息及其选修课程的信息

select s.*,sc.cno from s right outer join sc on sc.sno=s.sno;

SQL之连接查询_第9张图片

3.3全外连接

全外连接一般没有什么意义,MySQL并不能直接支持全外连接,但是可以通过左右外连接的并集来模拟实现。

4、复合条件连接查询

在上面各个连接查询中,where子句中只有一个条件,where子句中有多个条件的连接操作,称为复合条件连接。

查询选修“180103”号课程且成绩在80分以上的所有学生的姓名

方式一:theta连接方式

select sname from sc,s where sc.sno=s.sno and cno=180103 and grade>80;

SQL之连接查询_第10张图片

方式二:ANSI 连接方式

select sname from sc join s on sc.sno=s.sno and cno=180103 and grade>80;

SQL之连接查询_第11张图片

查询平均成绩大于70分的同学的学号、姓名、选修课程名和成绩信息

select s.sno,sname,c.cno,grade from sc,c,s where sc.sno=s.sno and c.cno=sc.cno group by sno having avg(grade)>70;

SQL之连接查询_第12张图片

查询选修了“数据结构”的学生姓名、系部、成绩,并按成绩降序排列

select sname,sdept,grade from sc,s,c where sc.sno=s.sno and c.cno=sc.cno and cname='数据结构' order by grade desc;

SQL之连接查询_第13张图片

5、集合运算连接查询

有时候,用户希望 SQL 查询中利用关系代数中的集合运算(并、交、差)来组合关系,SQL为此提供了相应的运算符:union、intersect、except,分别对应于集合运算的

∪ 、 ∩ 、﹣。 ∪、∩、﹣。

查询学分不是64或 48的课程名称

(select c.cname from c where credit !=64 ) union (select c.cname from c where credit !=48 );

SQL之连接查询_第14张图片

总结

  1. 连接操作除了可以是两表连接,一个表于其自身连接外,还可以是两个以上的表进行连接,后者通常 称为多表连接。
  2. 对于不同的DBMS,支持的集合运算不同,例如MySQL只支持并运算,但是集合运算大都可以使用关系运算符进行替换或者使用嵌套查询,因此不必担心集合运算连接查询。

你可能感兴趣的:(sql,数据库,mysql)