数据库笔记(持续更新中)


1.数据库的介绍

安装在操作系统之上的数据管理软件,存储和管理数据

1.1数据库的分类

  • 关系型数据库(SQL)

    MySQL、Oracle、SQL Server、DB2、SQLite

    通过表和表之间的、行和列之间的关系进行数据的存储

  • 非关系型数据库(Not Only SQL)

    Redis、MongoDB

    以对象方式存储,通过对象自身的属性来决定,如定位等需要动态更新的信息

1.2数据库管理系统(DBMS)

科学有效的管理数据、维护和获取数据;应用通过数据库管理系统操作数据库中的数据,如mysql

DDL ->数据库定义语言

DML ->数据库操作语言

DQL ->数据库查询语言

DCL ->数据库控制语言

2.数据库的使用

操作数据库->操作数据库中的表->操作数据库中表的数据 mysql中的关键字不区分大小写

2.1操作数据库

1.创建数据库
CREATE DATABASE IF NOT EXISTS `test`;
2.删除数据库
DROP DATABASE IF EXISTS `test`;
3.使用数据库
USE `CRITICALWORD`;  --如果标名或字段名为关键词需要用``包住

SELECT `name` FROM `student`;
4.查看数据库
SHOW DATABASES;  --查看所有的数据库

2.2数据库的数据类型

1.数值
  • tinyint 十分小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 3个字节
  • int 标准的省属 4个字节(常用)
  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • decimal 字符串形式的浮点数 金融计算的时候
2.字符串
  • char 字符串固定的大小 0~255
  • varchar 可变字符串 0~65535 常用的String
  • tinytext 卫星文本 2^8-1
  • text 文本串 2^16-1 保存大文本
3.时间日期
  • date YYYY-MM-DD 日期格式
  • time HH:MM:ss 时间格式
  • datetime YYYY-MM-DD HH:MM:SS 最常用的时间格式
  • timestamp时间戳, 1970.1.1到现在的毫秒数
  • year年份表示
4.null
  • 没有值、未知
  • 不要使用null进行运算

2.3数据库的字段属性

1.unsigned

  • 无符号整数,声明该列不能为负数

2.zerofill

  • 不足的位数用0填充

3.自增(autoimplement)

  • 自动在上一条记录的基础上加一,通常用来设计唯一的主键index,必须为整数

2.4创建数据库和一些规范

/*创建一个school数据库
--创建学生表(列、字段)使用SQL创建
--学号int、登录密码varchar(20)姓名varchar(20)性别varchar(2),出生日期(datetime)、家庭住址、email

--注意使用英文()、表的名称、字段尽量用``括起来
--AUTO INCREMENT 自增
--字符串用''括起来,所有语句后面加',',最后一个不加*/

CREATE TABLE IF NOT EXISTS `student` (
		`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
		`name` VARCHAR(30) NOT NULL DEFAULT('匿名') COMMENT '姓名',
		`password` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT '密码',
		`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
		`birthday` DATE DEFAULT NULL COMMENT '出生日期',
		`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
		`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
		PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
/*格式
CREATE TABLE [IF NOT EXISTS] `表名`(
	`字段名` 列属性 [属性] [属性] [属性] [注释],
	`字段名` 列属性 [属性] [属性] [属性] [注释],
	···
	`字段名` 列属性 [属性] [属性] [属性] [注释]
)[表类型][字符集设置][注释]

*/

/*每个表都必须存在以下五个字段,表示一个记录存在的意义
ID  --主键
`VERSION`  --乐观锁
id_delete  --伪删除
gmt_create  --记录的创建时间
gmt_update  --修改时间*/

2.5常用命令

SHOW CREATE DATABASE campus  --查看创建数据库的语句
SHOW CREATE TABLE student  --查看创建表的语句
DESC student  --显示表的结构

2.6数据库引擎

  • InnoDB: mysql默认使用、 安全性高,事务的处理,多表多用户操作
  • MyISAM: 早些年使用的、 节约空间,速度较快
MyISAM InnoDB
事务支持 不支持 支持
数据行锁定 不支持(表锁) 支持(行锁)
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,约为MyISAM的两倍

物理空间存在的位置

所有的数据库文件都存在data目录下,本质还是文件的存储,有特定的格式,一个文件夹对应一个数据库

MySQL引擎在物理文件上的区别

  • InnoDB在数据库表中只有*.frm文件,以及上级目录下的ib_data文件
  • MYISAM对应的文件
    • *.frm--表结构的定义文件
    • *.MYD--数据文件
    • *.MYI--索引文件

设置数据库的字符集编码

MySQL默认编码为Latin1,不支持中文

CHARTSET = utf8

2.7SQL语句对的增删改

--ALTER TABLE [表名] RENAME AS [新表名]
ALTER TABLE teacher RENAME AS teacher1  --修改表名
--ALTER TABLE [表名] ADD [字段名] [列属性]
ALTER TABLE teacher1 ADD age INT(11)  --添加表的字段
--ALTER TABLE [表名] MODIFY [属性名] [新的属性约束]
ALTER TABLE teacher1 MODIFY age VARCHAR(11)  --修改约束
--ALTER TABLE [表名] CHANGE [旧属性名] [新属性名]
ALTER TABLE teacher1 CHANGE age age1  --表中属性重命名
--ALTER TABLE [表名] DROP[删除的属性名]
ALTER TABLE teacher1 DROP age1  --删除表中的属性
--DROP TABLE [表名] IF EXISTS [表名]
DROP TABLE IF EXISTS teacher1  --删除表

3.数据管理(DML语言)

3.1外键

阿里的JAVA规范:【强制】不得使用外键与级联,一切外键概念必须在应用层解决

创建表的时候没有外键关系

ALTER TABLE `[表名]`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)

--ALTER TABLE [表名] ADD CONSTRAINT `FK_[需要添加外键的属性名]` FOREIGN KEY(`[需要添加外键的属性名]`) REFERENCES `[作为约束添加的所在表名]`(`[作为约束添加的所在属性]`)

最佳实践:

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 若要使用外键需要在程序层面实现,否则做DELETE或UPDATE都必须考虑外键因素,开发、测试极不方便

3.2添加

  • INSERT
INSERT INTO [表名]([字段1,字段2,字段3]) VALUES('值1','值2','值3')  --多字段对多个值
INSERT INTO [表名]([字段]) VALUES('值1'),('值2')  --一个字段插入多个值

字段是可以省略的,但是后面的值必须要一一对应,不能少;可以同时插入多条数据

3.3修改

  • UPDATE
--UPDATE [表名] SET [属性1] = '值1',[属性2] = '值2' WHERE [其他属性] = 值3;
UPDATE `student` SET `name` = 'ygw' WHERE `id` = '1';  --如果不指定条件会改变所有的内容
操作符 意义 范围 影响
<>或!= 不等于 5<>6 true
BETWEEN...AND... 在什么之间 [2,5]
AND && 1>2 AND 2>1 false
OR || 1>2 AND 2>1 true

3.4删除(DELETE、TRUNCATE)

都能删除数据,都不会删除数据结构

  • DELETE

不会影响自增,删除后认为原来的自增数

重启数据库后的现象:

  1. InnoDB使用DELETE后,自增列会从1开始(存在内存当中断电即消失)
  2. MyISAM继续从上一个自增量开始(存在文件中的,不会丢失)
--DELETE FROM [表名] WHERE [属性];
DELETE FROM `student` WHERE id = 1;
  • TRUNCATE

完全清空一个数据库表,表的结构和索引约束不会变,

--TRUNCATE [表名];
TRUNCATE `student`;

TRUNCATE重新设置自增列,计数器会归零、TRUNCATE不会影响事务