数据库
市面上的数据库有很多种,最常见的数据库有如下几个:
- MySQL 数据库(目前使用最广泛、流行度最高的开源免费数据库;Community + Enterprise)
- Oracle 数据库 (收费)
- SQL Server 数据库 (收费)
- Mongodb 数据库(Community + Enterprise)
其中,MySQL、Oracle、SQL Server 属于传统型数据库 (又叫做: 关系型数据库 或 SQL 数据库),这三者的设计理念相同,用法比较类似。
而 Mongodb 属于新型数据库(又叫做: 非关系型数据 或 NOSQL 数据库),它在一定程度上弥补了传统型数据库的缺陷
SQL
SQL的学习目标
重点掌握如何使用SQL从数据表中:
查询数据 (select) 、插入数据 (insert into)、更新数据 (update) 、删除数据 (delete)
额外需要掌握的 4种 SQL语法:
where 条件、and 和 or 运算符、order by 排序、count()函数
SQL中的SELECT语句
SELECT 语句用于从表中查询数据。执行的结果被存储在一个结果表中(称为结果集)。语法格式如下:
-- 这是注释
-- 从 FROM 指定的[表中],查询出[所有的] 据。 * 表示[所有列]
SELECT * FROM 表名称
-- 从 FROM 指定的[表中],查询出指定 列名称 (字段) 的数据
SELECT 列名称 FROM 表名称
注意:SQL语句中的关键字对大小写不敏感。SELECT 等效于 select,FROM 等效于from。
select * from users
-- 多个列之间 使用逗号分割
select username,password from users
SQL的INSERTINTO 语句
INSERT INTO 语用于向数据表中插入新的数据行,语法格式如下:
-- 语法解读: 向指定的表中,插入如下几列数据,列的值通过 values --指定2
-- 注意: 列和值要一一对应,多个列和多个值之间,使用英文的逗号分隔
INSERT INTO table_name (列1,列2,...) VALUES (值1,值2,....)
向 users 表中,插入一条 username 为 tony stark,password 为 098123 的用户数据,示例如下:
-- 向 users 表中,插入新数据,username 的值为 tony stark password 的值为 098123
insert into users (username, password) values ('tony stark', 098123)
SQL的UPDATE语句
-- 语法解读:
-- 1.用 UPDATE 指定要更新哪个表中的数据
-- 2.用 SET 指定列对应的新值
-- 3.用 WHERE 指定更新的条件
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
把 users 表中id 为7的用户密码,更新为 888888。示例如下
UPDATE users SET password='888888' WHERE id=7
-- 更新某一行中的若干列
UPDATE users SET password='admin123',status=1 WHERE id=2
SQL的 DELETE 语句
DELETE 语句用于删除表中的行。语法格式如下:
-- 从指定的表中,根据 WHERE 条件,删除对应的数据行
DELETE FROM 表名称 WHERE 列名称 = 值
删除id为111的数据
DELETE FROM users WHERE id=11
SQL的 WHERE 子句
WHERE 子句用于限定选择的标准。在 SELECT、UPDATE、DELETE 语句中,皆可使用 WHERE 子句来限定选择的标准
-- 查询语句中的 WHERE 条件
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
-- 更新语句中的 WHERE 条件
UPDATE 表名称 SET 列=新值 WHERE 列 运算符 值
-- 删除语句中的 WHERE 条件
DELETE FROM 表名称 WHERE 列 运算符 值
可以通过WHERE子来限定SELECT的查询条件:
-- 查询 status 为 1 的所有用户
SELECT * FROM users WHERE status=1
-- 查询 id 大于 2 的所有用户
SELECT * FROM users WHERE id>2
-- 查询 username 不等于 admin 的所有用户
SELECT * FROM users WHERE username<>'admin'
SQL的 AND 和 OR 运算符
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
AND 表示必须同时满足多个条件,相当于 JavaScript 中的 && 运算符,例如 if (a !== 10 && a!== 20)
OR 表示只要满足任意一个条件即可,相当于 JavaScript 中的|| 运算符,例如 if(a !== 10 a !== 20)
AND 运算符示例
使用AND 来显示所有 status 为 0,并且id 小于3的用户
SELECT * FROM users WHERE status=0 AND id<3
使用 OR 来显示所有 status 为1,或者 username 为 zs 的用户
SELECT *FROM users WHERE status=1 OR username='zs'
SQL的ORDER BY 子句
ORDER BY语用于根据指定的列对结果集进行排序
ORDER BY语句默认按照升序对记录进行排序
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字
ORDER BY子句——升序排序
对 users 表中的数据,按照status 字段进行升序排序,示例如下:
-- 注意:如下两条 SOL 语句是等价的,
-- 因为 ORDER BY 默认进行升序排序:
-- 其中, ASC 关键宁代表升序排序
SELECT * FROM users ORDER BY status;
SELECT * FROM users ORDER BY status ASC;
ORDER BY子-降序排序
对 users 表中的数据,按照id 字段进行降序排序,示例如下:
SELECT * FROM users ORDER BY id DESC
ORDER BY子-多重排序
对 users 表中的数据,先按照 status 字段进行降序排序,再按照 username 的字母顺序,进行升序排序,示例如下:
SELECT * FROM users ORDER BY status DESC, username ASC
SQL的COUNT(*)函数
COUNT(*)函数用于返回查询结果的总数据条数,语法格式如下:
SELECT COUNT(*) FROM 表名称
查询 users 表中 status 为 0的总数据条数:
SELECT COUNT(*) FROM users WHERE status=0
使用AS为列设置别名
如果希望给查询出来的列名称设置别名,可以使用 AS 关键字,示例如下
SELECT COUNT(*) AS total FROM users WHERE status=0
在项目中操作MySQL
配置mysql模块
在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置,主要的配置步骤如下:
// 1,导入 mysql 模块
2 const mysql = require( 'mysql' )
3//2.建立与 MySQL 数据库的连接
4 const db = mysql.createPool((
host: '127.0.0.1',// 据库的 IP 地址
user: 'root', //登录数据库的账号
password:admin123 ,// 登录数据库的密码
database:'my_db_01' // 指定要操作哪个数据库
})
测试mysql 模块能否正常工作
调用 db.query0函数,指定要执行的 SQL 语句,通过回调函数拿到执行的结果:
// 检测 mysql 块能否正工作
db.query('SELECT 1', (err, results) => {
if (err) return console.log(err.message)
// 只要能打印出 [ RowDataPacket {1': 1 ] 的结果,就证明数据库连接正常
console.log(results)
})
使用 mysql模块操作 MySQL 数据库
查询数据
查询 users 表中所有的数据:
// 询 users 表中所有的用户数据
const sqlStr = 'select * from users'
db .query(sqlStr, (err, results) => (
// 查询失败3
if (err) return console.log(err .message)
// 查询成功6
console.log(results)
})
插入数据
向 users 表中新增数据,其中 username 为 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) => (
if (err) return console.log(err.message) // 失败
if(results.affectedRows === 1){
console,log(插入数据成功')
} // 成功8
})
插入数据便捷方式
向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据
// 2.待执行的 SQL 语句,其中英文的 ? 表示占位符
const user = { username: ' Spider-Man2', password: 'pcc4321'}
const sqlstr = 'INSERT INTO users SET ?'
// 3.直接将数据对象当作占位符的值
db.query(sqlstr, user, (err, results) => {
if (err) return console.log(err.message) // 失败
if(results.affectedRows === 1){ onsole,log('插入数据成功') }
})
更新数据
可以通过如下方式,更新表中的数据:
// 1,要更新的数据对象
const user = ( id: 7, username: 'aaa', password: '000' )
// 2.要执行的 SQL 语句
const sqlStr = UPDATE users SET username=?, password=?, WHERE id=?
// 3.调用 db.query() 行 SQL 语的同时,使用数组依次为占位符指定具体的值6
db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
if (err) return console.log(err.message) // 失败
if (results.affectedRows === 1){ console.log(!更新数据成功!) } / 成功8
})
更新便捷方式
// 演示更新数据的便捷方式
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('更新数据成功')
})
删除数据
在删除数据时,推荐根据id 这样的唯一标识,来删除对应的数据。示例如下:
// 1.要执行的 SQL 语句
const sqlStr = 'DELETE FROM users WHERE id=?'
// 2,调用 db.query() 执行 SQL 语句的同时,为占位符指定具体的值
// 注意: 如果 SQL 语句中有多个占位符,则必须使用数组为每个占位符指定具体的值
如果 SQL 语句中只有一个占位符,则可以省略数组511
db.query(sqlstr, 7, (err, results) => (
if (err) return console.log(err.message) // 失败
if (results.affectedRows === 1) (
console.log(删除数据成功!)
})
标记删除
使用 DELETE 语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作.
所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除.
当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了UPDATE 语句,将这条数据对应的 status 字段标记为删除即可
//标记删除:使用 UPDATE 语句代 DELETE 语;只更新数据的状态,并没有真正删除
db.query( 'UPDATE USERS SET status=1 WHERE id=?', 6, (err, results) => (
if (err) return console.log(err.message) // 失败
if (results.affectedRows === 1){
console.log(删除数据成功!) // 成功
}
})