【前端39_数据库】数据库基础、Node 中链接数据库并使用

数据库

为什么要用数据库

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

下载

官网

基本操作

建立表

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

今年建表遇到个问题
在这里插入图片描述
我用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;

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

在这里插入图片描述

查询细分

条件查询

  • 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 为主表,

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 这个模块,mysql2mysql 的二次封装,添加了 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了,重启之后进入服务就删掉了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值