关于关系型数据库的一些基本概念
程序员文章站
2024-03-08 08:35:03
...
一、数据库
1、数据库简介
- 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询(CURD)操作。
2、数据库管理系统
- 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
- 管理数据库操作系统的程序员叫做数据库管理员DBA(database administrator)
3、常见数据库管理系统
- MYSQL:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
- Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
- DB2:IBM公司的数据库产品,收费的。常应用在银行系统中.
- SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
- SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
- SQLite: 嵌入式的小型数据库,应用在手机端。
4、表
- 关系数据库表:是对应于一个关系模型的所有的关系的集合。它是一种以关系模式DAO为基础存储数据以及用数字方法处理数据库组织的方法,是目前最为流行的一种数据组织形式。
- 表:是指同一类记录的集合。
- 字段:对应实体的属性,也称做数据项。
- 元组:元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,在二维表里,元组也称为记录。
- 相互关系:一个数据库可以包含若干张表;一张表有若干个字段;每张表又有若干条记录(元组),每条记录(元组)对应每个字段都有一个值。
表与类的对应关系:
数据库 | 实体类 |
---|---|
表 | 对象 |
字段 | 属性 |
其中,一条记录(元组)就是对应一个对象。
5、视图
- 视图是一张虚拟表
- 表示一张表的部分数据或多张表的综合数据
- 其结构和数据是建立在对表的查询基础上
- 视图中不存放数据
- 数据存放在视图所引用的原始表中
- 一个原始表,根据不同用户的不同需求,可以创建不同的视图
视图的优点:
- 筛选表中的行
- 防止未经许可的用户访问敏感数据
- 降低数据库的复杂程度
- 将多个物理数据库抽象为一个逻辑数据库
6、索引
索引是一种有效组合数据的方式,为快速查找到指定记录。索引技术就是为了让数据库更快的定位一条数据所采用的一种查询性能优化技术。
MySQL索引按存储类型分类:B-树索引、哈希索引。
MySQL索引分类:
索引 | 说明 |
---|---|
普通索引 | 基本索引类型,允许在定义索引的列中插入重复值和空值 |
唯一索引 | 索引列数据不重复,允许有空值 |
主键索引 | 主键列中的每个值都是非空、唯一的,一个主键将自动创建主键索引 |
复合索引 | 将多个列组合作为索引 |
全文索引 | 支持值的全文查找,允许重复值和空值 |
空间索引 | 对空间数据类型的列建立的索引 |
二、SQL
1、SQL简介
结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
2、SQL语句分类
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象(结构):数据库,表,列等。关键字:create,alter,drop等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等。
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等。
3、SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾
- 可使用空格和缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 同样可以使用/**/的方式完成注释,也可以用 – 的形式完成注释
4、MySQL的数据类型
分类 | 类型名称 | 说明 |
---|---|---|
整数类型 | tinyInt | 很小的整数 |
smallint | 小的整数 | |
mediumint | 中等大小的整数 | |
int(integer) | 普通大小的整数 | |
小数类型 | float | 单精度浮点数 |
double | 双精度浮点数 | |
decimal(m,d) | 压缩严格的定点数 | |
日期类型 | year | YYYY1901~2155 |
time | HH:MM:SS-838:59:59~838:59:59 | |
date | YYYY-MM-DD 1000-01-01~9999-12-3 | |
datetime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59 | |
timestamp | YYYY-MM-DD HH:MM:SS 19700101 00:00:01 UTC~2038-01-19 03:14:07UTC | |
文本、二进制类型 | CHAR(M) | M为0~255之间的整数 |
VARCHAR(M) | M为0~65535之间的整数 | |
TINYBLOB | 允许长度0~255字节 | |
BLOB | 允许长度0~65535字节 | |
MEDIUMBLOB | 允许长度0~167772150字节 | |
LONGBLOB | 允许长度0~4294967295字节 | |
TINYTEXT | 允许长度0~255字节 | |
TEXT | 允许长度0~65535字节 | |
MEDIUMTEXT | 允许长度0~167772150字节 | |
LONGTEXT | 允许长度0~4294967295字节 | |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串 | |
BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
5、MySQL常用约束
约束就是对表或字段的限制,用来确保数据的完整性、唯一性。
1、主键约束(primary key)
主键约束列不允许重复,也不允许空值,相当于非空约束+唯一约束。每个表最多只能有一个主键。
-- 创建表时添加主键约束
create table person(
pid int primary key,
pname varchar(20)
);
-- 创建表时添加联合主键(多个字段组合)
create table grade(
pid int, /* 学生id */
cid int, /* 课程id */
score double,
primary key(pid, cid); /* 联合作为主键 */
)
-- 删除主键约束
alter table person drop primary key;
-- 创建表后添加主键
alter table grade add primary key(id, name);
-- 修改主键约束
alter table person modify pname varchar(20) primary key
2、外键约束(foreign key)
外键约束是保证表与表之间的参照完整性,外键是构建于主表和从表的两个字段之间的参照关系
-- 基本外键
-- 主表
create table worker(
wid int primary key,
name varchar(20)
);
-- 从表
create table salary(
sid int primary key,
smoney double,
foreign key(sid) references worker(wid)
);
-- 多列外键组合
-- 主表
create table student(
sid int,
sname varchar(32),
primary key(sid, sname)
);
-- 从表
create table grade(
sid int,
cid int,
score double,
foreign key(sid,cid) references student(sid,sname)
);
-- 删除外键约束
alter table student drop foreign key fk_student_score;
-- 增加外键约束
alter table grade add foreign key(sid, cid) reference student(sid, sname)
3、唯一约束(unique)
唯一约束是指定表的列或列组合不能重复,保证数据的唯一性。
唯一约束不允许出现重复的值,但是可以为多个null。
同一个表可以有多个唯一约束,多个列组合的约束。
在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
-- 创建表时添加唯一约束
create table uuser(
uid int not null,
uname varchar(20),
upassword varchar(20),
unique(pname,ppassword)
);
-- 创建表后添加唯一约束
alter table uuser add unique(uname,upassword)
-- 修改唯一约束
alter table uuser modify uname varchar(32) unique;
-- 删除唯一约束
alter table uuser drop index uname;
4、非空约束(not null)
非空约束用于确保当前列的值不为空值,强制列不接受null值,如果不向字段添加值,就无法插入新记录或者更新记录。
-- 创建表时添加为空约束
create table person(
pid int not null,
pname varchar(20)
);
-- 增加非空约束
alter table person modify pname varchar(20) not null;
-- 取消非空约束
alter table person modify pname varchar(20) null;
5、自增约束(auto_increment)
在每次插入新记录时,数据库自动生成字段的值。自增约束只能是整型值。
-- 创建表时添加自增约束
create table person(
pid int auto_increment,
pname varchar(32)
);
-- 取消自增约束
alter table person modify pid int;
-- 添加自增约束
alter table person modify pid int auto_crement;
-- 默认auto_incremnt的开始值是1,修改初始值
alter table person auto_increment=100
6、默认值约束(default)
添加一条记录前设置默认值,再添加时可以不用填写该值
-- 创建表时添加默认约束
create table person(
pid int primary key,
pname varchar(32) default '默认值'
);
-- 取消默认约束
alter table person alter column pname drop default; // 默认值独有方法,更快
alter table person modify pname varchar(32);
-- 添加默认约束
alter table person alter column pname set default '默认值';
alter table person modify pname varchar(32) default '默认值';