这一章主要是连接查询,重点!!!
先上菜:
(表的基本结构:
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 ;
//这里可以看到确实对查询的结果集进行了操纵,说明是可以的
//此外,这里稍加题一点,我们通常可以看到这样的语句:
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
形式:
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 '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及其重要,重在理解
如果感觉可以请点赞