2021-05-24Node.js第五天

一、数据库和可视化工具的安装与使用

数据库的使用也可以参照项目实战,比如react好客租房。

1. 数据库的安装

(1)直接运行phpStudy软件,安装地址不能有中文和空格。
(2)运行可视化工具Navicat,新建连接,通过账号密码连接到数据库。在连接中可以创建数据库。
(3)运行可视化工具HeidiSQL,点击"新建",输入密码,即可新建一个连接。在连接中可以创建数据库。
注意:
①一个电脑可以安装多个MSQL数据库,但是一次只能启动一个数据库。
②在电脑中搜索服务,可以禁用当前正在运行的MySQL数据库。

2. 创建数据库

① 在可视化工具中新建一个数据库。
②在数据库中新建一个数据库表。
③为数据库表添加字段(列),并为字段设置名称、长度和类型、特殊标识。
④手动向数据库表中添加内容。
⑤在项目中操作数据库。

字段的特殊标识:PK 主键, NN值不允许为空, UQ值唯一,AI值自动增长。

二、SQL语句

① SQL 是一门数据库编程语言
② 使用 SQL 语言编写出来的代码,叫做SQL 语句
③ SQL 语言只能在关系型数据库中使用(例如 MySQL、Oracle、SQL Server)。非关系型数据库(例如 Mongodb) 不支持 SQL 语言

注意:一段SQL语句的末尾加上分号 " ;"

1. select语句

查询表中某一列的数据:select 列名 from 表名
查询表中所有列的数据:select * from 表名

2. insert into 语句

向表中插入新的数据行:insert into 表名(列名1,列名2)values(值1,值2)

例如:向 users 表中,插入一条 username 为 tony stark,password为 098123的用户数据

insert into users (username,password) values ('tony stark','098123')

注意:列和值要一 一对应,多个列(值)之间用英文逗号隔开。

3. update语句

修改表中某一行的某些列的数据:
update 表名 set 列名1 = 新值 , 列名2=新值
where 列名=某值

update表示修改的哪张表的数据;set 表示更改的那一列的数据;where表示条件限定。
例如:把 users 表中 id 为 2 的用户密码和用户状态,分别更新为admin123 和 1。

update users set password = "admin", status=1 where id = 2
4. delete语句

删除表中的行:
delete from 表名
where 列名=某值

例如:从 users 表中,删除 id 为 4 的用户。

delete from users where id = 4
5. where 子句

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

6. and 和 or 运算符

① and 和or 可在 where 子语句中把两个或多个条件结合起来。
② and 表示必须同时满足多个条件,相当于JavaScript 中的 && 运算符,例如if (a !== 10 && a !== 20)
③ or 表示只要满足任意一个条件即可,相当于JavaScript 中的 || 运算符,例如if(a !== 10 || a !== 20)

例如:使用 AND 来显示所有 status 为 0,并且 id 小于 3 的用户

select * from users where status=0 and id < 3
7.order by 子句

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

例如:对 users 表中的数据,按照status 字段进行升序排序

select  *  from users
order by status asc;

对 users 表中的数据,先按照 status 字段进行降序排序,再按照username 的字母顺序,进行升序排序。

select * from users order
by status desc, username asc;
8. count(*)函数

count(*) 函数用于返回查询结果的总数据条数。

例如:查询 users 表中 status 为 0 的总数据条数。

select count(*) from users 
where status = 0
9. 使用 AS 为列设置别名

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

select count(*) as total from users 
where status = 0

三、在项目中操作 数据库

1 .保存与打开.sql文件

在数据库可视化工具中书写的sql语句,可以保存到本地,是一个.sql文件。
在数据库可视化工具中可以打开本地的.sql文件。

2. 在项目中操作 数据库 分为三大步

① 下载安装操作 MySQL 数据库的第三方模块(mysql)
② 通过 mysql 模块连接到 MySQL 数据库
③ 通过 mysql 模块执行 SQL 语句

3. 第一步:在项目中下载第三方模块

npm install mysql

4. 第二步:将项目连接数据库
// 1. 导入 mysql 模块
const mysql = require('mysql')
// 2. 建立与 MySQL 数据库的连接关系
const db = mysql.createPool({
  host: '127.0.0.1', // 数据库的 IP 地址
  user: 'root', // 登录数据库的账号
  password: 'admin123', // 登录数据库的密码
  database: 'my_db_01', // 指定要操作哪个数据库
})

下面的代码可以测试数据库是否连接成功:

// 测试 mysql 模块能否正常工作
db.query('select 1', (err, results) => {
  // mysql 模块工作期间报错了
  if(err) return console.log(err.message)
  // 能够成功的执行 SQL 语句
  console.log(results)
})
5. 第三步:在项目中执行SQL语句

const data = { 数据对象 }
const sqlStr = "具体的SQL语句"
db.query(sqlStr,[数据对象] ,function(err ,results) { } )

(1)查询数据(查)
例如:查询 users 表中所有的数据

// 查询 users 表中所有的数据
const sqlStr = 'select * from users'
db.query(sqlStr, (err, results) => {
  // 查询数据失败
  if (err) return console.log(err.message)
  // 查询数据成功
  // 注意:如果执行的是 select 查询语句,则执行的结果是数组
  console.log(results)
})

(2)插入数据(增)
例如:向 users 表中新增数据, 其中 username 为 Spider-Man,password为 pcc321

//定义数据对象
const user = { username: 'Spider-Man', password: 'pcc123' }
// 定义待执行的 SQL 语句
const sqlStr = 'insert into users (username, password) values (?, ?)'
// 执行 SQL 语句
db.query(sqlStr, [user.username, user.password], (err, results) => {
  // 执行 SQL 语句失败了
  if (err) return console.log(err.message)
  // 成功了
  // 注意:如果执行的是 insert into 插入语句,则 results 是一个对象
  // 可以通过 affectedRows 属性,来判断是否插入数据成功
  if (results.affectedRows === 1) {
    console.log('插入数据成功!')
  }
})

插入数据时,如果数据对象的属性,与数据表的字段(列)一 一对应,则有简便方式如下

//定义数据对象
const user = { username: 'Spider-Man2', password: 'pcc4321' }
// 定义待执行的 SQL 语句
const sqlStr = 'insert into users set ?'
// 执行 SQL 语句
db.query(sqlStr, user, (err, results) => {
  if (err) return console.log(err.message)
  if (results.affectedRows === 1) {
    console.log('插入数据成功')
  }
})

(3)更新数据(改)
例如:将id为4的数据做出修改

const user = { id: 6, username: 'aaa', password: '000' }
// 定义 SQL 语句
const sqlStr = 'update users set username=?, password=? where id=?'
// 执行 SQL 语句
db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
  if (err) return console.log(err.message)
  // 注意:执行了 update 语句之后,执行的结果,也是一个对象,可以通过 affectedRows 判断是否更新成功
  if (results.affectedRows === 1) {
    console.log('更新成功')
  }
})

更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则有简便方式如下

const user = { id: 6, username: 'aaaa', password: '0000' }
// 定义 SQL 语句
const sqlStr = 'update users set ? where id=?'
// 执行 SQL 语句
db.query(sqlStr, [user, user.id], (err, results) => {
  if (err) return console.log(err.message)
  if (results.affectedRows === 1) {
    console.log('更新数据成功')
  }
})

(4)删除数据(删)
在删除数据时,推荐根据 id 这样的唯一标识,来删除对应的数据

const sqlStr = 'delete from users where id=?'
db.query(sqlStr, 5, (err, results) => {
  if (err) return console.log(err.message)
  // 注意:执行 delete 语句之后,结果也是一个对象,也会包含 affectedRows 属性
  if (results.affectedRows === 1) {
    console.log('删除数据成功')
  }
})

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

// 标记删除
const sqlStr = 'update users set status=? where id=?'
db.query(sqlStr, [1, 6], (err, results) => {
  if (err) return console.log(err.message)
  if (results.affectedRows === 1) {
    console.log('标记删除成功')
  }
})

注意:
①如果执行的是 select 查询语句,则执行的results结果是数组。
②如果执行的是 insert into 语句、update语句、delete语句,则 results 是一个对象。
③可以通过 results.affectedRows 判断是否更新成功。
④SQL语句中可以用 ? 当做占位符。
⑤如果SQL语句中有多个占位符,则必须用数组为每个占位符指定具体的值。
⑥如果SQL语句中只有个一个占位符,则可以省略数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 数据准备 回顾 记录操作:写操作:INSERT,UPDATE,DELETE读取操作:SELECT 这章主要学习:子...
    齐天大圣李圣杰阅读 1,155评论 0 4
  • mysql 优化数据库设计 第一范式(1st NF) 第一范式的目标是确保每列的原子性定义:数据库表中的所有字段都...
    xyxSUN阅读 493评论 0 1
  • 一、JDBC中事务处理的步骤: 1、要取消掉JDBC的自动提交:void setAutoCommit(boolea...
    浅水姑娘柠檬泪_d411阅读 267评论 0 0
  • 索引与执行计划 索引入门 索引是什么? 生活中的索引 MySQL 官方对索引的定义为:索引(Index)是帮助 M...
    Curtain_call阅读 659评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 9,088评论 28 54

友情链接更多精彩内容