数据库的作用
- 更有效地管理数据
- 数据持久化
- 可以通过Java语言操作数据库
数据库的安装和配置
mysql5.7(免费、稳定)
下载地址:MySQL :: Download MySQL Community Server
-
特别说明:
如果安装过程中出错了,可以使用指令
sc delete mysql
删除已经只能装好的mysql服务 -
安装步骤:
- 较为复杂,推荐安装教程:Windows安装MySQL5.7教程 - 剑道子羽 - 博客园 (cnblogs.com)
命令行连接MySQL
-
连接MySQL服务的指令
mysql -h 主机IP -P 端口 -u 用户名 -p密码
- -p密码之间没有空格
- 如果没有-h 主机,默认连接本地
- 如果没有写-P端口,默认是3306
- 实际工作中,一般不用3306端口
Navicat安装和使用
Navicat是收费软件,可以试用15天
官网:Navicat | 支持 MySQL、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理
试用期结束后八仙过海,各显神通
-
使用:
- 新建连接
- 本机地址:127.0.0.1
- 端口:一般为3306
- 新建库、表、字段
同类型软件:SQLyog(免费)
数据库三层结构
所谓安装MySQL数据库,就是在主机安装一个数据库管理系统(DBMS,database manage system),这个管理程序可以管理多个数据库。
一个数据库中可以创建多个表,以保存数据(信息)。
数据库管理系统、数据库和表的关系如图所示:
- Mysql数据库-普通表的本质依然是文件
数据在数据库表中的存储方式
- 列(column)称为字段
- 行(row)称为记录,在java中,往往使用一个对象表示
SQL语句分类
-
DDL:数据定义语句[create 表、库]
DML:数据操作语句[增加insert,修改update,删除delete]
DQL:数据查询语句[select]
DCL:数据控制语句[管理数据库:用户权限grant revoke]
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification[,create_specification]...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
CHARACTER SET指定数据库采用的字符集,如果不指定字符集,默认utf8
-
COLLATE:指定数据库字符集的校对规则(常用的utf8_bin[区分大小写]、utf8_general_ci[不区分大小写、默认])
# 删除数据库 # DROP DATABASE db # 字符集为utf8,校对规则为utf8_bin # 对于表而言,如果没有指定字符集和校对规则,那么就默认为数据库的字符集和校对规则 CREATE DATABASE db CHARACTER SET utf8 COLLATE utf8_bin # *指所有字段,FROM指从哪个表查,WHERE 从哪个字段查 # SELECT * # FROM t1 # WHERE NAME = 'tom'
查看、删除数据库
- 显示数据库语句:
SHOW DATABASE
- 显示数据库创建语句:
SHOW CREATE DATABASE db
- 数据库删除语句(慎用):
DROP DATABASE [IF EXISTS] db
- 在创建数据库、表时,为了规避关键字,可以使用反引号解决:`CREATE`
备份、恢复数据库
-
备份数据库(命令行)
mysqldump -u 用户名 -p密码 -B 数据库1 数据库2 ... > 文件名.sql
-
恢复数据库(进入Mysql命令行执行)
SOURCE 文件名.sql(全路径)
也可以用Navicat备份
-
备份库的表
mysqldump -u 用户名 -p密码 数据库 表1 表2 ... > 文件名.sql
创建表
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype
)CHARACTER SET 字符集 COLLATE 校对规则 ENGINE 引擎
- field:指定列名
- datatype:指定字段类型
- 字符集和校对规则不指定则均默认和数据库一致
- engine:内容较多,见后文
- 注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
CREATE TABLE `user` (
id INT,
`name` VARCHAR(255),
`birthday` DATE
)CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;
列类型(数据类型)
分类 | 数据类型 | 说明 |
---|---|---|
数值类型 | BIT(M) | 位类型,M指定位数,默认值1,范围1-64 |
数值类型 | TINYINT[UNSIGNED] | 占1个字节,带符号的范围是-128到127,无符号0到255.默认有符号 |
数值类型 | SMALLINT[UNSIGNED] | 占2个字节,带符号是-2^15到2^15-1,无符号0到2^16-1 |
数值类型 | MEDIUMINT[UNSIGNED] | 占3个字节,有符号:-2^23~2^23-1,无符号:0~2^24-1 |
数值类型 | INT[UNSIGNED] | 占4个字节,有符号:-2^31~2^31-1 ,无符号:0~2^32-1 |
数值类型 | BIGINT[UNSIGNED] | 占8个字节,有符号:-2^63~2^63-1,无符号:0~2^64-1 |
数值类型 | FLOAT[UNSIGNED] | 占4个字节 |
数值类型 | DOUBLE[UNSIGNED] | 占8个字节,比FLOAT更精确 |
数值类型 | DECIMAL(M,D)[UNSIGNED] | 大小不确定,精度很高,M指定长度,D表示小数点位数 |
文本类型 | CHAR(SIZE) | 固定长度字符串,最大255 |
文本类型 | VARCHAR(SIZE) | 可变长度字符串,0~2^32-1 |
二进制类型 | BLOB,LONBGBLOB | 二进制数据 |
文本类型 | TEXT,LONGTEXT | 文本 |
时间日期 | DATE,DATETIME,TIMESTAMP | 日期类型YYYY-MM-DD(HH:MM:SS),TIMESTAMP时间戳 |
- 详见MySQL参考手册
数值型(整数)的基本使用
- 使用规范:在能够满足需求的情况下,尽量选择占用空间小的类型
# 表的字符集,校验规则,存储引擎,使用默认
# 如果没有指定unsigned,则TINYINT就是有符号的
# TINYINT有符号-128~127,没有符号0~255
CREATE TABLE t3 (
id TINYINT);
CREATE TABLE t4 (
id TINYINT UNSIGNED);
INSERT INTO t3 VALUES(-129); # errors:out of range
INSERT INTO t4 VALUES(255);
SELECT *FROM t3;
- bit类型按位显示
- 如果希望小数精度高,推荐使用decimal
- DECIMA[M,D] M是小数位数总数,D是小数点后面的位数
字符型基本使用
CHAR 固定长度字符串,最大255字符,不是字节数。不管是中文还是字母都是放4个,按字符计算。
VARCHAR 可变长度字符串,按照实际占用大小分配空间,减少空间浪费。最大65532字节,utf8编码最大21844个字符,1-3个字节(取决于编码)用于记录大小。可存放字符数量和编码器有关,字符不区分汉字和字母。
查询速度:char>varchar
-
如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证等
如果字段长度不确定,使用varchar,比如文章,留言
在存放文本时,可以用text数据类型,可以将text列视为varchar列,text不能有默认值。如果varchar不够用,可以使用mediumtext,longtext。如果想简单点,可以直接使用text
# 演示字符串类型
# 注释的快捷键:shift+ctrl+c,取消注释:shift+ctrl+r
-- 如果表的编码是utf8 varchar(size)size=(65535-3)/3=21844
-- 如果表的编码是gbk varchar(size)size=(65535-3)/2=32766
CREATE TABLE t09 (
`name` CHAR(255));
CREATE TABLE t10 (
`name` VARCHAR(21844));
日期类型的基本使用
DROP TABLE IF EXISTS t14;
CREATE TABLE IF NOT EXISTS t14 (
birthday DATE DEFAULT NULL,
job_time DATETIME DEFAULT NULL,
login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );-- 自动更新时间戳
SELECT
*
FROM
t14;
INSERT INTO t14 ( birthday, job_time )
VALUES
( '2022-11-11', '2019-02-22 13:25:07' );
示例
# 创建表练习
-- 字段 属性
-- Id 整型
-- name 字符型
-- sex 字符型
-- birthday 日期型
-- entry_date 日期型
-- job 字符型
-- Salary 小数型
-- resume 文本型
CREATE TABLE
IF
NOT EXISTS `emp` (
id INT,
`name` VARCHAR ( 32 ),
sex CHAR ( 1 ),
birthday DATE,
entry_date DATETIME,
job VARCHAR ( 64 ),
salary DOUBLE,
resume MEDIUMTEXT
) CHARSET utf8mb4 COLLATE utf8mb4_bin ENGINE INNODB;
INSERT INTO `emp` VALUES (1,' 张三','男','2000-1-1','2020-1-1 11:11:11','教师',5000.000,'12345');
删除、修改表
- 添加列
ALTER TABLE teblename
ADD (column datatype [DEFAULT expr],...);
- 修改列
ALTER TABLE tablename
MODIFY (column datatype [DEFAULT expr],...);
- 删除列
ALTER TABLE tablename
DROP (columnname);
- 查看表的结构:
desc 表名;-- 可以查看的列
- 修改表名
RENAME TABLE tablename to newtablename
- 修改字符集
ALTER TABLE tablename CHARACTER SET newcharset