目录
1.表的约束
1.1:约束类型
1.2:NULL约束
1.3:UNIQUE:唯一约束
1.4:DEFAULT :默认值约束
1.5:PRIMARY KEY:主键约束
1.5.1:联合主键
1.5.2:自增主键
1.6:FOREGIN KEY:外键约束
2.表的设计
2.1:三大关系
2.2:设计表的步骤
3.高级查询
3.1:聚合查询
3.1.1:聚合函数
3.1.2:GROUP BY 子句
3.1.3:HAVING
3.2:联合查询
3.2.1:内连接
3.2.2:外连接
3.2.3:自连接
3.2.4:子查询
前言:前一篇我们讲了简单的单表操作,如新增(C),查询(R),修改(U), 删除(D)。这里的查询只是简单的,单表的查询。接下来,我们要学习给列加上约束,多表的查询。
1.表的约束
为何要有约束?
就是让数据库帮助程序猿更好的检查数据是否正确。
1.1:约束类型
1. NOT NULL:指示莫列不能为空。不能保存NULL。
2.UNIQUE:保证莫列的值必须有唯一的值,不能重复。
3.DEFAULT:规定没有给赋值的列,赋值给默认值。
4.PRIMARY KEY:是NOT NULL和UNIQUE的结合,确保莫列(或者莫两个列多个列的结合)有唯一的标识,有助于更容易更快速地找到表中一个特定地记录。
5.FOREGIN KEY: 保证一个表中地数据匹配另一个表中的值的参照完整性。
1.2:NULL约束
创建表时:可以指定莫列不为空
当你指定莫列不为空的时候,你再插入NULL值,会报错。
1.3:UNIQUE:唯一约束
指定莫列为唯一的,不能重复的
1.4:DEFAULT :默认值约束
指定列插入数据时。该列为空.会自动填入默认值
1.5:PRIMARY KEY:主键约束
------是 NOT NULL 和 UNIQUE 的结合
在一个表里,只能有一个主键。
1.5.1:联合主键
但允许把多个列放在一起同时作为一个主键。这样叫做联合主键。
这也说明,是先查询之前插入的数据,满足再进行插入。
1.5.2:自增主键
那我如果手动新增一条记录
insert into student values(23,'qiqi',21),那下条自增主键是24?还是4?
1.6:FOREGIN KEY:外键约束
外键用于关联其他表的主键或唯一键
---------foregin key(当前表的列名) reference 主表(列名)
起到约束作用的表叫做主表/父表
被约束的这个表叫做子表。
要想创建外键,就要求主表对应的列得有 UNIQUE 约束,PRIMARY KEY。
一个表里面可以建多个外键。
那如果我想删除主表,直接用 drop table class 可以吗?
看来是不行的。要先删除子表,再删除父表。
2.表的设计
2.1:三大关系
一对一:
一对多:
多对多:
2.2:设计表的步骤
1.先确定实体(学生,课表等)
2.再明确实体之间的关系。
3.根据上述内容,套入关系中,表就出来了。
3.高级查询
3.1:聚合查询
聚合函数用于对一组值进行计算并返回一个汇总值。
3.1.1:聚合函数
函数 | 说明 |
COUNT ([DISTINCT] expr) | 返回查询到的数据的数量(空行也会算上) |
SUM ([DISTINCT] expr) | 返回查询到数据的总和,不是数字没有意义。 |
AVG ([DISTINCT] expr) | 返回查询到数据的平均值,不是数字没有意义。 |
MAX ([DISTINCT] expr) | 返回查询到数据的最大值,不是数字没有意义。 |
MIN ([DISTINCT] expr) | 返回查询到数据的最小值,不是数字没有意义。 |
这是行之间的计算
3.1.2:GROUP BY 子句
使用GRUOP BY 子句可以对指定进行分组查询。需要满足:使用GROUP BY进行分组查询时,SELECT 指定的字段必须是“分组依据的字段”,其他字段若想出现再SELECT 中则必须包含在聚合函数中。
select 列名 聚合函数 from 表名 group by 分组列名
分组前的条件过滤
3.1.3:HAVING
分组之前进行条件查询。我们用的是where ,那分组之后再想进行条件过滤就要用having。
select 列名 聚合函数 from 表名 group by 分组列名 having 指定条件
3.2:联合查询
联合查询也叫做多表查询。
首先要明白什么叫笛卡尔积:
笛卡尔积是两个表的乘积,列数是两个表的列数之和,行数是两个表的行数之积。
select * from 表名1,表名2;
3.2.1:内连接
是这两个表都会有的数据,通过内连接,筛选出有效的数据。
这里是用where 进行内连接
select 指定列名 from 表名1,表名2 .... where 内连接条件
如果几个表名的列名相同,要写 成表名.列名
还可以用 inner join on
select 指定列 from 表名1 (inner) join 表名2 on 指定条件
那where 和join on 有啥区别了?
where:
是先进行笛卡尔积,再执行下一步where挑选出表中的符合内连接的数据,这样比较慢。
join on:
先显示from 后面的这张表,再从 join 后的这张表挑选出返回条件可连接的元素,之后才连接起来,比较快。
where和join on 之间的差距在于效率的高低,而查询结构并没有什么差别.
where 的查询效率低于join on的查询效率。
3.2.2:外连接
外连接分为左外连接和右外连接。
左外连接:会把左表的所有连接的结果列出来,若右表中没有对应的记录,就是用null填充。
select * from 左表 left join 右表 on 连接条件;
右外连接:会把右表的所有连接的结果列出来,若左表中没有对应的记录,就是用null填充。
select * from 右表 left join 左表 on 连接条件;
3.2.3:自连接
自己和自己笛卡尔积,将自己的行传化为列
3.2.4:子查询
子查询是嵌套在其他sql语句中的select 语句,也叫做嵌套查询。
单行子查询:返回一行记录的子查询。
=:
查询李四的成绩
多行子查询:返回多行记录的子查询
IN:
查询英语成绩不及格的同学
联合查询的步骤:
1.先计算笛卡尔积
2.引入连接条件
3.根据需求加入必要条件,将不必要的列去掉。
总结:
以上就是我总结的表的约束的高级查找的知识,若有错误,请各位铁子留言纠错,若感觉不错,请一键三联。