Node.js--》如何在Node.js中操作MySQL

news2024/11/15 23:42:45

目录

数据库

MySQL的安装与配置

SQL管理数据库

WHERE子句

AND和OR

ORDER BY子句

COUNT(*)函数

在Express项目中操作MySQL


数据库

数据库(database)是用来组织存储管理数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。

数据库的分类

MySQL数据库(目前使用最广泛、流行度最高的开源免费数据库;Community + Enterprise)

Oracle数据库(收费)

SQL Server数据库 (收费)

Mongodb数据库(Community + Enterprise)

比较:MySQL、Oracle、SQL Server属于传统型数据库(又叫做:关系型数据库或SQL数据库),这三者的设计理念相同,用法比较类似;而MongoDB属于新型数据库(又叫做:非关系型数据库或NoSQL数据库),它在一定程度上弥补了传统型数据库的缺陷。

传统型数据库的数据组织结构:在传统型数据库中,数据的组织结构分为数据库(database)、数据表(table)、数据行(row)、字段(field)这4大部分组成。

实际开发中库、表、行、字段的关系:在实际项目开发中,一般情况下,每个项目都对应独立的数据库不同的数据,要存储到数据库的不同表中,例如:用户数据存储到users 表中,图书数据存储到 books表中每个表中具体存储哪些信息,由字段来决定,例如:我们可以为users 表设计id、username、password这3个字段表中的行,代表每一条具体的数据。

MySQL的安装与配置

对于开发人员来讲,只需安装 MySQL Server 和 Navicat 这两个软件,就能满足开发需求了。

MySQL Server:专门用来提供数据存储和服务的软件

Navicat:可视化的MySQL管理工具,通过它可以方便的操作存储在 MySQL Server中的数据

具体的安装教程,可以参考一下我之前的文章:MySQL的安装 。有了可视化工具,我们创建表和编辑表的数据就变得异常容易了。

SQL管理数据库

SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言。能够让我们以编程的形式,操作数据库里面的数据。

注意

1)SQL是一门数据库编程语言

2)使用 SQL 语言编写出来的代码,叫做 SQL 语句

3)SQL语言只能在关系型数据库中使用(例如:MySQL、Oracle、SQL server)。非关系型数据库(例如:Mongodb)不支持SQL语言。

SELECT语句

用于从表中查询数据。执行的结果被存储在一个结果表中(称为结果集)。其语法如下:(注意:SQL语句中的关键字对大小写不敏感,SELECT等效于select,FROM等效于from)。

-- 这是注释
-- 从 FROM 指定的【表中】,查询出【所有的】数据,* 表示【所有列】
SELECT * FROM 表名称

-- 从 FROM 指定的【表中】,查询出指定 列名称 (字段) 的数据
SELECT 列名称 FROM 表名称

INSERT INTO语句

用于向数据表中插入新的数据行。

-- 向指定表中插入数据,列的值通过 values 一一指定
-- 列和值要一一对应,多个列和多个值之间,要使用英文逗号分隔
insert into table_name (列1,列2...) values (值1,值2,值3)

Update语句

用于修改表中的数据

-- 用 UPDATE 指定要更新哪个表中的数据,用 SET 指定列对应的新值,用 WHERE 指定更新的条件
update 表名称 set 列名称 = 新值 where 列名称 = 某值

DELETE语句

用于删除表中的行

-- 从指定的表中,根据 WHERE 条件,删除对应的数据行
delete from 表名称 where 列名称 = 值

WHERE子句

用于限定选择的标准,在SELECT、UPDATE、DELETE语句中,皆可使用WHERE子句来限定选择的标准。

-- 查询语句中的 WHERE 条件
select 列名称 from 表名称 where 列 运算符 值
-- 更新语句中的 WHERE 条件
update 表名称 set 列=新值 where 列 运算符 值
-- 删除语句中的 WHERE 条件
delete from 表名称 where 列 运算符 值

下面的运算符可在 WHERE 子句中使用,用来限定选择标准:

操作符描述
=等于
<>(在某些版本的SQL中可以写为 != )不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式

例如:可以通过 WHERE 子句来限定 SELECT 的查询条件:

-- 查询 status 为 1 的所有用户
select * from users where status=1
-- 查询 id 大于 2 的所有用户
select * from users where id>2
-- 查询 username 不等于 admin 的所有用户
select * from users where username<>'admin'

AND和OR

AND和OR可在WHERE子语句中把两个或多个条件结合起来。

AND表示必须同时满足多个条件,相当于JS中的 && 运算符

OR表示只要满足任意一个条件即可,相当于JS中的 || 运算符

ORDER BY子句

order by语句用于根据指定的列对结果集进行排序。order by语句默认按照升序对记录进行排序,如果想按照降序对记录进行排序,可以使用 DESC 关键字。

COUNT(*)函数

COUNT(*)函数用于返回查询结果的总数据条数,语法格式如下:

使用AS为列设置别名:如果希望给查询出来的列名设置别名,可以使用 AS 关键字:

在Express项目中操作MySQL

安装操作MySQL数据库的第三方模块(mysql)

mysql模块是托管于npm上的第三方模块。它提供了在 Node.js项目中连接和操作MySQL数据库的能力。想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:(注意:如果数据库是8.0以后的,需安装mysql2,因为8.0+版本的加密方式改变,node目前还不支持!)

# 我的数据库是8.0+版本,安装如下命令即可
npm install mysql2

通过mysql模块连接到MySQL数据库

在使用mysql模块操作 MySQL数据库之前,必须先对 mysql模块进行必要的配置,主要的配置步骤如下:

// 导入 mysql 模块
const mysql = require('mysql2')
// 建立与MySQL数据库的连接
const db = mysql.createPool({
  host:'127.0.0.1',    // 数据库的 IP 地址
  port:'3306'          // 数据库的端口号
  user:'root',         // 登录数据库的账号
  password:'123456',   // 登录数据库的密码
  database:'mysql_test'// 指定要操作哪个数据库
})

通过mysql模块执行SQL语句

调用 db.query() 函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:

// 导入 mysql 模块
const mysql = require('mysql2')
// 建立与MySQL数据库的连接
const db = mysql.createPool({
  host:'127.0.0.1',    // 数据库的 IP 地址
  port:'3306',
  user:'root',         // 登录数据库的账号
  password:'123456',   // 登录数据库的密码
  database:'mysql_test'// 指定要操作哪个数据库
})

// 检测 mysql 模块能否正常执行
db.query('select * from users',(err,results)=>{
  if(err) return console.log(err.message);
  // 只要能打印出 [RowDataPacket {'1','1'} ]的结果,就证明数据库连接正常
  console.log(results);
})

向 users 表中新增数据,其中username为张三,password为123000,代码如下:

// 向数据库中添加数据
const thing = {username:'hh',password:123000}
// 待执行的SQL语句,其中英文 ? 表示占位符s
// const dataStr = 'insert into users (username,password) values (?,?)'

// 向表中增添数据时,如果数据对象的每个属性和数据表字段一一对应,则可以通过以下方式简单快速插入语句
const dataStr = 'insert into users set ?'

// 使用数组形式,为 ? 占位符指定具体的值
// db.query(dataStr,[thing.username,thing.password],(err,results)=>{
  
db.query(dataStr,thing,(err,results)=>{
  if(err) return console.log(err.message); // 失败
  // 注意:如果执行的是insert into插入语句,则results是一个对象
  // 可以通过affectedRows属性,来判断是否插入数据成功
  if(results.affectedRows === 1){
     console.log('数据插入成功!');
  }
})

因为 id 具有唯一性,即使你把某条id的记录删掉,它的id下一条数据是用不了的,只能自增。

更新数据对象,可以通过以下方式进行:

// 向数据库中更新数据
const thing = {id:3,username:'aaa',password:123000}
// 待执行的SQL语句,其中英文 ? 表示占位符s
const dataStr = 'update users set username=?,password=? where id=?'
// 调用db. query()执行SQL语句的同时,使用数组依次为占位符指定具体的值
db.query(dataStr,[thing.username,thing.password,thing.id],(err,results)=>{
  if(err) return console.log(err.message); // 失败
  // 可以通过affectedRows属性,来判断是否更新数据成功
  if(results.affectedRows === 1){
     console.log('数据更新成功!');
  }
})

删除数据时,推荐用唯一标识 id 去删除。

// 向数据库中删除数据
const dataStr = 'delete from users where id=?'
db.query(dataStr,4,(err,results)=>{
  if(err) return console.log(err.message); // 失败
  // 可以通过affectedRows属性,来判断是否删除数据成功
  if(results.affectedRows === 1){
     console.log('数据删除成功!');
  }
})

标记删除:使用DELETE语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作。所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除。当用户执行了删除的动作时,我们并没有执行DELETE语句把数据删除掉,而是执行了UPDATE语句,将这条数据对应的status字段标记为删除即可。

// 标记删除:使用 update 语句来替代 delete 语句,只更新数据的状态,并没有真正删除
const dataStr = 'update users set status=1 where id=?'
db.query(dataStr,11,(err,results)=>{
  if(err) return console.log(err.message); // 失败
  // 可以通过affectedRows属性,来判断是否删除数据成功
  if(results.affectedRows === 1){
     console.log('数据删除成功!');
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法拾遗二十三之暴力递归到动态规划一

算法拾遗二十三之暴力递归到动态规划一题目一优化Code&#xff08;空间换时间&#xff09;优化二题目二优化一&#xff08;缓存法&#xff09;优化三&#xff08;严格表优化&#xff09;题目一 假设有排成一行的N个位置&#xff0c;记为1~N&#xff0c;N 一定大于或等于 2 开始…

Softing与Portainer合作,为工业物联网提供灵活高效的机器连接管理解决方案

Softing工业自动化成为了Portainer的增值经销商。Portainer.io是一个用于管理容器软件应用的平台&#xff0c;而Softing连接产品与其相结合可以使用户更轻松地管理工业物联网解决方案。 &#xff08;左边&#xff1a;Thomas Hilz&#xff0c;Softing工业自动化常务董事&#xf…

创建odoo15项目

Odoo 提供了一种机制来帮助建立一个新模块 python 启动项目名称 scaffold 模块名称 模块创建的文件夹如下两种方式&#xff1a; 1&#xff09;可新建manage.py文件来启动脚手架 import os import sysLIB_PATH os.path.join(os.path.split(os.path.realpath(__file__))[0], .…

【谷粒商城基础篇】基础篇总结

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

【kafka-ui】支持kafka with raft的可视化集群管理工具

前言 在早期使用kafka的时候一般使用Kafka Tool或者kafka eagle&#xff0c;前者为桌面软件&#xff0c;后者为浏览器软件。总体来说体验一般&#xff0c;但是还比较够用。 但是从kafka3.3.1开始&#xff0c;已经正式抛弃zookeeper使用自己的仲裁器了&#xff0c;但是上述两种…

什么是网站备案?如何查询网站是否备案?

网站备案是指根据国家法律法规需要网站的开办者向国家有关部门申请的备案.具体分为ICP备案和公安备案。 ICP备案 《互联网信息服务管理办法》指出&#xff0c;互联网信息服务分为经营性和非经营性两类。 国家对经营性互联网信息服务实行许可制度&#xff1b;对非经营…

实验室小分子PEG衍生物之Azido-PEG11-Azide/amine/NHS/COOH 叠氮-十一聚乙二醇-叠氮 1392284-57-9

Azido-PEG11-Azide叠氮-十一聚乙二醇-叠氮 中文名称&#xff1a;叠氮-聚乙二醇(十一甘醇)-叠氮&#xff1b;叠氮-十一聚乙二醇-叠氮 英文名称&#xff1a;Azido-PEG11-Azide 分子式&#xff1a;C24H48N6O11 分子量&#xff1a;596.67 CAS&#xff1a;1392284-57-9 外观&#x…

elasticsearch基础(一)

一、初识elasticsearch 1. 了解ES 1.1 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09;。…

apply,call,bind的作用与区别

1.作用 都可以用来改变this,并立即执行函数 首先来看一个构造函数 function User(name) {this.name name;}let lisi new User(李四)console.log(lisi)// {"name": "李四"}使用call和apply改变this 第一个参数传递改变this指针的这个对象 function Us…

云存储生态构建的技术基因和最佳实践

当云计算、大数据、物联网、人工智能等新技术纷至沓来&#xff0c;我们都在时代的洪流中亲历这样的变化——数字科技深入渗透工作生活&#xff0c;从消费娱乐到生活服务&#xff0c;再到产业革新。 智能化时代&#xff0c;企业 IT 趋势的四大转变 不难发现&#xff0c;以上云…

涉及top名校对IB课程的分数要求

在北美、欧洲&#xff0c;有许多著名的大学乐于接收IB学生&#xff0c;有一些大学还为优秀IB毕业生提供奖励学分、越级的鼓励入学政策。全球有分布在近百个国家的一千余所大学与国际文凭组织(IBO)有稳定的协约关系&#xff0c;确保这些大学承认IB文凭。 什么是IB课程?IB课程项…

FFmpeg 结构体以及核心方法介绍

1.FFmpeg整体结构 ffplay、ffprobe、ffmpeg是上层的三个应用程序 libavutil&#xff1a;核心工具库&#xff0c;其他模块一般都会依赖这个模块做一些基本的音视频处理。 libavformat&#xff1a;文件格式协议库&#xff0c;封装了protocol层和demuxer、Muxer层&#xff0c;使…

ATTCK 01

官网环境链接 漏洞信息 下载好后自行解压 分别在VM中依次打开 配置攻击机和三个客户机的网络环境 其中攻击机选择 kali 客户机为 win7 win8 win2k3 kali的设置 &#xff08;VMnet1&#xff09; win7 的设置 (VMnet1用于连接外网 VMnet2用于连接内网&#xff09; win8 …

滴滴前端一面高频vue面试题及答案

keep-alive 使用场景和原理 keep-alive 是 Vue 内置的一个组件&#xff0c; 可以实现组件缓存 &#xff0c;当组件切换时不会对当前组件进行卸载。 一般结合路由和动态组件一起使用 &#xff0c;用于缓存组件提供 include 和 exclude 属性&#xff0c; 允许组件有条件的进行缓…

数据交换格式

1、什么是数据交换格式 数据交换格式&#xff0c;就是服务器端与客户端之间进行数据传输与交换的格式。 前端领域&#xff0c;经常提及的两种数据交换格式分别是 XML 和 JSON。其中 XML 用的非常少&#xff0c;所以&#xff0c;我们重点要学习的数据交换格式就是 JSON。 2、XML…

数学建模学习笔记-算法(整数规划模型的基本概念)

目录 基本概念 定义 分类&#xff1a; 数学模型 分为 整数规划和松弛的线性规划的关系​编辑 基本概念 定义 数学规划中变量限制为整数时&#xff0c;称为整数规划 线性规划中变量限制为整数时&#xff0c;称为整数线性规划 分类&#xff1a; 变量全限制为整数时&#…

Adversarial Robustness vs. Model Compression, or Both?

众所周知&#xff0c;深度神经网络&#xff08;DNN&#xff09;容易受到对抗性攻击&#xff0c;这种攻击是通过在良性示例中添加精心设计的扰动来实现的。基于最小-最大鲁棒优化的对抗性训练可以提供对抗性攻击的安全概念。然而&#xff0c;对抗性鲁棒性需要比仅具有良性示例的…

二叉树的Morris遍历

Morris 遍历的是指就是避免用栈结构&#xff0c;而是让下层到上层有指针&#xff0c;具体时通过让底层节点指向 null 的空闲指针指回上层的某个节点&#xff0c;从而完成下层到上层的移动。 Morris 遍历的过程&#xff1a; 假设当前节点为cur&#xff0c;初始时cur就是整棵树的…

33-剑指 Offer 34. 二叉树中和为某一值的路径

题目给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。示例 1&#xff1a;输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22输出&#…

邮箱中的Qt线程设计

邮箱&#xff08;deepin-mail&#xff09;主要使用Qt框架开发&#xff0c;是一个有大量并行任务且需要监控进度和结果的项目&#xff0c;任务的优先级调整和支持取消回滚也是必不可少。Qt已经为我们提供了多种线程设计的方法&#xff0c;可以满足绝大部分使用场景&#xff0c;但…