数据库MySql学习

80 阅读8分钟

数据库

市面上的数据库有很多种,最常见的数据库有如下几个:

  • 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 列 运算符 值

image.png

可以通过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(删除数据成功!) // 成功
      }  
})