一、数据库
1.1 数据库的安装
数据库的安装,见《MYSQL安装教程.doc》
MYSQL安装教程.doc
1.2 数据库(database)的介绍
顾名思义:存放数据的仓库,它的作用:可以将内存的数据,存储到文件中
将数据的状态由 可变的状态,变为 持久化状态
首先:没学数据库之前,我们的数据都是放在JVM的内存中。内存有一个特点:
一关机就没了,什么东西可让它持久?硬盘上的东西,一般都是持久的
所以,此时就需要让数据从内存中,可以迁移到硬盘的文件中去,变的可持久化
1.3 数据库的分类
1.3.1 关系型数据库(Relational Database):
关系型数据库:关注于数据和数据之间的关系,或者表和表之间的关系
常见:MYSQL Oracle SQLServer(微软) DB2(微软) pgSQL……
它的结构:表和表的结构
用法:需要编写SQL语句
存储:更多是以文件的方式来进行存储
1.3.2 非关系型数据库(NO Relational Database):
非关系型数据库:不关注于数据和数据之间的关系,它更看重数据的存储
常见:Redis Memcache HBase MongoDB……
它的结构:key - value
用法:不需要编写SQL语句
存储:更多的是以内存为主,文件为辅助的方法来存储
二、表(Table)
表:是专门用来放置数据的一种文件,例如:Excel表格
当然,我们也不会将所有的数据,都放置在同一个表格中,所以,以后可能存在很多的表格
2.1 表的结构
表中的数据以行和列的方式来进行存在
行:代表一条数据 —— 就是一个Java类的实例
列:代表的是那一条数据的某一个属性(字段)—— 就是那个实例的属性
2.2 SQL 结构化查询语言
结构化查询语言(Structured Query Language),它跟JAVA一样,同样是一种编程语言,只不过它是专门用来和关系型数据库进行交互的一种语言。
2.3 RDBMS(关系型数据库管理系统)
Relational Database Management System (关系型数据库管理系统)
这种管理系统的责任:负责对数据库中的表进行 数据的读写
我们现在常用的说法: 数据库 === RDBMS
也就是:MYSQL ORACLE DB2 SQLSERVER ……
存储引擎
RDBMS中提供了很多种操作表的方式,每一种不同的方式,都有独特的特点:
像MySQL中常见的存储引擎:InnoDB MyIsam
InnoDB : 支持事务 操作就很慢(1000W 耗时30分钟)
MyIsam : 不支持事务 操作就飞快(1000W,耗时6分钟)
2.4 MYSQL的使用
数据库的使用,需要定义SQL语句来完成操作。
SQL语句分为4类:
1、DDL 数据库定义语言 创建,修改,删除 数据库,表结构,存储过程,视图……
2、DML 数据库操作语言 新增,修改,删除 表中的数据……
3、DQL 数据库查询语言 查询 表中的数据……
4、DCL 数据库控制语言 创建用户,给用户授权……
SQL语句,不区分大小写!
**
2.5 数据库连接工具
Navicat、Sqlyog、Toad for mysql等
三、DDL
数据库定义语言 创建,修改,删除 数据库,表结构,存储过程,视图……
3.1 数据库的创建,修改,删除
3.1.1 创建库
创建(1)**:**
create database 数据库名称;
每一条语句,都需要使用 分号 结束,分号代表:那条语句结束
EG:
create database woniuxy;
默认采用:latin (拉丁字符集) 中文放进去,就会乱码!
创建(2):
create database 数据库名称 character set 'UTF8MB4'
UTF8 : 3个字节进行存储!
UTF8MB4 : 4个字节进行存储!(建议)
EG:
create database j75 character set 'utf8mb4';
3.1.2 显示所有的数据库
show databases;
显示所有由MYSQL管理的数据库;
修改数据库
3.1.3 修改库
改不了库的名字,但是可以改库的编码集!
alter database 数据库名称 character set 'utf8';
将woniuxy数据库的字符编码集,由latin修改为utf-8
EG:
alter database woniuxy character set 'utf8mb4';
3.1.4 删除数据库(遗弃)
删除数据库的语法:
drop database 数据库的名称;
删除j75数据库!
EG:
drop database j75;
3.2 表的创建,修改,删除
3.2.1 字段名
就是你们对象的属性,数据库中字段名的命名方式:
1、所有单词都小写,单词之间使用 _ 进行分割
2、如遇到一些关键字,需要作为字段名,需要使用 TAB键,上方的波浪键进行转义
3、见名知意
合法的例如:user_name login_name gender age pwd( == password)
3.2.2 数据类型
数值类型
日期和时间类型
字符串类型
注意:char 和 varcher 是常用的2种字符类型
char(10) 的特点:数据库需要提前在硬盘上 分配 10个字符的空间,不管10个字符的空间有没有内容,因为它是定长字符
varchar(10)的特点:有多少个字符就分配多少空间,但是最大空间不得超过10,因为它是可变长度的字符类型! 一个中文,占2个字节,一个英文,占1个字节
3.2.3 字段约束
约束:对字段的值做某些要求
主键约束:每个表中都需要有一列是唯一的,好比:你们的书,每一页都有一个唯一的页码。通常该列固定为:id列 用: Primary Key
非空约束:表示某一列的值,不能为NULL NULL、NOT NULL
唯一约束:表示某一列的值,不能重复 例如:登陆名 UNIQUE、KEY
自增约束:表示某一列的值,需要自动增长,但是只能放在数值列上 auto_increment
外键约束:表示某一列的值,可能是其他表的主键 foreign key
非负约束:表示某一列的值,不能是负数 unsigned
默认约束:表示某一列的值,可以有默认值 default
字段约束:[NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]] [PRIMARY KEY] [FOREIGN KEY] [UNSIGNED] [COMMENT ‘注释的内容’]
3.2.4 创建表
create table 表的表名 (字段列表); //字段列表:字段名 数据类型 字段约束
例如:商品表(id,商品的名称,商品的类型,商品的价格,商品的描述)
create table goods_info (
id bigint primary key auto_increment,
goods_name varchar(60) not null,
goods_type int not null,
goods_price decimal(10,2) unsigned not null,
goods_desc varchar(200) null
);
但是在使用上述命令之前,需要先选择 数据库
use 数据库的库名;
EG:
use woniuxy;
3.2.5 修改表
向已经存在的表中,新增一列
alter table 表的表名 add column 新的字段名 数据类型 [字段约束];
EG:
alter table goods_info add column made_day date comment '生产日期';
向已经存在的表中,删除一列
alter table 表的表名 drop 列的列名;
EG:
alter table goods_info drop made_day;
将表中已经存在的某些列,修改为新的列
alter table 表的表名 change 老字段 新字段 数据类型 [字段约束];
EG:
alter table goods_info change goods_type goods_type smallint unsigned;
3.2.6 删除表
drop table 表的表名;
EG:
drop table goods_info;
请记住:表的改动,代价很大(可能存在大量的数据,会受到影响),所以不要轻易的决定修改表的表结构,或者删除表
3.3 主键的要求
表中至少应该有1个主键,原因是我们要保证 实体的完整性
主键的特点:
1、不具备任何的业务含义
2、主键的内容一定不能改变(稳定性)
3、主键不是越多越好,有1-2就好 当然一般来讲都是只有1个
例如:
身份证能不作为主键?电话号码能不作为主键? 不能
3.3.1 实体的完整性
讲的是我们存入到数据库中的 每个Java实体都是完整,而且不重复的个体;
保证实体完整性的办法:
1、加主键k
2、在某些字段添加 唯一约束
3.3.2 列的完整性
将的是如何保证每一列都是具有一定的含义的,是完整,不是NULL的
保证列完整性的办法:
1、给列加非NULL约束
2、给列添加默认约束 比如:密码 默认值 123456
3.3.3数据库三大范式(面试题 + 后续设计数据库表的中心思想)
我们现在已经涉及到数据库的建表,建表怎么建?需要遵循一定的规则
设计数据库表时,需要遵从的规矩:三大范式
第一范式:列具有原子性,列一定要划分到不可划分(最小)为止
eg:收货地址(address) 四川省成都市高新区孵化园5号楼3楼301号
按照范式约定来讲:省 市 区 街道 详细地址
第二范式:表中所有列,都必须与主键有一定的关系 (建立在:遵循第一范式的基础上)
主键:代表的实体
第三范式:表中所有列,都必须与主键有直接相关(而不是间接相关) (建立在:遵循第一,二范式的基础上)
比如:能否将女朋友的名字,爸妈,建立在学生表的字段中?