首页 > 数据库 > SQL Server >

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

2017-09-12

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

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

先上菜:

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

下面是理论知识:

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

1.交叉连接cross join

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

案例:

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

这里写图片描述

内连接inner join

    形式:
        from  表1  inner  join 表2  on 表1.字段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 ;  

这里写图片描述

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

左(外)连接left (outer) join

   形式:
    from  表1  left  【outer】  join 表2  on 表1.字段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 &#39;sid&#39; 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);
//原理一样,右侧基准,就不过多讲解了
含义:
将两个表的内连接所得到的结果数据,
再加上左边表中,那些不能满足连接条件的数据行所得到的结果。其中“右边部分”,填充空值(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及其重要,重在理解
如果感觉可以请点赞

相关文章
最新文章
热点推荐