数据库

为什么要用数据库

数据持久化保存,如果用文件保存的话,增删查改的话会比较费劲

下载

官网

基本操作

建立表

我去之前连建表都没写,淦!写的笔记也太不完善了。

今年建表遇到个问题
在这里插入图片描述
我用navcat 去修改数据也会报错
在这里插入图片描述

这说明是建数据库的时候数据集设置的不对。

在这里插入图片描述
我尝试了在原有的 database 上修改数据集,但是还是不可以输入中文,无奈只能删掉数据库重新建表
在这里插入图片描述

1
2
utf8;
utf8_general_ci;

增:INSERT INTO

1
2
3
4
5
6
7
8
9
10
11
INSERT INTO 表名(字段一,字段二,字段三) VALUES ("值一""值二",值三);
// 举例1
INSERT user (username,pwd,age,sex) VALUES ('李四',123,28,'男');
// 举例2 node 中
// 注意:
// - 占位符的逗号别是中文的,否则会报错 mysql 的语法错误
const [rows_insert] = await connection
.promise()
.execute(
`INSERT INTO friends (openid, name, lunarDate, solarDate, isOfficialAccountReminder, isRemindSolar, isRemindLunar, remark) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
[openid, name, lunarDate, solarDate, isOfficialAccountReminder, isRemindSolar, isRemindLunar, remark]

在这里插入图片描述

删:DELETE FROM

1
2
DELETE FROM 表名 条件语句;
// 举例:DELETE FROM user WHERE id=2;

假删除
思路:通过更新代替删除
操作:添加个字段: is_delete

改:UPDATE

如果改的字段比较多的话,是不需要添加括号的,添加括号之后 Node 会提示报错。
注意:WHERE 不可以提前,在 node 中会不好使
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
UPDATE 表名 SET 字段='值' 条件语句
// 举例1:UPDATE user SET username='李四' WHERE id = 3;
// 举例2: UPDATE users SET openid = '${openid}', unionid = '${unionid}', nickName = '${nickName}' WHERE id = ${id}
// 举例3:建议用第二种方法
const [rows_update] = await connection
.promise()
.query(
`UPDATE users SET openid = '${openid}', unionid = '${unionid}', nickName = '${nickName}' WHERE id = ${id}`
)
const [rows_update] = await connection
.promise()
.query(`UPDATE users SET openid = ?, unionid = ?, nickName = ? WHERE id = ?`, [openid, unionid, nickName, id])

查:SELECT FROM *

1
2
SELECT * FROM 表名 条件语句;
// 举例:SELECT * FROM user WHERE id=1;

这里的 * 指的是字段,要查找的字段

在这里插入图片描述

查询细分

条件查询

  • ORAND
  • 符号:><=<> 不等、!= 也是不等、
  • 排列:正序:ASC(默认)、倒叙:DESC,eg:SELECT * FROM org_hierarchy ORDER BY sort ASC
  • 分页相关:LIMIT ,有两个参数,LIMIT 从什么位置开始查询,查询几条,(举例:SELECT * FROM user ORDER BY age LIMIT 0,5;
  • 判断字段是否为 NULLIS NULL,中间可以加NOT 变成 IS NOT NULL

模糊查询:LIKE

  • 需要 LIKE,和一个占位符, 例如:SELECT * FROM user WHERE userName LIKE '李%'

  • 如果是中间的字符的话,可以这样查询,用两个占位符
    在这里插入图片描述

联表查询:JOIN ON

关系型数据 JOIN ON

举例子:比方说我有两张表,内容如下

在这里插入图片描述

在这里插入图片描述

这是以左边的 products 为主表,

1
2
3
SELECT * FROM  products LEFT JOIN users ON products.uid = users.id;
// 把表的名字简写了,用关键字:AS 。
SELECT * FROM products AS p LEFT JOIN users AS u ON p.uid = u.id;

在这里插入图片描述
这是以右边为主表的查询

1
SELECT * FROM  products RIGHT JOIN  users ON products.uid = users.id;

在这里插入图片描述

Node 中链接数据库

基本写法

首先引入 mysql2 这个模块,mysql2mysql 的二次封装,添加了 promise

然后通过 mysql2.createConnection({}) 填写好配置信息,建立链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const mysql2 = require("mysql2");
let data = require("./data/data.json");
const connection = mysql2.createConnection({
host: "localhost",
user: "root",
password: "123",
database: "js04",
});
connection.query("SELECT * FROM users", (err, res) => {
if (err) {
return console.log(err);
}
console.log(res);
});

数据查询用 connection.query(),会提供一个回调函数,查询的结果放到了回调函数中的 res
在这里插入图片描述

Promise 写法

这样写不够优雅,可以通过 connection.promise()把数据变成Promise类型的,然后查询的内容放到了 query里,再把rows 解构出来

修改成 Promise 后如下图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const mysql2 = require("mysql2");
const connection = mysql2.createConnection({
host: "localhost",
user: "root",
password: "123",
database: "js04",
});
async function fn() {
const [rows, fields] = await connection
.promise()
.query("SELECT * FROM users");
console.log(rows);
}
fn();

在这里插入图片描述

数组解构

为什么可以这样找出 rows 呢,这里其实是数组的解构,相当于我们把数组的第 0 项拿出来,并赋值给 rows,所以这里的rows起什么名字都可以哦

1
2
3
4
const [rows] = await connection
.promise()
.query(`SELECT * FROM news LIMIT ?,?`, [(p - 1) * perPage, perPage]);
return rows;

判断查询是否成功

如何查看插入成功了呢?看:affectedRows: 1

在这里插入图片描述

忘记数据库密码(windows)

1
2
C:\Users\10074>mysql
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)

报这个鸟错误啊,重新修改密码

  • 在 url 中输入 %ProgramData% 找到路径

改着改着密码想起来了,淦

删除 service

建数据库的时候,有个服务名字重复了,对就是 mysql57,

  • 进入管理员权限的 cmd ,然后 sc delete 服务名,如果有通知你删除成功,那么就 ok 了,重启之后进入服务就删掉了。