数据库设计的三大范式:
概念:
关系型数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效,优雅的数据库。
一般项目中用的最多的也就是第三范式,性能和维护比较平衡
第一范式:数据库中的每个字段都是不可拆分的数据项,那么就满足第一范式
第二范式:首先满足第一范式,其次,每个非主键字段是由主键字段来决定的。
第三范式:首先满足第二范式,其次,非主键字段之间不存在函数依赖关系
简单的可以理解为:
第一范式就是原子性,字段是不可再分割的;
第二范式就是完全依赖的,没有部分依赖;
第三范式就是没有传递依赖
数据库的选择方面:
项目大小方面:
Oracle和SQLServer适合企业级项目
MySQL更适合互联网项目的开发
价格方面:
Oracle和SQLServer需要支付一定费用
mySQL开源免费
语言选择方面:
.net跟SQLserver结合比较好
PHP和Java跟其他结合比较好
MySQL常用存储引擎比较:
MyISAM:不支持事务,表级锁,查询效率高,适用于查询多的情况下
Innodb:推荐使用的,支持事务,行级锁,MySQL5.5之后默认的存储引擎
Archive:该存储引擎查询和添加操作,适合做日志存储
怎么样修改MySQL的存储引擎:
1>可以通过修改MySQL的配置文件my.ini文件的关键字是default-storage-engine = 所要修改的名称
2>可以通过创建表的时候 加上 engine = myisam
3>还可以通过sql语句的方式修改:alter table 表名 engine = 存储引擎名称;
下面都是以MySQL为例:
命名规范:
数据库的表和字段一定要有字段含义,方便表的字段的可读性和维护性
*数据库的基本操作(以MySQL为例):
修改数据库的字符编码:alter database 数据库名 character set = utf8;
*显示表users中字段的详细信息:
show columns from users;
多表更新例子:
update 第一张表 INNER JOIN 第二张表 on 第一张表的字段 = 第二张表的字段(on后面是字段值相同)
set 第二张表的某个字段 = 第一张表的某个字段
*把查询出来的数据插入到刚创建的表中
create table 表名(
id smallint unsigned primary key auto_increment;
username varcher(33) not null;
)
select 列名 from 表名 ;//查询出来的记录
/
*MySQL中的存储过程
定义:存储过程是SQL语句和控制语句的预编译集合,以一个名称存储,并作为一个单元处理。
存储过程的优点
1、增强了SQL语句的功能和灵活性
2、实现较快的执行速度
3、减少了网络流量
创建存储过程
1>创建没有参数的存储过程:
例子:创建一个不带参数的存储过程:CREATE PROCEDURE sp1() select version();
调用存储过程:
CALL sp1;或者 CALL sp1();
2>创建带有IN类型参数的存储过程
//根据指定id删除用户
DELIMITER //
CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = id ;
END
//
后面把定界符修改回来
//删除存储过程
DROP PROCEDURE removeUserById;
//查看已创建的存储过程的状态
show procedure status;
3>创建带有IN和OUT类型参数的存储过程
先修改定界符,然后创建存储过程
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO userNums;
END
//
调用存储过程:
CALL removeUserAndReturnUserNums(22,@nums);
@nums表示用户变量
4>创建带有多个OUT类型参数的存储过程:
同上
5>存储过程与自定义函数对的区别:
存储过程实现的功能更复杂一些;而函数的针对性更强
存储过程可以返回多个值;函数只能有一个返回值
存储过程一般都是独立的来执行的;而函数可以作为其他SQL语句的组成部分来出现
CREATE FUNCTION f1() RETURNS VACHAR(20)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
修改数据表(添加外键约束)
alter table 表名 add foreign key(需要添加的外键列名) references
另外一张的名称(另一张表需要关联的外键字段)
alter table 表名 add foreign key(需要添加的外键列名) references 表名(字段名)
概念:
关系型数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效,优雅的数据库。
一般项目中用的最多的也就是第三范式,性能和维护比较平衡
第一范式:数据库中的每个字段都是不可拆分的数据项,那么就满足第一范式
第二范式:首先满足第一范式,其次,每个非主键字段是由主键字段来决定的。
第三范式:首先满足第二范式,其次,非主键字段之间不存在函数依赖关系
简单的可以理解为:
第一范式就是原子性,字段是不可再分割的;
第二范式就是完全依赖的,没有部分依赖;
第三范式就是没有传递依赖
数据库的选择方面:
项目大小方面:
Oracle和SQLServer适合企业级项目
MySQL更适合互联网项目的开发
价格方面:
Oracle和SQLServer需要支付一定费用
mySQL开源免费
语言选择方面:
.net跟SQLserver结合比较好
PHP和Java跟其他结合比较好
MySQL常用存储引擎比较:
MyISAM:不支持事务,表级锁,查询效率高,适用于查询多的情况下
Innodb:推荐使用的,支持事务,行级锁,MySQL5.5之后默认的存储引擎
Archive:该存储引擎查询和添加操作,适合做日志存储
怎么样修改MySQL的存储引擎:
1>可以通过修改MySQL的配置文件my.ini文件的关键字是default-storage-engine = 所要修改的名称
2>可以通过创建表的时候 加上 engine = myisam
3>还可以通过sql语句的方式修改:alter table 表名 engine = 存储引擎名称;
下面都是以MySQL为例:
命名规范:
数据库的表和字段一定要有字段含义,方便表的字段的可读性和维护性
*数据库的基本操作(以MySQL为例):
修改数据库的字符编码:alter database 数据库名 character set = utf8;
*显示表users中字段的详细信息:
show columns from users;
多表更新例子:
update 第一张表 INNER JOIN 第二张表 on 第一张表的字段 = 第二张表的字段(on后面是字段值相同)
set 第二张表的某个字段 = 第一张表的某个字段
*把查询出来的数据插入到刚创建的表中
create table 表名(
id smallint unsigned primary key auto_increment;
username varcher(33) not null;
)
select 列名 from 表名 ;//查询出来的记录
/
*MySQL中的存储过程
定义:存储过程是SQL语句和控制语句的预编译集合,以一个名称存储,并作为一个单元处理。
存储过程的优点
1、增强了SQL语句的功能和灵活性
2、实现较快的执行速度
3、减少了网络流量
创建存储过程
1>创建没有参数的存储过程:
例子:创建一个不带参数的存储过程:CREATE PROCEDURE sp1() select version();
调用存储过程:
CALL sp1;或者 CALL sp1();
2>创建带有IN类型参数的存储过程
//根据指定id删除用户
DELIMITER //
CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = id ;
END
//
后面把定界符修改回来
//删除存储过程
DROP PROCEDURE removeUserById;
//查看已创建的存储过程的状态
show procedure status;
3>创建带有IN和OUT类型参数的存储过程
先修改定界符,然后创建存储过程
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO userNums;
END
//
调用存储过程:
CALL removeUserAndReturnUserNums(22,@nums);
@nums表示用户变量
4>创建带有多个OUT类型参数的存储过程:
同上
5>存储过程与自定义函数对的区别:
存储过程实现的功能更复杂一些;而函数的针对性更强
存储过程可以返回多个值;函数只能有一个返回值
存储过程一般都是独立的来执行的;而函数可以作为其他SQL语句的组成部分来出现
CREATE FUNCTION f1() RETURNS VACHAR(20)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
修改数据表(添加外键约束)
alter table 表名 add foreign key(需要添加的外键列名) references
另外一张的名称(另一张表需要关联的外键字段)
alter table 表名 add foreign key(需要添加的外键列名) references 表名(字段名)