1.数据库的基本概念
数据库(database)是用来
组织,存储和管理数据的仓库
常见的数据库及分类:
MySQL数据库(目前使用最广泛,流行度最高的开源免费数据库,Community(社区免费版) + Enterprise(企业收费版))- Oracle数据库(收费)
- SQL Server数据库(收费)
- Mongodb数据库(Community(社区免费版) + Enterprise(企业收费版))
其中,MySQL,Oracle,SQL server 属于传统型数据库(又叫做关系型数据库,SQL数据库),这三者的设计理念相同,用法比较类似,而Mongodb属于新型数据库(又叫做非关系型数据库,或NoSQL数据库),它在一定程度上弥补了传统型数据库的缺陷
1.1传统型数据库的数据组织结构
在传统型数据库中,数据的组织结构分为
数据库(database),数据表(table),数据行(row),字段(field)这4大部分组成
实际开发中库,表,行,字段的关系:
- 在实际开发中,一般是每个项目都有对应的
独立数据库 - 不同的数据,要存储在数据库的不同表中
- 每个表中具体存储哪些信息,由字段来决定
- 表中的行,代表每一条具体的数据
2.安装并配置MySQL
- MySQL Server:
专门用来提供数据存储和服务的软件 - MySQL Workbench:
可视化的MySQL管理工具,通过ta,可以方便的操作存储在MySQL Server中的数据
安装步骤就不详细赘述了
3. MySQL的基本使用
3.1 使用MySQL WorkBench 管理数据库
DataType 数据类型:
int整数varchar(len)字符串tinyint(1)布尔值
字段的特殊标识:
什么是SQL
SQL(英文全称:Structured Query Language)是
结构化查询语言,专门用来访问和处理数据库的编程语言,能够让我们以编程的形式,操作数据库里面的数据
三个关键点:
- SQL是一门
数据库编程语言 - 使用SQL语言
只能在关系型数据库中使用(例如:MySQL,Oracle,SQL Server),非关系型数据库(例如:Mongodb)不支持SQL语言
3.2 SQL语句的学习
- SELECT语句用于
从表中查询数据,执行的结果被存储在一个结果表中,称为结果集,语法格式如下:
-- 这是注释
-- 从FROM指定的[表中],查询出[所有的]数据,*表示[所有列]
SELECT * FROM 表名称
-- 从FROM指定的[表中],查询出指定 列名称(字段) 的数据
SELECT 列名称 FROM 表名称
注意:SQL语句中的关键字对大小写不敏感
- INSERT INTO语句用于
向数据表中插入新的数据行,语法格式如下
-- 语法解读: 向指定的表中,插入如下的激烈数据,列的值通过values 一一指定
-- 注意: 列和值要一一对应,多个列和多个值之间,使用英文的逗号分隔
INSERT INTO table_name (列1,列2,...)VALUES (值1,值2,....)
- UPDATE语句用于
修改表中的数据,语法格式如下:
-- 1.用UPDATE 指定要更新哪个表中的数据
-- 2.用SET指定对应的新值
-- 3.用WHERE指定更新的条件
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
- DELETE语句哟用于删除表中的行,语法格式如下:
注意注意:对于初学者来说,经常忘记提供WHERE条件,从而导致删除整张表的数据!!! 慎重慎重慎重!!!
DELETE FROM users WHERE id
WHERE子句用于限定选择的标准,在SELECT,UPDATE,DELETE 语句中,皆可使用WHERE子句来限定选择的标准
-- 查询语句中的 WHERE 条件
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
-- 更新语句中的 WHERE 条件
UPDATE 表名称 SET 列名称=新值 WHERE 列 运算符 某值
-- 删除语句中的 WHERE 条件
DELETE FROM 表名称 WHERE 列 运算符 值
- 可以在WHERE子句中使用的
运算符,用来限定选择的标准
| 操作符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于(也可以写为 !=) |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
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
-- 显示所有status=1或者username = zs的用户
SELECT * FROM users WHERE status=1 OR username='zs'
- ORDER BY语句用于
根据指定的列对结果集进行排序默认情况下,按照升序对记录进行排序,如果希望按照降序对记录进行排序,可以使用DESC关键字,ASC关键字代表升序排序,默认可不写
9. COUNT(*)函数用于返回查询结果的总数据条数
SELECT COUNT(*) FROM 表名称
如果希望给查询出来的列名称设置别名,可以使用AS关键字
SELECT COUNT(*) AS total FROM users WHERE status = 0
4.在项目中操作MySQL
在项目中操作数据库的步骤
- 安装操作MySQL数据库的第三方模块(
mysql) - 通过mysql模块
连接到MySQL数据库 - 通过mysql模块
执行SQL语句
4.1安装与配置mysql模块
mysql模块是托管与npm上的第三方模块,它提供了在Node.js项目中
连接和操作MySQL数据库的能力
- 使用
npm install mysql安装依赖包 配置mysql模块
// 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模块能否正常工作
// 3. 测试mysql模块能否正常工作
db.query('select 1',(err,results)=>{
// musql模块工作期间报错了
if (err) {
return console.log('err',err.message)
}
// 能够成功执行SQL语句
console.log('result',results)
})
4.1 查询数据
// 查询users表中的所有数据
const sqlStr = 'select * from users'
db.query(sqlStr,(err,results)=>{
//查询数据失败
if (err) {
return console.log('err',err.message)
}
// 查询数据成功
// 注意:如果执行的是select查询语句,则执行的结果是数组
console.log('result',results)
})
4.2使用mysql模块向MySQL中插入数据
//向users表中新增数据,其中usenamr:'Spider-Man',password:pcc321
// 1. 定义要插入到users表中的数据对象
const user = { username: "Spider-Man", password: "pcc321" };
// 2. 定义待执行的sql语句,其中英文的 ? 表示占位符
const sqlStr = "INSERT INTO users (username,password) VALUES (?,?)";
// 3. 使用数据的形式,依次为 ? 占位符指定具体的值
db.query(sqlStr, [user.username, user.password], (err, results) => {
// 执行sql语句失败
if (err) {
return console.log(err.message);
}
// 执行sql语句成功
// 注意:如果执行的是insert into语句,则results是一个对象,可以根据affectRows属性,来判断插入是否成功
if (results.affectedRows === 1) {
console.log("插入数据成功");
}
});
打开MySQL Workbench验证插入结果
插入数据的便捷方式
向表中新增数据时,如果
数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据
// 1. 要插入到users表中的数据对象
const user = { username: "Spider-Man2", password: "pcc322" };
// 2. 定义待执行的sql语句,直接使用SET ?
const sqlStr = "INSERT INTO users SET ?"
// 执行SQL语句,直接将user对象填充过来
db.query(sqlStr, user, (err, results) => {
// 失败
if (err) {
return console.log(err.message);
}
// 成功
if (results.affectedRows === 1) {
console.log("插入数据成功");
}
});
4.3 更新数据
//更新users表中id=6的数据,其中usenamr:'Spider-Man2',password:pcc322
// 1. 要插入到users表中的数据对象
const user = { id: 6, username: "aaa", password: "000" };
// 2. 定义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语句,results依然是一个对象,可根据affectRows属性,来判断更新是否成功
if (results.affectedRows === 1) {
console.log("更新数据成功");
}
});
// 便捷更新方法
// 1. 要插入到users表中的数据对象
const user = { id: 6, username: "bbb", password: "111" };
// 2. 定义sql语句
const sqlStr = "UPDATE users SET ? where id=?";
// 执行SQL语句,匹配user和user.id
db.query(sqlStr, [user,user.id], (err, results) => {
// 失败
if (err) {
return console.log(err.message);
}
// 成功
if (results.affectedRows === 1) {
console.log("更新数据成功");
}
});
4.4 删除数据
在删除数据时,根据id这样的唯一标识,来删除对应的数据即可
//删除数据
// 1. 待执行的sql语句
const sqlStr = "DELETE FROM users WHERE id=?";
// 执行SQL语句
// 注意:如果SQL语句中有多个占位符,则必须使用数组为每个占位符指定具体的值,
// 如果SQL语句中只有一个占位符,则可以省略数组
db.query(sqlStr, 6, (err, results) => {
// 失败
if (err) {
return console.log(err.message);
}
// 成功
if (results.affectedRows === 1) {
console.log("删除数据成功");
}
});
标记删除:使用DELETE语句,会真正的把数据从表中删除掉,为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
所谓
标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除,当用户执行了删除的动作时,我们并没有执行DELETE语句把数据删除掉,而是执行了UPDATE语句,将这条数据对应的status字段标记为删除即可
// 标记删除
// 1. 待执行的sql语句
const sqlStr = "UPDATE users SET status=? WHERE id=?";
// 执行SQL语句
db.query(sqlStr, [1, 5], (err, results) => {
// 失败
if (err) {
return console.log(err.message);
}
// 成功
if (results.affectedRows === 1) {
console.log("标记删除数据成功");
}
});