数据库基础
前端 得到用户输入的数据、渲染数据库中的数据。展示、收集数据。
后端 处理从前端获取到的数据,保存到数据库中。中转、处理数据。
数据库 永久保存数据。保存数据到硬盘。
数据和信息
Data数据
1、任何描述事物的文字或符号都可以称为数据。
2、软件开发就是为了收集数据,从中筛选出有用的信息。
3、信息就是经过分析筛选后的数据。
4、数据需要保存,保存的介质有内存和硬盘。
-
内存中的数据是临时的,随着软件或系统的关闭,数据也会消失。
-
硬盘中的数据是永久的,就算系统关闭,数据依然保留。
- excel等文件保存数据就是一种保存到硬盘中的途径。
5、如果需要大量数据的保存,文件系统就不再方便。
6、使用一个系统化的数据仓库才能高效地管理数据。
数据库
DataBase,称为数据库,简称为DB
运行在操作系统上,按照一定的数据结构,保存数据的仓库。是一个电子化的文件柜。
数据永久保存在硬盘中。
数据库管理系统
DataBase Manager System,简称DBMS
通常所说的数据库,其实是指数据库管理系统,如MySQL、SQLServer、Oracle等,
是一种操作和管理数据库的大型软件,用来创建、使用和维护数据库。
总结
-
数据Data是一个软件的根本。数据要永久地保存到数据库中。
-
数据库DB是一个运行在操作系统上的软件。
-
数据库管理系统DBMS是管理数据库的一个软件。
-
学习数据库就是学习如何使用DBMS创建、使用数据仓库来管理数据。
常见的数据库管理系统
关系型数据库
关系型数据库是主流的数据库类型。
数据通过行row和列column的形式(表格)保存。
每行称为一条记录。
每列称为一个字段
字段通常为Java中某个实体类的属性,通过这个类创建的对象,就是一条记录
class Student{
Integer id;
String name;
String major;
}
class Main{
public static void main(String[] args){
Student s1 = new Student();
s1.id=1001; s1.name="小王";
s1.major="计算机";
}
}
如上代码中,Student类对应学生表,其中的属性对应表中的字段。创建的对象s1对应表中的一条记录。
关系型数据库中,数据表之间进行关联,能快速查询想要的数据。
优点:
1、易于维护:数据都是以表的结构保存,格式一致
2、使用方便:SQL语句通用,可以用于不同的关系型数据库
3、支持复杂查询:可以通过SQL语句在多个表之间进行关联查询
缺点:
1、读写性能由硬盘的读写速度相关。
2、海量数据处理时,如果要频繁读写,效率变低
3、表结构不易改动,灵活度欠佳
非关系型数据库
数据通过对象的形式保存,对象可以是一个键值对、文档、图片等。
特点:
1、保存数据的格式多样
2、数据保存在内存中,对于海量数据的读写性能高
3、不支持复杂查询
MySQL8.x的安装和使用
1.下载
https://www.mysql.com/
- 安装
一直下一步直到,
输入密码:
.
- 使用
之后可以使用图形化界面方便操作。但最好了解纯命令行的形式使用MySQL。因为最终项目运行在Linux服务器上,无法使用图形界面。
在安装目录的bin文件夹中,输入cmd进入控制台。默认安装目录为C:\Program Files\MySQL\MySQL Server 8.0
常用指令
-
show databases; 查看所有的数据库
-
use数据库名; 进入指定数据库
-
show tables; 在某个数据库中,查看其中的所有表
-
create database数据库名;创建指定数据库
-
drop database 数据库名**;** 删除指定数据库
数据库管理系统图形化管理工具
如果只是使用控制台操作数据库系统很不方便,所以在windows下有很多图形化的管理工具。
如navicat、datagrip、sqlyog等。
Navicat的使用
创建mysql连接
点击后输入密码
等待创建连接成功后,双击连接表示进入mysql:
创建数据库
在连接上右键,点击新建数据库,只需填写数据库名
切换数据库
双击对应的数据库,表示"use 数据库"名指令
删除数据库
在对应的库上右键删除数据库
### 创建数据表
在展开后的数据库中,在表的选项上右键新建表
保存时输入表名
建表时注意
-
由于MySQL大小写不敏感,数据库名、表名、字段名全部使用小写字母,多个单词之间用下划线_隔开
-
数据类型和所占长度根据实际情况选择
-
如果某列数据必须要填写,将"不是null"勾选
-
如果某个字段有默认值,可以在设计表的时候设置
-
每张表通常会设置一个编号"id"列,将其设置为主键。目的是为了区分每条记录。主键列中的数据不能重复,通常还会将主键列设置为整型,自增。
-
最好加上注释
数据的完整性
-
数据完整性是指数据精确可靠,不能保存无意义或无效的数据。
- 如不合理的年龄性别、全部为空的记录、重复记录等。
-
为了保证保存在数据库中的数据是完整数据,就要在设计数据表的时候添加一些约束或字段特征来保证数据完整性。
MySQL中常见的数据类型
整型 | ||
---|---|---|
tinyint | 对应Java中的short | 短整型 |
int | 对应Java中的int | 整型 |
bigint | 对应Java中的long | 长整型 |
浮点型 | ||
---|---|---|
float | 对应Java中的float | 单精度浮点型 |
double | 对应Java中的double | 双精度浮点型 |
decimal(宽度,精度) | 指定保留的小数位数和整体宽度 | 如decimal(4,2) 如3.14159 --> 3.14 |
字符串 | ||
---|---|---|
char(大小) | 定长字符串 | 对应Java中的String。char(10)表示就算实际保存4个字符,也占10个长度。 |
varchar(大小) | 可变字符串 | 对应Java中的String。varchar(10)表示如果实际保存4个字符,占4个长度。 |
text | 文本 | 字符串长度过大时使用 |
日期 | ||
---|---|---|
date | 日期 | yyyy-MM-dd |
time | 时间 | HH:mm:ss |
datetime | 日期时间 | yyyy-MM-dd HH:mm:ss |
timestamp | 时间戳 | 保存日期的毫秒数 |
约束
非空约束
-
关键字:null
-
不写或设置null表示允许为空
-
not null表示不能为空
-
用于控制某个字段能否为null
主键约束
-
关键字:primary
-
主键primary key:也称为主关键字、主码。用于区分表中的每条记录。如果有现成的字段可以区分
-
每条记录时,将该字段设置为主键,如身份证号、学号等;如果没有现成的字段可以区分每条记录时,通常会额外添加一个id字段设置为主键。
-
通常一张表中只选择一个字段作为主键
唯一约束
-
关键字:unique
-
用于控制该字段不能重复
-
可以在建表的时候设置唯一约束的字段
默认值约束
-
关键字:default
-
用于添加记录时,可以自动填充一个默认值
外键约束
-
关键字:foreign key / references
-
在主从关系的表中,给从表中的某个字段添加外键约束,引用主表中的某个字段。这样从表中的外键字段的值只能来自于主表中。
- 如学院表为主表,学生表为从表,学生表中的学院编号只能来自于学院表中的学院编号
SQL
SQL:Structrued Query Language 结构化查询语言
用于操作关系型数据库的一门语言。可以用来创建、维护数据库和数据
操作数据库
1、创建数据库
create database 数据库名;
2、切换数据库
use 数据库名;
3、删除数据库
drop database 数据库名;
操作数据表
1、创建数据表
create table 表名(
字段名1 数据类型 [字段特征],
字段名2 数据类型 [字段特征],
...
字段名n 数据类型 [字段特征],
)
2、修改数据表
修改表时,要保证不影响现有数据
- 对表重命名
alter table 旧表名 rename to 新表名;
- 添加字段
alter table 表名 add column 字段名 数据类型 [字段特征];
- 修改字段
alter table 表名 change 旧字段名 新字段名 数据类型 [字段特征];
- 删除字段
alter table 表名 drop 字段名;
3、添加约束
- 添加唯一约束
alter table 表名 add unique(字段名);
- 添加主键约束
alter table 表名 add primary key(字段名);
- 添加默认值约束
alter table 表名 alter 字段名 set default '默认值';
- 添加外键约束
alter table 从表表名 add foreign key(从表外键字段) references 主表表名(主表字段)
添加约束的操作通常是对已存在的表进行修改和维护时使用。如果是一张新表,最好在设计表的时候就设计好约束。
4、 删除数据表
drop table 表名;
如果要删除有外键关联的表。先删除从表,再删除主表
5、创建表的同时添加约束
-- 建表的同时添加约束
-- 创建hero表,包含
create table hero(
-- 编号id 非空 主键 自增 注释
id int not null primary key auto_increment comment '编号',
-- 姓名name 非空 唯一
name varchar(20) not null unique comment '姓名',
-- 性别sex 非空 默认 男
sex char(1) not null default '男' comment '性别',
-- 价格price 非空
price int not null comment '价格',
-- 上架时间create_date 可以为空
create_date date comment '上架时间',
-- 定位position
position varchar(20) comment '定位'
)
-- 创建从表battle表,包含
create table battle(
-- 人物编号no 非空
no int not null comment '人物编号',
-- 分路 非空
way varchar(20) not null comment '分路',
-- 外键 no引用hero表中的编号字段id
foreign key(no) references hero(id)
)
练习
1、单表创建练习
- 创建新库,创建员工表employee
- 编号emp_no,主键,自增,非空
- 姓名emp_name,非空
- 联系方式emp_phone,非空
- 入职时间join_date,非空
- 部门dept,非空
- 工资salary,非空
- 邮箱email,可以为空
create database employee;
-- 创建新库,创建员工表employee
create table employee(
-- 编号emp_no,主键,自增,非空
emp_no int not null primary key auto_increment comment '编号',
-- 姓名emp_name,非空
emp_name varchar(20) not null comment '姓名',
-- 联系方式emp_phone,非空
emp_phone char(15) not null comment '联系方式',
-- 入职时间join_date,非空
join_date date not null comment '入职时间',
-- 部门dept,非空
dept varchar(20) not null comment '部门',
-- 工资salary,非空
salary double not null comment '工资',
-- 邮箱email,可以为空
email varchar(30) comment '邮箱'
)
2、从表创建练习
- 创建图书数据库db_book
- 创建图书类型表book_type
- 类型编号type_id,主键,非空,自增
- 类型名称type_name,非空,唯一
- 创建图书详情表book_info
- 图书编号book_id 主键 自增 非空
- 图书名称book_name 非空
- 图书作者book_author 默认 ‘佚名’
- 出版时间publish_date
- 图书价格book_price 非空
- 图书类型type_id 外键 关联图书类型表中的类型编号
-- 创建图书数据库db_book
create database db_book;
use db_book;
-- 创建图书类型表book_type
create table book_type(
-- 类型编号type_id,主键,非空,自增
type_id int not null primary key auto_increment comment '类型编号',
-- 类型名称type_name,非空,唯一
type_name varchar(20) not null comment '类型名称'
)
-- 创建图书详情表book_info
create table book_info(
-- 图书编号book_id 主键 自增 非空
book_id int not null primary key auto_increment comment '图书编号',
-- 图书名称book_name 非空
book_name varchar(20) not null comment '图书名称',
-- 图书作者book_author 默认 '佚名'
book_author varchar(20) default '佚名' comment '图书作者',
-- 出版时间publish_date
publish_date date comment '出版时间',
-- 图书价格book_price 非空
book_price double not null comment '图书价格',
-- 图书类型type_id 外键 关联图书类型表中的类型编号
type_id int comment '图书类型',
foreign key(type_id) references book_type(type_id)
)