[TOC]
>[success] # 数据库操作(创建和增、删、改、查)
<br>
>[success] ## 创建库
接下来我们完成下面这 **2** 个操作:
* 通过 **workbench** 创建一个 **myblog** 数据库
* 执行 `show databases;` 查询
1. 首先 **点击图片中的圆柱体图标** ,这个图标就是创建库的按钮

2. **输入我们要创建的数据库名称** ,然后 **点击 apply 进行创建**

3. 这时候会弹出一个确认框,确认框中有一句话 `CREATE SCHEMA `myblog` ;` ,这句话是 **workbench** 自动为我们生成的 **SQL语句** ,这句话的的意思是 **创建一个名为 myblog 的库** , 然后 **点击 apply 进行创建**

4. 会弹出一个窗口,告诉你创建成功了,然后点击 **Finish**

然后把这个窗口也关闭

5. 这时候执行 `show databases;` 进行查询,就可以看到已经新加入了一个 **myblog** 库

>[success] ## 删除库
1. **删除库** 只需要 **在库名称处单击右键** ,点击 **Drop Schema...**

2. 点击 **Review SQL**

3. **点击Execute**

>[success] ## 创建表
下面这 **2个截图** 是我们在 **项目需求分析时** ,做存储时候的讲解的图, **第 1 个图是存储用户的表,第 2 个图是存储博客的表**
>[success] ### 创建用户表
* **id** : **id** 是为了保证 **每一行都不能重复** ,**id** 是标识,**它是会递增的,123456这样递增** ,这里需要注意:**如果创建了 10 条数据,把前 9 条都删除了,后续数据的 id 是从 11 继续开始递增,删除数据后,后续的数据不会进行篡位**
* **username** : **username** 就是 **用户名**
* **password** : **password** 就是 **密码** ,目前还是 **明文密码** ,后续会讲 **密码如何加密**
* **realname** : **realname** 就是 **中文名** ,如果是英文系统还分为 **firstname** 和 **lastname**

上图不光有 **表结构** 还有 **内容** ,例如: **张三、李四都属于内容** ,**但是在建表时候我们只会建表结构,而不会建内容,表结构包括如下内容:**
* **column** : **column** 代表 **列** ,这个 **表有多少列** ,里面是 **列名称**
* **datatye** : **datatye** 代表 **数据类型** ,**具体数据类型说明可查看结尾总结的表格**
* **pk 主键** : **pk 主键** 意思是我们所有 **id** 不可以重复,**Y代表不可以重复**
* **nn 不为空** : **nn 不为空** 意思是这一列是否允许为空, **Y代表不能为空**
* **AI 自动增加** : **AI 自动增加** 添加数据时每次会自动增加 **id** , **Y代表自动增加**
* **Default** : **Default** 是默认值,我们暂时不设置默认值

接下来开始正式使用 **workbench** 来创建表
1. 首先展开我们要的 **myblog** 库

2. 在 **Tables** 上单机右键,选择 **Create Table...**

3. 然后 **按照我们上面的表结构来创建表** ,完成后 **点击 apply**

4. 点完后会弹出一个窗口,窗口中为我们 **自动生成了建表的 SQL语句** ,然后点击 **apply**

5. 接下来会弹出一个窗口提示创建成功了,点击 **Finish**

然后把这个窗口也关闭掉

6. 此时 **点击刷新按钮**,然后展开 **users 库** ,就能看到 **新增加了 1 张表** ,然后点击 **Columns** 就可以看到刚刚添加的 **列名称**

>[success] ### 创建博客表
* **id** : **id** 是为了保证 **每一行都不能重复** ,**id** 是标识,**它是会递增的,123456这样递增** ,这里需要注意:**如果创建了 10 条数据,把前 9 条都删除了,后续数据的 id 是从 11 继续开始递增,删除数据后,后续的数据不会进行篡位**
* **title** : **title** 是标题
* **createtime** : **createtime** 是 **创建时间,创建时间** 是使用的 **13** 位毫秒数 **时间戳** 整数
* **author** : **author** 是作者

**表结构包括如下内容:**
* **column** : **column** 代表 **列** ,这个 **表有多少列** ,里面是 **列名称**
* **datatye** : **datatye** 代表 **数据类型** ,**具体数据类型说明可查看结尾总结的表格**
* **pk 主键** : **pk 主键** 意思是我们所有 **id** 不可以重复,**Y代表不可以重复**
* **nn 不为空** : **nn 不为空** 意思是这一列是否允许为空, **Y代表不能为空**
* **AI 自动增加** : **AI 自动增加** 添加数据时每次会自动增加 **id** , **Y代表自动增加**
* **Default** : **Default** 是默认值,时间戳默认设置个0

接下来开始创建 **blogs** 表,顺序与 创建 **users** 表顺序一致,如果想看前几个步骤可以去看上面创建 **users** 表的步骤,这里 **前几个步骤就不在重复了,只展示建表时候的画面**

>[success] ## 修改表
1. 在想要修改的表名上 **单机右键** 点击 **Alter Table...**

2. 此时会弹出修改界面

这样就可以直接修改了,修改后点击 **apply**
>[success] ## 删除表
1. 在想要删除的表名上 **单机右键** 点击 **Drop Table...**

2. **点击 Rview SQL**

3. **点击 Execute** 就删除完成了

>[success] ## 表操作(增、删、改、查)
* **增删改查**
* **使用SQL语句**
注意:【-- 】**2 个** 横杠一个空格,是 **SQL** 语句中的注释
**SQL语句如下:**
~~~
use myblog; -- 使用myblog库,要对哪个库进行操作就要 use 哪个库
-- show tables; -- 显示这个数据库所有的表
-- 【增加功能】
-- (不用写id,因为id自增)
-- password是MySQL关键字,写反斜杠包裹起来才可以使用
-- 下面SQL语句的意思:向 users 表中添加数据, values方法的参数分别对应前面的几个值
-- insert into users(username, `password`, realname) values('lisi', '123', '李四');
-- 【修改功能】
-- 修改 users 表中 username 等于 list 的数据的 realname 改为 李四2
-- update users set realname='李四2' where username='lisi';
-- 如果更新2个字段的话,加个逗号
-- update users set realname='李四2', password=456 where username='lisi';
-- 直接执行上面修改数据的语句可能会报错,意思是安全模式不能修改,所以需要一次执行下面这个语句,执行完就删掉就行
-- SET SQL_SAFE_UPDATES = 0;
-- 【查询功能】
-- 查询 users 表中全部列的数据(一般情况下避免使用 * 号,* 会耗费性能)
-- select * from users;
-- 查询指定列, 查询 id 和 username 列的数据
-- select id, username from users
-- 根据查询条件查询数据(使用where来添加条件进行查询,username等于zhangsan的用户)
-- select * from users where username='zhangsan';
-- 根据查询条件查询数据 > 多条件查询(username等于zhangsan并且password等于123)
-- select * from users where username='zhangsan' and `password`='123';
-- 根据查询条件查询数据 > 多条件查询(username等于zhangsan或者password等于123)
-- select * from users where username='zhangsan' or `password`='123';
-- 根据查询条件查询数据 > 多条件查询(username等于zhangsan或者password不等于123)
-- select * from users where username='zhangsan' or `password` <> '123';
-- 模糊查询(用like 与 %包裹要查询的名字, 来模糊查询用户名称中包含zhang的数据)
-- select * from users where password like'%zhang%';
-- 排序(order by id ,根据id来排序,默认情况下是正序)
-- select * from users where username='zhangsan' or `password`='123' order by id;
-- 排序(order by id desc 根据id排序倒叙)
-- select * from users where username='zhangsan' or `password`='123' order by id desc;
-- 【删除功能】
-- 一定要加 where 条件进行删除,不然的话会把表中数据全部删除
-- 删除 username 为 lisi 的数据
-- delete from users where username='lisi';
~~~
可以把这些指令放入到 **workbench** 中运行测试。
>[success] ### 软删除
**需要注意:在正式环境中删除数据并不是像上面的 SQL 指令一样直接把数据删除,而是软删除** ,**正式环境** 中**数据库** 会有一个 **state 字段,默认等于 1**

这里可以看到所有数据的 **state** 都是 **1** ,等于 **1** 代表数据是可用的

**删除时改成 0**
~~~
-- 把 users 表中 username 等于 lisi 的数据的 state 修改成 0
update users set state='0' where username='lisi' -- 软删除(假删除)
~~~
**软删除** 的好处就是 **数据可以恢复** ,**改成 1 就又恢复了** ,根据项目需求而定,因为我们这里要学习删除指令所以暂时不使用软删除
>[success] ### 添加假数据
为了接下来学习时候 **数据库** 中有 **测试数据** ,我们先 **手动向数据库中插入几条假数据** ,**SQL 指令** 如下:
~~~
insert into users(username, `password`, realname) values('lisi', '123', '李四');
insert into users(username, `password`, realname) values('zhangsan', '123', '张三');
insert into blogs(title, content, createtime, author) values('标题A', '内容A', '1646361945579', 'zhangsan');
insert into blogs(title, content, createtime, author) values('标题B', '内容B', '1646362886241', 'lisi');
~~~
然后 **鼠标滑动光标点击workbench上的闪电图标一起执行,就可以把他们四个都添加到数据库了**
>[success] ## 总结
**MySQL表结构中的常用数据类型** :
| 数据类型 | 应用场景 |
| --- | --- |
| int | id、数字整数都可以用int类型 |
| varchar | **字符串类型数据** 都可以使用 **varchar** ,可以限制位数 **varchar(20)** 代表20位字符串长度 |
| longtext | 博客内容, **longtext** 类型不限长度,最多可以 **储存 4G** 大小的内容 |
| bigint | **时间戳** 是 **13位整数** 就不可以使用 **int** 类型了,所以就需要使用 **bigint(20)** ,20位整数 |
**字符串** 一般用 **varchar** 就可以,如果很长很长内容的话就用 **longtext** ,**整数** 一般情况下用 **int** 就可以,如果 **整数** 不满足条件的话就要 **bigint**,这些类型 **基本上满足我们日常系统中所有的数据类型**。
**常用语句 :**
~~~
show databases; // 查询所有库
CREATE SCHEMA myblog; // 新建 myblog 库
DROP DATABASE `myblog`; // 删除 myblog 库
// 在myblog库中创建users表
CREATE TABLE `myblog`.`users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(20) NOT NULL,
`password` VARCHAR(20) NOT NULL,
`realname` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id`));
// 删除 myblog 库 users 表
DROP TABLE `myblog`.`users`;
// 查询MySQL版本
select version()
~~~
- NodeJS基础
- 什么是NodeJS
- npm
- Node.js+Express+Koa2+开发Web Server博客
- 下载和安装node
- nodejs和js的区别
- commonjs-演示
- nodejs如何debugger
- server端与前端的区别
- 项目需求分析
- 开发接口(不使用任何框架)
- http-概述
- 处理get请求
- 处理post请求
- 处理http请求的综合示例
- 搭建开发环境
- 初始化并且开发路由
- 开发博客项目之数据存储
- MySql介绍
- 数据库操作(创建和增、删、查)
- Nodejs 操作 Mysql
- Nodejs 链接 mysql 做成工具
- API 对接 MySQL
- 开发博客项目之登陆
- cookie-介绍
- cookie用于登录验证
- cookie做限制