Bootstrap

【MySQL】基础篇

目录

1数据库的概念

1.1 常见数据库

1.2 MySQL相关软件

1.3 初识SQL

2 SQL常用语法

2.1 SELECT(查询)

2.2 INSERT INTO(插入)

2.3 UPDATE(更新)

2.4 DELETE(删除)

2.5 WHERE 子语句(条件筛选)

2.5.1 语法

2.5.2 条件运算符

2.5.3 逻辑运算符

2.6 ORDER BY 子语句(排序)

2.7 COUNT() (统计数据数量)

2.8 AS(设置别名)

3 MySQL

3.1 安装MySQL模块

3.2 连接数据库

3.3 操作MySQL

3.3.1 查询数据

3.3.2 插入数据

3.3.3 更新数据

3.3.4 删除数据

4 前后端的身份验证


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 前后端的身份验证

待更新

;