MySQL数据库基本操作(三)
MySQL补充:
mysql是关系型数据库,关系数据库,是建立在关系模型基础上的数据库,
现实世界中的各种实体,以及实体之间的各种联系,均用关系模型(table)来表示。
#关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
# 实体:就是数据对象 (可以是有型的,也可以是无型的)
E-R 图 (实体关系模型)
E-R图也称实体-联系图(Entity Relationship Diagram),
提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
它是描述现实世界关系概念模型的有效方法。
是表示概念关系模型的一种方式。 用“矩形框”表示实体型,矩形框内写明实体名称;
用“椭圆图框”表示实体的属性,并用“实心线段”将其与相应关系的“实体型”连接起来;
用”菱形框“表示实体型之间的联系成因,在菱形框内写明联系名,
并用”实心线段“分别与有关实体型连接起来,同时在”实心线段“旁标上联系的类型(1:1,1:n或m:n)
外键约束FOREING KEY
外键约束FOREIGN KEY
,保持数据一致性,完整性实现一对一或一对多关系。
(因为一个表只存一类信息。用外键来做参照,保证数据的一致性,可以减少数据冗余)
外键约束的要求:
数据表的存储引擎只能为InnoDB外键列和参照列数据类型一致外键必须关联到键上面去,一般情况是关联到,另一张表的主键
#例:
##表a
mysql> 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;
alter table a auto_increment=6; # 只能调大,不可以调小,一个表里面只有一个auto_increment,一般和主键一起用。
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; #增加外键
mysql> alter table `b`
-> add constraint AB_id foreign key(fy_id) references `a`(a_id); #一个表只存一类信息。
一对多关系
举例,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院(通常情况下),学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。
#例:
##创建学院表
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('计算机学院'),
-> ('外语学院')
-> ;
Query OK, 2 rows affected (0.10 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> INSERT INTO `student`(`s_name`,`dept_id`)
-> VALUES('s1',1),
-> ('s2',2),
-> ('s3',2)
-> ;
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
一对一关系
举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用外键加主键的方式来实现这种关系。
#例:
#学生表:
mysql> DESC `student`;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| dept_id | int(11) | YES | MUL | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.06 sec) #建立详细学生表:
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`)
-> ); # 主键映射 主键
Query OK, 0 rows affected (0.67 sec) insert into student_details value(2,'男',18,'湖南长沙','佳爸爸',''); insert into student_details value(4,'男',20,'湖南长沙','李爸爸',''); insert into student_details value(5,'男',20,'湖南长沙','李爸爸','');
多对多关系
举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。对于多对多关系,需要创建第三张关系表,关系表中通过外键加主键的形式实现这种关系。
#例:
#建立课程表:
mysql> CREATE TABLE `course`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(20) NOT NULL
-> );
Query OK, 0 rows affected (1.18 sec) insert into course(name) values('python'),('java'),('英语'),('日语'); #学生与课程多对多关系表 (中间表)
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`)
-> );
Query OK, 0 rows affected (0.50 sec) insert into `select` values(1,1),(1,3),(4,4);
insert into `select` values(2,3),(2,1),(2,4);
外键约束的参照操作:
mysql> SELECT * FROM `department`;
+----+----------------------+------+
| d_id | name | code |
+-----+----------------------+------+
| 1 | 计算机学院 | 1 |
| 2 | 外国语学院 | 2 |
+-----+----------------------+------+ mysql> SELECT * FROM `student`;
+----+--------+--------+
| id | name | dep_id |
+----+--------+--------+
| 1 | budong | 1 |
| 2 | Tuple | 1 |
| 3 | Which | 2 |
+----+--------+--------+ mysql> DELETE FROM `department` WHERE `d_id`=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`mydb`.`student`, CONSTRAINT `stu_dep_for_key` FOREIGN KEY (`dep_id`) REFERENCES `department` (`id`))
#因为外键关联的原因,不能删除父表中的记录 mysql> UPDATE `student` SET `dept_id`=1 WHERE `dept_id`=2;
mysql> DELETE FROM `department` WHERE `d_id`=2;
#因为student表中的dep_id没有值关联department中的id=2的数据,所以可以删除department表中id=2的数据
查询中一些较为常见的函数
#求最大年龄
mysql> SELECT MAX(`age`) FROM `student_details`; #求最小年龄
mysql> SELECT MIN(`age`) FROM `student_details`; #求和
mysql> SELECT SUM(`age`) FROM `student_details`; #求平均数
mysql> SELECT AVG(`age`) FROM `student_details`; #四舍五入
mysql> SELECT ROUND(AVG(`age`)) FROM `student_details`; #统计
mysql> select count(s_id) from student; #查看当前时间
mysql> SELECT NOW(); mysql> create table tb1(
-> id INT,
-> name VARCHAR(20),
-> dates DATETIME
-> );
mysql> insert into tb1 value(1,'佳能',now());
作业
1.建立好 学院、学生、学生详情、课程、选课详情 这个5张表。 用文字简单叙述其表关系,和 如何实现其表关系。
MySQL数据库基本操作(三)的更多相关文章
- (三)mysql数据库基本操作
(1)SQL语句:结构化查询语句 DDL语句 数据定义语言:数据库丶表丶视图丶索引丶存储过程丶函数丶create drop alter DML语句 数据库操作语言:插入数据insert,删除数据del ...
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. P ...
- day39 mysql数据库基本操作
什么是数据库 用来存储数据的仓库 数据库可以在硬盘及内存中存储数据 主要学习硬盘中存储数据,因为内存中的数据总有一天会丢失 数据库与文件存储数据区别 (公司的开发是综合内容的) 数据库本质也是通过文件 ...
- python操作MySQL数据库的三个模块
python使用MySQL主要有两个模块,pymysql(MySQLdb)和SQLAchemy. pymysql(MySQLdb)为原生模块,直接执行sql语句,其中pymysql模块支持python ...
- mysql数据库基本操作sql语言
mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...
- php连接MySQL数据库的三种方式(mysql/mysqli/pdo)
引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案 ...
- Django/MySql数据库基本操作&ORM操作
数据库配置: #第一步在settings里面 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbna ...
- Mysql数据库基本操作 (一)
1.使用mysql数据库的必备要素 a. 安装MySQL服务端 b. 安装MySQL客户端 c. [客户端]连接[服务端] d. [客户端]发送命令给[服务端MySQL]服务的接受命令并执行相应操作( ...
- mysql数据库基本操作以及获取数据库强大帮助文档
MySQL数据库强大帮助文档 mysql 中help等价于\h或者? mysql> ? create database;(查看创建数据库的语法) mysql> ? drop databas ...
- mysql数据库第三弹
mysql数据库知识拓展 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT ...
随机推荐
- c语言之linux下gettimeofday函数windows替换方案
* Copyright (C) 2008 mymtom (mymtom@hotmail.com) * All rights reserved. * * Redistribution and use i ...
- Java类的加载、链接和初始化(个人笔记)
这里看到一篇比较好的文章:http://www.infoq.com/cn/articles/cf-Java-class-loader 这里只是针对什么时候会触发java类的初始化(注意:这里不是说的实 ...
- 【BZOJ4716】假摔 二分+暴力
[BZOJ4716]假摔 Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao. ...
- 【BZOJ4817】[Sdoi2017]树点涂色 LCT+线段树
[BZOJ4817][Sdoi2017]树点涂色 Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路 ...
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...
- HBase架构原理详情
本文从网上看到的,自己看过了,同时收藏下!感谢分享! HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化 ...
- javascript基础(整理自手册网)
变量 person=null; //清空变量 carname="Volvo"; //赋值给未声明的变量, 它将会变成全局变量, 即使在函数内部 window.carnam; //所 ...
- JavaSctipt语句for循环的思考
一.语法 for (语句 1; 语句 2; 语句 3) { 被执行的代码块; } 语句 1: 在循环(代码块)开始前执行, 可选. 语句 2: 定义运行循环(代码块)的条件, 可选, 如果省略了语句 ...
- 从B 树、B+ 树、B* 树谈到R 树(转)
作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Fra ...
- ABAP自动生成程序
QID 用表 APQD 里的ID REPORT Z001 去年6月花了一周的成果,可是玩了一周就没玩了, 现在想来: 研究下程序共性 ,这个总结的多,一定会提高效率 这个用 ...