什么是数据库
数据库是指集中起来经计算机加工后可以高效访问的数据集合,称为DataBase(DB)。平时常说的Mysql,Oracle,Postgresql数据库其实是对数据进行管理的软件,称为DBMS(DataBase Management System)。
为什么需要数据库
理由如下:
① 方便多人协同
如果使用文本文件来保存数据,特定时刻只能一个用户打开编辑,无法共享。
② 提高开发者效率,降低代码耦合性
开发者通过数据库软件提供的接口来操控数据,无需自行编写代码,不用关心数据是如何存储的。
③ 更好管理数据
数据集中起来更易管理,提高了安全性、易用性。
数据库软件的分类
数据库按照数据结构来组织、存储和管理数据,实际上,数据库分为下列五种类型:
- 层次数据库
- 关系数据库
- 面向对象数据库(OODB)
- XML数据库
- 键值数据库
下文只介绍关系型数据库(RDBMS)。
SQL
SQL全名是结构化查询语言。用户使用它来与RDBMS进行沟通。SQL语句分为如下三类:
- DDL(数据定义语言)
创建或删除或修改数据库以及数据库中的表等对象。 - DML(数据操纵语言)
查询或变更表中的记录。 - DCL(数据控制语言)
确认或取消对数据库中数据的变更,对用户权限的设置。
SQL书写规则
①语句以英文分号;结尾
②SQL不区分关键字、表名、列名的大小写,通常写法为关键字大写,表名首字母大写,其余(列名)小写。注意:表中的数据区分大小写。
③SQL语句中直接书写的日期、字符串需要用单引号括起来,而数字不需要。
④SQL语句单词间需要换行符或者英文半角状态下空格分隔。
RDBMS的系统结构
构建RDBMS的常用架构为C/S结构,即客户端/服务器结构。
其基本结构是:
客户端通过SQL语句向服务器端发起请求,服务器端收到请求并从数据库中获取数据,然后通过二维表的形式返回给客户端。
客户端和服务器端可以安装在不同的主机上,通过网络实现多个客户端访问一个服务器端。
RDBMS中的表
关系数据库通过二维表来管理数据,简称为表。
表的每一行称为一条记录,每一列称为一个字段。
关系数据库必须以行为单位进行数据读写
表、数据库、列名称只能用半角英文字母开头,只能由数字,下划线,英文字母组成。
字段的数据类型可以是整型,字符串,日期,浮点型,可以通过添加约束来对字段中的数据进行限制。例如字段不能为空,可设置为NOT NULL。所有列都必须指定数据类型。
表与表的关系可以分为“一对一”,“一对多”,“多对一”,“多对多”四种关系,这样才能够按照应用程序的逻辑来组织和存储数据。这三种关系是通过“主键”和“外键”来进行维护的。
主键
主键:能够唯一区分出两条不同记录的某个字段,并且要求主键与业务无关,即主键默认不要更改,因为它是用来唯一定位记录的字段。主键不能为空。
由于主键的作用十分重要,如何选取主键会对业务开发产生重要影响。如果我们以学生的身份证号作为主键,似乎能唯一定位记录。然而,身份证号也是一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不修改的时候,就会对业务产生严重影响。
所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。
因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。
作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:
自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
对于大部分应用来说,通常自增类型的主键就能满足需求。
外键
关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
多对多关系是通过一个中间表来实现的,设置外键会降低应用程序的性能。
SQL语句
CREATE DATABASE shop; -- 创建数据库shop
CREATE TABLE Product -- 创建表product
(product_id CHAR(4) NOT NULL, -- 定义字段 包括数据类型和约束
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id)); -- 最后定义主键约束
DROP TABLE Product; -- 永久删除表product
ALTER TABLE Product RENAME TO Goods; -- 重命名表名为Goods
ALTER TABLE Product ADD COLUMN purchase_price INTEGER; -- 向表中添加列
ALTER TABLE Product DROP COLUMN purchase_price; -- 删除刚才添加的列
BEGIN TRANSACTION; --开始插入记录的指令
INSERT INTO Product VALUES('0001','帽子','衣服',100,'2019-9-21'); -- 插入一条记录
参考
廖雪峰的SQL教程
《SQL基础教程》