31. 数据库基础
1. 数据库基础知识
1.1 关系型数据库与非关系型数据库
1.2 关系型数据库的结构
库 Database
库,也称数据库,用于组织、存储和管理数据
类比于文件夹
表 Table
表,是数据库中基本的数据存储单位,由行(Row)和列(Column)组成
类比于excel文件
记录 Record
记录,是表中的一行的所有数据
例如:在一个订单表中,每一条记录可能代表一个订单所有信息,包含订单号、订单日期、订单金额等。
表头 Header
表头,是表格中列的名称
可以看作是数据的结构化信息,帮助用户理解和操作数据
表单 Form
严格来说不直接属于数据库结构的一部分,但表单是一种常用的界面元素,用于收集并展示数据。
表单可以用于输入、修改或查询数据库中的数据。
表单通常包含多个字段,每个字段对应数据库表中的一个列。用户通过填写表单并提交,可以将数据填写到数据库中或更新现有数据。
2. SQL语句基础概念
2.1 SQL语句规范
SQL语句不区分大小写,为了提高代码的可读性,建议采用统一的书写规范。
关键字大写:SELECT, FROM, WHERE, JOIN。
表名、列名小写,用双引号括起来以确保大小写的敏感性。
字符串与日期:字符串与日期类型的数据应使用单引号' '括起来,单词之间用英文半角空格隔开。
SQL语句可单行或多行书写,默认以英文半角分号 ; 结尾,关键词不能跨多行
单行注释:--或#
多行注释:
/*
注释内容
*/
2.2 SQL语句类型
根据用途,SQL语句可以分为几种主要类型:
1. 数据查询语言 (DQL Data Query Language)
用于从一个或多个表中检索数据。
主要命令是 SELECT。
2. 数据定义语言 (DDL Data Definition Language)
用于定义或改变数据库结构。
常用命令包括:
CREATE:创建数据库、表、视图等。
ALTER:修改现有数据库对象的结构。
DROP:删除数据库对象。
TRUNCATE:清除表中的所有数据但保留表结构。
RENAME:重命名数据库对象(某些数据库系统可能使用不同的语法)。
3. 数据操纵语言 (DML Data Manipulation Language)
用于添加、更新和删除数据库中的数据。
常用命令包括:
INSERT:向表中插入新记录。
UPDATE:更新表中的现有记录。
DELETE:从表中删除记录。
MERGE:在某些数据库中,用于基于条件更新或插入数据。
4. 事务控制语言 (TCL Transaction Control Language)
用于管理事务,确保数据的一致性和完整性。
常用命令包括:
COMMIT:提交当前事务,使更改永久化。
ROLLBACK:撤销当前事务,恢复到事务开始前的状态。
SAVEPOINT:设置保存点,允许部分回滚事务。
SET TRANSACTION:设置事务的特性(如只读、隔离级别等)。
5. 数据控制语言 (DCL Data Control Language)
用于控制数据库访问权限。
常用命令包括:
GRANT:授予用户特定权限。
REVOKE:撤销用户的特定权限。
6. 其他命令
还有一些其他的命令不属于上述分类,例如:
EXPLAIN:显示查询计划,帮助优化查询性能。
SHOW:显示数据库信息,如表结构、索引等。
USE:选择当前工作的数据库。
BEGIN 或 START TRANSACTION:开始一个新的事务。
2.3 常用命令
3. SQL语句操作库、表、数据
3.1 操作数据库(文件夹级别)---对库的增删改查
[1]创建数据库
方法一:create database 数据库名称;
方法二:create database if not exists 数据库名称;
--数据库不存在则创建,存在则忽略
方法三:create database if not exists 数据库名称 charset 字符编码名称;
--latin1:西欧语言字符集
--utf8mb4(当前中文默认):完整的utf-8编码,支持所有Unicode字符,包括表情符号,一个字符最多占4个字节
--gbk:简体中文字符集
[2]查看数据库
系统自带的数据库:
查看所有数据库:
show databases;
模糊查询,查看名称中包含指定字符的数据库:
show databases like "%obj%";
查看数据库的建库SQL语句:
show create database 数据库名称;
示例:
show create database test01;
show create database test02;
show create database test03;
[3]修改数据库
修改数据库默认的编码集:
alter database 数据库名称 charset "utf8mb4";
举例:将test03的字符集由gbk改为utf8mb4
[4]删除数据库
以下MySQL自带的数据库不能删除
drop database [if exists] 数据库名称; --中括号里的内容表示可选
3.2 操作数据库中的表(文件级别)---对表的增删改查
[1]操作表之前的操作:进入到指定库、查看所在的库
use 库名称; --进入到指定库
注意:进入到指定数据库后无法退回到之前刚登录的状态,但可以通过use进行切换
select database(); --查看所在的库
[2] 创建表
语法:
create table 表名(
列名1 数据类型[(最多字符个数)] [约束条件],
列名2 数据类型[(最多字符个数)] [约束条件],
...
列名n 数据类型[(最多字符个数)] [约束条件]
);
列名和数据类型必填,中括号里的内容选填。
列名不可重复。
常见数据类型:
int:整数 括号内的参数默认为11,是显示宽度,不影响存储大小,不推荐使用
有符号 INT
位数: 32 位 4个字节
最小值: -2,147,483,648 (-2^31)
最大值: 2,147,483,647 (2^31 - 1)
无符号 INT
位数: 32 位 4个字节
最小值: 0
最大值: 4,294,967,295 (2^32 - 1)
varchar(n):变长字符串,n是字符串的最大长度 1~255,默认宽度为1,只能存1个字符
text:长文本
date:日期
datetime:日期和时间
decimal(m, n):小数,m是总位数,n是小数点后的位数
常见约束条件:
not null:不能为空值
primary key:主键,列(或列组合的)唯一标识,每个表可以有一个主键
unique:列的值必须唯一
default value:列的默认值
auto_increment:自增,通常用于主键,自动生成唯一的数字;一般与主键配合使用
check:检查约束,确保列中的值满足特定条件;MySQL 8.0.16之前的版本要使用触发器才能实现check的约束功能
foreign key:外键,用于在两个表之间建立连接,确保参照完整性
主键写法一:
create table product1(
id int auto_increment primary key,
name varchar(10) not null,
unique(name),
price decimal(10, 2),
stock int default 20
);
主键写法二:
create table product2(
id int auto_increment,
name varchar(10) not null,
unique(name),
price decimal(10, 2),
stock int default 20,
primary key(id)
);
id是主键,且自增
name不允许为空,且必须唯一
price为小数
stock库存为整型,默认值是20
[3]查看表
show tables; --查看库下所有的表
show create table 表名; --查看创建表的SQL语句
查看表结构的两种方法:
describe 表名;
desc 表名;
[4] 修改表
修改表中的列:
alter table 表名 modify 列名 数据类型;
--modify只能修改列的数据类型,不能修改列名
alter table 表名 change 原列名 新列名 数据类型;
--change既可以修改列的数据类型,又可以修改列名
修改表名:
alter table 原表名 rename 新表名;
添加列:
alter table 表名 add 列名 数据类型; --默认在表的结尾添加列
alter table 表名 add 列名 数据类型 after 指定列名; --在指定列的后面添加列
alter table 表名 add 列名 数据类型 first; --在列的最前面添加列
删除表中的列:
alter table 表名 drop 列名;
[5] 删除表
drop table 表名;
--执行该命令MySQL不会给出任何提示确认的信息,一旦删除无法恢复,建议先备份后删除,或者重命名表代替删除操作
[6] 以绝对路径的形式操作不同的库
create table test02.teacher(id int); --在test01库中操作test02库新建一个表
[7] 重置表信息
TRUNCATE table 表名;
保留表的结构,将表的记录以及表的状态回滚
3.3 操作表中的数据---对数据的增删改查
[1] 增加数据
增加一行数据:
insert into 表名 (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...);
即使只有一列或一个值,括号不可少。
以上可以不向所有的列中都传入数据,如果向所有列中传入数据,可以简写为:insert into 表名 values (值1, 值2, 值3, ...);
增加多行数据:
insert into 表名 (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...), (值1, 值2, 值3, ...), (值1, 值2, 值3, ...);
[2] 查询数据
查询表中全部数据:
select * from 表名;
查看指定列的数据:
select 列1,列2,... from 表名;
[3] 修改数据
update 表名 set 列名=新值 where 筛选条件;
举例:将name为toy的stock改为21
[4] 删除数据
delete from 表名 where 筛选条件; ---会删除所有符合条件的数据
删除stock为60的一行数据(记录):
delete from t1 where stock=60;
删除id大于1的记录:
delete from t1 where id>1;
清空表中所有数据:
delete from 表名;
4. 存储引擎
4.1 概念
存储引擎是用于处理不同表类型的数据存储、索引、数据检索的技术,不同的存储引擎提供了不同的存储机制、索引类型、锁定级别和事务支持。
数据库使用存储引擎进行创建、查询、更新和删除数据等操作。
4.2 MySQL中常见的存储引擎
[1]InnoDB
是MySQL5.5及以后版本的默认存储引擎
支持事务处理、行级锁定、外键约束以及崩溃恢复等高级功能。
[2]MyISAM
是MySQL5.5以前版本的默认存储引擎
不支持事务处理
插入数据速度较快
[3]MEMORY
MEMORY存储引擎将数据存储在内存中
访问速度极快
数据在数据库重启后会丢失
[4]Blackhole
黑洞引擎,接受所有数据写入请求,但不实际存储任何数据
用于测试或主从复制配置中的日志记录
4.3 查看所有引擎
show engines;
4.4 查看不同存储引擎存储数据的异同
[1] 使用不同的存储引擎建表
[2] 表的文件
[3] 表文件的作用
InnoDB:
.frm:存储了表的定义信息,包括列名、类型等。
.ibd:存储表的数据和索引
MyISAM:
.frm:存储了表的定义信息,包括列名、类型等。
.MYD:存储表的数据
.MYI:存储表的索引
MEMORY:
.frm:存储了表的定义信息,包括列名、类型等。
没有数据文件,数据存储在内存中,重启数据库后数据会丢失。
Blackhole :
.frm:存储了表的定义信息,包括列名、类型等。
[4] 表中依次存入数据
[5] 查看数据
Blackhole存储引擎创建的表中没有存入数据
memory存储引擎创建的表在数据库重启后数据丢失