文章目录
- 数据库
- 为什么要用数据库
- 下载
- 基本操作
- 建立表
- 增:INSERT INTO
- 删:DELETE FROM
- 改:UPDATE
- 查:SELECT FROM *
- 查询细分
- 条件查询
- 模糊查询:LIKE
- 联表查询:JOIN ON
- Node 中链接数据库
- 基本写法
- Promise 写法
- 数组解构
- 判断查询是否成功
- 忘记数据库密码(windows)
- 删除service
数据库
为什么要用数据库
数据持久化保存,如果用文件保存的话,增删查改的话会比较费劲
下载
官网
基本操作
建立表
我去之前连建表都没写,淦!写的笔记也太不完善了。
今年建表遇到个问题
我用navcat
去修改数据也会报错
这说明是建数据库
的时候数据集
设置的不对。
我尝试了在原有的 database
上修改数据集,但是还是不可以输入中文,无奈只能删掉数据库重新建表
utf8
utf8_general_ci
增:INSERT INTO
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
DELETE FROM 表名 条件语句;
// 举例:DELETE FROM user WHERE id=2;
假删除
思路:通过更新代替删除
操作:添加个字段:is_delete
改:UPDATE
如果改的字段比较多的话,是不需要添加括号的,添加括号之后 Node
会提示报错。
注意:WHERE
不可以提前,在 node
中会不好使
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 *
SELECT * FROM 表名 条件语句;
// 举例:SELECT * FROM user WHERE id=1;
这里的
*
指的是字段,要查找的字段
查询细分
条件查询
-
OR
、AND
- 符号:
>
、<
、=
、<>
不等、!=
也是不等、 - 排列:正序:
ASC
(默认)、倒叙:DESC
,eg:SELECT * FROM org_hierarchy ORDER BY sort ASC
- 分页相关:
LIMIT
,有两个参数,LIMIT 从什么位置开始查询,查询几条
,(举例:SELECT * FROM user ORDER BY age LIMIT 0,5;
) - 判断字段是否为
NULL
:IS NULL
,中间可以加NOT
变成IS NOT NULL
模糊查询:LIKE
- 需要
LIKE
,和一个占位符, 例如:SELECT * FROM user WHERE userName LIKE '李%'
- 如果是中间的字符的话,可以这样查询,用两个占位符
联表查询:JOIN ON
关系型数据 JOIN ON
举例子:比方说我有两张表,内容如下
这是以左边的 products
为主表,
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;
这是以右边为主表的查询
SELECT * FROM products RIGHT JOIN users ON products.uid = users.id;
Node 中链接数据库
基本写法
首先引入 mysql2
这个模块,mysql2
是 mysql
的二次封装,添加了 promise
等
然后通过 mysql2.createConnection({})
填写好配置信息,建立链接:
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
后如下图
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
起什么名字都可以哦
const [rows] = await connection.promise().query(
`SELECT * FROM news LIMIT ?,?`
, [(p - 1) * perPage, perPage]);
return rows;
判断查询是否成功
如何查看插入成功了呢?看:affectedRows: 1
忘记数据库密码(windows)
C:\Users\10074>mysql
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
报这个鸟错误啊,重新修改密码
- 在url 中输入
%ProgramData%
找到路径
改着改着密码想起来了,淦
删除service
建数据库的时候,有个服务名字重复了,对就是 mysql57,
- 进入管理员权限的 cmd ,然后
sc delete 服务名
,如果有通知你删除成功,那么就ok了,重启之后进入服务就删掉了。