第5章 后端Web基础 (MySQL基础)

课程介绍

数据库:DataBase(DB),是存储和管理数据的仓库

数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件。

SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。

一、MySQL概述

1、安装

(1)解压并添加环境变量

文件解压后放到自己的路径中

添加环境变量

path环境变量中

验证

(2)对mysql初始化

管理员方式打开命令行输入mysqld --initialize-insecure

此时mysql的安装目录出现这个文件夹,存放mysql的数据文件

(3)注册MySQL服务

管理员方式命令行输入mysqld -install

(4)启动MySQL服务

管理员方式命令行输入net start mysql启动服务

管理员方式命令行输入net stop mysql停止服务

(5)修改默认账户密码

mysqladmin -u root password root

(6)登录MySQL

管理员方式命令行输入mysql -uroot -proot

语法:语法:mysql-u用户名-p密码-h数据库服务器IP地址 -P端口号 默认端口号为3306

(7)卸载

管理员方式命令行输入net stop mysql

mysqld -remove mysql

2、数据库模型

关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

二维表:有行有列的表

特点: 使用表存储数据,格式统一,便于维护。 使用SQL语言操作,标准统一,使用方便,可用于复杂查询。

mysql中创建数据库:create database db01;

此时在mysql的安装目录的data文件夹中就会出现db01的文件夹,代表该数据库

二、SQL语句

SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。

1、数据库操作

sql 复制代码
--查询所有数据库
show databases;
​
--查询当前数据库
select database();
​
--使用/切换数据库
use 数据库名;
​
--创建数据库
create database[if not exists]数据库名[default charset utf8mb4];
​
--删除数据库
drop database[if exists]数据库名;

注意:(不常用) 上述语法中的database,也可以替换成schema。

如:create schema dbo1;

MySQL8版本中,默认字符集为utf8mb4。

2、图形化工具

命令行:无提示、操作繁琐、无历史记录

常用的图形化工具

介绍:DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。

官网:DataGrip | JetBrains for Data

(1)安装

  • 安装完成之后双击安装.bat
  • 输入激活码

    点击Activate激活,continue

(2)创建项目

创建项目

输入项目名字

创建连接,下载驱动

测试连接,点击Apply和OK

(3)界面使用

  • 界面介绍

  • 若查询语句不小心关掉了,在这里重新打开

  • 新建数据库

  • 在这里删除数据库

    同时刷新一下

3、表操作-创建

(1)语法

最后一个字段结尾不要加逗号

sql 复制代码
create table tablename(
    字段1 字段类型[约束][comment字段1注释],
    字段2 字段类型[约束][comment字段2注释]
)[comment表注释];

在正在使用的数据库中创建表,例如db02

sql 复制代码
-- 创建表(无约束)
create table user(
    id int comment 'ID, 唯一标识',
    username varchar(50) comment '用户名',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '性别'
) comment '用户信息表';

此时在db02中会创建一个表,里面有这5个字段,鼠标悬浮可以查看备注信息

(2)插入数据

4、表操作-约束

约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确性、有效性和完整性

(1)语法

非空约束:限制该字段值不能为null not null 唯一约束:保证字段的所有数据都是唯一、不重复的 unique 主键约束:主键是一行数据的唯一标识,要求非空且唯一 primary key 默认约束:保存数据时,如果未指定该字段值,则采用默认值 default 外键约束:让两张表的数据建立连接,保证数据的一致性和完整性 foreign key

主键自增关键字:auto_increment

sql 复制代码
-- 创建表(约束)
create table user(
    id int primary key auto_increment comment 'ID, 唯一标识', -- 主键约束 auto_increment
    username varchar(50) not null unique comment '用户名', -- 非空 唯一
    name varchar(10) not null comment '姓名', -- 非空
    age int comment '年龄',
    gender char(1) default '男' comment '性别' -- 默认
) comment '用户信息表';

(2)图形化图标解释

右下角钥匙代表主键约束

左边蓝框代表唯一约束

左下角圆圈代表非空约束

5、表操作-数据类型

(1)数值类型

类型 大小(byte) 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述 备注
tinyint 1 (-128,127) (0,255) 小整数值
smallint 2 (-32768,32767) (0,65535) 大整数值
mediumint 3 (-8388608,8388607) (0,16777215) 大整数值
int 4 (-2147483648,2147483647) (0,4294967295) 大整数值
bigint 8 (-2^63,2^63-1) (0,2^64-1) 极大整数值
float 4 (-3.402823466 E+38,3.402823466351 E+38) 0 和 (1.175494351 E-38,3.402823466 E+38) 单精度浮点数值 float(5,2):5表示整个数字长度,2 表示小数位个数
double 8 (-1.7976931348623157 E+308,1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) 双精度浮点数值 double(5,2):5表示整个数字长度,2 表示小数位个
decimal 小数值(精度更高) decimal(5,2):5表示整个数字长度,2 表示小数位个数

数值类型的选取原则: 在满足业务需求的前提下, 尽可能选择占用磁盘空间小的数据类型

例如

  • age tinyint unsigned

  • id int unsigned

(2)字符串类型

类型 大小 描述
char 0-255 bytes 定长字符串
varchar 0-65535 bytes 变长字符串
tinyblob 0-255 bytes 不超过255个字符的二进制数据
tinytext 0-255 bytes 短文本字符串
blob 0-65 535 bytes 二进制形式的长文本数据
text 0-65 535 bytes 长文本数据
mediumblob 0-16 777 215 bytes 二进制形式的中等长度文本数据
mediumtext 0-16 777 215 bytes 中等长度文本数据
longblob 0-4 294 967 295 bytes 二进制形式的极大文本数据
longtext 0-4 294 967 295 bytes 极大文本数据

以lob为结尾的是以二进制形式存储的

以text为结尾的是以普通文本存储的

数据库开发中主要用到前两个字符串类型

char(10): 固定占用10个字符空间; 存储A, 占用10个空间; 存储ABC, 占用10个空间;性能略高、浪费磁盘空间

varchar(10): 最多占用10个字符空间; 存储A, 占用1个空间; 存储ABC, 占用3个空间;节约磁盘空间、性能略低

例如:

  • username varchar(50)

  • idcard char(18)

  • phone char(11)

(3)日期时间类型

类型 大小(byte) 范围 格式 描述
date 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
time 3 -838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
year 1 1901 至 2155 YYYY 年份值
datetime 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
timestamp 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

开发中常用到date和datetime类型

例如:

  • bithday date

  • operateTime datetime

(4)小结

1.数值类型在定义的时候,后面加了unsigned关键字是什么意思?

unsigned表示无符号类型,表示只能取o及正数

不加默认是signed,表示可以取负数

2.char与varchar的区别是什么?什么时候用char,什么时候用varchar?

char是定长字符串,varchar是变长字符串

如果一个字段的长度是固定的,建议使用char;如:身份证号、手机号

如果一个字段的长度不是固定的,建议使用varchar;如:用户名、姓名

6、表操作-设计案例2

(1)设计表过程

1.阅读并分析页面原型及需求

2.分析表中包含哪些字段,以及字段的类型、约束

3.创建表结构(添加基础字段id、create_time、update_time)

(2)设计员工表

sql 复制代码
-- 案例: 设计员工表 emp
-- 基础字段: id 主键, create_time 创建时间, update_time 更新时间
create table emp (
    id int unsigned primary key auto_increment comment 'ID,主键',
    username varchar(20) not null unique comment '用户名',
    password varchar(50) default '123456' comment '密码',
    name varchar(10) not null comment '姓名',
    gender tinyint unsigned not null comment '性别, 1:男, 2:女',
    phone char(11) not null unique comment '手机号',
    job tinyint unsigned comment '职位, 1:班主任, 2:讲师, 3:学工主管, 4:教研主管, 5:咨询师',
    salary int unsigned comment '薪资',
    entry_date date comment '入职日期',
    image varchar(300) comment '头像',
    create_time datetime comment '创建时间',
    update_time datetime comment '更新时间'
) comment '员工表';

7、表操作-查询-修改-删除

(1)语法

sql 复制代码
-- 查询当前数据库的所有表
show tables;
​
-- 查询表结构
desc 表名;
​
-- 查询建表语句
show create table表名;
​
-- 添加字段
alter table 表名 add 字段名类型(长度) [comment注释][约束];
​
-- 修改字段类型
alter table 表名 modify 字段名 新数据类型(长度);
​
-- 修改字段名与字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment注释][约束];
​
-- 删除字段
alter table 表名 drop column 字段名;
​
-- 修改表名
alter table 表名 rename to 新表名;
​
-- 删除表
-- 注意:在删除表时,表中的全部数据也会被删除。
drop table[if exists]表名;

(2)案例

sql 复制代码
-- 查询当前数据库所有表
show tables;
​
-- 查看表结构
desc emp;
​
-- 查询建表语句
show create table emp;
​
-- 字段: 添加字段 qq varchar(13)
alter table emp add qq varchar(13) comment 'QQ号码';
​
-- 字段: 修改字段类型 qq varchar(15)
alter table emp modify qq varchar(15) comment 'QQ号码';
​
-- 字段: 修改字段名 qq -> qq_num varchar(15)
alter table emp change qq qq_num varchar(15) comment 'QQ号码';
​
-- 字段: 删除字段 qq_num
alter table emp drop column qq_num;
​
-- 修改表名
alter table emp rename to employee;
​
-- 删除表
drop table employee;

(3)图形化操作

  • 鼠标悬浮自动显示建表语句

  • 修改表结构,右键表

    新增字段

    字段类型

三、数据操作语言

DML英文全称是DataManipulationLanguage(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

添加数据(INSERT)

修改数据(UPDATE)

删除数据(DELETE)

1、insert

(1)语法

sql 复制代码
-- 指定字段添加数据
insert into 表名(字段名1, 字段名2) values (值1, 值2);
​
-- 全部字段添加数据
insert into 表名 values (值1, 值2, ...);
​
-- 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
​
-- 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);

(2)范例

sql 复制代码
-- DML : 数据操作语言
-- DML : 插入数据 - insert
-- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值
insert into emp(username, password, name, gender, phone) values ('songjiang','12345678','宋江',1,'13300001111');

-- insert into emp(username, password, name, gender, phone) values ('songjiang2songjiang222','12345678','宋江2',1,'13300001117');


-- 2. 为 emp 表的 所有字段插入值
-- 方式1:
insert into emp(id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time)
          values(null, 'linchong','12345678','林冲',1,'13300001112',1,6000,'2020-01-01','1.jpg',now(),now());

-- 方式2:
insert into emp values(null, 'likui','12345678','李逵',1,'13300001113',1,6000,'2020-01-01','1.jpg',now(),now());


-- 3. 批量为 emp 表的 username, password, name, gender, phone  字段插入数据
insert into emp(username, password, name, gender, phone) values
            ('ruanxiaoer','12345678','阮小二',1,'13300001114'),('ruanxiaowu','12345678','阮小五',1,'13300001115');

(3)注意

1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的。

2.字符串和日期型数据应该包含在引号中(单引号、双引号都可以)。

3.插入的数据大小/长度,应该在字段的规定范围内。

2、update

(1)语法

sql 复制代码
-- 修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ... [where 条件];

(2)范例

sql 复制代码
-- DML : 更新数据 - update
-- 1. 将 emp 表的ID为1员工 用户名更新为 'zhangsan', 姓名name字段更新为 '张三'
update emp set username = 'zhangsan' , name = '张三' where id = 1;

-- 2. 将 emp 表的所有员工的入职日期更新为 '2010-01-01'
update emp set entry_date = '2010-01-01';

(3)注意

修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。

2、delete

(1)语法

sql 复制代码
-- 删除数据
delete from 表名 [where条件];

(2)范例

sql 复制代码
-- DML : 删除数据 - delete
-- 1. 删除 emp 表中 ID为1的员工
delete from emp where id = 1;

-- 2. 删除 emp 表中的所有员工
delete from emp ;

(3)注意

1.DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。

2.DELETE语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。

四、DQL

DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。

关键字:SELECT

1、基础查询

(1)语法

sql 复制代码
-- 查询多个字段
select 字段1,字段2,字段3 from 表名;

-- 查询所有字段(通配符)
select * from 表名;

-- 为查询字段设置别名,as关键字可以省略
select 字段1 [as 别名1], 字段2 [as 别名2] from 表名;

-- 去除重复记录
select distinct 字段列表 from 表名;

(3)范例

sql 复制代码
--  =================== DQL: 基本查询 ======================
-- 1. 查询指定字段 name,entry_date 并返回
select name, entry_date from emp;

-- 2. 查询返回所有字段
-- 方式1: 推荐
select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp;
-- 方式2: 不推荐
select * from emp;

-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期),as可以省略
select name as 姓名, entry_date as 入职日期 from emp;

select name 姓名, entry_date 入职日期 from emp;

-- 4. 查询已有的员工关联了哪几种职位(不要重复) - distinct
select distinct job from emp;

2、条件查询

(1)语法

sql 复制代码
-- 条件查询
select 字段列表 from 表名 where 条件列表;

(2)运算符

(3)范例

sql 复制代码
--  =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = '柴进';

-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary <= 5000;

-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null;

-- 4. 查询 有职位 的员工信息
select * from emp where job is not null ;

-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';

select * from emp where password <> '123456';

-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01';

-- select * from emp where entry_date between '最小值' and '最大值';

-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01' and gender = 2;

select * from emp where (entry_date between '2000-01-01' and '2010-01-01') and gender = 2;

-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;

select * from emp where job in (2,3,4);

-- 9. 查询 姓名 为两个字的员工信息 (_: 单个字符; % 任意个字符)
select * from emp where name like '__';

-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';

-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';

(4)小结

1.如何进行null值的判断?

is null,is not null

2.模糊匹配中的通配符?

%[任意个字符】,_[一个字符】

3.如何组装多个查询条件?

and/or

3、分组查询

(1)聚合函数

sql 复制代码
-- 聚合函数
-- 注意: 所有的聚合函数不参与null的统计

-- 1. 统计该企业员工数量 - count
-- count(字段)
select count(id) from emp;

-- count(*) : 推荐
select count(*) from emp;

-- count(常量): 推荐
select count(1) from emp;

-- 2. 统计该企业员工的平均薪资 - avg
select avg(salary) from emp;

-- 3. 统计该企业员工的最低薪资 - min
select min(salary) from emp;

-- 4. 统计该企业员工的最高薪资 - max
select max(salary) from emp;

-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和) - sum
select sum(salary) from emp;

(2)语法

sql 复制代码
-- 分组查询
select 字段列表 from 表名[where 条件列表] group by 分组字段名 [having 分组后过滤条件];

where与having的区别:

1.执行时机不同:where是分组之前 进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

2.判断条件不同:where不能对聚合函数进行判断,而having可以。

(3)范例

sql 复制代码
-- 分组
-- 注意: 分组之后, select后的字段列表不能随意书写, 能写的一般是 分组字段 + 聚合函数;
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender, count(*) from emp group by gender;

-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) >= 2;

(4)注意

1,分组之后,查询的字段 一般为聚合函数和分组字段,查询其他字段无任何意义。

2.执行顺序:where>聚合函数>having。

4、排序查询

(1)语法

sql 复制代码
-- 排序查询
select 字段列表 from 表名 [where 条件列表] [group by 分组字段名 having 分组后过滤条件] order by 排序字段排序方式;

排序方式:升序(asc),降序(desc);默认为升序asc,是可以不写的。

注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

(2)范例

sql 复制代码
--  =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序 - asc
select * from emp order by entry_date asc;
select * from emp order by entry_date;

-- 2. 根据入职时间, 对员工进行降序排序 - desc
select * from emp order by entry_date desc;

-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date , update_time desc;

5、分页查询

(1)语法

sql 复制代码
-- 排序查询
select 字段 from 表名 [where条件] [group by 分组字段 having 过滤条件] [order by排序字段] limit 起始索引,查询记录数;

说明:

起始索引从0开始。

分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

如果起始索引为0,起始索引可以省略,直接简写为limit 10。

(2)范例

sql 复制代码
--  =================== 分页查询 ======================
-- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from emp limit 0,5;
​
select * from emp limit 5;
​
-- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from emp limit 0,5;
​
-- 3. 查询 第2页 员工数据, 每页展示5条记录
select * from emp limit 5,5;
​
-- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from emp limit 10,5;
​
-- 页码
-- 起始索引 = (页码 - 1) * 每页展示记录数
相关推荐
门前大桥下.8 小时前
HTML-01我的第一个网页
前端·html
我是大卫8 小时前
【图】React源码解析-从数据结构、依赖追踪机制、值传播与更新触发、以及性能陷阱与优化,深挖useContext的底层原理
前端·react.js·源码
谭光志8 小时前
深入浅出 RAG:用一个可运行的 Demo 讲透完整链路
前端·后端·ai编程
Cobyte8 小时前
使用 JavaScript 实现有限状态机的经典问题
前端·javascript·vue.js
道友可好8 小时前
前端工程师的 AI 时代生存指南
前端·人工智能·后端
●VON8 小时前
鸿蒙 PC Markdown 编辑器质量流水线:Web 构建、回归与 Release 门禁
前端·华为·编辑器·harmonyos·鸿蒙
acheding8 小时前
File System Access API 实战:让网页真正读写本地文件
前端·javascript·vue.js·编辑器·markdown
何时梦醒8 小时前
⚛️ React 19 + TypeScript 深度学习笔记 —— 从组件化思维到 WebGPU 端侧 AI 落地
前端·javascript·人工智能
橘子星9 小时前
在浏览器里跑大模型!用 WebGPU 零成本部署 DeepSeek-R1
前端·typescript