思维导图
导学
运行中的程序,其相关的运行期间数据是存储在内存中的。程序一旦关闭,内存中的数据在程序关闭后就会被清理掉。比如在之前的JavaWeb学习中,我们发现有很多的数据我们都是存储在服务器对象中的,一旦服务器重启或者关闭,这些数据就会消失。
但是,我们的类似用户数据要放置在持久化介质中,那么这些数据我们想要持久化保存下来,需要如何处理呢?这个时候就需要使用到无论在哪种开发中都非常重要的数据库了。
数据库简介
什么是数据库
数据库-电子化的文件柜
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。
数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:
- 数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。
- 数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。
常用数据库
- Oracle
- DB2(IBM)
- SQL Server(微软)
- Postgre SQL
- MySQL
MySQL数据库
MySQL是一个关系型数据库管理系统(这种所谓的"关系型"可以理解为"表格"的概念,,一个关系型数据库由一个或数个表格组成,表与表之间可以通过主键与外键建立关系。),由瑞典MySQL AB 公司开发,属于Oracle旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码,免费的软件,因此可以大大降低总体拥有成本。
MySQL数据库是我们今后将要学习的主要数据库。
MySQL术语
大多数时候,我们所讲的数据库,其实指的是数据库系统。
接下来,我们来看看数据库系统的主要结构:
数据库系统(Database System):DBS
- 数据库(Database)
- 数据库管理系统(Database Managerment System):DBMS
主要是用来定义数据管理和维护数据的脚手架 - 应用开发工具
- 管理员及用户
对于数据库管理而言,我们主要是通过SQL语言进行管理,它并不是MySQL所独有的。每个不同品牌的数据库都有这类语言进行数据管理,这些SQL语言其实都是大同小异的,学习MySQL中的SQL语言后,能够很快的上手其他种类的SQL语言。
SQL语言(Structured Query Language)是一门结构化查询语言,以下是其包含的语言种类:
- DDL 数据定义语言 (定义数据库、表、视图、索引、触发器等)
- DML 数据操作语言 (数据增删改)
- DQL 数据查询语言 (数据查询)
- DCL 数据控制语言 (权限设置)
其实学习数据库,主要是学习数据库语言的使用。
数据库登录退出常用命令
SQL语句语法规范:
- 常用MySQL的关键字需要大写(小写也支持),库名、表名、字段等使用小写
- SQL语句支持折行操作,拆分时不能把完整的单词拆开
- 数据库名称、表名称、字段名称不要使用MySQL的保留字,如果必须使用,需要使用反引号’'将其括起来
创建和管理数据库
数据表及相关操作
数据表-用于保存数据
- 数据表是数据库最重要的组成部分之一,数据保存在数据表中。说mysql是关系型数据库的原因是表和表之间存在关系。
- 数据表由行(row)和列(column)来组成。
- 每个数据表中至少有一列,行可以有零行、一行或多行来组成。
- 表名要求唯一,不要包含特殊字符,最好含义明确。
创建表
CREATE TABLE IF NOT EXISTS tbl_name(
字段名称 字段类型[完整性约束条件],
字段名称 字段类型[完整性约束条件],
. . .
)ENGINE=存储引擎 CHARSET=编码方式;
表的字段类型
- 数值型
整数、浮点数、定点数 - 字符串类型
- 时间日期类型
MySQL常用数据类型
数值型
整型
其中布尔型等价于TINYINT(1),0为false,其余为true。
TINYINT(1),中的1的意思是值存入的数据的长度为1。不是数据的大小。
在mysql中没有专门的布尔类型,但是在实际的开发中我们通常有这样的需求,此时一般的处理方式就是在数据库中存储数字,不同的数字表示不同的状态。
以后在数据库设计时,遇到表示状态或者是标识的字段,就可以用不同的数字来进行区分
浮点型
对于decimal类型的数据,我们称之为定点数,浮点数的计算存在一定误差,使用decimal类型可以提高计算精度,常用于银行业务和工资,价格等数据的存储。
MySQL 是支持所有标准 SQL 中的数值类型。在绝大多数的应用程序中,我们使用 INT 和 DECIMAL 类型就可以了。
字符串类型
一般最常使用 VARCHAR(可变长度)、CHAR(定长)、TEXT(长文本类型,例如博客文章等数据),其他不常用的还有 LONGTEXT、TINYTEXT等等。
VARCHAR 和 CHAR 的区别:例如 VARCHAR 定义的长度为 200,在使用的时候是存储了 4 个字符长度的字符串,那么在数据库中只会占用 4 个字符的数据空间,CHAR 是定长,无论存储多少数据,在数据空间中都会占用到定义的长度。
日期型
一般使用 DATETIME (用日期和时间构成)、DATE(只是表示日期),其他不常用的还有 TIME 、YEAR等等。
二进制数据的存放
在数据中,我们一般不会去存储类似照片、视频这样的二进制文件,而是把这些文件在服务器中的访问地址用字符串类型的数据进行存储。
在定义数据库字段名称时,由于数据库不区分大小写,所以,一般碰到了多个单词,我们用_分隔
案例:建表
-- 创建用户表所在库
CREATE DATABASE IF NOT EXISTS dodoke DEFAULT CHARACTER SET 'UTF8';
-- 打开dodoke
USE dodoke;
-- 用户表 dodoke_user
CREATE TABLE IF NOT EXISTS dodoke_user(
id INT,
username VARCHAR(20),
password CHAR(32),
email VARCHAR(50),
age TINYINT,
card CHAR(18),
tel CHAR(11),
salary FLOAT(8,2),
married TINYINT(1),
addr VARCHAR(100),
sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;
-- 查看当前数据库下的数据表
SHOW TABLES;
-- 查看dodoke_user表的详细信息
SHOW CREATE TABLE dodoke_user;
-- 通过三种方式查看指定数据表的表结构
SHOW COLUMNS FROM dodoke_user;
DESC dodoke_user;
DESCRIBE dodoke_user;
-- 最后删除dodoke_user数据表
DROP TABLE dodoke_user;
完整型约束
在一个完整的表中,是需要对表中的字段进行相关约束的。
使用约束主要是为了保证数据表中数据的合法性以及相对完整性。
约束类型包括:
- 主键约束(PRIMARY KEY:PK):唯一的确定在数据表中的记录,而且主键约束是不能为空的,我们一般使用没有业务含义的字段去进行主键定义,在MySQL中可以使用自增长类型的主键或者可以使用 UUID 。一个表只能有一个主键。
- 非空约束(NOT NULL)
- 默认值(DEFAULT)
- 唯一约束(UNIQUE KEY:UK):在一个表中可以有多个字段是唯一的
- 外键约束(FOREIGN KEY:FK)
- 自增约束(AUTO_INCREMENT):只能用于数值列,而且配合索引使用
- 正数约束(UNSIGNED):将对应字段下的值定义为正数,不建议使用,可能会给程序计算带来一定的异常!
- 零填充:(ZEROFILL):在数值前自动填充0,建议在后端代码中完善格式化,不建议数据库格式化!
-- 创建表的语句
CREATE TABLE student_info1 (
id INT AUTO_INCREMENT PRIMARY KEY,
-- 建立非空和唯一性 约束
code CHAR(2) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL DEFAULT 'zhangsan',
age INT(12) NOT NULL,
weight DECIMAL(10, 2),
birthday DATE NOT NULL,
in_school DATETIME NOT NULL,
description TEXT
)
CREATE TABLE student_account1 (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
account VARCHAR(20),
password VARCHAR(20),
-- 设置本表的student_id字段作为外键,关联到父表的主键字段id
CONSTRAINT FK_SI_SA_01 FOREIGN KEY (student_id) REFERENCES student_info1(id)
)
外键的使用条件:
- 两个表必须是InnoDB表,MyISAM表暂时不支持外键
- 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
- 外键字段是依赖于已存在表的一个主键(一般是主键),所以一定要先有主表。
- 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:
可以使得两张表关联,保证数据的一致性和实现一些级联操作。
在建立了外键关系的两个表中,一般是子表通过某个字段引用主表的主键数据。如果父表中有与子表相关联的记录,不能更新或删除父表中的相关联的记录,同样要删除主表(父表),需要先删除子表。如果要去对外键数据进行处理,一般我们会先解除外键关系,然后对数据处理后再加上。
动态删除与添加外键:
-- 动态删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 动态添加外键
ALTER TABLE 表名 ADD [CONSTRAINT 外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段);
-- 动态添加外键之前表中的记录一定是合法的记录,没有脏值(不符合外键对应主表中字段包含的值),否则外键添加不会成功
外键的约束操作
- CASCADE:从父表进行删除或更新,子表也跟着删除或更新,级联的操作
- SET NULL:从父表删除或更新记录,并且设置子表的外键列为NULL
- NO ACTION|RESTRIC:拒绝对父表做更新或删除操作
ALTER TABLE 表名 ADD [CONSTRAINT 外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段)
ON DELETE CASCADE ON UPDATE CASCDE;