多表联查
多表联查 :
就是把多张表的数据显示在一个结果集中
- 内连接(inner join) : 显示两张表都有的内容
- 外连接(3种)
A) 左连接(left join) : 在 left join 左边的表数据全部都显示
B) 右连接(right join): 在 right join右边的表数据全部都显示
C) 全连接(full join) : 在 full join 两边的表数据全部都显示 - 交叉连接(cross join):如果不带where条件,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积
步骤:
1、找到多个表之间的关系--公共列
2、select * from 表1 as a
inner join 表2 as b
on a.公共列 = b.公共列
where 条件
示例:
--1、内连接(inner join) : 显示两张表都有的内容
select * from boy as a inner join girl b
on a.sid = b.uid
--2、外连接(3种)
--A)左连接(left join),也叫左外连接(left outer join)
--在 left join 左边的表数据全部都显示
select* from boy b left join girl g
on b.sid = g.uid
--B)右连接(right join),也叫右外连接(right outer join)
--在 right join右边的表数据全部都显示
select * from boy right join girl
on boy.sid = girl.uid
--C)全连接(full join)
--在 full join 两边的表数据全部都显示
select * from boy a full join girl b
on a.sid = b.uid
--3、交叉连接(cross join)
select * from boy cross join girl
多表联查示例:
--我们之前的查询全部都是建立在一个表之中,很多时候,
--接触的表不止一个
--表 : 一个表只能描述一个事情
--学号 姓名 性别 年龄 班级 班级名 班导 班导电话
--家长 家长电话 住址 身份证
--学生表 : 学号 姓名 性别 年龄 班级 身份证
--班级表 : 班级 班级名 班导
--班导表 : 班导 班导电话
--家长表 : 家长 家长电话 住址
select * from studentinfo
select * from classinfo
select * from teacherinfo
--显示出学生姓名,班级名,老师名
select stuname,classnumber,teachername
from StudentInfo a inner join ClassInfo b
on a.SClassID = b.ClassID
inner join TeacherInfo c
on b.CTeacherID = c.TeacherID
复制表(得到一张新表)
select * into 新表名 from 原始表
注:
- 新表名之前没有创建
- 不会复制主键、标识列
select * from boy
select * from girl
select * into tfboy from boy
select * from tfboy
示例:
--复制男女表,男女表合二为一
select sid,a.name as aname,b.name bname into 男女 from boy a full join girl b
on a.sid = b.uid
select * from 男女
插入表
insert into 插入表名 select * from 原始表
insert into boy select * from girl
select * from boy
注:
- 在已经存在的表中插入原始表的全部数据
- 插入表名已经创建
- 插入表不能违反约束