SQL学习笔记
约束
约束用于限制加入表的数据的类型
| 约束类型 | 保留字 | 说明 |
|---|---|---|
| 主键约束 | primary key | 要求主键列不为空,且主键列值唯一 |
| 外键约束 | foreign key | 用在两个表之间建立关联,需要指定引用主表是哪里一列 |
| 非空约束 | not null | 要求该列不能存在空值 |
| 默认约束 | default | 指定某列的默认值 |
| 唯一约束 | unique | 要求该列的值必须是唯一的,允许为空,但只能存在一个空值 |
| 检查约束 | check | 限制某列取值的范围是否合适 |
设置约束
-
创建表时:
<约束类型>(<列名>) -
修改表时:
①添加约束:add constraint <约束名><约束类型><列名>
②删除约束:drop constraint <约束名> -
约束名一般命名规则:约束类型_约束列(用英文),eg: PK_ID 表示主键约束ID这列的值
栗子:
//设置学生表的学号为主键
primary key (学号)
//为学生表性别字段添加默认约束为“男”
add constraint DF_Sex default ('男') for 性别
//为班级表的班级人数添加检查约束,限定在30至60人之间
add constraint CK_Number check (班级人数>30 and 班级人数<60)
//将班级表的系编号列设为外键,引用系表中的系编号列
foreign key (系编号) ferences 系(系编号)
查询
查询的数据源
也称 ” 记录源 “,是存放在数据库中的基本表或已经创建好的视图,可以有一个或多个数据源。
若是多个数据源,需要指定这些数据源之间的关系,以保证查询结果的正确性。
查询的结果
只有在运行查询时产生,因此也称为 “动态结果记录集”,可通过视图实现结果集的显示。
SELECT语句
无条件查询和有条件查询
栗子:
//查看学院表中各个学院的信息
select 学院编号,学院名称,院长姓名,电话,地址 from 学院
//查看学生表中来自 王者峡谷的 男 同学
select * from 学生 where 性别=‘男' and 籍贯='王者峡谷' //*表示反馈回所有的字段
//查看有三个以上班级(包括三个班级)的系的相关信息
select * from 系 where 班级个数>=3 //符号为英文的大于
//查看教室表中男教授的姓名,性别,职称信息
select 姓名,性别,职称 from 教室 where 性别='男' and 职称='教授'
排序分组
ASC 升序
DESE 降序
基本语法 order by <表达式>
//按班级人数由少到多查看班级情况
select * from 班级 order by 班级人数 ASC
//在学生表中,按年龄由小到大顺序显示全体女生的姓名,性别,出生年月信息
select 姓名,性别,出生年月 from 学生 where 性别='女' order by 出生年月 DESE
在排序结果中添加新列 select <表达式> as <新列名>
//统计学生表中A01班男生人数,新列名为“男生人数”
select count(*) as 男生人数 from 学生 where 班级编号='A01' and 性别=‘男' //count()为函数
分组基本语法 group by <表达式> having <表达式>
//在成绩表中查询有两门以上课程在90门以上的学生的学号及课程数,新列名为课程数
select 学号,count(*) as 课程数 from 成绩 where 成绩>90 group by 学号 having count( *)>=2
连接查询
内连接
内连接时,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录。
分类
- 等值连接:使用【=】比较被连接的列值
- 非等值连接: 使用【>、>=、<=、<、!>、!<、<>】进行比较运算的连接
- 自然连接:等值连接的特殊情况,是去掉重复列的等值连接
栗子:
//查看每个学生所选课程的成绩(内连接学生表、成绩表)
select 学生.学号,学生.姓名,成绩.课程编号,成绩.成绩
from 学生 inner join 成绩
on 学生.学号 = 成绩.学号
//多表等值连接
//查看每个班级,每个学生所选课程的成绩(连接学生、班级、成绩)
select 学生.学号,学生.姓名,班级.班级名称,成绩.成绩
from 学生,班级,成绩
where 学生.班级编号=班级.班级编号 and 学生.学号=成绩.学号
外连接
只限制一张表中的数据必须满足连接条件,另一张表可不满足连接条件的连接方式
分类
- 左外连接 (left outer join):限制右端的表中数据必须满足连接条件,不管左边表是否满足,均输出左端表中的数据
- 右外连接 (right outer join):限制左端的表中数据必须满足连接条件,不管右边表是否满足,均输出右端表中的数据
- 全外连接(full outer join):左右两端的记录都输出,如果没有找到匹配的记录,用NULL代替
栗子:
//要查询所有学生的成绩情况【不管学生有没有成绩都会输出到结果集中】
select 学生.学号,学生.姓名,成绩.课程编号,成绩.成绩
from 学生 left outer join 成绩
on 学生.学号=成绩.学号
//要查询所有学生的成绩情况【只有有成绩的学生信息才会输出到结果集】
select 学生.学号,学生.姓名,成绩.课程编号,成绩.成绩
from 学生 right outer join 成绩
on 学生.学号=成绩.学号
//全外连接
select 学生.学号,学生.姓名,成绩.课程编号,成绩.成绩
from 学生 full outer join 成绩
on 学生.学号=成绩.学号
嵌套查询
一个查询语句被完全包含在另一个查询语句的where和having的条件短语中。
嵌套查询的执行过程是“由里到外”进行的,每个子查询在其上一级查询未处理之前已经完成计算,其结果用于建立父查询的查询条件。
谓词
用来描述或判定客体性质、特征或者客体之间关系的词项,用于引导子查询。
- distinct:控制唯一性
- top:前xx条记录
- in和not in
- 比较运算符和between
- exists:存在
- like
- any或all
用于相等判断的子查询
//查看与A01班人数相等的班级名称,班长名字
select 班级名称,班长名字
from 班级
where 班级人数 =(select 班级人数 from 班级 where 班级编号='A01');
带有IN谓词的子查询
//查看女友生气的100个理由、沙雕的自我修养两门课程的学生学号、成绩
select 学号,成绩,课程编号
from 成绩
where 成绩.课程编号 in (select 课程编号
from 课程
where 课程名称='女友生气的100个理由' or 课程名称='沙雕的自我修养');
带有比较运算符的子查询
//查看少于“如何成为胡萝北大王”课程学时数的课程
select 课程名称,学时
from 课程
where 学时< ( select 学时 from 课程 where 课程名称=’如何成为胡萝北大王');
带有ANY或ALL的子查询
any:
① > any:大于子查询结果中的某个值
② < any:小于子查询结果中的某个值
③ >= any:大于等于子查询结果中的某个值
④ <= any:小于等于子查询结果中的某个值
⑤ = any:等于子查询结果中的某个值
⑥ != any:不等于子查询结果中的某个值
all:
① > all:大于子查询中的所有值
② < all:小于子查询中的所有值
③ >= all:大于等于子查询中的所有值
④ <= all:小于等于子查询中的所有值
⑤ = all:等于子查询中的所有值
⑥ != all:不等于子查询中的所有值
栗子:
//查看超过A001同学的所有课程成绩的同学
select 学号,成绩
from 成绩
where 成绩> all(select 成绩 from 成绩 where 学号= ‘A001’)and not 学号='A001';