SQL语句使用03------连接

本文详细介绍了SQL中的连接查询概念及应用,包括交叉连接、内连接、左(外)连接、右(外)连接等类型,并通过实例展示了如何对查询结果进行排序、分组等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一章主要是连接查询,重点!!!

先上菜:

(表的基本结构:
        Student(Sid,Sname,Sage,Ssex) 学生表 
        Course(Cid,Cname,Tid) 课程表 
        SC(Sid,Cid,score) 成绩表 
        Teacher(Tid,Tname) 教师表
        )

下面是理论知识:

连接查询的基本形式:
    select  XX1,  XX2,  ....  from   表1  【连接方式】 join2  【连接条件】  where ........;

1.交叉连接cross join

形式:
        from1  cross  join2  
含义:
    将两个表的每一行都进行两两对接之后的所有数据行所构成的结果数据;
    通常,此时,结果数据中的行数,就是两个表的原先行数的乘积;
    这种连接,又称为“笛卡尔积”;

案例:

select * from teacher cross join Course;
//数据很多,就是相乘,实用性不大,一般不用

这里写图片描述

内连接inner join

    形式:
        from1  inner  join 表2  on1.字段1 = 表2.字段2
含义:
    将两个表的每一行进行两两对接之后的所有数据中,取出满足所给定的条件那些数据所得到的结果;
    通常,此时,结果数据中的行数,不一定是多少,而是完全看具体条件的设定;

案例:
select * from student inner join sc on student.sid=sc.sid;
//内连接的特点是可以添加约束条件 on
//可以理解为只显示满足on的结果    

这里写图片描述

那么问题来了:内连接后的结果能操纵吗?
例如:我要对score排序

     select * from student inner join sc on student.sid=sc.sid where sage>30 group by Cid  ;

这里写图片描述

 select * from student inner join sc on student.sid=sc.sid where sage>30 group by Cid having score >60 order by score asc ;  

这里写图片描述

//这里可以看到确实对查询的结果集进行了操纵,说明是可以的

//此外,这里稍加题一点,我们通常可以看到这样的语句:

 select distinct SC.S#,Sname 
    from Student,SC //注意这里
    where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 

这涉及到Sql语句的映射连接,在我看来,这个就是inner join.
  SQL 定义了两种不同语法方式去表示”连接”。首先是”显式连接符号”,它显式地使用关键字 JOIN,其次是”隐式连接符号”,它使用所谓的”隐式连接符号”。
  隐式连接符号把需要连接的表放到 SELECT 语句的 FROM 部分,并用逗号隔开。这样就构成了一个”交叉连接”,WHERE 语句可能放置一些过滤谓词(过滤条件)。 
  那些过滤谓词在功能上等价于显式连接符号. SQL 89标准只支持内部连接与交叉连接,因此只有隐式连接这种表达方式;SQL 92标准增加了对外部连接的支持,这才有了JOIN表达式。

左(外)连接left (outer) join

   形式:
    from1  left  【outer】  join 表2  on1.字段1 = 表2.字段2
含义:
    将两个表的内连接所得到的结果数据,再加上左边表中,那些不能满足连接条件的数据行所得到的结果。
    其中,后一部分数据的“右边部分”,填充空值(null)

案例:
    select * from student left join sc on student.sid=sc.sid where sc.sid<1011 and sc.sid >1005;  
    select * from sc left join student on student.sid=sc.sid where sc.sid<1011 and sc.sid >1005; 

这里写图片描述

//仔细比对这两个结果我们可以得到很多信息:
1.我在where中使用字段的时候用了前缀:sc.sid——这说明当有多个同名字段时要标明使用哪个,不然会报错:

select * from student left join sc on student.sid=sc.sid where sid<1011;
    1052 - Column 'sid' in where clause is ambiguous

2.左连接是以左边为基准,这里面我特意删去了1008号同学,但是他有成绩,所以并不是所有有成绩的同学都存在。

    在查找的时候当以student为基准时,所有的同学都有成绩,所以全部显示。
    在以SC为基准时并不是所有成绩都有人对应,所以右侧显示NULL;

右(外)连接right (outer) join

形式:
from  表1  right  【outer】  join 表2  on 表1.字段1 = 表2.字段2


含义:
    将两个表的内连接所得到的结果数据,再加上右边表中,那些不能满足连接条件的数据行所得到的结果。
    其中,后一部分数据的“左边部分”,填充空值(null);
//原理一样,右侧基准,就不过多讲解了

全外连接 full 【outer】 join(存在于传说中的方法,至少mysql并没有~~~)

含义:
将两个表的内连接所得到的结果数据,
再加上左边表中,那些不能满足连接条件的数据行所得到的结果。其中“右边部分”,填充空值(null);
再加上右边表中,那些不能满足连接条件的数据行所得到的结果。其中“左边部分”,填充空值(null);

4、查询所有同学的学号、姓名、选课数、总成绩;

select Student.Sid,Student.Sname,count(SC.Cid),sum(score) from Student left Outer join SC on Student.Sid=SC.Sid group by Student.Sid;
//先左连接,再按id(或者name均可),便可以得到总成绩,选课数

这里写图片描述

总结:

连接查询在SQL及其重要,重在理解
如果感觉可以请点赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值