2.2 SQL
SQL是一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。
分类
全称
说明
DDL
Data Definition Language
数据定义语言,用来定义数据库对象(数据库,表,字段)
DML
Data Manipulation Language
数据操作语言,用来对数据库表中的数据进行增删改
DQL
Data Query Language
数据查询语言,用来查询数据库中表的记录
DCL
Data Control Language
数据控制语言,用来创建数据库用户、控制数据库的访问权限
1.DDL-数据库
上述语法的database也可换成schema。如:create schema db01; MySQL8版本中,默认字符集为utf8mb4
utf8mb4是一种能支持emoji表情包(😌)的存储方式
2.DDL-表结构
这里,我们结合一个实际页面做一个需求分析,尝试解读他的表结构是什么样(给大家5min时间)
现在我来带领大家一起分析一下
字段
字段类型
字段长度
字段描述
id
int
20
数据唯一ID
name
varchar
255
武器名称(AK-47、M4A1等)
baseWeapon
varchar
255
武器型号(消音型)
price
decimal
10,2
武器价格
appearance
varchar
50
外观:崭新出厂、久经沙场、略有磨损
category
varchar
20
类别(武器皮肤、印花)
quality
varchar
20
品质(全息、闪耀、冠军等)
isCollectible
tinyint
1
收藏品:是(1)、否(0)
imgUrl
varchar
500
商品图片(存储图片 URL)
stock
int
10
在售数量
有了这个之后,我们就需要结合上面的语法,在DataGrip里完成表结构的创建
在自己的数据库连接下,右键-创建表
声明表名,这里我用:weapon,你可以随意
声明表字段,如上分析的,依次填写,这里我不再一一截图
声明一个表的唯一主键,用于标识数据
所有字段填写完毕后,点击ok,此时我们的表就创建好了(这里我只填写了2个)
案例练习
请你完成我们本次实训需要开发的游戏饰品前后端开发项目的表结构分析设计,页面原型图如下
案例讲解
课堂实施,最终分析下来的SQL语句如下:
3.DML-新增数据
语法如下,我们依次按照下面语法完成上述表结构数据的新增
⏰注意:
插入数据时,指定的字段顺序需要与值的顺序是一一对应的 。
字符串和日期型数据应该包含在引号中(单引号、双引号都可以)。
插入的数据大小/长度,应该在字段的规定范围内 。
4.DML-删除数据
语法如下,我们按照下面语法完成上述表结构数据的删除
⏰注意:
DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
🤓思考一个问题:项目正式上线之后,你是否会删除这条数据?
会:数据就真的没了
这种,我们称之为:物理删除
不会:那怎么实现删除的效果呢
这种,我们称之为:逻辑删除
5.DML-修改数据
语法如下,我们按照下面语法完成上述表结构数据的更新
⏰注意:
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
6.DQL-查找数据
一个完整的DQL查询包含以下几个部分
基本查询(select...from...)
条件查询(where)
分组查询(group by)
排序查询(order by)
分页查询(limit)
基本查询
- 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
案例练习:
请你查找出当前武器表里面的:图片、价格、数量
条件查询
比较运算符
功能
>
大于=
大于等于
<
小于
<=
小于等于
=
等于
<> 或 !=
不等于
between ... and ...
在某个范围之内(含最小、最大值)
in(...)
在in之后的列表中的值,多选一
like 占位符
模糊匹配(_匹配单个字符, %匹配任意个字符)
is null
是null
逻辑运算符
功能
and 或 &&
并且 (多个条件同时成立)
or 或 ||
或者 (多个条件任意一个成立)
not 或 !
非 , 不是
案例练习:
基础比较与逻辑组合查出当前武器表中:
价格大于 200 元,且外观为 “崭新出厂”,且品质是 “全息” 或 “冠军” 的武器
范围与否定逻辑查出当前武器表中:
库存数量在 10 到 50 之间(含 10 和 50),且类别不是 “印花”,且标签不包含 “略有磨损” 的武器
模糊匹配与空值判断查出当前武器表中:
名称以 “AK-” 开头(如 AK-47、AK-74),且评价数量不为空的武器
多条件组合与枚举匹配查出当前武器表中:
武器型号在“M4A1”“AWP”“P2000”列表中,且价格小于 100 元,且库存数量不等于 0 的武器
复杂逻辑嵌套查出当前武器表中:
价格在 500 元以上且品质为闪耀 或者价格在 100-300 元之间且外观为久经沙场,且标签不为空的武器
分组查询
函数
功能
count
统计数量
max
最大值
min
最小值
avg
平均值
sum
求和
案例练习:
查找出价格最大的武器
查找所有武器的平均价格
null值不参与所有聚合函数的运算 。
统计数量可以使用:count() count(字段) count(常量),推荐使用count() 。
除了上述的分组函数,还有两个关键字也是经常使用的
where与having的区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;
而having是分组之后对结果进行过滤。判断条件不同:where不能对聚合函数进行判断,而having可以。
比如我要统计每个基础武器型号(baseWeapon)的平均价格,但只关注:
外观为 “崭新出厂” 的商品(分组前过滤)
平均价格超过 200 元的武器型号(分组后过滤)
假设表结构核心字段如下
字段名
说明
baseWeapon
基础武器型号(如 AK-47、M4A1)
appearance
外观状态(如 “崭新出厂”“久经沙场”)
price
单价(元)
则对应的sql如下,表示:外观为崭新出厂的 AWP 和 M4A1,平均价格均超过 200 元
排序查询
排序方式:升序(asc),降序(desc);默认为升序asc,是可以不写的
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
案例练习:
查询 类别为 “武器皮肤” 且品质为 “闪耀” 的商品,要求:
只显示商品名称(name)、基础武器型号(baseWeapon)、价格(price)、库存(stock)这 4 个字段
按价格(price)从高到低排序(价格相同的情况下,按库存从低到高排序)
分页查询
😏说明:
起始索引从0开始,起始索引 = (查询页码 - 1) 每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
案例练习:
查询 类别为 “印花” 且外观为 “略有磨损” 的商品,要求:
只显示商品名称(name)、价格(price)、库存(stock)这 3 个字段;
按价格从低到高排序;
分页参数:每页显示 15 条记录,查询第 3 页的数据。
SQL
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
select
name,
price,
stock
from
weapon_skins
where
category = '印花'
and appearance = '略有磨损'
order by
price asc
limit
30, 15; -- 起始索引=(3-1)15=30,查询15条记录
3.NodeJS连接数据库实现增删改查
3.1 工程搭建
新建一个文件夹,即工程名称:weapon
vscode打开当前文件夹,此时如下
执行命令创建本地package.json文件,后续用于描述项目信息、管理依赖、指定工程入口等
Bash
运行代码
复制代码
1
npm init -y
执行命令,用于后续连接mysql
Bash
运行代码
复制代码
1
npm install mysql2 dotenv