约束

约束用于限制加入表的数据的类型

约束类型 保留字 说明
主键约束 primary key 要求主键列不为空,且主键列值唯一
外键约束 foreign key 用在两个表之间建立关联,需要指定引用主表是哪里一列
非空约束 not null 要求该列不能存在空值
默认约束 default 指定某列的默认值
唯一约束 unique 要求该列的值必须是唯一的,允许为空,但只能存在一个空值
检查约束 check 限制某列取值的范围是否合适

设置约束

  1. 创建表时: <约束类型>(<列名>)

  2. 修改表时:
    ①添加约束:add constraint <约束名><约束类型><列名>
    ②删除约束: drop constraint <约束名>

  3. 约束名一般命名规则:约束类型_约束列(用英文),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语句

[SQL][学习笔记]mooc学习(约束、查询、连接查询、嵌套查询)

无条件查询和有条件查询

栗子:

//查看学院表中各个学院的信息
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';

相关文章: