1.数据完整性:
1.实体的完整性:一个实体就是一条记录,如果记录无法区分,称之为失去了数据的完整性.
自动增长列(auto_increment)
主键的约束(primary key)
唯一键(unique)
2.域完整性:如果两个字段无法区分,称之为失去了域的完整性.
默认数据类型约束
默认值约束
非空约束
3.引用的完整性:两个表的对应记录不完整.(不可避免的)
建立外键->只用主表有的,从表不一定会有(从表中还不能进行相关操作)
4.自定义完整性:自己制定的规则在实现后出现了偏差.
存储过程(比较像python的自定义函数)
触发器
2.外键(foreign key):
外键:从表的公共字段
外键约束用来保证引用的完整性,主外键的名字可以不一样,但是数据类型必须一样.
特点:
1.主表中不存在的记录,从表中不能插入
2.从表中存在记录,主表中不能先删除
3.必须先删除从表,再删除主表
#创建外键:
mysql> create table student(
-> s_id int auto_increment comment'主键' primary key,
-> s_name varchar(255)
-> )engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> create table marks(
-> m_id int comment'主键',
-> ch float,
-> math float,
-> foreign key (m_id) references student(s_id) on delete set null on update cascade
-> )engine=innodb;
Query OK, 0 rows affected (0.13 sec)
#插入数据
mysql> insert into student values (1,'Faker');
Query OK, 1 row affected (0.09 sec)
mysql> insert into marks values (1,98, 60);
Query OK, 1 row affected (0.00 sec)
#修改表的时候添加外键
#如果要在某个字段上添加外键,这个字段必须有索引才可以,如果这个字段没有索引就直接添加外键,那么mysql会自动创建索引.
(从表) (主表) (关联字段)
alter table marks add foreign key (student) references stuinfo(s_id);
#当主表删除 从表设置为空(指的是外键字)(级联设置)
#on delete set null
#当主表删除 从表中整条数据跟着删除(级联删除)
#on delete set cascade
#当修改主表时 从表的关联字段也跟着修改(级联修改)
#on update cascade
alter table marks add foreign key (student) references student(s_id) on delete set null on update cascade;
#查询创建表的结构
mysql> show create table marks;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| marks | CREATE TABLE `marks` (
`m_id` int(11) DEFAULT NULL COMMENT '主键',
`ch` float DEFAULT NULL,
`math` float DEFAULT NULL,
KEY `m_id` (`m_id`),
CONSTRAINT `marks_ibfk_1` FOREIGN KEY (`m_id`) REFERENCES `student` (`s_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.13 sec)
#删除外键(其中marks_ibfk_1是mysql分配的外键名称,上述查询可以看到)
alter table stumarks drop foreign key marks_ibfk_1;
操作外键(mysql表中设置外键会影响效率.所以一般数据量较少的时候使用):
1.严格约束(外键约束),保证引用的完整性
2.置空操作(set null):主表记录删除或者更新,从表的外键字段设置为null
3.联级操作(cascade): 主表的记录删除或者更新,从表外键字段一起发生变化
4.一般都是删除的时候外键字段置空,修改的时候更新关联
3.实体之间的关系:
- 一对一关系
- 一对多关系
- 多对多关系
4.范式:
- 第一范式:确保每一列的数据原子化(不可在分割)
- 第二范式:非主键字段必须依赖主键字段(一个表只描述一件事情)
- 第三范式:在非主键字段中,一个字段确定了,其它字段也确定称为传递依赖
5.查询语句:
select 字段(结果集) from 表名(数据源) [where 条件] [group by 分组][having 条件][order by 排序 asc|desc][limit限制 s,n]
#1.字段表达式
select 查询也可以用来做计算
select unix_timestamp(); --显示系统时间戳
mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
| 1580280704 |
+------------------+
1 row in set (0.39 sec)
select rand();--显示随机数
mysql> select rand();
+---------------------+
| rand() |
+---------------------+
| 0.24619844951312844 |
+---------------------+
1 row in set (0.02 sec)
#2.from语句
#from后面跟的是数据表,可以是多张表
#3.dual表
#dual表不是一个实实在在存在的表,它是为了保证select语句的完整性的.
#4where子句
#where子句在数据源进行筛选;
select * from student where s_name='Faker';
mysql> select * from student where s_name='Faker';
+------+--------+
| s_id | s_name |
+------+--------+
| 1 | Faker |
+------+--------+
1 row in set (0.11 sec)
#5.is null && is not null
筛选数据为空或不为空
select * from marks where ch is null or math is null;
mysql> select * from marks where ch is null or math is null;
Empty set (0.00 sec)
#6.between| not between
#筛选指定范围内的数据
select * from marks where ch between 75 and 100;
mysql> select * from marks where ch between 75 and 100;
+------+------+------+
| m_id | ch | math |
+------+------+------+
| 1 | 98 | 60 |
+------+------+------+
1 row in set (0.02 sec)
#7.运算符
#算数运算符:+ - * / % ++ --
#比较运算符:> < >= <= (<> !=)
#逻辑运算符:and or not
#8.聚合函数
sum() #求和
avg() #求平均值
max() #最大值
min() #最小值
count() #统计
#9.通配符
_ #匹配一个字符
% #匹配所有
#10.模糊查询
select * from student where s_name like '%k%';
mysql> select * from student where s_name like '%k%';
+------+--------+
| s_id | s_name |
+------+--------+
| 1 | Faker |
+------+--------+
1 row in set (0.14 sec)
#11.分组查询 group by
#group_concat()可以将同一组的字段连接在一起
#12.having查询
#where:设置查询的条件,字段必须是存在的
#having: 设置查询的条件,条件字段必须在结果集中(即必须是查询的结果);
#having 的查询效率要高于where
#13.order by排序[asc|desc]
select * from marks order by ch asc; #asc 可以不写 ,它是默认值
mysql> select * from marks order by ch asc;
+------+------+------+
| m_id | ch | math |
+------+------+------+
| 1 | 98 | 60 |
+------+------+------+
1 row in set (0.04 sec)
#表中直插入了一个数据,看不出效果
#14.limit限制
#limit 起始位置,显示长度
select * from student limit 3; #第一个不写默认从1开始
#15.查询语句中的选项
all :和 * 是一个意思,表示查询所有的
distinct: 去除重复的数据
select distinct ch from marks;
#16.on duplicate key update
作用:在插入数据的时候,如果这个数据已经存在或不满足唯一约束的条件就执行更新;