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语句中只有个一个占位符,则可以省略数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

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