MySQL基本使用

@

目录


一、数据库简介

数据库(database)是用来组织、存储和管理数据的仓库。

市面常见数据库

  • MySQL 数据库(目前使用最广泛、流行度最高的开源免费数据库;Community + Enterprise)
  • Oracle 数据库(收费)
  • SQL Server 数据库(收费)
  • Mongodb 数据库(Community + Enterprise)

数据库分类

  • 传统型数据库(又叫:关系型数据库,SQL 数据库),比如:MySQL 、Oracle 、SQL Server
  • 新型数据库,(又叫:非关系型数据库,NoSQL 数据库),比如:Mongodb

两种数据库各有优缺点,相辅相成

传统型数据库的数据组织结构

在传统型数据库中,数据的组织结构分为

  • 数据库(database)
  • 数据表(table)
  • 数据行(row)
  • 字段(field)
    这 4 大部分组成

实际开发中库、表、行、字段的关系

  1. 在实际项目开发中,一般情况下,每个项目都对应 独立的数据库
  2. 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books 表中。
  3. 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为 users 表设计 id、username、password 这 3 个字段。
  4. 表中的行,代表每一条具体的数据。


二、安装并配置 MySQL

MySQL8.0.18安装自定义安装_思苑-CSDN博客_mysql自定义安装



三、MySQL的基本使用

1. 使用 MySQL Workbench 管理数据库

① 连接数据库

MySQL基本使用

② 主界面的组成部分

MySQL基本使用

③ 创建数据库

MySQL基本使用
注意:创建新数据库的名字不能包含中文,空格要用 _代替

MySQL基本使用
MySQL基本使用
MySQL基本使用

④ 创建数据表

MySQL基本使用
字段数据类型 DataType

  1. int 整数
  2. varchar(len)字符串
  3. tinyint(1)布尔值

字段的特殊标识

  1. PK (Primary Key) 主键、唯一标识
  2. NN(Not Null) 值不允许为空
  3. UQ(Unique) 值唯一
  4. AI(Auto Increment) 值自动增长
  5. Default/Expression 默认值

⑤ 向表中写入数据

MySQL基本使用
MySQL基本使用


2. 使用 SQL 管理数据库

① 什么是 SQL

SQL(Structured Query Language)是 结构化查询语言,专门用来访问和处理 关系型数据库 的编程语言,而非关系型数据库不支持 SQL 语言

② 查询数据(select)

SELECT 语句用于从 查询数据。执行的结果被存储在一个 结果表 中(称为 结果集)。语法格式如下:

-- 这是注释
-- 从 FROM 指定的【表中】,查询出【所有的】数据,* 表示【所有的】
SELECT * FROM 表名称

-- 从 FROM 指定的【表中】,查询出指定【列名称(字段)】的数据,多个列名之间以 英文逗号分隔
SELECT 列名称1, 列表名2 FROM 表名称 

注意: SQL 语句中的 关键字对大小写不敏感。SELECT 等效于 select,FROM 等效于 from。但是表名、列名等对大小写敏感

举例
从 users 表中选取所有的列
MySQL基本使用
MySQL基本使用
获取名为 "username" 和 "password" 的列的内容(从名为 "users" 的数据库表)
MySQL基本使用


③ 插入数据(insert into)

INSERT INTO 语句用于向数据表中插入新的数据行,语法格式如下:

-- 向指定的表中,插入如下几列数据,列的值通过 values 指定
INSERT INTO table_name(列1, 列2,...) VALUES(值1, 值2,...)

注意:列的值要一一对应,多个列和多个值之间,使用英文的逗号分隔

示例:
向 users 表中,插入一条 username 为 tony stark,password 为 098123 的用户数据
MySQL基本使用
MySQL基本使用


④ 更新数据(update)

Update 语句用于修改表中的数据。语法格式如下:

-- 用 UPDATE 指定要更新哪个表中的数据
-- 用 SET 指定列对应的新值
-- 用 WHERE 指定更新的条件
UPDATE 表名称 SET 列名称1 = 新值, 列名称2 = 新值 WHERE 列名称 = 某值

注意:

  • 多个被更新的列之间,使用英文的逗号进行分隔;
  • 更新字段值需要指明 WHERE 更新条件,否者整个表中的该字段值都会被跟新

示例:
把 users 表中 id 为 2 的用户密码和用户状态,分别更新为 123abc 和 1。
MySQL基本使用
MySQL基本使用


⑤ 删除数据(delete)

DELETE 语句用于删除表中的行。语法格式如下:

-- 从指定的表中,根据 WHERE 条件,删除对应的数据行
DELETE FROM 表名称 WHERE 列名称 = 值

注意:删除表中行时要指定 WHERE条件,否者将删除整个表

示例
从 users 表中,删除 id 为 3 的用户
MySQL基本使用
MySQL基本使用


⑥ WHERE 子句

WHERE 子句用于 限定选择的标准。在 SELECT、UPDATE、DELETE 语句中,皆可使用 WHERE 子句来限定选择的标准。

可在 WHERE 子句中使用的 运算符,如下表
MySQL基本使用
注意:在某些版本的 SQL 中,操作符 <> 可以写为 !=

示例

-- 查询 status 为 1 的所有用户
select * from users where status=1;
-- 查询 id 大于 2 的所有用户
select * from users where id>2;
-- 查询 username 不等于 admin 的所有用户
select * from users where username<>'admin'

⑦ AND 和 OR 运算符

AND 和 OR 可在 WHERE 子语句中 把两个或多个条件结合起来

  • AND 表示 必须同时满足多个条件
  • OR 表示 只要满足任意一个条件即可

示例
使用 AND 来显示所有 status 为 0,并且 id 小于 3 的用户:
MySQL基本使用
使用 OR 来显示所有 status 为 1,或者 username 为 zs 的用户:
MySQL基本使用


⑧ ORDER BY 子句

ORDER BY 语句用于根据指定的列 对结果集进行排序
ORDER BY 语句 默认按照升序 对记录进行排序,默认关键字为 ASC
如果您希望按照 降序 对记录进行排序,可以使用 DESC 关键字。

示例:
对 users 表中的数据,按照 status 字段进行升序排序
MySQL基本使用
对 users 表中的数据,按照 id 字段进行降序排序
MySQL基本使用
多重排序
对 users 表中的数据,先按照 status 字段进行降序排序,再按照 username 的字母顺序,进行升序排序
MySQL基本使用

⑨ COUNT(*) 函数

COUNT(*) 函数用于返回 查询结果的总数据条数,语法格式如下:

select count(*) from 表名称

示例
查询 users 表中 status 为 0 的总数据条数
MySQL基本使用

使用 AS 为列设置别名

如果希望给查询出来的列名称设置别名,可以使用 AS 关键字,例如
MySQL基本使用
MySQL基本使用



四、在项目中操作 MySQL

1. 在项目中操作数据库的步骤

  1. 安装操作 MySQL 数据库的 第三方模块mysql
  2. 通过 mysql 模块 连接到 MySQL 数据库
  3. 通过 mysql 模块 执行 SQL 语句
    MySQL基本使用

2. 安装与配置 mysql 模块

安装

mysql 模块是托管于 npm 上的 第三方模块, 可通过 npm 直接下载安装
npm i mysql

配置

在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置,主要的配置步骤如下:

// 导入 MySQL模块
const mysql = require('mysql');
// 建立与 MySQL 数据库的连接
const db = mysql.createPool({
    host: '127.0.0.1', // 数据库的 IP 地址
    user: 'root', // 登录数据库的账号
    password: 'admin123', // 登录数据库的密码
    database: 'my_db_01' //指定要操作哪个数据库
})

测试

调用db.query()函数,指定要执行的 SQL 语句,通过回调函数拿到执行的结果来判断 mysql模块是否正常执行

/*
db.query(param1, param2)
	param1: String, SQL语句
	param2:function,SQL语句执行后的回调函数
		err: 错误对象
		results: SQL语句执行结果
*/
db.query('select 1', (err, results) => { // 'select 1' 并无实际意义,单打用来测试
	// mysql模块异常
    if(err) return console.log(err.message);
    // mysql模块正常
    console.log(results);
})

输出结果:
MySQL基本使用

3. 使用 mysql 模块操作 MySQL 数据库

① 查询数据

例如,查询 users 表中所有的数据:

// 要执行的 sql 语句
const selectSqlStr = 'select * from users';

db.query(selectSqlStr, (err, results) => {
    // 查询失败
    if(err) return console.log(err.message);
    // 查询成功
    console.log(results); // 查询操作的结果 results 为数组
})

输出结果
MySQL基本使用


② 插入数据

例如,向 users 表中新增数据:

// 要插入到 users 表中的数据对象
const user = {username: 'superman01', password:'ssss01'};
// 待执行的 sql 语句,其中英文的 '?' 表示占位符
const insertSqlStr = 'insert into users (username, password) values (?, ?)';
//调用 query()执行sql语句的同时,其中数组参数会依次为 '?' 占位符指定具体的值 
db.query(insertSqlStr, [user.username, user.password], (err, results) => {
    if(err) return console.log(err.message); // 失败
    console.log(results);// 查询操作的结果 results 为数组
    // results.affectedRows 表示当次的操作对数据表中数据行所影响的行数
    if(results.affectedRows === 1) console.log('数据插入成功!'); // 成功
})

输出结果:
MySQL基本使用
表中的id值具有唯一性,不可重复
MySQL基本使用

插入数据的便捷方式

向表中新增数据时,如果 数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据:

const user = {username: 'superman02', password:'sssss2'};
const insertSqlStr = 'insert into users set ?';
db.query(insertSqlStr, user, (err, results) => {
    if(err) return console.log(err.message);
    if(results.affectedRows === 1) console.log('数据插入成功!');
})

③ 更新数据

可以通过如下方式,更新表中的数据:

// 要更新的数据对象
const user = {id: 6, username: 'aaa', password:'000'};
// 要执行的SQL语句
const updateSqlStr = 'update users set username=?, password=? where id=?';
// 调用 db.query() 执行sql语句的同时, 使用数组依次为占位符指定具体的值
db.query(updateSqlStr, [user.username, user.password, user.id], (err, results) => {
    if(err) return console.log(err.message); // 失败
    console.log(results); // 更新数据操作的结构 results 为对象
    if(results.affectedRows === 1) console.log('数据g更新成功!'); // 成功
})

输出结果:
MySQL基本使用

更新数据的便捷方式

更新表数据时,如果 数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据:

// 要更新的数据对象
const user = {id: 6, username: 'aaaa', password:'0000'};
// 要执行的SQL语句
const updateSqlStr = 'update users set ? where id=?';
// 调用 db.query() 执行sql语句的同时, 使用数组依次为占位符指定具体的值
db.query(updateSqlStr, [user, user.id], (err, results) => {
    if(err) return console.log(err.message); // 失败
    if(results.affectedRows === 1) console.log('数据更新成功!'); // 成功
})

④ 删除数据

在删除数据时,推荐根据 id 这样的唯一标识,来删除对应的数据。示例如下:

// 要执行的SQL语句
const deleteSqlStr = 'delete from users where id=?';
// 调用 db.query() 执行sql语句的同时, 为占位符指定具体的值
db.query(deleteSqlStr, 6, (err, results)=>{
    if(err) return console.log(err.message);
    if(results.affectedRows === 1) console.log('数据删除成功!');
})

注意:

  • 如果SQL语句中有多个占位符,则必须使用数组为每个占位符指定具体的值
  • 如果 SQL 语句中只有一个占位符,则可以省略数组形式

标记删除

使用 DELETE 语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用 标记删除 的形式,来 模拟删除的动作

所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除。
当用户执行了删除的动作时,实际并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应的 status 字段标记为删除即可。

const FalseDeleteSqlStr = 'update users set status=? where id=?';
db.query(FalseDeleteSqlStr,[1, 7], (err, results)=>{
    if(err) console.log(err.message)
    if(results.affectedRows) console.log('标记删除成功!');
})
上一篇:Nacos服务注册和发现以及配置管理技术分享,Go中接入非常简单极易上手


下一篇:容器监控cAdvisor原理分析