文章目录
📕1. 初识数据库
✏️1.1 关系型数据库
关系型数据库是指采用了关系模型来组织数据的数据库,以行和列的形式存储数据。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
✏️1.2 数据库服务器,数据库与表之间的关系
数据库服务器可以理解为就是一个软件,类似于微信,QQ,王者荣耀一样。MySQL就是一个软件。
在MySQL这个软件里会有许多表:类似于课程表,但是课程表会有许多,毕竟每个班对应的课是不一样的。
表里面会存储真正的数据,例如课程表中会有周一第一节是数学,第二节是语文等等。
✏️1.3 C/S架构与B/S架构
- C/S架构
C/S 架构全称是客户端 / 服务器(Client / Server)架构,是常用的两层架构。客户端需要安装客户端软件,服务端程序运行在服务器上,提供Socket或数据库服务。
- B/S架构
B/S架构全称是浏览器 / 服务器(Browser/Server)结构,分为Web浏览器、服务器程序、数据库服务三部分,可以理解为是对C/S架构⼀种改进。由于所有的业务逻辑都由服务器程序处理,所以客户端仅使用浏览器就可以完成所有操作,大大降低了客户端的维护成本。
✏️1.4 什么是SQL
SQL(Structured Query Language)是结构化查询语言的简称,是一种数据库查询和程序设计语言,
用于存取数据以及查询、更新和管理关系数据库。
💡注意💡注意💡注意
SQL是编程语言—>类似于JAVA
MySQL是数据库服务器软件—>类似于微信
Navicat是可视化工具—>类似于idea
📕2. 数据类型
与其他编程语言类似,SQL中规定了用于言描述属性的数据类型。常用的数据类型有以下几类:
- 数据值类型
- 字符串类型
- 二进制类型
- 日期类型
✏️2.1 数据值类型
类型列表
数据类型取值范围
✏️2.2 字符串类型与二进制类型
类型列表
❓如何选择CHAR和VARCHAR?
- 如果数据确定长度都一样,就使用定长 CHAR 类型,比如:身份证,md5,学号,邮编。
- 如果数据长度有变化,就使用变长 VARCHAR ,比如:名字,地址,但要规划好长度,保证最长的字符串能存的进去。
✏️2.3 日期类型
类型列表
📕3. 库的操作
✏️3.1 查看数据库
SHOW DATABASES;
- databases是复数形式
- SQL语句中大小写不敏感
- 语句结束要用分号
✏️3.2 创建数据库
CREATE DATABASE IF NOT EXISTS TEST CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
- CREATE DATABASE 是创建数据库关键字
- TEST是数据库名字
- IF NOT EXISTS表示当数据库不存在时创建,数据库存在就不执行该语句了
- CHARACTER SET 用来指定数据库采用的字符集编码
- COLLATE 指定数据库字符集的校验规则
查看数据库支持的字符集编码
SHOW CHARSET;
查看数据库支持的排序规则
SHOW COLLATION ;
MySQL8.0默认的字符集编码是 utf8mb4
MySQL8.0默认的排序规则是 utf8mb4_0900_ai_ci
✏️3.3 修改数据库
ALTER DATABASE teat CHARACTER SET gbk;
对数据库的修改主要是修改数据库的字符集,校验规则
✏️3.4 删除数据库
DROP DATABASE IF EXISTS test;
💡注意:
- 删除数据库是一个危险操作,不要随意删除数据库
- 删除数据库之后,数据库对应的目录及目录中的所有文件也会被删除
- 删除数据库之后,使用show databases; 语句查看不到对应的数据库
📕4. 表的操作
✏️4.1 查看所有表
SHOW TABLES;
✏️4.2 创建表
CREATE TABLE IF NOT EXISTS test field datatype [约束] [comment '注解内容'][engine 存储引擎] [character set 字符集] [collate 排序规则];
- CREATE TABLE 是创建表的关键字
- 校验语句[if not exists]
- field是列名,datatype是数据类型
- comment:对列的描述或说明
- engine:存储引擎,不指定则使用默认存储引擎
- character set:字符集,不指定则使用默认字符
- collate:排序规则,不指定则使用默认排序规则
🌰例如:创建⼀个用户表,其中包含用户编号、用户名、密码、生日,并指定字符集为utf8mb4,排序规则
为utf8mb4_0900_ai_ci
CREATE TABLE IF NOT EXISTS users(
id BIGINT,
`name` VARCHAR(20),
`password` VARCHAR(20),
birthday DATE
) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
🌰例如:创建⼀个表并指定存储引擎为MyISAM
CREATE TABLE t_myisam (
id BIGINT,
name VARCHAR(20) comment '⽤⼾名'
)ENGINE= MyISAM;
💡注意:
- 创建一个存储引擎为 InnoDB 的表时,会在对应的数据库目录下生成一个用来存储真实数据的物理文件,命名格式为 表名.ibd
- 创建一个存储引擎为 MyISAM 的表时,会在对应的数据库目录下分别⽣成三个以不同后缀名结尾的文件,分别是 表名.MYD ( MYData )的数据文件, 表名.MYI ( MYIndex ) 的索引文件,以表名.sdi 的表信息描述文件(JSON格式)
✏️4.3 查看表结构
DESC 表名;
🌰示例(以下图片为Navicat可视化工具):
• Field:表中的列名
• Type:列的数据类型
• Null:该列的值是否允许为Null
• Key:该列的索引类型
• Default:该列的默认值
• Extra:扩展信息
✏️4.4 修改表
在项目的实际开发中,随着版本的迭代和需求的变更,经常会对表结构进行调整,比如向现有表中添加列,删除列,或者修改某列的列名、数据类型或长度,这时就需要对表进行修改操作。
- 新增列
ALTER TABLE name ADD assets datatype first | after field;
name是要修改表的名字,assets是新增列名字,datatype是数据类型,first是增到第一行,after是增到field后。
🌰例如:在id列后添加address列
运行结果:
- 修改某列的长度
ALTER TABLE name MODIFY address VARCHAR(255);
运行结果:
- 重命名某列
ALTER TABLE name RENAME COLUMN address TO avater;
运行结果:
- 删除某个字段
ALTER TABLE name DROP avater;
运行结果:
- 修改表名
ALTER TABLE name RENAME TO newname;
✏️4.5 删除表
DROP TABLE IF EXISTS name
💡注意事项:
• 删除表是⼀个危险操作,执行删除语句时⼀定要谨慎
• 删除表成功后,磁盘上对应的数据文件也会被删除
• ⼀次可以删除多个表,表与表之间用逗号隔开
✏️4.6 练习
创建一个store数据库,用来管理商店的商品、顾客和订单数据,这个数据库有以下三个表组成:
商品表:表名为goods,表中包含的列如下:
• 客户表:表名为customer,表中包含的列如下:
购买记录表:表名为purchase,表中包含的列如下:
代码如下:
CREATE DATABASE IF NOT EXISTS store;
CREATE TABLE IF NOT EXISTS goods(
id BIGINT COMMENT'商品编号',
`name` VARCHAR(50) COMMENT'商品名',
unitprice DECIMAL(12,2) COMMENT'零售单价',
costprice DECIMAL(12,2) COMMENT'成本价',
category VARCHAR(20) COMMENT'商品类型',
provider VARCHAR(50) COMMENT'供应商'
);
CREATE TABLE IF NOT EXISTS customer(
id BIGINT COMMENT'客户编号',
`name` VARCHAR(20) COMMENT'客户姓名',
gender BOOL COMMENT'性别' ,
phone_num VARCHAR(20) COMMENT'电话号码',
email VARCHAR(50) COMMENT'电子邮件',
address VARCHAR(225) COMMENT'地址',
create_time DATETIME COMMENT'注册时间'
);
CREATE TABLE IF NOT EXISTS purchase(
order_id VARCHAR(32) COMMENT'订单编号',
customer_id BIGINT COMMENT'客户编号',
goods_id BIGINT COMMENT'商品编号',
nums INT COMMENT'购买商品数量',
amount DECIMAL(12,2) COMMENT'总金额',
create_time DATETIME COMMENT'订单生成时间'
);