目录
一.数据库简单介绍
二.进一步了解MySQL
三.安装MySQL并配置
四.使用SQL语句管理数据库
1.SQL语言中的注释
2.SELECT查询语句
3.INSERT INTO插入语句
4.URDATE修改语句
5.DELETE删除语句
6.精讲WHERE子句
7.ORDER BY排序子句
8.COUNT(*)函数
五.在项目中链接并操作MySQL
1.配置mysql模块
2.简单测试MySQL数据库链接是否正常以及mysql模板是否可以正常工作
3.查询操作
4.插入操作
5.更新数据
6.删除操作与标记删除
一.数据库简单介绍
数据库(database)是组织、存储、管理数据的仓库,互联网中的数据都有数据库来存储以及管理,用户可以对数据库中的数据来进行增删改查的操作,我们今天要阐述的并使用的就是MySQL数据库,MySQL数据库也叫传统型数据库、关系型数据库或者SQL数据库(同样为该类型的数据库还有Oracle以及SQL Server),与之相互补的有一种非关系型数据库,也叫新型数据库或NoSQL数据库,以mongodb为例,我们在之前章节阐述过
二.进一步了解MySQL
MySQL是由数据库(database)、数据表(table)、数据行(row)、列【字段】(field)这四样构成,以这样的组织结构来进行存储
我们一般需要对每一个项目都建立一个与之相对应的独立的数据库
不同的数据需要存储在不同的表中
每一个表中具体需要存储哪些信息,由列决定
表中的行,代表每一条具体的数据
三.安装MySQL并配置
我们需要安装
MySQL Server:提供数据存储和服务的软件
MySQL Workbench:可视化MySQL管理工具
我们下载其mysql-installer-community-8.0.28.0.msi文件就可以,直接将所有的配置都安装上(windows)
下载地址:MySQLhttps://www.mysql.com/cn/
安装配置好之后,我们可以打开MySQL Workbench 8.0 CE软件运行数据库
*我们在安装配置时输入的密码需要记住,以此来链接数据库
我们可以在可视化工具中创建库、创建表等等
创建库:点击创建库选项-->填写库名-->Apply
创建表:
展开创建好的库-->Table右键-->Create Table-->填写表名称-->表描述(Comments)[可以不写]-->填写表字段-->Apply
创建表需要知道的数据类型及特殊标识 :
DataType数据类型:
int:整数 varchar(length):字符串【length表示限制字符串长度】
tinyint(0):布尔值
字段特殊标识:
PK(Primary Key):主键(唯一标识)
NN(Not Null):值不能为空
UQ(Unique):值唯一(只要前期创建过,后期就算删除了数据也会占用这个唯一的值)
AI(Auto Increment):值自动增长
Default/Expression:默认值
如果我们已经创建好表了,但是还想向表中添加数据,我们可以:
数据表右键-->Select Rows - Limit1000-->输入
不过毕竟我们在真正的项目中是必须要用SQL语句来进行操作,所以可视化图形工具只要会简单的使用就可以了,不需要做太深的研究 ,主要还是SQL语言的学习
四.使用SQL语句管理数据库
SQL(Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言,能够让我们以编程的形式操作数据库里面的数据,和其他编程语言一样,也有专门的SQL语句来进行数据库的编程
tips:SQL语言只能在非关系型数据库中使用,不能再类似mongodb这样的非关系型数据库中使用
tips:SQL语句的关键字对大小写不敏感
1.SQL语言中的注释
-- 这是一段SQL注释
2.SELECT查询语句
SELECT用来从表中查询数据,执行的结果被存储在一个结果集中(结果集也是以表的格式来显示)
假如我们现在想要查询users表中的所有数据:
SELECT * FROM users
(from)也就是从users表中查询(*通配符)所有的数据
这样是查询出整个表中的所有数据了,如果我们想要查询一个列(字段)的所有数据呢?
SELECT 字段(列)名称 FROM users
意思是从指定的表中查询出指定列的所有数据
查询多个列:
SELECT 列1名称,列2名称,列N名称 FROM users
3.INSERT INTO插入语句
向数据表中插入新的数据行
INSERT INTO users(列1,列2,列3) VALUES(列1对应的值,列2对应的值,列3对应的值)
向users表中插入三条数据:列1:列1对应的值,列1:列1对应的值,列1:列1对应的值
4.URDATE修改语句
URDATE users SET 列名=新值 WHERE 列名称=某值
意思是修改users表中列名为某值的那条数据,将它的列名改为新值
修改语句中涉及到了俩个我们没有见过的语句:
SET和WHERE
SET:指的是修改列名的新值
WHERE:指的是修改的条件,达到这个条件才可以修改
第一个列名和第二个列名不是一个列名,比如我们要在users表中修改id为80的那条数据,将它的password改为123456,并且将它的名字改为:小蜗:
URDATE users SET password= '123456',username='小蜗' WHERE id=80
5.DELETE删除语句
假如我们现在想要删除id值为100的那个用户信息
DELETE FROM users WHERE id=100
-- DELETE FROM users WHERE 列名称=值
6.精讲WHERE子句
之前我们UPDATE修改语句中说到过WHERE语句,它其实就是用于限定选择的一个标准,也就是说达到了这个限定才可以执行前面的主语句,没有WHERE前面的语句也可以执行,但是会将表中的所有数据都修改,所以使主语句更加的完整的WHERE语句就被称为子语句
我们之前都是使用"="符号来限制条件,其实WHERE语句也可以使用其他的运算符
=:等于
>:大于
<:小于
>=:大于等于
<=:小于等于
!=/<>:不等于
BETWEEN:在某个范围内
LIKE:搜索某种模式
AND:表示同时满足俩个或多个条件时执行相关操作
DELETE FROM users WHERE id>100 AND status=1
OR:表示只要满足俩个或多个其中一个就可以执行相关操作
DELETE FROM users WHERE id>100 OR status=1
7.ORDER BY排序子句
ORDER BY用于根据的指定的列,来对相关数据进行排序
升序ASC:
SELECT * FROM users ORDER BY id
-- 或者是:
SELECT * FROM users ORDER BY id ASC
因为ORDER BY具有默认值,它的默认值就是升序,所以我们可以不写
降序:
SELECT * FROM users ORDER BY id DESC
多重排序:
SELECT * FROM users ORDER BY id DESC,status=0,username ASC
8.COUNT(*)函数
COUNT(*)函数用来返回查询结果的总数据条数
假如我们想要获取users表中一共有几条数据(几行)
SELECT COUNT(*) FROM users
其中AS语句可以为获取到的结果集命令。如果不命名的话,我们获取到的结果集的列名称就为COUNT(*)表达不了意思,也不好看:
假如我们现在想要知道status值为1的用户有多少,并将获取到的结果集的列名改为errnum:
SELECT COUNT(*) AS errnum FROM users WHERE status=1
我们发现status值为1的用户有一个,并将查询到的结果集的名称改为了errnum
五.在项目中链接并操作MySQL
在node环境中,我们 可以直接下载一个第三方的包,叫做mysql
然后链接到我们的MySQL数据库,最后通过mysql模块执行SQL语句,就可以实现对数据库的操作了,我们可以通过模板引擎或者模板字符串等方式动态渲染到UI页面
1.配置mysql模块
下载就不需要多说了,我们require导入完成之后
建立于MySQL数据库的链接:
//导入
const mysql = require('mysql')
//链接
const db = mysql.createPool()
其实链接不算完成,我们需要在createPool方法中以填写我们的MySQL数据库信息对象,然后才可以真正的建立链接:
//导入
const mysql = require('mysql')
//链接
const db = mysql.createPool({
host:'127.0.0.1',
user:'root',
password:'admin123'
database:'my_testdb'
})
host:代表数据库的IP地址
user:代表登录数据库的账号名称
password:代表登录数据库的账号密码
database:被操作数据库名称
2.简单测试MySQL数据库链接是否正常以及mysql模板是否可以正常工作
在我们执行SQL语句的时候,需要调用是query()函数,来指定要执行的SQL语句以及回调函数
//导入
const mysql = require('mysql')
//链接
const db = mysql.createPool({
host:'127.0.0.1',
user:'root',
password:'admin123'
database:'my_testdb'
})
//SELECT 1没有实际性的作用,只是简单的测试一下
//如果错误返回err报错,如果正确返回results值
//我们通过返回的正确值中不难看出,查询语句返回的是一个数组
db.query('SELECT 1',(err,results) => {
if(err) return console.log("失败" + err.message)
console.log(results)
})
//打印出[RowDataPacket {'1':1}]表示成功,链接正常
3.查询操作
//查询
const dbStr = 'SELECT * FROM users'
db.query(dbStr,(err,results) => {
if(err) return console.log("请求错误" + err.message)
console.log(results);
})
我们查询了users表中的所有数据
4.插入操作
//插入(繁琐)
const dbStr = {
username:"小giao",
password:"@giao998"
}
const sqlStr = 'insert into users (username,password) values(?,?)'
db.query(sqlStr,[dbStr.username,dbStr.password],(err,results) => {
if(err) return console.log("错误" + err.message)
if(results.affectedRows === 1){
console.log("插入成功");
}
})
我们发现在给值的时候,我们使用了?,后续通过填充而实现了插入的操作
?其实就是SQL语句中的占位符,我们现在占位,然后后续有了动态的值传进来,实现动态的插入
多个值我们使用[]数组的形式包含起来
成功之后的返回值affectedRows是一个属性,表示我们执行了这条SQL语句影响到的行数,我们就插入了一行数据,所以当affectedRows等于1的时候,就表示插入成功
tips:执行INSERT INTO插入语句返回的值不是数组了,而是一个对象
简便写法:
为什么会有简便写法,难道这还不见简便吗?
数据少的时候固然可以,但是如果我们需要写入很多很多数据呢?单单是?就需要写很多,非常的不好,所以我们:
const dbStr = {
username:"老王",
password:"985985211"
}
//使用SET?即可将一一对应的数据填充到这里进行执行
const sqlStr = 'insert into users set ?'
//直接将dbStr对象传过去
db.query(sqlStr,dbStr,(err,results) => {
if(err) return console.log("错误" + err.message)
if(results.affectedRows === 1){
console.log("插入成功");
}
})
这次,无论我们有多少的数据,都只需要写一个问号,不需要写很多的语句以及键值
tips:如果我们id值(主键)采用的是UQ值为一且AI自动增长的话,我们删除了id为100的用户,再进行新注册用户的话,这个用户不可以再占用id100的位置了,新用户应该依次为101,消失的100就算删了也不能重复占用
5.更新数据
它的返回值也是一个对象
同样我们使用最便捷的方式来做例子:
//更新
const dbStr = {
id:2,
username:"小郭",
password:"985985211"
}
const sqlStr = 'update users set ? where id=?'
db.query(sqlStr,[dbStr,dbStr.id],(err,results) => {
if(err) return console.log("错误" + err.message)
if(results.affectedRows === 1){
console.log("更新成功");
}
})
tips:如果SQL语句中有多个占位符,必须使用数组来为每一个占位符指定具体的值,如果只有一个占位符,我们就可以省略数组
6.删除操作与标记删除
返回值也是一个对象,我们可以更具ID值来删除对应的数据,因为id值是唯一的,不会多删误删
删除建议并不要真正的删除用户数据,使用DELETE会把用户的数据从表中真正的删除掉,一些重要的用户信息不可以使用DELETE来删除,我们可以使用标记删除来模拟一个删除的动作
比如我们建一个status列,为布尔值类型,为0时用户正常,为1时用户删除,使用status来标记删除
本质就是用户执行删除之后,我们并没有真正的删除,而是使用修改语句将status的值改为1
//更新
const dbStr = {id:2}
const sqlStr = 'update users set status=1 where id=?'
db.query(sqlStr,dbStr,(err,results) => {
if(err) return console.log("错误" + err.message)
if(results.affectedRows === 1){
console.log("删除成功");
}
})