本文已参与「新人创作礼」活动,一起开启掘金创作之路。
数据库
什么是数据库?简单来说,数据库即是专门用来存储数据,管理数据的仓库。
在接触到数据库之前,我们可能都是利用文件来存储数据的。在一些简单的业务逻辑中,使用文件来存储数据似乎也没有什么不好,但是随着所面临的需求越来越复杂,对安全,效率等要求也越来越高,使用简单的文件来存储便很难满足我们的需求了。
简单总结来说,文件保存数据有着以下四点不便之处:一、安全性问题;二、文件不利于数据的查询与管理;三、文件不利于存储海量数据;四、文件在程序中控制不方便。
由于以上四点以及种种其他原因,数据库,应运而生。
SQL语句
SQL(Structured Query Language),全称为结构化查询语言,是一种数据库查询和程序设计语言,主要用于存取数据以及查询、更新和管理关系数据库系统。
SQL语句大致可以分为以下四类:
1.DML数据操纵语言:如insert、delete、update,也即我们常说的增删改查四大技能的前三个。
2.DDL数据定义语言:主要以create为主。
3.DCL数据库控制语言:管理员才拥有权限使用的,用来设置或更改数据库用户或角色权限的语句。
4.DQL数据查询语言:即select,增删改查四大神功的最后一个,查。
与我们常用的C/C++等编程语言不同的是,SQL语句是不区分大小写的。
约束
所谓表的约束,真正约束字段的还是数据类型,但是数据类型的约束相比来说还是太过单一,比如有些时候我们需要某些数据需要在另一张表中找到对应,比如我们需要这个字段不能为空...实际的应用场景中我们的表与表之间不可能是松散的,互不相干的。例如我们写一个聊天软件,好友列表中不可能添加进用户列表中都没有注册的用户。在以上种种情况下,需要有一些额外的约束,更好的保证数据的合法性,以及数据在业务逻辑角度的正确性。
空属性
在数据库中,默认字段基本上都是字段为空(null),但是实际开发中,总有些情况下我们不希望某些字段为空,因为字段为空会导致某些运算无法进行。
于是,在设计数据表库的时候,我们可以在表中进行一些限制,使得满足某种条件的数据无法插入到表中,即是我们所说的“约束”。
比如,我们在定义某个存储人名的表的时候
create table name(person_name varchar(20) not null);
这样便使得添加的person_name不可以为空。
默认值
与C++中的缺省参数一样,我们可以在创建表的时候,给其中的某一种数据添加一个默认值,在数据插入时不给该字段赋值,就会使用默认值代替。不过数据库的默认值可没有C++中缺省参数的那么多规则。
create table name(person_name varchar(20) not null, sex char(2) default '男');
以上,在我们没有具体给出sex的值的时候,数据库会默认为其赋值为'男';
列描述
列描述说白了实际上就是注释,使用comment定义,并没有什么实际的含义,专门用来描述字段。
列描述无法通过desc看到,但可以通过show命令看到。
自增长
我们经常会碰到一些场景需要对插入数据库的数据进行连续的编号,如果每次添加新的数据都手动给数据输入编号,这显然不是一个好主意,因为这种连续的编号显然是一种系统本身就可以通过一些逻辑来帮我们做到的事情。于是,便有了自增长————auto_increment。
被设定为自增长的字段,再用户不给定值的情况下,系统会自动的给其赋予当前字段中已有的最大值加一的值,得到一个新的不同的值。
自增长常常与主键搭配在一起使用,作为逻辑主键。
自增长有着以下三种特点:
- 任何一个字段要做自增长,前提是它本身必须是一个索引。(关于索引,会在后续总结)
- 自增长字段的数据类型必须是整数。
- 一张表中最多只能有一个自增长。
还有一点需要注意的是,在MySQL中(因为我只使用过MySQL),设置为自增长的字段,如果用户手动录入的新记录对应位置的数据为0,系统可能会默认你传入的是null,从而做出自增长操作。
主键
主键(primary key)用来唯一约束字段中的数据,不能重复,不能为空,一张表中最多只能有一个主键。但是,一个主键可以同时约束多个字段,而多个字段作为的主键被称为复合主键,或联合主键。
主键是数据表中的唯一索引,比如我们在数据库中查询一个人时,通过姓名查询可能会查出很多人,但是通过身份证号查询,查到的人必定是唯一的。因为身份证号就是唯一的。
需要提醒一点,复合主键约束的情况下,作为复合主键的几个字段中,单独的字段里可以出现重复的数据,但是几个字段合在一起是唯一的。这种形容可能有些不形象,举个例子就是,在没有身份证号标识的情况下,我们可以将一个人的姓名、性别、身高等数种数据组合在一起作为一个主键约束,虽然可能会有人同名,但他们的性别可能不同,也有可能是身高不同……总之这些数据组合在一起后,恰巧可以保证我们在数据库中找到那个唯一的对象。
唯一键
有些时候,一张表往往有很多字段需要唯一性,但是一张表中只能有一个主键——唯一键便是用来解决多个字段需要唯一性约束的问题的。
唯一键允许为空,并且可以多个为空,空字段不参与唯一性的比较。
由于唯一键与主键都是约束字段的唯一性,所以往往会有人认为主键在一定程度上可以与唯一键画上等号。为了防止我自己在太多的知识点中将这些概念记混,我感觉还是有必要将主键与唯一键之间的区别总结一下。
- 主键是用作表中每一行的唯一标识符,唯一键是保证非主键的字段的唯一性。
- 主键不能接收null值,唯一键可以接受null值。
- 一张表中只能由一个主键,但是可以有多个唯一键。
- 定义主键时自动创建聚集索引,定义唯一键时生成非聚集索引。
- 主键支持自增长,唯一键不支持自增长。
一般来说,我们定义主键,更多的是为了其唯一标识性,看中的是其在索引在查找方向上的优势。而定义唯一键,则偏重于保证该字段信息在业务上不和其它信息重复。
外键
外键用于定义主表与从表之间的关系:外键约束主要定义在从表上,而主表则必须是拥有主键约束或唯一键约束的。当定义外键之后,外键列的数据必须在主键列中存在或者为null。
foreign key (字段名) references 主表(列)
以我们熟悉的聊天软件的添加好友功能为例:
用户表:create table user(id int primary key, name varchar(11) not null ......);(其中内容省略)
好友信息表:create table friend(name varchar(11) not null, friend_name varchar(11) not null, foreign key (name) references user(name), foreign key (friend_name) references user(name));
当我们在好友信息表中插入好友信息是,系统会确定我们要插入的信息是否存在于用户表也即主表的name列中,只有当确定存在时,才会成功插入。