您的位置:首页 > 编程语言 > Python开发

【python_mysql】mysql数据库基础知识总结

2018-01-29 01:18 716 查看

知识要点:

mysql是关系型数据库,关系数据库,是建立在关系模型基础上的数据库,现实世界中的各种实体,以及实体之间的各种联系,均用关系模型(table)来表示。
关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。实体:就是数据对象 (可以是有型的,也可以是无型的)


1. 外键约束要求

2. 一对多表关系

3. 一对一表关系

4. 多对多表关系

5. 外键约束的参照操作

E-R模型(实体关系模型)

E-R图也称实体-联系图(Entity Relationship Diagram),
提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一种方式。

实体关系模型:
1. 用“矩形框”表示实体型,矩形框内写明实体名称;
2. 用“椭圆图框”表示实体的属性,并用“实心线段”将其与相应关系的“实体型”连接起来;
3. 用”菱形框“表示实体型之间的联系成因,在菱形框内写明联系名,
4. 并用”实心线段“分别与有关实体型连接起来,同时在”实心线段“旁标上联系的类型(1:1,1:n或m:n)。


外键约束要求(FOREING KEY)

外键约束FOREIGN KEY,保持数据一致性,完整性实现一对一或一对多关系。(因为一个表只存一类信息。用外键来做参照,保证数据的一致性,可以减少数据冗余)。
外键约束的要求:
1. 数据表的存储引擎只能为InnoDB
2. 外键列和参照列数据类型一致
3. 外键必须关联到键上面去,一般情况是关联到,另一张表的主键


## 一张表只存一类信息。
## 创建表a
create table `a`(a_id int primary key, a_name varchar(20) not null);
insert into a values(1,'a1'),(2,'a2');

## 修改主键属性
alter table a modify a_id int auto_increment;
show create table a;
## 一个表里面只有一个auto_increment,一般和主键一起用。
alter table a auto_increment=6;
insert into a(a_name) value('a6');

## 创建表b
create table `b`(b_id int primary key,b_name varchar(20) not null,fy_id int not null,constraint AB_id foreign key(fy_id) references `a`(a_id));

## 删除外键
alter table `b` drop foreign key AB_id;

## 增加外键
alter table `b` add constraint AB_id foreign key(fy_id) references `a`(a_id);


1. 一对多关系

举例,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院(通常情况下),学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。

## 创建学院表
mysql> create table department(d_id int primary key AUTO_INCREMENT,d_name varchar(20) not null);

## 创建学生表,一个不同列,关联到另一种表的主键
mysql> create table student(s_id int primary key AUTO_INCREMENT,s_name varchar(20) not null,dept_id int not null,constraint SD_id foreign key(dept_id) references department(d_id));

## 插入学院信息
mysql> INSERT INTO `department`(`d_name`)VALUES('计算机学院'),('外语学院');

## 插入学生基本信息
mysql> INSERT INTO `student`(`s_name`,`dept_id`)VALUES('s1',1),('s2',2),('s3',2);


2. 一对一关系

举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用外键加主键的方式来实现这种关系。

#例:
## 查看学生表信息:
mysql> DESC `student`;

## 建立详细学生表:# 主键映射-主键
mysql> CREATE TABLE `student_details`(`id` INT PRIMARY KEY,`sex` VARCHAR(10) not null,
`age` INT,`address` VARCHAR(20) comment '家庭住址',`parents` VARCHAR(20),
`home_num` VARCHAR(20),FOREIGN KEY (`id`) REFERENCES `student`(`s_id`));

## 插入详细数据到到学生详细表中
insert into student_details value(2,'男',18,'浙江','xxx','12345678910');
insert into student_details value(4,'男',20,'天津','xxx','12345678911');
insert into student_details value(5,'男',20,'贵阳','xxx','12345678912');


3. 多对多关系

举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。对于多对多关系,需要创建第三张关系表,关系表中通过外键加主键的形式实现这种关系。

## 例:
## 建立课程表:
mysql> CREATE TABLE `course`(`id` INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(20) NOT NULL);

## 插入基本数据
insert into course(name) values('python'),('java'),('.net'),('javascript');

#学生与课程多对多关系表 (中间表)
mysql> CREATE TABLE `select`(`s_id` INT,`crs_id` INT,PRIMARY KEY (`s_id`,`crs_id`),FOREIGN KEY (`s_id`) REFERENCES `student` (`s_id`), FOREIGN KEY (`crs_id`) REFERENCES `course` (`id`));

## 关联表属性说明:
## 1. 防止同一个学生,多次选同一门课程
PRIMARY KEY (`s_id`,`crs_id`)
## 2. 必须学生表的学生,才能选课
FOREIGN KEY (`s_id`) REFERENCES `student` (`s_id`)
## 3. 只有课程存在,才能选
FOREIGN KEY (`crs_id`) REFERENCES `course` (`id`)

## 插入基本数据:
insert into `select` values(1,1),(1,3),(4,4);
insert into `select` values(2,3),(2,1),(2,4);


4. 外键约束的参照操作

## 学院表和学生表之间的关联关系:
mysql> SELECT * FROM `department`;
mysql> SELECT * FROM `student`;

## 直接执行如下操作将删除失败:因为外键关联的原因,不能删除父表中的记录
mysql> DELETE FROM `department` WHERE `d_id`=1;
## ERROR INFO:
a foreign key constraint fails (`mydb`.`student`, CONSTRAINT `stu_dep_for_key` FOREIGN KEY (`dep_id`) REFERENCES `department` (`id`))

## 如何才能正确的删除关联的数据呢,先删除关联的外键信息:
## 因为student表中的dep_id没有值关联department中的id=2的数据,所以可以删除department表中id=2的数据。
mysql> UPDATE `student` SET `dept_id`=1 WHERE `dept_id`=2;
mysql> DELETE FROM `department` WHERE `d_id`=2;


5. 查询中常见的函数

## mysql数据库查询中一些较为常见的函数:
## 求最大年龄MAX()
mysql> SELECT MAX(`age`) FROM `student_details`;

## 求最小年龄MIN()
mysql> SELECT MIN(`age`) FROM `student_details`;

## 求和SUM()函数()
mysql> SELECT SUM(`age`) FROM `student_details`;

## 求平均数AVG()函数
mysql> SELECT AVG(`age`) FROM `student_details`;

## 四舍五入ROUND()函数
mysql> SELECT ROUND(AVG(`age`)) FROM `student_details`;

## 统计汇总COUNT()函数
mysql> select count(s_id) from student;

## 查看当前时间,NOW()
mysql> SELECT NOW();
mysql> create table tb1(id INT,name VARCHAR(20),dates DATETIME);
mysql> insert into tb1 value(1,'xxx',now());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: