多表连接查询

311 阅读3分钟

0. 举例专用数据库

创建数据库代码如下

--使用T-SQL语句创建名为schooldb 数据库
--数据库主文件名为schooldb_data,初始大小为10MB,最大为50mb,增长速度为5%,
--日志文件名为schooldb_1og,初始大小为10MB ,最大为100mb,增长速度为5mb,
--所有文件都放在C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER2\MSSQL\DATA 这个文件目录下

create database schooldb
on(
name = schooldb_data,
filename = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER2\MSSQL\DATA\schooldb_data.mdf',
size = 10mb,
maxsize = 50mb,
filegrowth = 5)
log on
(
name = 'schooldb_1og',
filename= 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER2\MSSQL\DATA\schooldb_log.ldf',
size = 10mb,
maxsize = 1000mb,
filegrowth = 5mb
)
go

use schooldb
go

--根据下面三个表创建数据库
create table student
(sno char(8) primary key,
sname char(8) not null,
sex char(2) not null check(sex in ('男','女')),
sage int not null,
sdept char(8)
)
go

create table course
(cno char(8) primary key,
cname char(8) not null,
cpno char(8),
credit int,
)
go

create table sc
(sno char(8) foreign key references student(sno),
cno char(8) foreign key references course(cno),
grade int,
primary key(sno,cno)
)
go

创建之后插入了一些数据,目前表中数据如下:

学生表:

课程表:

选课表

1. 连接查询

1.1 无连接规则连接

不设置where子句,连接结果是表1中的每一行都会和表2中的所有进行连接(笛卡尔积)

select * from student,sc

PS:截图不全,太多了

1.2 有连接规则查询

通过 where 子句来设置连接条件,最常用的一种,或者用inner join的方法

-- 方法1
select * from student,course,sc
where sc.sno = student.sno and sc.cno = course.cno

-- 方法2
select * 
from sc inner join student s on s.sno = sc.sno
        inner join course  c on c.cno = sc.cno

2. 高级连接查询

2.1 自连接查询

自身与自身连接查询

-- 查询李勇所在系的所有学生信息
select t1.*
from student t1, student as t2
where t1.sdept = t2.sdept
and t2.sname = '李勇'
-- PS:s1.*指student表的所有字段,如果select * 的话,就会显示t1,t2的所有字段(搞出左右分别相同的字段)

--对比子查询,如果先查李勇的院系,然后再查这个院系所有学生的信息,比较墨迹

查询结果:

下面为全部学生信息:

2.2 内连接查询

内连接最大的特点就是只返回两个表中相互匹配的记录,而那些不能匹配的记录就被自动去除了。

2.2.1 等值连接
select * 
from student s,sc 
where s.sno = sc.sno 

2.2.2 自然连接

一种特殊的等值连接,必须是同名的属性列才能进行,并且在结果中去除重复的属性列。

select * 
from student s,sc 
where s.sno = sc.sno 

2.2.3 不等值连接

例如 >、>=、<、<=、<>或 between

2.3 左外连接查询

左侧表的所有记录都包含在结果关系中

select *
from student s left outer join sc on s.sno = sc.sno 

2.4 右外连接查询

右侧表的所有记录都包含在结果集中

select *
from sc right outer join course c on sc.cno = c.cno

2.5 全外连接查询

两个表的记录都包含在内

select *
from sc full outer join course c on sc.cno = c.cno

2.6 交叉连接

返回的是一个笛卡尔积

--方法1: 通过逗号隔开
select * from t1,t2

--方法2,用cross join连接表明
select * from t1 corss join t2