先上菜:
(表的基本结构: Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) 教师表 )
下面是理论知识:
连接查询的基本形式: select XX1, XX2, .... from 表1 【连接方式】 join 表2 【连接条件】 where ........;
形式: from 表1 cross join 表2
含义: 将两个表的每一行都进行两两对接之后的所有数据行所构成的结果数据; 通常,此时,结果数据中的行数,就是两个表的原先行数的乘积; 这种连接,又称为“笛卡尔积”;
案例:
select * from teacher cross join Course; //数据很多,就是相乘,实用性不大,一般不用
形式: 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 ;
//这里可以看到确实对查询的结果集进行了操纵,说明是可以的
形式: 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;
形式: from 表1 right 【outer】 join 表2 on 表1.字段1 = 表2.字段2 含义: 将两个表的内连接所得到的结果数据,再加上右边表中,那些不能满足连接条件的数据行所得到的结果。 其中,后一部分数据的“左边部分”,填充空值(null); //原理一样,右侧基准,就不过多讲解了
含义: 将两个表的内连接所得到的结果数据, 再加上左边表中,那些不能满足连接条件的数据行所得到的结果。其中“右边部分”,填充空值(null); 再加上右边表中,那些不能满足连接条件的数据行所得到的结果。其中“左边部分”,填充空值(null);
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及其重要,重在理解
如果感觉可以请点赞