1. MySQL数据库
phpstudy 数据库服务器及图形化软件 软件链接
链接:https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw
提取码:xl3k
数据库对于我们前端同学来说,就是一个了解。
对于不会变化的数据(省、市、县),我们可以保存到json文件中。
对于经常变化的数据,我们建议保存到数据库中。
1.1 什么是数据库
数据库 (database) 是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、
浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。
为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数 据进行新增、查询、更新、删除等操作。
- 增删改查
- 新增
- 删除
- 修改
- 查询
1.2 常见的数据库及分类
市面上的数据库有很多种,最常见的数据库有如下几个:
- MySQL 数据库(目前使用最广泛、流行度最高的的开源免费数据库;)
- Oracle 数据库(收费)
- SQL Server 数据库(收费)
- Mongodb 数据库(Community + Enterprise)
其中,MySQL、Oracle、SQL Server 属于传统型数据库(又叫做:关系型数据库 或 SQL 数据库),这三者的 设计理念相同,用法比较类似。
而 Mongodb 属于新型数据库(又叫做:非关系型数据库 或 NoSQL 数据库),它在一定程度上弥补了传统型 数据库的缺陷。
1.3 MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品
我们常说数据库,其实只是一个泛指。那么数据库的结构是怎样的呢?
- 数据库服务器
- 数据库(一般来说,一个项目,都会使用一个独立的数据库)
- 数据表(真正存储数据的地方)
- 行与列(每一行代表一条数据。列又叫做字段)
- 数据表(真正存储数据的地方)
- 数据库(一般来说,一个项目,都会使用一个独立的数据库)
真正存储数据的是数据表。数据表和我们见过的Excel表格结构基本相同。
数据表的结构和excel一模一样。
id(不允许重复) | name | age | sex | tel |
---|---|---|---|---|
1 | 王宇 | 23 | 男 | 13200008888 |
2 | 王宇 | 23 | 男 | 13300008888 |
3 | 裴志博 | 25 | 男 | 18866669999 |
… | … | … | … | … |
2 安装MySQL
MySQL 服务器软件 ---- 存储数据,可以创建数据库、数据表
MySQL图形化管理工具 — 可以使用它管理(创建、增删改查等等)数据库
2.1 安装MySQL服务软件
安装wampserver
安装过程,略
2.2 安装操作MySQL的图形化工具(Navicat)
图形化的管理工具,有很多种
- mysql-workbeach(英文版,没有中文版)
- Navicat
前面已经安装了MySQL软件。那么我们如何管理或者说使用它呢,对于我们来说,还需要安装一个管理MySQL的工具,它就是 Navicat
。
MySQL服务和图形化工具的关系
安装过程略,但要记住你的安装目录。
破解:将补丁中的 “navicat.exe” 复制到你的安装目录中,覆盖原理的文件即可
3 Navicat使用
3.1 连接到MySQL服务器
3.2 创建数据库
3.3 创建数据表
比如创建一个学生信息表:
id(不允许重复) | name | age | sex | tel |
---|---|---|---|---|
1 | 王宇 | 23 | 男 | 13200008888 |
2 | 王宇 | 24 | 男 | 13300008888 |
3 | 裴志博 | 25 | 男 | 18866669999 |
… | … | … | … | … |
对于一张表,最重要的是表头的设计
对于数据库中的数据表,最重要的设计也是表头,只不过在数据库中
把表头叫做字段
。
名(表头) | 类型 | 长度 | 不是null | 键 | 其他 |
---|---|---|---|---|---|
id | int | √ | 🗝 | 勾选自动递增 | |
name | varchar | 10 | √ | ||
age | int | ||||
sex | char | 1 |
-
id – 自动递增 – √
-
最后保存,填表名
student
。 -
其他补充点
- 数据库中的数字类型
- tinyint -128~127
- smallint -65535 ~ 65535
- int -21亿 ~ 21亿
- bigint 更大
- 数据库中的字符串类型
- varchar - 变长字符串类型
- char - 定长字符串类型
- 数据库中的数字类型
3.4 导入导出数据表
-
导出
- 在数据表名字上,比如
student
上,右键 --> 转储SQL文件 --> 结构和数据,选择保存位置保存即可。
- 在数据表名字上,比如
-
导入
- 在数据库名上面 --> 右键 --> 运行SQL文件 --> 选择SQL文件,运行即可完成导入。
- 导入注意事项,表名不能重复。
SQL语句(重点)
SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言。
三个关键点
- SQL 是一门数据库编程语言
- 使用 SQL 语言编写出来的代码,叫做 SQL 语句
- SQL 语言只能在关系型数据库(例如 MySQL、Oracle、SQL Server)中使用。非关系型数据库(例如 Mongodb) 不支持 SQL 语言
SQL能做什么
- 从数据库中查询数据
- 向数据库中插入新的数据
- 更新数据库中的数据
- 从数据库删除数据
- 可以创建新数据库
- 可在数据库中创建新表
- 可在数据库中创建存储过程、视图
- etc…
4. 数据查询
语法格式:
- SQL语句,
不区分
大小写。
-- 基本的查询语法
SELECT 字段1,字段2,... FROM 表名
select 字段,字段,.... from 表名-- 查询所有的字段
SELECT * FROM 表名-- 带条件的查询
SELECT * FROM 表名 [WHERE 条件] [ORDER BY 排序字段[, 排序字段]] LIMIT [开始位置,]长度.....
4.1 基本查询
格式: select 字段名1, 字段名2,… from 表名
案例1: 查询所有英雄的姓名和昵称
select name,nickname from heroes
案例2: 查询全部英雄的全部信息
select * from heroes
4.2 带where子句的查询
select field1, field2… from 表名 查询表中的所有数据
where 可以使用条件来筛选查询出的结果
-- 查询id小于10的英雄
-- select * from heroes where 条件
-- select * from heroes where id<10-- 查询id小于20的女英雄
-- select * from heroes where id<20 and sex='女'-- 查询年龄大于等于20小于等于30的英雄
-- select * from heroes where age>=20 and age<=30
-- select * from heroes where age between 20 and 30
4.3 模糊查询
通配符:
-
%: 代表任意长度(包括0)的任意字符
-
_: 代表1位长度的任意字符
like: 在执行模糊查询时,必须使用like来作为匹配条件
-- 查询名字中带有 “斯” 的英雄
-- select * from heroes where name like '%斯%'-- 查询名字的最后一个字是 “斯” 的英雄
-- select * from heroes where name like '%斯'-- 查询名字中带有 “斯” ,并且要求 “斯”前面只能有一个字的英雄
select * from heroes where name like '_斯%'
4.34 统计查询
- max 查询最大值
select max(age) from heroes
- Min 查询最小值
select min(age) from heroes
- avg 查询平均值
select avg(age) from heroes
- sum 查询总和(查询所有英雄的年龄之和)
select sum(age) from heroes
- count 查询总记录数(查询共计有多少个英雄)
select count(*) cc from heroes
-- 查询所有英雄中年龄最大的的年龄
-- select max(age) from heroes-- 查询所有英雄中年龄最小的的年龄
-- select min(age) from heroes-- 查询所有英雄年龄的平均值
-- select avg(age) from heroes-- 查询所有英雄的年龄之和
-- select sum(age) from heroes-- 查询共计有多少个英雄
-- select count(*) from heroes-- 查询共计有多少英雄,用cc表示
-- select count(*) cc from heroes
4.4 查询结果排序
order by 可以对查询结果按某个字段进行升序或者降序排列
- 升序 asc (默认值)
- 降序 desc
可进行排序的字段通常是 整型 英文字符串型 日期型 (中文字符串也行,但一般不用)
-- select * from heroes order by 排序字段 asc/desc
-- asc 默认值,可以省略,表示升序
-- desc,表示降序-- 查询所有的英雄,按年龄升序排序
-- select * from heroes order by age asc
-- select * from heroes order by age-- 查询所有的英雄,按年龄降序排序
-- select * from heroes order by age desc-- 查询所有的英雄,先按年龄降序排序;如果年龄相同的,再按id降序排序
-- select * from heroes order by age desc, id desc-- 查询年龄大于50岁的英雄,并按年龄降序排序
select * from heroes where age>50 order by age desc
注意:如果SQL语句中,有where和order by,where一定要放到order by之前。
4.5 限制查询结果
limit 用来限制查询结果的起始点和长度
- 格式: limit start, length
- start: 起始点。 查询结果的索引,从0开始。 0代表第一条数据。如果省略start,则默认表示从0
- length: 长度
-- 查询所有英雄中前5个英雄
-- select * from heroes limit 起始位置, 长度
-- select * from heroes limit 0, 5
-- select * from heroes limit 5-- 查询所有英雄中,第6到10个英雄
-- select * from heroes limit 5, 5-- 查询年龄最大的3个英雄
-- select * from heroes order by age desc limit 3-- 查询年龄最大的3个女英雄
select * from heroes where sex='女' order by age desc limit 3
注意:where、order by、limit如果一起使用,是有顺序的,where在最前面、其次是order by、limit要放到最后。另外三者之间没有and之类的。
4.6 小结
- 控制查询的列数
- select 字段, 字段, … from heroes ---- 选择查询指定的列
- select * from heroes ---- 查询所有的列
- 控制查询的行数
- where 条件
- where id>3
- where id>3 and age<30
- where id<3 or sex=‘男’
- where name like ‘%斯%’
- order by 字段 排序规则
- order by age asc
- order by age desc
- limit 起始位置, 长度
- limit 0, 3 相当于 limit 3
- limit 3, 3
- where 条件
select 字段 from 表名 [where 条件] [order by 排序字段 排序规则] [limit 起始位置,长度]
select count(*) as total from 表名 – 查询总记录数
5. 添加数据
基本的格式: insert into 表名 …
方式一:指定字段和值,只要字段和值对应即可。和顺序无关
insert into heroes (字段, 字段, ...) values (值, 值, ...)
insert into heroes (nickname, age, name) values ('虚空恐惧', 98, '科加斯')
方式二:和顺序有关,因为没指定字段,所以值必须是所有的值,而且顺序和表中字段的顺序要一致
insert into heroes values (null, '拉克丝', '光辉女郎', '女', 28)
方式三:使用set里设置新数据的值,没有顺序关系
insert into heroes set 字段=值, 字段=值, ....
insert into heroes set name='李青', nickname='盲僧'
6. 修改数据
格式:
update 表名 set 字段1=值1, 字段2=值2,... where 修改条件
修改表中的哪一条(几条)数据的 字段1=值1…
不指定修改条件会修改所有的数据
-- 加条件修改
update heroes set age=28, skill='在地上打滚' where id=19
-- 如果不指定条件,则会修改所有的行
update heroes set sex='妖'
7. 删除数据
格式: delete from 表名 where 删除条件
注意:不指定条件将删除所有数据
-- delete from heroes where id=19
-- 不加条件,将删除所有的数据,危险操作
-- delete from heroes
drop table stu; – 删除stu表
drop database heroes – 删除库,加入反引号可以防止出现问题,否则MySQL可能会将70当做关键字或其他意思解释
小结
- 添加
- insert into 表名 set 字段=值, 字段=值, 字段=值, …
- 更新
- update 表名 set 字段=值, 字段=值, 字段=值 where 条件
- 删除
- delete from 表名 where 条件
8. node中的mysql模块
8.1 mysql模块的作用
mysql模块是一个第三方模块,专门用来操作MySQL数据库。 可以执行增删改查操作。
# 如果前面没有安装过其他模块,需要先初始化
npm i mysql
curd: 就代表数据库的增删改查
c: create 就是添加 (增)
u: update 就是修改 (改)
r: read 就是查询 (查)
d: delete 就是删除 (删)
8.2 mysql模块的使用步骤
在Node中使用MySQL模块一共需要5个步骤:
-
加载 MySQL 模块
-
创建 MySQL 连接对象
-
连接 MySQL 服务器
-
执行SQL语句
-
关闭链接
// 1. 加载mysql模块
const mysql = require('mysql');
// 2. 创建连接对象(设置连接参数)
const conn = mysql.createConnection({// 属性:值host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong'
});// 3. 连接到MySQL服务器
conn.connect();// 4. 完成查询(增删改查)
/*
conn.query(SQL语句, [SQL中占位符的值], (err, result, fields) => {err: 错误信息result: 查询结果fields: 当前查询过程中涉及到的字段信息,一般用不着
});
*/// 5. 关闭连接,释放资源
conn.end();
8.3 基本的增删改查
基本的查询
执行查询类型的SQL语句,查询结果(result)是一个数组,数组的每个单元是对象,每个对象就是一条记录,对象的属性是数据表的字段名
// 1. 加载mysql
const mysql = require('mysql');// 2. 创建连接对象(填写连接参数)
const conn = mysql.createConnection({host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong',multipleStatements: true // 表示可以一次性执行多条SQL
})// 3. 连接到MySQL服务器
conn.connect();// 4. 完成查询
// conn.query(SQL语句, 给占位符的值, 回调函数);/// 4.1 基本的查询
conn.query('select * from heroes limit 2', (err, result) => {if (err) throw err;console.log(result);
});// 5. 关闭连接
conn.end();
执行增删改语句
要完成增删改操作,只需要将SQL语句换成增删改语句即可。
对于增删改语句,返回的result是一个表示SQL执行结果的对象。其主要属性如下:
- insertId 添加时有该属性,表示新增数据的id
- affectedRows 受影响行数,表示受影响的行数。增删改的时候都有该属性
- changRows 改变的行数,修改操作的时候,会有该属性
// 1. 加载mysql
const mysql = require('mysql');// 2. 创建连接对象(填写连接参数)
const conn = mysql.createConnection({host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong',multipleStatements: true // 表示可以一次性执行多条SQL
})// 3. 连接到MySQL服务器
conn.connect();// 4. 完成查询
// conn.query(SQL语句, 给占位符的值, 回调函数);/// 4.2 增删改
conn.query('delete from heroes where id = 1', (err, result) => {if (err) throw err;console.log(result);
});// 5. 关闭连接
conn.end();
8.4 占位符模式的增删改查
什么是占位符
SQL中的“?” 就是占位符。比如
select * from heroes where id > ?
insert into heroes set ?
update heroes set ? where id = ?
delete from heroes where id = ?
如何为占位符传值
当SQL语句中使用了占位符,则query方法需要使用参数2为这些占位符传递实际的值。并且不同的 “?” 需要的值格式也不同。具体要符合下面三种要求:
-
SQL中有 1 个占位符,则query方法的第二个参数设置为一个值
-
SQL中有 多 个占位符,则query方法的第二个参数设置为数组,数组中的值按顺序分别传递给每个占位符
-
SQL中,如果
字段=值,字段=值...
使用 “?” 站位了,则需为这个 “?” 传递一个对象,形式如下:let val = {// 字段: 值name: '压缩',nickname: '疾风剑豪',// 其他... }
有占位符的增删改查
// 例子一:查询id小于3的英雄
let sql = 'select * from heroes where id < ?';
conn.query(sql, 3, (err, result) => {if (err) throw err;console.log(result);
});
// 例子二:查询id小于3的女英雄
let sql = 'select * from heroes where id < ? and sex = ?';
conn.query(sql, [3, '女'], (err, result) => {if (err) throw err;console.log(result);
});
// 例子三:SQL中的 "字段=值, 字段=值..."的位置使用了一个占位符,则需为该占位符传递一个对象
// 如果SQL语句中有 字段=值, 字段=值, .... 可以使用一个 ? 表示;并且要为这个问号传递一个对象
let sql = 'insert into heroes set ?';
let values = {// 字段: 值name: '艾克',nickname: '时间刺客',age: 34
};
conn.query(sql, values, (err, result) => {if (err) throw err;// console.log(result);if (result.affectedRows > 0) {console.log('添加成功,最新添加的id为:' + result.insertId);} else {console.log('添加失败');}
});
// 例子四:
// SQL中有两个占位符,所以要传递一个数组
// 第1个问号表示 “字段=值, 字段=值...”,所以为这个问号传递一个对象
let sql = 'update heroes set ? where id = ?';
let values = {skill: '时光倒流',sex: '男'
}
conn.query(sql, [values, 36], (err, result) => {if (err) {console.log('修改失败');} else {console.log('修改成功');}
});