MySQL数据库操作

发布于:2025-05-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、MySQL数据库介绍

所有数据库语句均在“mysql>”操作环境中执行,并且每一条操作语句都是以分号(;)结束的
数据库目前标准的指令集是 SQL。SQL是 Structured Query Language 的缩写,即结构化查询语言

SQL 语言主要由以下几部分组成。
DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和定义字段,如CREATE、ALTER、DROP。
DML(Data Manipulation Language,数据操纵语言):用来插入、删除和修改数据库中的数据,如INSERT、UPDATE、DELETE。
DQL(Data Query Language,数据查询语言):用来查询数据库中的数据,如 SELECT。
DCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、存取权限等,如COMMIT、IROLLBACK、GRANT、REVOKE.

二MySQL库操作

1.系统数据库

经初始化后的 MySQL 服务器 ,默认建立了四个数据库:sys、mysql、information_schema 和performance_schema

information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等

performance schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象

mysql:授权库,主要存储系统用户的权限信息

sys:主要用于存储系统性能信息和监控数据,对数据库的性能优化和故障排除具有关键作用

2.数据库操作

2.1创建数据库

语法:

mysql> create database 数据库名;

列子:将创建一个名为db1的库
在这里插入图片描述

2.2数据库命名规则

可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长 128 位

2.3选择数据库

use 数据库名;

例子:切换|进入db1
在这里插入图片描述

2.4 查看数据库

查看当前数据库中有那些库

在这里插入图片描述
显示创建名为db1的数据库时所使用的SQL语句
在这里插入图片描述
返回当前选中的数据库的名称
在这里插入图片描述

2.5删除数据库

drop database 数据库名;

例子:
在这里插入图片描述

三、MySQL表操作

1.表介绍

库相当于文件夹。而表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

ID name age sex
1 张三 18 male
2 李四 68 female
3 王五 30 male

2.查看表

使用 SHOW TABLES 查看当前所在的数据库中包含的表。在操作之前,需要先使用 USE语句切换到所使用的数据库,就像要查看一个文件夹里面有多少文件,要先进入这个文件夹
在这里插入图片描述

3.创建表

3.1语法

mysql>create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名 2 类型[(宽度)约束条件],
字段名3类型[(宽度)约束条件]
);

#注意:
1.在同一张表中,字段名是不能相同
2.宽度和约束条件可选
3.字段名和类型是必须的,字段的类型宽度和约束条件是可选项
4.表中最后一个字段不要加逗号

3.2类型介绍

MySQL支持多种类型,大致可以分为三类:数值日期/时间字符串(字符)类型。对于我们约束数据的类型有很大的帮助

数值类型

类型 大小 范围(有符号) 范围(无符号) 用途
INT 4 字节 (-2 147 483 648,2 147483 647) (0,4 294 967 295) 大整数值
DOUBLE 8 字节 (-1.797E+308,-2.22E-308) (0,2.22E-308,1.797E+308) 双精度浮点数值
DOUBLE(M,D) 8个字节,M表示长度,D表示小数位数 同上,受M和D的约束DOUBLE(5,2)-999.99-999.99 同上,受M和D的约束 同上,受M和D的约束
DECIMAL(M,D) DECIMAL(M,D) 依赖于M和D的值,M最大值为65 依赖于M和D的值,M最大值为65 小数值

日期类型

类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59’/838:59:59 HH:MM:SS HH:MM:SS
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-0100:00:00/9999-12-31 23:59:59 YYYY-MM-DDHH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-0100:00:00/2038结束时间是第 2147483647 秒北京时间2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨03:14:07 YYYYMMDDHHMMSS 混合日期和时间值,时间戳

字符串类型

类型 大小 用途
CHAR 0-255字符 定长字符串 char(10) 10个字符
VARCHAR 0-65535 字节 变长字符串 varchar(10) 10个字符
BLOB (binary large object) 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据

3.3约束条件

约束条件与数据类型的宽度一样,都是可选参数,类似于使用excel存储数据时,可以利用 excel的公式限制员工 ID 列:禁止重复值,且不能为空
约束条件作用:用于保证数据的完整性和一致性,主要分为:

约束条件 说明
PRIMARY KEY(PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOTNULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型而且为主键)
DEFAULT 为该字段设置默认值
UNS IGNED 无符号
ZEROFILL 使用0填充
ENMU() 限制字段可以存储的值集合

3.4创建表示例

在这里插入图片描述

4.查看表的结构

DESCRIBE语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过 USE语句切换到目标数据库
在这里插入图片描述
查看详细表结构或者创建表所使用的语句可以执行show create table t1\G#查看表详细结构,可加\G。\G表示以长格式展示结果
在这里插入图片描述

5.修改表名

ALTER TABLE表名RENAME 新表名;

例子
在这里插入图片描述

5.2 增加字段

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER字段名

在这里插入图片描述
在这里插入图片描述

5.3删除字段

ALTER TABLE 表名 DROP 字段名;

例子
在这里插入图片描述

5.4 修改字段

ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTERTABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条 件…];

例子
在这里插入图片描述

在这里插入图片描述

6.复制表

只复制表结构,不复制表中数据
在这里插入图片描述
复制表结构十记录:(key 不会复制:主键、外键和索引)
在这里插入图片描述
select *from t2 是查询语句

7.删除表

删除数据库中的表,需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库

在这里插入图片描述
在这里插入图片描述

四MySQL数据操作

在 MySQL 管理软件中,可以通过 SQL, 语句中的 DML,语言来实现数据的操作,包括使用 INSERT 实现数据的插入、使用 UPDATE 实现数据的更新、使用 DELETE实现数据的删除、使用 SELECT 查询数据。

创建示例表
在这里插入图片描述

插入数据insert

INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下所示
插入数据后可使用 mysql>select * from tl;验证
顺序插入:

INSERT INTO 表名 VALUES(值 1,值 2,值 3…值 n);

在这里插入图片描述
指定字段插入数据

INSERT INTO 表名(字段 1,字段 2,字段 3…字段 n)VALUES(值 1,值 2,值 3…值n);

在这里插入图片描述
插入多条记录

INSERT INTO 表名 VALUES (値 1,值 2,值 3…值 n),(値 1,值 2,值 3…值 n),(值 1,值 2,值3…值 n);

在这里插入图片描述

删除数据insert

DELETE 语句:用于删除表中指定的数据记录,语句格式如下所示
删除数据后可使用 mysql>:select *from tl;验证

DELETEFROM表名WHERE条件表达式

在这里插入图片描述

更新数据insert

UPDATE 语句:用于修改、更新表中的数据记录。语句格式如下所示
更新数据后可使用 mysql>select *from tl;验证

UPDATE表名SET 字段名1=字段值1 [,字段名2=字段值2 ]WHERE 条件表达 式

在这里插入图片描述
需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操作。

查询数据insert

SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL数据库支持标准的 SQL 查询语句,语句格式如下所示

单表查询
单表查询语句

SELECT 字段1,字段 2…FROM 表名
WHERE 条件
GROUP BY 字段
HAVING 筛选
ORDER BY 字段
LIMIT 限制条数

关键字执行的优先级

from
where
group by
having
select
order by
limit

说明
1.找到表:from
2.拿着 where 指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组 group by,如果没有 group by,则整体作为组
4.将分组的结果进行 having 过滤
5.执行 select
6.将结果按条件排序:order by
7.限制结果的显示条数:limit

准备数据
创建测试库

create database test;
use test;
create table renyuan(
id int not null unique auto_increment, #员工id
name varchar(20) not null,     #姓名
sex enum('male','female') not null default 'male', #性别,大部分是男的
age int(3) unsigned not null default 28,  #年龄
hire_date date not null,    #入职时间
post varchar(50),       #岗位
post_comment varchar(100),  #职位描述
salary double(15,2),    #薪资
office int, #办公室,一个部门一个屋子
depart_id int  #部门编号
);
insert into renyuan(name,sex,age,hire_date,post,salary,office,depart_id) values
('zhangsan','male',18,'20170301','teacher',7300.33,401,1), #教学部
('lisi','male',78,'20150302','teacher',1000000.31,401,1),
('wangwu','male',81,'20130305','teacher',8300,401,1),
('zhaoliu','male',73,'20140701','teacher',3500,401,1),
('suqi','male',28,'20121101','teacher',2100,401,1),
('zhuba','female',18,'20110211','teacher',9000,401,1),
('洪金宝','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),

('歪歪','female',48,'20150311','sale',3000.13,402,2),#销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),

('张野','male',28,'20160311','operation',10000.13,403,3), #运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;

简单查询
语法:把表中需要的列的数据查询出来

SELECT 字段1,字段 2...FROM 表名

例子
在这里插入图片描述
表示所有字段时,可以使用通配符“*”显示所有的数据记录
在这里插入图片描述

where 条件

WHERE是 SQL, 中用于筛选数据的核心子句,其作用是通过指定条件从表中过滤出符合条件的记录。它可应用于SELECT、UPDATE、DELETE 等语句中,控制操作的范围
where 字句中可以使用:

1.比较运算符:> < >= <= <> !=
2.between 80 and 100值在10到20之间
3.in(80,90,100)值是 10 或 20 或 30
4.like egon%
pattern 可以是%或_
%表示任意多字符
_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符and or not

(1)比较运算符:>、<、>=<= 、!=
薪资大于 10000 的人姓名

在这里插入图片描述
不是403办公室的人姓名
在这里插入图片描述
(2)between and: 在…之间
薪资在 10000 至 15000 之间的人姓名
在这里插入图片描述
(3)in :集合查询
薪资是 9000 或 10000 或 30000 的人姓名
在这里插入图片描述

(4)like:像,模糊匹配
_:任意单个字符
%任意多个字符

名字以“程”开头的人的信息
在这里插入图片描述
在这里插入图片描述
(5)逻辑运算符:and or not
薪资 17000 并且办公室是 403的人
在这里插入图片描述
薪资 17000 或者办公室是 403 的人
在这里插入图片描述
薪资不是 9000 或 10000 或 30000 的人姓名
在这里插入图片描述

group by 分组

在这里插入图片描述
但是只查看 sex 字段又没有任何意义,因为需要的是组内的信息,所以需要结合聚合函数查看

(1)聚合函数:count() avg()max()min()sum()
count()计数
计算男生和女生的人数
在这里插入图片描述
avg():平均值
每个岗位的平均薪资
在这里插入图片描述
max():最大值
每个岗位的最高薪资
在这里插入图片描述
min()最小值
每个岗位的最低薪资
在这里插入图片描述
sum():总和
每个岗位的薪资总和
在这里插入图片描述

having过滤

having与where不一样的地方
执行优先级从高到低:where>groupby>having
Where 发生在分组 group by之前,因而 Where 中可以有任意字段,但是绝对不能使用聚合函数。
Having 发生在分组 group by之后,因而 Having 中可以使用分组的字段,无法直接取到其他字段,但可以使用聚合函数

有哪些岗位是平均工资大于 10000 的
在这里插入图片描述

order by 排序

使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?可以使用0RDERBY语句来完成排序,并最终将排序后的结果返回给用户
排序的关键字可以使用 ASC或者DESC。ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。DESC是按降序方式进行排列
在这里插入图片描述
在这里插入图片描述

limit限制结果条目

在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到LIMIT 子句

倒叙排列后仅显示第一行
在这里插入图片描述

正则匹配

MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用REGEXP这个关键字来指定正则表达式的匹配模式

name是l开头的姓名

在这里插入图片描述
name是u结尾的姓名
在这里插入图片描述
name是wan和wu之间至少1个g的姓名
在这里插入图片描述

多表查询

多表查询用于从多个关联表中提取组合数据,常见方式包括JOIN连接和子查询,以下是关键知识点与使用场景:
准备数据
创建test2数据库

create database test2;
use test2;
create table bumen(
id int,  
name varchar(20) 
);
create table renyuan(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int  #部门ID
);
insert into bumen values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into renyuan(name,sex,age,dep_id) values
('zhangsan','male',18,200),
('lisi','female',48,201),
('wangwu','male',38,201),
('zhaoliu','female',28,202),
('sunqi','male',18,200),
('zhuba','female',18,204)
;

子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另·个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT语句中使用.在INERT、UPDATE、DELETE中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

<表达式>[NOT]IN<子查询>

当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE。若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。

查询平均年龄在 25 岁以上的部门名
在这里插入图片描述
查看技术部员工姓名
在这里插入图片描述
查看不足1人的部门名字(子查询得到是有人的部门id)
在这里插入图片描述

多表连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。

内连接(只连接匹配的行)
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字INNER JOIN来连接多张表,并使用 ON 子句设置连接条件。内连接的语法格式如下。
SELECT column_name(s)FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name ;
在这里插入图片描述
bumen 没有 204 这个部门,因而 renyuan 表中关于 204 这条员工信息没有匹配出来
左连接(优先显示左表全部记录)
MySQL 除了内连接,还可以使用外连接。区别于MSQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分,有左连接和右连接之分。
左连接也可以被称为左外连接,在FROM子句中使用LEFTJOIN或者LEFTOUTERJOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行
在这里插入图片描述
在这里插入图片描述
以左表为准,即找出所有员工信息,当然包括没有部门的员工本质就是:在内连接的基础上增加左边有右边没有的结果
右连接(优先显示右表全部记录)
右连接也被称为右外连接,在FROM子中使用RIGHTJOIN或者RIGHTOUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录
在这里插入图片描述

在这里插入图片描述
以右表为准,即找出所有部门信息,包括没有员工的部门本质就是:在内连接的基础上增加右边有左边没有的结果

五MySQL数据库用户授权

MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低。

创建用户

Mysql8 用户创建与授权的分离,必须先创建用户才能给用户授权语法:

CREATE USER 用户名@来源地址 IDENTIFIED BY ‘密码’

用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.bdqn.com”“192.168.1.%”等

IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分,则用户的密码将为空

执行以下操作可以添加一个名为“yh”的数据库用户,并允许其从本机访问验证密码为“123456”

在这里插入图片描述

授权操作

授权语法:

GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址

权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。

数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“ * ”。例如,使用“auth.* ”表示授权操作的对象为 auth

执行以下操作可以为数据库用户’yh’@'localhost’,设置对 test 数据库中的所有表具有查询权限

在这里插入图片描述
切换到其他 Shell终端,以用户yh的身份连接数据库。在已授权的数据库上操作将被允许,否则将被拒绝。例如,允许用户yh查询 test 数据库中表的数据记录,但禁止查询其他数据库中的表的记录。show databases只能看到被授权的库
在这里插入图片描述
在企业服务器的应用中,数据库与网站服务器有时候是相互独立的。因此在MySQL 服务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库。通常的做法是,创建一个或几个网站专用的数据库,并授予所有权限,限制访问的来源 IP 地址。
例如,执行以下操作可以新建bdgn数据库,并授权从IP地址为192.168.10.101 的主机连接,用户名为“x”,密码为“pwd123”,允许在bdqn数据库中执行所有操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录x
在这里插入图片描述

查看权限

SHOW GRANTS语句:专门用来查看数据库用户的授权信息,通过FOR子句可指定查看的用户对象(必须与授权时使用的对象名称一致),语句格式如下所。

SHOW GRANTS FOR 用户名@来源地址

执行以下操作可以査看用户 x 从主机 192.168.10.101 访问数据库时的授权信息。
在这里插入图片描述

撤销权限

REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作,语句格式如下所小。

REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到