# 数据库
# 1. 数据库安装
1、打开mysql官方下载页面,选择5.6.41版本下载。
2、下载完毕,运行安装包进行安装,查看安装教程
# 2. 数据库介绍
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
# 2.1 纯文本管理数据弊端
以前我们通常把数据存储在一个json文件中,然后通过fs
模块的读写文件完成数据读取和更新。
下面代码是用于查找用户是否已存在
// 通过fs读取文件,查找数据
const foundUser = function(name, callback) {
fs.readFile(__dirname + "/user.json", "utf-8", (err, data) => {
const users = JSON.parse(data);
const hasFound = users.find(item => item.name === name);
callback(hasFound);
});
};
但是用这种方式管理数据会有下面问题:
- 数据存取不方便,不利于维护和扩展,当数据量大了之后,无法直接通过打开文件的形式对数据进行操作
- 数据存储比较分散,无法进行集中式管理;
# 2.2 SQL数据库
SQL:Structured Query Language结构化查询语言
SQL是用于方便管理数据库的一套查询语言,可以利用SQL语句对数据进行增删改查(CURD),关系型数据一般都提供了SQL语法,也就是说你只要掌握SQL语法,就可以用相同的方式操作SQL数据库。
不管是什么数据库,最终都是将数据存到文件(硬盘)中,只是存储的格式不同于文本文件。
例如:一个 Excel 文件就可以看做一个数据库:
一个 Excel 文件中可以包含多个数据表,表中就可以存储相应的数据:
# 2.3 常见的数据库分类
关系型数据库(sql数据库)
MySQL:开源数据库,一般互联网公司使用,使用率非常高。
Oracle:大型商业数据库,很多大型项目银行系统都会用Oracle,商业授权非常昂贵。
Microsoft SQL Server:微软开发的数据库,闭源收费,用的人比较少。
非关系型数据库(No-sql数据库):
Mongodb:应用较为广泛的非关系型数据库,nodejs项目较多使用该数据库。
Redis:内存数据库,存储非常快
# 3. 连接和操作数据库
# 3.1 通过命令行操作数据库
打开cmd,登陆mysql
#mysql -u你的用户名 -p密码 mysql -uroot -p123456
使用
create database
命令创建数据库和使用show databases
查看数据库#create database 数据库名字 create database heima; # 查看是否创建成功 show databases;
use 数据库名字
进入数据库# 使用heima数据库 use heima;
创建数据库表
表名:heros
表字段:id(唯一id),name(名字,不能为空值),gender(性别),img(头像),isdelete(是否被删除,默认是0,删除是1)
因为id是唯一值,我们设置它为主键,同时我们希望没插入一条数据,id值会自动增加1,所以把它设置为自动递增
auto_increment
create table heros( id int not null primary key auto_increment, name varchar(255) not null, gender varchar(255), img varchar(255), isdelete tinyint default 0) character set utf8;
查看表结构
desc 表名
# 3.2 通过navicat可视化操作数据库
# 4. SQL语句
# 4.1 增加
-- 2. 增加语句
-- 语法: insert [into] 表名 (字段1,字段2...) values (值1,值2...);
insert into heros (id,name,gender,img,isdelete) values (NULL,'张飞','男',NULL, 1);
insert into heros (name,gender) values ('兰陵王','男');
insert into heros values (null,"花木兰","女"); -- 如果直接写值的话,必须和字段匹配起来,这样写会报错的
insert into heros values (null,"花木兰","女", NULL , 0); -- 没有字段的时候,如果要是直接添加值的话,必须和字段对应,不能缺少
# 4.2 查询
-- 1. 查询的SQL语句 查询出来的数据都是结果集
-- 语法: select * from 表名 where 条件
select * from heros; -- 表示查询所有的数据信息
select id,name,gender from heros; -- 根据指定的字段来查询
select * from heros where id = 2; -- 查询id为2的那一条数据
select name,gender from heros where id = 3; -- 查询id为3的那条数据中的name gender id
select * from heros where id =3 or id= 5; -- 查询id为3 和5 的那两条数据
select * from heros where id = 2 or id = 3 or id = 4;
select * from heros where id in (2,3,4,5,7); -- 查询id为 2 3 4 5 7 的那些数据
# 4.3 修改
-- 4. 修改语句
-- 语法: UPDATE 表名 set 字段1= 值1,字段2 = 值2... where 条件
UPDATE heros set gender = '男'; -- 如果后面没有跟条件的话,则表示将表中所有的数据中的gender都改成了男
UPDATE heros set gender = '女' WHERE id = 3; -- 将id为3的那条数据中的gender修改为“女”
UPDATE heros set gender = '女' WHERE name = '花木兰'; -- 将数据表中名字叫"李四"
# 4.4 删除
-- 3. 删除语句
-- 语法: DELETE FROM 表名 where 条件
DELETE FROM heros where id = 7;
DELETE FROM heros where id = 2 or id = 8;
DELETE FROM heros where id in (4,5,10);
DELETE FROM heros WHERE gender ='男' AND name = '兰陵王'; -- 通过多条件来删除数据 and 在这里表示并且的关系
DELETE FROM heros WHERE id > 10; -- 还可以根据id的特性
# 5. 常用函数
SQL提供用于统计,排序等便捷函数
# 5.1 统计
SELECT count(*) FROM heros; -- count用来统计所有的数据条数 会根据里面的参数来进行统计
SELECT count(id) FROM heros; -- 根据id来统计具体的数据条数
SELECT count(img) FROM heros; -- 根据img字段来统计具体的条数,如果数据为空则会忽略
SELECT MAX(id) FROM heros; -- 查询id中的最大值
SELECT MIN(id) FROM heros; -- 查询id中的最小值
SELECT avg(id) FROM heros; -- 查询id中的平均值 average 平均值
# 5.2 排序
SELECT * FROM heros order by id; -- order by是用来排序的,默认是以升序进行排序 asc就是升序排序
SELECT * FROM heros ORDER BY id desc;
# 5.3 分页
select * from heros limit 3; -- 取结果集中的前3条
SELECT * FROM heros ORDER BY id limit 3 offset 2; --从索引为2的位置向下查询3条
# 6. Node中操作数据库
使用nodejs操作数据库,需要安装mysql模块
npm install mysql --save
# 6.1 连接数据库
// 导入MySQL模块
var mysql = require('mysql');
// 创建一个数据库连接
var connection = mysql.createConnection({
host: '127.0.0.1', // 数据库服务器的地址
user: 'root', // 数据库的账号
password: 'root', // 数据库的密码
database: 'heima' // 数据库名称
});
// 连接数据库或打开数据库
connection.connect();
# 6.2 查询操作
// 获取所有英雄信息
const getHeros = function() {
connection.query('select * from heros', (err, results, fields) => {
console.log(results);
})
}
getHeros();
// 根据id获取单个英雄信息
const getHeroById = function(id) {
connection.query('select * from heros where id =' + id, (err, results, fields) => {
console.log(results);
})
}
// 根据英雄名字获取信息
const getHeroByName = function(name) {
// 问号相当于一个占位符,它会读取第二个参数中的值作为填充
connection.query('select * from heros where name =?', [name] , (err, results, fields) => {
console.log(results);
})
}
# 6.3 添加数据
// 新增英雄
const addHero = function() {
connection.query('insert into heros set ?', { name: '黄忠', gender: '男'}, (err, results, fields) => {
console.log(results);
})
}
# 6.3 更新数据
// 更新英雄
const updateHero = function() {
// 下面语句表示把id为2的数据的 name字段改为兰陵王
connection.query('update heros set ? where id = ?', [{name: '兰陵王'}, 2], (err, results, fields) => {
console.log(results);
})
}
# 6.4 删除数据
// 根据id删除英雄数据
const deleteHero = function(id) {
connection.query('delete from heros where id=' + id, (err, results, fields) => {
console.log(results);
})
}
# 6.4.1 软删除
数据库的数据是企业宝贵的财产,为了防止误操作导致数据丢失,往往在执行操作的时候,只是把数据标记为删除状态。
// 软删除,其实就是把isdelete字段更改为true值
const deleteHeroSoft = function(id) {
connection.query('update heros set isdelete=? where id=?', [true, id], function (err, results, fields) {
console.log(results)
})
}