目录
数据库约束
null
unique
default
primary key
外键约束
聚合查询
聚合函数
group by
联合查询
理解笛卡尔积
内连接
外连接
自连接
子查询
合并查询
目标:
1. 数据库约束
2. 聚合查询
3. 联合查询
对数据库中的数据来说,有的是合法的,有的是非法的,我们为了使数据库中的数据为合法的进而引入了 “约束 ”。
约束类型 | 说明 |
null | 值不能为空 |
unique | 值不能重复 |
default | 没有赋值时的默认值 |
primary key | 使某列有位移标识 |
外键约束 | 使一个表与另一个表匹配完整 |
使插入的值不能为空,为空的话,就不能插入。
不能插入原来已有的值
注意:
unique 约束会让后续插入数据 / 修改数据 的时候,都先进行一次 查询 操作。
没有赋值时的默认值(默认情况下为空)
1. 一个表中只能有一个primary key
2. 设置为priamry的列,具有唯一性,并且不能为空
3. 带有主键的表 / 列,每次插入也都进行查询(影响不大,通过索引查)
如何保证主键唯一 ???
mysql 提供了 " 自增主键" ,主键一般为 int / bigint 的类型,在插入数据的时候,不必手动指定主键值,由服务器自动分配(从 1 开始递增),当然也可以自己插入,但是插入的值必须比上一个值大(系统插入的时候会按照当前最大值进行分配)。
foreign key (当前表中被约束的列) references class (根据这个列约束);
1. 使两个表存在关系
2. 子表中的数据在对应的父表的列中要存在
3. 想删除父表的的时候,先删除子表
3. 父表中必须有主键(primary kay)
表达式查询是针对 列 和 列 之间的进行运算的,聚合查询相当于 行 和 行 之间的查询。因此 sql 中提供了 聚合函数。
1. count(...) 查询出来结果集的行数(“...” 为 “ * ” 的时候null也能算入)
2. sum(...) 把这一列的行求和(自动把null排除)
3. avg(...) 求平均值
4.max(...) 求最大值 min(求最小值)
eg:
select count(*) from 表名;
select sum / avg / max (列名) from 表名;
select 列名, 聚合函数 from 表名 group by 列名;
把相同列的分为一组,如果不使用聚合函数的话,数据可能可以会产生不想要的结果。。。
group by 可以搭配条件 :
1. where 一般写在前面,先执行where,再执行group by,最后执行聚合。
2. having 一般写在后面,先执行group by 再执行聚合,最后执行having。
在sql中,笛卡尔积的应用用于两个表求笛卡尔积,求后成为一个表。
假如有两个表,表1(2行,2列),表2(3行,3列)
求完笛卡尔积是将第一个表中的行和第二个表中的每一行进行结合,最终形成一个 6 行,5 列的表
select 列名, 列名... from 表1, 表2 where 条件 gruop by 列;
select 列名, 列名... from 表1 (inner)join 表2 on 条件;
1. 先将两个表进行笛卡尔积
select * from 表1, 表2;
2. 加上连接条件,筛选出有效数据
select * from 表1, 表2 where ... ;
3. 针对列进行精简
select 列名, 列名... from 表1, 表2 where ... ;
4. 针对上述结果进行聚合查询
select 列名, 列名... from 表1, 表2 where ... gruop by 列;
左外连接:select 列名, 列名... from 表1 left join 表2 on 条件;
右外连接:select 列名, 列名... from 表1 right join 表2 on 条件;
左外连接:以左侧表为基准,保证左侧表的数据都存在,如果对应列右侧不存在,填为空
右外连接:以右侧表为基准,保证右侧表的数据都存在,如果对应列左侧不存在,填为空
select 列名, 列名... from 表1,表1 where 条件;
sql中一张表只能进行列和列的比较,但是同一个表进行笛卡尔积就能将行的关系转换为列的关系。
select ... from 表1 where 字段 = (select ... from ...);
select ... from 表1 where 字段1 in (select ... from ...);
select ... from 表1 where exists (select ... from ... where 条件);
select ... from 表1, (select ... from ...) as tmp where 条件;
-- UNION:去除重复数据
select ... from ... where 条件 union select ... from ... where 条件
-- UNION ALL:不去重
select ... from ... where 条件 union all select ... from ... where 条件