MySQL

MySQL

定义

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

  • 数据库管理系统:DataBase Management System(DBMS),操作和管理数据库的大型软件
  • SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准

数据库产品

以下均属于关系型数据库

MySQL概述

MySQL连接:mysql -hxxx -Pxxx -uxxx -pxxx

-h:连接的ip地址(可选){未选,默认本机的3306接口}

-P:连接的端口号(可选)

-u:指定的用户名

-p:指定的密码

数据模型

  • 关系型数据库:建立在关系模型基础上,由多张相互连接的二维表(有行有列)组成的数据库(RDBMS)

  • 特点:

    • 使用表存储数据,格式统一,便于维护

    • 使用SQL语言操作,标准统一,使用方便,可用于复杂查询

      数据库存储方式:

      • 数据库 -> 表 -> 数据(记录)

SQL

  • 分类:

重点关注前三个

SQL语句

DDL

数据库

  • 操作语法 [ ]:可选(如果要使用里面的代码,[ ]不要敲)

数据库名后的[ ]作用是指定字符集(默认utf8mb4)

在命令行敲:mysql -u root -p进入mysql

系统自带数据库:

注意:上述语法中的database,也可以替换成schema(复数要加s)。如:Create schema db01;MySQL8版本中,默认字符集为utfmb4

MySQL客户端工具 - 图形化工具

  • 介绍:DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案
  • 官网:https://www.jetbrains.com/zh-cn/datagrip/

连接数据库:

  • 创建project

  • 创建连接

下载驱动, 可能会比较耗时, 耐心等待一会儿。

  • 测试连接

下载完驱动之后,可以点击 Test Connection 来测试一下是否可以正常的连接数据库。

然后点击 OK , 就已经连接上了MySQL数据库了。

连接上以后点击图中所示按钮可以选择要展示的数据库

此时右边的控制台会出现一个console,在这里就可以编写数据库(如果没有就自行点击左侧的类似于终端按钮的图标即可显示)

注解:–

  • 找上一次编辑的文件:

如果觉得名字不好记可以自行更改

表结构-创建

  • 创建表的语法:

1
2
3
4
5
6
7
8
--创建表
create table user(
    id int comment'ID,唯一标识',
    username varchar(50) comment'用户名',
    name varchar(50) comment'姓名',
    age int comment'年龄',
    gender char(1) comment'性别'
) comment '用户信息表';

选中该字段运行:左侧就会出现相关信息

双击user:就可以查看表


  • 约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据
  • 目的:保证数据库中数据的正确性、有效性和完整性

1
2
3
4
5
6
7
8
-- 创建表(约束)
create table user(
    id int primary key auto_increment comment'ID,唯一标识',    -- 主键约束 auto_increment
    username varchar(50) not null unique comment'用户名',  -- 不为空且唯一
    name varchar(50) not null comment'姓名',  -- 非空
    age int comment'年龄',
    gender char(1) default'男' comment'性别'
) comment '用户信息表';

1
auto_increment:自增值(从最大值开始自增)
  • 数据类型

MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型

数值类型:

字符串类型:

日期时间类型:

案例

根据页面原型,设计员工表

步骤:

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

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

③创建表结构

需求:

工表

工表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-- 案例:设计员工表 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(32) 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(255) comment '图像',
    create_time datetime comment '创建时间',
    update_time datetime comment '修改时间'
)comment '员工表';

表结构-查询、修改、删除

  • 表结构的查询、修改、删除相关语法如下:

注意:在删除表时,表中的全部数据也会被删除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 查询当前数据库所有表
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 user;

也可以通过以下操作添加/修改,删除字段选择" - “,删除表结构选择drop,改名选择Rename

DML

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

    • 添加数据(INSERT)
    • 修改数据(UPDATE)
    • 删除数据(DELETE)

添加语句

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-- DML : 插入数据 - insert
-- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值
insert into emp(username,password,name,gender,phone) values ('songjiang','12345678','宋江',1,'11122233345');
 -- 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','13300012254',1,6000,'2020-01-01','1.jpg',now(),now());

  -- 方式2:
  insert into emp values (null,'likui','12345678','李逵','1','13300012256',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,'11122233346'),
                  ('ruanxiaowu','12345678','阮小五',1,'11122233347');

注意: 1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的 2.字符串和日期型数据应该包含在引号中(单引号、双引号都可以) (使用双引号可能会报红,但是不妨碍正常运行,建议使用单引号) 3.插入的数据大小/长度,应该在字段的规定范围内

修改语句

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

1
2
3
4
5
6
7
  -- 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';

如果不添加条件,会报出以下警告,此时点击Execute则会继续运行

删除语句

注意:

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

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

1
2
3
4
5
6
-- DML : 删除数据 - delete
-- 1. 删除 emp 表中 ID为1的员工
delete from emp where id = 1;

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

除警

DQL

  • DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录
  • 关键字:SELECT

基本查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
--  =================== 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. 查询已有的员工关联了哪几种职位(不要重复)
select distinct job from emp

注意:* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

条件查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--  =================== 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';-- 注意: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;-- 括号可写(更清晰)可不写

-- 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'%二%';

语句太多,结果就不一一展示了

分组查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--  =================== DQL: 分组查询 ======================
-- 聚合函数
-- 注意:所有的聚合函数不参与null统计
-- 1. 统计该企业员工数量
-- count(字段)
select count(id) from emp;

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

-- count(常量)    有数据就标1  推荐2
select count(1) from emp;

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

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

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

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

注意:

1.null值不参与所有聚合函数的运算

2.统计数量可以使用:count() count(字段) count(常量),推荐使用count()

h区

1
2
3
4
5
6
7
-- 分组
-- 注意:分组之后,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;

注意:

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

2.执行顺序: where > 聚合函数(group by) > having

having后可以使用聚合函数,where不可以

排序查询

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
--  =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序
select * from emp order by entry_date asc;
select * from emp order by entry_date;

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

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

3.

分页查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
--  =================== 分页查询 ======================
-- 1. 从起始索引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) * 每页展示记录数

本站于2026年3月31日建立
使用 Hugo 构建
主题 StackJimmy 设计