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