# 数据库

# 1. 数据库安装

1、打开mysql官方下载页面,选择5.6.41版本下载。

image-20200722230044778

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);
  });
};

但是用这种方式管理数据会有下面问题:

  1. 数据存取不方便,不利于维护和扩展,当数据量大了之后,无法直接通过打开文件的形式对数据进行操作
  2. 数据存储比较分散,无法进行集中式管理;

# 2.2 SQL数据库

SQL:Structured Query Language结构化查询语言

SQL是用于方便管理数据库的一套查询语言,可以利用SQL语句对数据进行增删改查(CURD),关系型数据一般都提供了SQL语法,也就是说你只要掌握SQL语法,就可以用相同的方式操作SQL数据库。

不管是什么数据库,最终都是将数据存到文件(硬盘)中,只是存储的格式不同于文本文件。

例如:一个 Excel 文件就可以看做一个数据库:

image-20191130010602491

一个 Excel 文件中可以包含多个数据表,表中就可以存储相应的数据:

image-20191130010617517

# 2.3 常见的数据库分类

关系型数据库(sql数据库)

MySQL:开源数据库,一般互联网公司使用,使用率非常高。

Oracle:大型商业数据库,很多大型项目银行系统都会用Oracle,商业授权非常昂贵。

Microsoft SQL Server:微软开发的数据库,闭源收费,用的人比较少。

非关系型数据库(No-sql数据库):

Mongodb:应用较为广泛的非关系型数据库,nodejs项目较多使用该数据库。

Redis:内存数据库,存储非常快

# 3. 连接和操作数据库

# 3.1 通过命令行操作数据库

  1. 打开cmd,登陆mysql

    #mysql -u你的用户名 -p密码
    mysql -uroot -p123456
    
  2. 使用create database命令创建数据库和使用show databases查看数据库

    #create database 数据库名字
    create database heima;
    # 查看是否创建成功
    show databases;
    
  3. use 数据库名字进入数据库

    # 使用heima数据库
    use heima;
    
  4. 创建数据库表

    表名: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;
    
  5. 查看表结构desc 表名

image-20200715153054276

# 3.2 通过navicat可视化操作数据库

image-20200722230445881

# 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)
  })
}