目录
1数据库的概念
1.1 常见数据库
市面上的数据库有很多种,最常见的数据库有如下几个:
MySQL数据库(目前使用最广泛、流行度最高的开源免费数据库;Community + Enterprise)
Oracle 数据库(收费)
SQL Server 数据库(收费)
Mongodb数据库(Community + Enterprise)
其中,MySQL、Oracle、SQL Server 属于传统型数据库(又叫做:关系型数据库或SQL 数据库),这三者的 设计理念相同,用法比较类似
而Mongodb属于新型数据库(又叫做:非关系型数据库或NoSQL 数据库),它在一定程度上弥补了传统型数据库的缺陷
1.2 MySQL相关软件
对于开发人员来说,只需要安装MySQL Server 和MySQL Workbench 这两个软件,就能满足开发的需要了
MySQL Server:专门用来提供数据存储和服务的软件
MySQL Workbench:可视化的MySQL 管理工具,通过它,可以方便的操作存储在MySQL Server 中的数据
1.3 初识SQL
SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言。能够让 我们以编程的形式,操作数据库里面的数据
三个关键点:
① SQL 是一门数据库编程语言
② 使用SQL 语言编写出来的代码,叫做SQL 语句
③ SQL 语言只能在关系型数据库中使用(例如MySQL、Oracle、SQL Server)
非关系型数据库(例如Mongodb) 不支持SQL 语言
2 SQL常用语法
2.1 SELECT(查询)
SELECT 语句用于从表中查询数据,执行的结果被存储在一个结果表中(称为结果集),语法格式如下:
-- 从 FORM 指定的表中,查询出所有的数据 *表示所有列
SELECT * FROM 表名称
-- 从 FROM 指定的表中,查询出指定列名称(字段)的数据
SELECT 列名称 FROM 表名称
❗注意:SQL 语句中的关键字对大小写不敏感,SELECT 等效于select,FROM 等效于from
但是表名称、列(字段)名称严格区分大小写
举例:
如需获取名为"username" 和"password" 的列的内容(从名为"users" 的数据库表)
多个列之间用英文逗号隔开
SELECT username, password FROM users
2.2 INSERT INTO(插入)
INSERT INTO 语句用于向数据表中插入新的数据行,语法格式如下:
INSERT INTO table_name (列1, 列2, ...) VALUES (值1, 值2, ...)
注意:列和值之间要一一对应,多个列、多个值之间用英文逗号隔开
值是否加引号取决于其数据类型
举例:
向users表中插入一条username=user_a001,password=123456的值数据
INSERT INTO users (username, password) VALUES ("user_a001", "123456")
2.3 UPDATE(更新)
Update 语句用于修改表中的数据,语法格式如下:
UPDATE 表名称 SET 列名称 = 新值
上述命令会将表中所有的相应列都修改为新值,如果要指定哪一条数据,需要用WHERE子句,如下:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
举例:
将users表中的username=user_a001数据的password值修改为654321
UPDATE users SET password = 654321 WHERE username = user_a001
2.4 DELETE(删除)
DELETE 语句用于删除表中的行,语法格式如下:
DELETE FROM 表名称
上述命令会直接删除整个表的数据(不包含表的列名称等信息),因此我们也需要使用WHERE子语句来指定数据行,如下:
DELETE FROM 表名称 WHERE 列名称 = 值
举例:
删除users表中username=user_a001的数据行
DELETE FROM users WHERE username = user_a001
注意:
1. id字段一般会设置自增,由系统自动分配,当某一条数据,如id=4的数据被删除时,再插入一条新的数据,该数据的id会从5开始,而不会使用4
2.一般不直接删除数据,而是使用标记删除的方法,即设置某一字段的值为特定值来区分是否被删除
2.5 WHERE 子语句(条件筛选)
WHERE 子句用于限定选择的标准,在SELECT、UPDATE、DELETE语句中,皆可使用WHERE 子句来限定选择的标准
2.5.1 语法
-- 在SELECT中使用
SELECT 列名称 FROM 表名称 WHERE 列名称 = 某值
-- 在UPDATE中使用
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
-- 在DELETE中使用
DELETE FROM 表名称 WHERE 列名称 = 某值
2.5.2 条件运算符
上述的 = 可以替换为其他符号
操作符 | 描述 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
注意:如MYSQL部分版本中,也可以使用!=作为不等号
2.5.3 逻辑运算符
AND 和 OR 可在WHERE 子语句中把两个或多个条件结合起来
AND 表示必须同时满足多个条件
OR 表示只要满足任意一个条件即可
举例:
查询users表中username=user_a001并且password=123456的数据
SELECT * FORM users WHERE username = user_a001 AND password = 123456
2.6 ORDER BY 子语句(排序)
ORDER BY 语句用于根据指定的列对结果集进行排序
ORDER BY 语句默认按照升序对记录进行排序,也可以使用ASC关键字
如果希望按照降序对记录进行排序,可以使用DESC关键字
举例:
将users中的所有数据依照id进行升序排序
SELECT * FROM users ORDER BY id
SELECT * FROM users ORDER BY id ASC
将users中的所有数据依照id进行降序排序
SELECT * FROM users ORDER BY id DESC
ORDER BY也支持多重排序,如下:
将users表中的数据先按照id字段进行降序排序,再按照status字段进行升序排序,ASC同样可以省略
SELECT * FROM users ORDER BY id DESC, status ASC
2.7 COUNT() (统计数据数量)
COUNT() 函数用于返回查询结果的总数据条数,语法格式如下:
-- 统计指定列中非 NULL 值的数量
SELECT COUNT(列名称) FORM 表名称
-- 统计表中的行数(包含 NULL 值)
SELECT COUNT(*) FORM 表名称
2.8 AS(设置别名)
如果希望给查询出来的列名称设置别名,可以使用AS关键字,示例如下:
SELECT 列表名 AS 别名 FORM 表名称
3 MySQL
接下来将会演示如何在node.js中使用MySQL
3.1 安装MySQL模块
mysql 模块是托管于npm 上的第三方模块,它提供了在Node.js 项目中连接和操作MySQL 数据库的能力。,想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:
npm i mysql
3.2 连接数据库
//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" //指定要操作哪个数据库
})
可以通过下列代码检测是否成功连接:
db.query("SELECT 1", (err, results) => {
if(err) return console.log(err.message)
//只要打印出[ RowDataPacket { '1': 1 } ] 的结果,就证明数据库连接正常
console.log(results)
})
3.3 操作MySQL
下列为基本代码模板,可以通过query方法与MySQL进行交互
db.query("SQL语句", (err, results) => {
//执行成功时,err值为空,否则为错误信息
})
3.3.1 查询数据
db.query("SELECT * FORM users", (err, results) => {
//查询失败
if(err) return console.log(err.message)
//查询成功
console.log(results)
})
3.3.2 插入数据
可以使用英文的?表示占位符,
当只有一个占位符时,在指定具体值的时候,可以不用数组进行传值(在删除数据章节有体现)
//要插入数据库的数据
const user = { username: "user_a001", password: "123456" }
//待执行的SQL语句,其中英文的 ? 表示占位符
const sqlStr = "INSERT INTO users (username, password) VALUES (?, ?)"
//使用数组的形式,依次为 ? 占位符指定具体的值
db.query(sqlStr, [user.username, user.password], (err, results) => {
//失败
if(err) reyurn console.log(err.message)
//成功
if(results.affectedRows === 1) console.log("插入数据成功!")
})
当用户数据字段太多时,上述方法过于繁琐,可以采取下列写法:
前提:数据对象的每个属性和数据表的字段一一对应
//要插入数据库的数据
const user = { username: "user_a001", password: "123456" }
//待执行的SQL语句,其中英文的 ? 表示占位符
const sqlStr = "INSERT INTO users SET ?"
//直接将数据对象当做占位符
db.query(sqlStr, user, (err, results) => {
//...
})
3.3.3 更新数据
//要更新的数据对象
const user = { id: 7, username: "user_a001", password: "123456" }
//要执行的SQL语句
const sqlStr = "UPDATE users SET username = ? , password = ? WHERE id = ?"
//调用query()
db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
//失败
if(err) reyurn console.log(err.message)
//成功
if(results.affectedRows === 1) console.log("更新数据成功!")
})
更新数据也可以进行简化
//要更新的数据对象
const user = { id: 7, username: "user_a001", password: "123456" }
//要执行的SQL语句
const sqlStr = "UPDATE users SET ? WHERE id = ?"
//调用query()
db.query(sqlStr, [user, user.id], (err, results) => {
//...
})
3.3.4 删除数据
//要执行的SQL语句
const sqlStr = "DELETE FROM users WHERE id = ?"
//注意:如果SQL语句中有多个占位符,则必须使用数组为每个占位符定具体的值
//如果SQL语句中只有一个占位符,则可以省略数组
//删除id为7的数据
db.query(sqlStr, 7, (err, results) => {
//失败
if(err) reyurn console.log(err.message)
//成功
if(results.affectedRows === 1) console.log("删除数据成功!")
})
标记删除:
使用DELETE 语句,会把真正的把数据从表中删除掉
为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除
当用户执行了删除的动作时,我们并没有执行DELETE 语句把数据删除掉,而是执行了UPDATE 语句,将这条数据对应的status 字段标记为删除即可
4 前后端的身份验证
待更新