唉今天面试问了个表连接的问题没有答上来,好桑心,这东西敲一敲就会啦,真是的,整理一下吧
数据库表如下:
SC(Sid,Cid,score)成绩表
Sid:学号
Cid:编号
score:成绩
Student(Sid,Sname,Sage,Ssex)学生表
Sid:学号
Sname:学生姓名
Sage:学生年龄
Ssex:学生性别
Course(Cid,Cname,Tid)课程表
Cid:课程编号
Cname:课程名称
Tid:教师编号
Teacher(Tid,Tname)教师表
Tid:教师编号
Tname:教师名字
1. 插入数据到SC数据库
insert into SC(Sid,Cid,score) values ('201043192','001','53')
2. 更新SC数据库数据
update SC set Cid='003' where Sid='201043192'
3. 创建表
create table SC(Sid char(10),Cid char(5),score int(3))
4. 查询学生成绩>60的同学的学号和平均成绩
select Sid,avg(score) as avgscore from SC group by Sid having avgscore>60
由于平均成绩是分组之后才查询出来的,所以必须先分组(group by)再取平均值,group by除了可以取平均值,还可以取sum(),min(),max(),count(*)
下面重点说下表的连接:
连接方式分三种,内连接,外连接,交叉连接.
内连接用inner join 取两个表的交集
外连接包括左(外)连接和右(外)连接和全外连接
左外连接以左边的表为主表 left join
右外连接以右边的表为主表 right join
全外连接是取两个表的并集 full join
交叉连接是取两个表的笛卡尔积 cross join
下面说下常用的:一个内连接+两个外连接
tableA(sid,sname)
图片.png
tableB(sid,score)
图片.png
1. 查询所有同学的学号,姓名(使用内连接)
select tableA.sid,sname
from tableA inner join tableB
on tableA.sid=tableB.sid
内连接.png
内连接取交集
2. 查询所有同学的学号,姓名(使用左连接)
select tableA.sid,sname
from tableA left join tableB
on tableA.sid=tableB.sid
左连接.png
注意:左连接时,当sid两个表都有时,要标注是哪个表的sid,要使用左表.sid,因为左连接时,是以左边的表为基础,连接右边的表,左边表的数据应该全部显示,即使对应的右边表中某字段对应的值有空数据,也要全部显示左边的数据,右边的数据会以左边表数据为基础显示
3. 查询所有同学的学号,姓名(使用右连接)
select tableB.sid,sname
from tableA right join tableB
on tableA.sid=tableB.sid
右连接.png
右连接时,当sid两个表都有时,要标注是哪个表的sid,要使用右表.sid,因为右连接就是以右边的表为基础,连接左边的表,右边表的数据会全部显示,即使对应的左边的表种某字段对应的值有空数据,也要全部显示右边表的数据,左边的数据会以右边表数据为基础显示
网友评论