MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库
2023-06-13 09:20:10 时间
DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select)
DDL(Data Definition Language,数据定义语言) (create,drop,alter)
DCL(Data Control Language,数据控制语言) grant(授权),revoke(撤销权限)
TCL(Transaction Control Language,事务控制语言) commit(提交事务),rollback(回滚事务)
二、数据库的基本操作 2.1、show命令了解数据库 1) show databases [like “%te%”];
注意:MySQL在创建一个数据库时,就会在MySQL的安装目录下的data目录中生成和该数据库同名的目录。
查看MySQL系统变量的值,使用mysqladmin varables命令得到这个信息。
6.2)当前连接MySQL的Session的变量:show session variables;
显示哪个线程正在运行,使用mysqladmin processlist命令得到这个消息。如果你有
process权限,你可以看到所有的线程。否则,你仅能看到你自己的线程。
查看MySQL服务器某个用户的权限信息,显示的是给该用户进行授权的SQL语句。
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
在MySQL5.5版本以前MySQL默认的使用MyISAM作为默认的引擎,之后使用额是InnoDB作为默认的引擎。 三、SQL的三大范式 3.1、第一范式(1NF) 强调的是列的原子性,即列不能够再分成其他几列。
数据库表中的任何字段都是单一属性的,不可再分。(
所有的值尽可能的是最小的不可分割的)
考虑这样一个表:【联系人】(姓名,性别,电话) 如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
create table aa(id int,NameAge varchar(100)) insert aa values(1,无限-女 ) 没有达到第一范式 create table aa(id int,name varcahr(10),age char(2)) insert aa values(1,无限,女 ) 达到第一范式
实例
3.2、第二范式(2NF)
首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
数据库表中的非关键字段对任一候选关键字段都不存在部分函数依赖 (除了主键列之外的其他所有的列的值尽可能的依赖于主)
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。 因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。
显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。 可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
create table sci( sno int(32),cno int(32),grade int(32),credit int(32), primary key sno,cno 课程(cno)1---1学分(credit) 学生(sno)n---n课程(cno) 学生+课程--- 分数(grade) sno cno grade credit 1 1 60 80 2 1 90 80 3 1 70 80 . . . . . . . . . . . . 如此以来,学分被大量重复存储,数据冗余 如要某课程学分,则要大量重复操作 如要加新课程,由于sno和cno共同做为主键,则在加入新课程时,必须有人选该课 如某学生某课程结业,则该学生其它课程信息也同时被删除了 这种设计不太好吧,非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖 分成两个关系模式 sc1(sno,cno,grade),c2(cno,credit)。新关系包括两个关系模式,它们之间通过sc1中的外关键字cno相联系,需要时再进行自然联接,恢复了原来的关系 3.3、第三范式(3NF) 关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖 确保每列和主键直接相关,而不是简接相关。 例----S1(SNO,SNAME,DNO, DNAME, LOCATION) 学号 姓名 所在系 系名称 系地址 关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。 原因:关系中存在传递依赖造成的。即SNO 1- 1 DNO。 而DNO 1- n SNO却不存在, 而DNO - LOCATION存在, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO - LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。 解决目地:每个关系模式中不能留有传递依赖。 解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION) 注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系
实例2
3.3、第三范式(3NF)
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖
确保每列和主键直接相关,而不是简接相关。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。 其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。
不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。 通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
![MySQL(三)之SQL语句分类、基本操作、三大范式详解数据库](http://blog.ytso.com/zb_users/plugin/LazyLoad/usr/loading.gif)
例----S1(SNO,SNAME,DNO, DNAME, LOCATION) 学号 姓名 所在系 系名称 系地址 关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。 原因:关系中存在传递依赖造成的。即SNO 1- 1 DNO。 而DNO 1- n SNO却不存在, 而DNO - LOCATION存在, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO - LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。 解决目地:每个关系模式中不能留有传递依赖。 解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION) 注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系
实例3
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/4296.html
mysql相关文章
- MySQL Error number: MY-013610; Symbol: ER_AUTHCACHE_ROLE_EDGES_UNKNOWN_AUTHORIZATION_ID; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL数据库:启动失败的挣扎(mysql数据库无法启动)
- MySQL指令操作技巧:快速实现目标(mysql输入命令)
- MySQL数据库灵活实用的备份服务器(mysql备份服务器)
- MySQL分页技术:优化数据检索性能(mysql分页技术)
- MySQL中的IN运算符技巧(mysql查in)
- 【长沙】MySQL培训班:学习走向数据库专业人士(长沙mysql培训)
- MySQL动态表:实时数据应用的利器(mysql动态表)
- MySQL 主主同步配置指南(mysql主主同步配置)
- MySQL参数指南:完整指引你完善数据库构建(mysql参数大全)
- MySQL数据库格式化:获得稳定可靠的数据结构(mysql数据库格式化)
- MySQL使用JDBC连接数据库的指南(mysql 的jdbc)
- MySQL中的Normalization 数据库设计的重要规则(mysql中normal)
- c MySQL 存储图片的实践(c mysql 保存图片)
- 使用经验分享MySQL个人数据库管理技巧(mysql个人)
- 打开大门,突破91道MySQL面试难关(91道mysql面试题)
- MySQL 设置开启双重保障(2个mysql设置)
- 用CSV文件快速转入MySQL数据库(csv文件转入mysql)
- MySQL中的大于号()是如何使用的(mysql中出现了 >)
- MySQL三表联查实现数据分页操作(mysql三表联查分页)
- MySQL中MyISAM和InnoDB引擎的区别(mysql 两种引擎区别)
- 优化效率,合并SQL语句MySQL查询优化技巧之两次查询合并(mysql 两次查询合并)
- MySQL 数据库无法打开问题的解决方法(mysql不能打开数据库)
- 如何处理MySQL不能卸载旧版本的问题(mysql不能卸载旧版本)