mysql数据完整性、实体关系

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
作用:在插入数据的时候,如果这个数据已经存在或不满足唯一约束的条件就执行更新;


发布了63 篇原创文章 · 获赞 1 · 访问量 2043

猜你喜欢

转载自blog.csdn.net/qq_45061361/article/details/104106488