数据库简述(以MySQL为例)
一、数据库中的概念
1.数据库是用户存放数据、访问数据、操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中。可以随时被有权限的用户查询、统计、添加、删除和修改。可以说,数据库是长期存储在计算机内的,有组织、可共享的数据集合。
在实际使用中,数据库和应用程序的关系是:应用程序被用来向数据库请求数据、并显示结果,它可以向数据库发出操作和查询指令,数据库系统安装在数据库服务器上,数据库用来存储数据,数据库服务器向应用程序响应和提供数据。
另外,数据库系统成熟的标志是数据库管理系统的出现。
数据库管理系统(DataBase Managerment System,简称DBMS)是管理数据库的一个软件,它充当所有数据的知识库,并对它的存储、安全、一致性、并发操作、恢复和访问负责,是对数据库的一种完整和统一的管理和控制机制。数据库管理系统不仅让我们能够实现对数据的快速检索和维护,还为数据的安全性、完整性、并发控制和数据恢复提供了保证。数据库管理系统的核心是一个用来存储大量数据的数据库。DBMS是所有数据的知识库,并对数据的存储、安全、一致性、并发操作、恢复和访问负责。
DBMS有一个数据字典(有时被称为系统表),用于贮存它拥有的每个事物的相关信息,例如名字、结构、位置和类型,这种关于数据的数据也被称为元数据(metadata)。
一个真正的数据库系统由硬件和软件两个方面构成。比如,我们要使用Oracle数据库,需要安装Oracle公司提供的数据库服务器软件和一台用于安装数据库管理系统的高性能的计算机服务器。
当今应用最普遍的是关系型数据库管理系统。目前,市场上流行的几种大中型数据库,如Oracle、DB2、Sybase、MS SQL Server、MySql等都是关系型数据库管理系统。
2.关系模型数据库采用“表”组织数据(表称为“关系”),一个数据库由许多个表组成,多个表数据之间存在着关系,在这些表上的数据操作依赖于关系,关系用来描述多个表之间的数据依存,包括了一对一、一对多、多对多的关系。
数据库中的若干概念有:
(1)概念模型:它是基于客户的想法和观点所形成的认识和抽象。
(2)实体(Entity):指客观存在的、可以被描述的事物,例如员工、部门。
(3)属性(Attribute):用于描述实体所具有的特征或特性,如使用编号、姓名、工资等级等属性来描述员工的特征。
(4)关系(Relationship):指实体之间的联系,主要包括一对一、一对多和多对多的关系。
(5)数据模型:也叫关系模型,是实体、属性、关系在数据库中的具体体现。
(6)关系数据库:用于存储各种类型数据的”仓库”,是二维表的集合。
(7)表:实体的映射。
(8)行和列:行代表一个具体的实体的数据,也叫一条记录;列是属性的映射,用于描述实体的。
(9)主键和外键:主键(primary key)是能确定一条记录的唯一标识,比如,一个表里包括身份证号、姓名、年龄三个属性,其中,身份证号是可以唯一确定一条记录的,其他属性值都可能会有重复,所以身份证号是这个表的主键。外键(Foriegn Key)用于与另一张表的关联,是能确定另一张表中某条记录的字段,用于保持数据的一致性,比如,A表中的一个字段,是B表的主键,那么该字段还可以是A表的外键。
3.数据库中的数据最终还是存储在磁盘上的;数据库存在的意义在于能够高效地管理和操作数据。
我们平时听到数据库有大型、中型和小型之分,这是基于数据库在较大数据量时能否依然维持较高的操作效率来划分的。
我们接下来以一种开源的中型数据库MySQL为例,了解数据库的有关操作。默认情况下,在mysql中创建表时不指定表的存储引擎,则会使用配置文件my.ini中default-storage-engine=InnoDB作为存储引擎。
一般情况下,mysql的存储引擎有:
(1)MyISAM。应用于以读写操作为主,很少更新、删除,并对事务的完整性、并发性要求不高的情形。
(2)InnoDB。应用于对事务的完整性要求较高,在并发条件下要求数据的一致性的情形。InnoDB是mysql默认的存储引擎。
(3)MEMORY。表的数据存储在内存中,访问效率高,但是一旦服务关闭,表中的全部数据丢失。
(4)MERGE。是一组MyISAM表的组合,可以突破对单个MyISAM表大小的限制,并提高访问效率。
我们在创建表时,可以显式地指定表的存储引擎,如:create table (...)engine=MyISAM;
二、数据库操作
1.假定我们在电脑上(Win7OS)安装了MySQL数据库,然后可以通过在CMD窗口中输入net start mysql开启mysql服务,接着在电脑上安装navicat客户端来操作mysql。我们还可以在DOS窗口中以某个用户权限进入mysql(如:mysql -uroot -p 对应的密码)。
2.数据库中包含的对象主要有:
(1)表,table。基本的数据存储对象,以行和列的形式存在,列是字段,行是记录。
(2)约束,constraint。执行数据校验,保证数据完整性。大部分数据库支持这些完整性约束:NOT NULL非空,UNIQUE Key唯一键,PRIMARY KEY主键,FOREIGN KEY外键,Check 约束。创建约束的时机主要有两个,一个是在建表的同时创建,另一个是在建表后创建(修改表)。可以定义列级或表级约束,还可以有单列约束和多列约束。
(3)数据字典。就是系统表,存放数据库相关信息的表。
(4)视图,view。一个或者多个表数据的逻辑显示。
(5)索引,index。用于提高查询的性能。
3.SQL(Structured Query Language,结构化查询语言)是在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。
我们先普及下数据表的列类型:
数值型,分为整数和浮点数类型,整数类型有int等,浮点数类型有float、double、decimal等;
日期类型,有date、time、timestamp等;
字符串类型,有char(n)、varchar(n)、blob、text等。
在MySql数据库中,SQL语句主要可以划分为以下几类:
(1)DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作。包括:CREATE、DROP、ALTER、RENAME、 TRUNCATE等。例:
#查看有哪些数据库
show databases;
#创建一个数据库
create database itszt;
#使用一个数据库
use itszt;
#删除一个数据库
drop database itszt;
#创建一个表
create table user(id int primary key auto_increment,stuno varchar(8) unique,stuname varchar(12) not null);
#显示一个表的结构
desc user;
#向表中新增一列
alter table user add hobby varchar(10);
#改变表的名称
alter table user rename student;
#还可以这样改变表的名称
rename table user to student;
#清空表中所有的记录
truncate user;
(2)DML(Data Manipulation Language): 数据操作语言,定义对数据库中记录的操作。包括:INSERT、DELETE、UPDATE、SELECT等
#向表user中增加三条记录
insert into user(stuno,stuname) values('20170001','张三');
insert into user(stuno,stuname) values('20170002','李四');
insert into user(stuno,stuname) values('20170003','王五');
#删除表中的一条记录
delete from user where stuno='张三';
#更新表中的一条记录
update user set stuname='赵六' where stuno='20170003';
#查看表中的所有记录
select * from student;
#多表连接主要有交叉连接(笛卡尔积连接),内连接,自然连接,左外连接,右外连接,全外连接(同交叉连接),自连接
create table dept(dept_id char(3) primary key,dept_name varchar(7) not null,dept_addr varchar(50) not null);
create table emp(emp_id int primary key,emp_name varchar(7) not null,dept_id char(3),constraint foreign key dept_fk(dept_id) references dept(dept_id));
#交叉连接/全外连接
select * from emp cross join dept;
#内连接
select * from emp inner join dept on emp.dept_id=dept.dept_id;
#自然连接
select * from emp natural join dept;
#左外连接
select * from emp left join dept on emp.dept_id=dept.dept_id;
#右外连接
select * from emp right join dept on emp.dept_id=dept.dept_id;
#自连接
select * from dept d1,dept d12 where d1.dept_addr=e2.dept_addr and d1.dept_id<>d2.dept_id;
(3)DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别的操作。包括:GRANT、REVOKE等。
(4)Transaction Control:事务控制,包括:COMMIT、ROLLBACK、SAVEPOINT等。
事务的4个特性:原子性(atomic,确保事务中的所有操作要么都发生,要么都不发生),一致性(consistency,一个事务一旦结束,系统所处的状态和业务规则是一致的,确保数据不被破坏),隔离性(isolation,多个事务操作同一数据时,每个事务都有各自的完整数据空间),持久性(durability,一旦事务完成,事务的结果应该持久化)。
数据库管理系统通过采用重执行日志确保事务的原子性、一致性和持久性,采用锁机制来实现隔离性。
#mysql默认事务自动提交;为此,先将自动提交设置为手动提交
set autocommit=false;
#开启事务
start transaction;
begin;
#向user表中插入两条记录
insert into user(stuno,stuname) values('20170004','(●—●)');
insert into user(stuno,stuname) values('20170005','小白');
#回归
rollback;
#更新数据并设置保存点
update user set stuname='韦小宝' where stuno='20170004';
#设置保存点
savepoint a1;
update user set stuname='小玄子' where stuno='20170005';
#回滚至保存点
rollback to a1;
#执行事务
commit;
4.触发器,trigger。
#先创建两个表作为演示用,一个是仓储表,另一个是销售表;销售出去一件产品,则仓储中该产品就会减少一件
create table store(storeid int(5) primary key ,storename varchar(20),storenum int(10));
insert into store(storename,storenum) values('小米6' 5000);
insert into store(storename,storenum) values('iphone6' 5000);
create table sale(orderid int(5) primary key auto_increment,ordername varchar(20),ordernum int(10),storeid int(5) references store(storeid));
#创建触发器
create trigger tg1 after insert on sale for each row
begin
update store set storenum=storenum-sale.ordernum where storeid=sale.storeid;
end;
5.存储过程。
#创建一个存储过程,该存储过程实现查询user表中的所有记录
create procedure go()
begin
select * from user;
end;
#调用存储过程go(),相当于执行select * from user;
call go();
#注:存储过程go()的()中可以传入参数,而且语句块可以更为复杂些
create procedure go2(num int(5))
begin
declare temp integer;
declare total integer;
set temp=1;
set total=1;
while temp<=num do
set total=total+temp;
set temp=temp+1;
end while;
select total;
end;
#调用存储过程,并传入参数
call go2(100);
6.自定义函数。
函数与存储过程的重要不同之处在于,函数可以有返回值。
#模仿go2(),创建一个函数go3(),并返回一个整型变量
create function go3(num int(5)) returns int
begin
declare temp integer;
declare total integer;
set temp=1;
set total=1;
while temp<=num do
set total=total+temp;
set temp=temp+1;
end while;
return total;
end;
#由于函数有返回值,所以直接通过select调用函数的返回值即可
select go3(100);
三、数据库设计
切记,数据库设计三范式:
第一范式:表不可再分割,即"表中不能再有表";
第二范式:主键必须全部依赖,不能部分依赖;
第三范式:主键不能传递依赖。
1.良好的数据库设计,应该遵循这样三个原则:
(1)节省数据的存储空间;
(2)能够保证数据的完整性;
(3)方便进行数据库应用系统的开发。
2.一般来说,一个软件项目开发周期,包括这样几个阶段:
(1)需求分析阶段。分析客户的业务和数据处理需求。
(2)概要设计阶段。设计数据库的E-R模型图(概念模型),确认需求信息的正确和完整。
(3)详细设计阶段。将E-R图转换为多张表(物理模型),进行逻辑设计,并应用数据库设计的三大范式进行审核。
(4)代码编写阶段。选择具体数据库进行物理实现,并编写代码实现前端应用。
(5)软件测试阶段。
(6)安装部署。