一.MySQL 数据库介绍
在熟悉安装及访问 MySQL 数据库以后,接下来将学习使用 MySQL 数据库的基本操作,这也是在服务器运维工作中不可或缺的知识。本节中的所有数据库语句均在“mysq1>”操作环境中执行,并且每一条操作语句都是以分号(;)结束的
数据库目前标准的指令集是 SQL。SQL是 Structured Query Language 的缩写,即结构化查询语言。它是1974年由Boyce 和Chamberlin 提出来的,1975~1979 年 IBM 公司研制的关系数据库管理系统原型 System R实现了这种语言。经过多年的发展,SL语言得到了广泛的应用。
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、ROLLBACK、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选择数据库
mysql>USE 数据库名;
例子:切换|进入 db1
2.4查看数据库
查看当前数据库中有哪些表
显示创建名为 db1 的数据库时所使用的 SQI语句
返回当前选中的数据库的名称
2.5 删除数据库
mysqI>DROP DATABASE 数据库名;
例子:
三.MySQL 表操作
1.表介绍
库相当于文件夹。而表相当于文件,表中的一条记录就相当于文件的一行内不同的是,表中的一条记录有对应的标题,称为表的字段容
2.查看表
使用 SHOW TABLES 查看当前所在的数据库中包含的表。在操作之前,需要先使用 USE语句切换到所使用的数据库,就像要査看一个文件夹里面有多少文件,要先进入这个文件夹
3.创建表
3.1 语法
mysql>create table 表名(
字段名1 类型[(宽度)约束条件],
字段名2 类型[(宽度)约束条件],
字段名3类型[(宽度)约束条件]
);
3.2 类型介绍
表内存放的数据有不同的类型,类似于使用excel存储数据时也需要设置的数据类型,每种数据类型都有自己的宽度,但宽度是可选的,不设置宽度时,会使用字段的默认宽度。
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的约束 | 双精度浮点数值 |
OECIMAL(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 | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-0100:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-0100:00:00/2038结束时间是第 2147483647 秒北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
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) | 标识该字段为该表的外键 |
NOT NULL | 标识该字段不能为空 |
UNIQUE KEY (UK) | 标识该字段的值是唯一的 |
AUTO_INCREMENT | 标识该字段的值自动增长:(整数类型,而且为主键) |
DEFAULT | 为该字段设置默认值 |
UNS IGNED | 无符号 |
ZEROFILL | 使用0填充 |
ENMU( ) | 限制字段可以存储的值集合 |
3.4 创建表示例
4.查看表结构
DESCRIBE 语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过 USE 语句切换到目标数据库
查看详细表结构或者创建表所使用的语句可以执行 show create table tl\G;#查看表详细结构,可加\G。\G表示以长格式展示结果
5.修改表
5.1 修改表名
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 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
例子:
6.复制表
只复制表结构,不复制表中数据
复制表结构+记录(key 不会复制:主键、外键和索引)
7.删除表
删除数据库中的表,需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库
四:MySQL 数据操作
1.介绍
在 MySQL 管理软件中,可以通过 SQL,语句中的 DML,语言来实现数据的操作,包括使用 INSERT 实现数据的插入、使用 UPDATE 实现数据的更新、使用 DELETE实现数据的删除、使用 SELECT 查询数据。
创建示例表
2.插入数据 INSERT
INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下所示
顺序插入:
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);
3.删除数据 INSERT
DELETE 语句:用于删除表中指定的数据记录,语句格式如下所示
DELETEFROM 表名WHERE条件表达式
4.更新数据 INSERT
UPDATE 语句:用于修改、更新表中的数据记录。语句格式如下所示
UPDATE表名SET字段名1=字段值1[,字段名2=字段值 2]WHERE 条件表达式
5.查询数据 INSERT
SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL数据库支持标准的 SQL 查询语句,语句格式如下所示
1.单表查询
1.1单表查询语法
语法:
SELECT 字段1,字段 2...FROM 表名
WHERE条件
GROUP BY 字段HAVING 筛选
ORDER BY 字段
LIMIT 限制条数
1.2 关键字执行的优先级
from
where
group by
having
select
order by
limit
1.3 准备数据
创建测试库
创建人员信息表
插入数据:三个部门:教学,销售,运营
1.4 简单查询
语法:把表中需要的列的数据查询出来
SELECT 字段1,字段 2...FROM 表名
例子:
表示所有字段时,可以使用通配符“*”,显示所有的数据记录
1.5 where 条件
WHERE是 SQL, 中用于筛选数据的核心子句,其作用是通过指定条件从表中过滤出符合条件的记录。它可应用于 SELECT、UPDATE、DELETE 等语句中,控制操作的范围
where 字句中可以使用:
1.比较运算符:><>=<>!=
2.between80and100值在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 的人姓名
1.6 group by 分组
(1)什么是分组?为什么要分组?
分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数 #这个需求没有“每”字,但可以把需求格式化为:取每个性别的人数
例如:
mysql> select * from renyuan group by sex;#以 sex 分组,查看除了 sex 以外的字段会报错mysql>select sex from renyuan group by sex;
聚合函数:count()avg()max()min()sum()
count():计数
计算男生和女生的人数
mysql>select sex,count(*)from renyuan group by sex,
avg():平均值
每个岗位的平均薪资
mysql>select post,avg(salary)from renyuan group by post;
max():
最大值
每个岗位的最高薪资
mysql>select post,max(salary)from renyuan group by post;
min():最小值
每个岗位的最低薪资
mysql>select post,min(salary)from renyuan group by post;
sum():总和
每个岗位的薪资总和
mysql>select post,sum(salary)from renyuan group by post;
1.7 having 过滤
HAVING与WHERE不一样的地方
执行优先级从高到低:where>groupby>having
Where 发生在分组 group by之前,因而 Where 中可以有任意字段,但是绝对不能使用聚合函数。
Having 发生在分组 group by之后,因而 Having 中可以使用分组的字段,无法直接取到其他字段,但可以使用聚合函数
1.8 order by 排序
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?可以使用0RDERBY语来完成排序,并最终将排序后的结果返回给用户
排序的关键字可以使用 ASC或者DESC。ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。DESC是按降序方式进行排列
1.9 limit 限制结果条目
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到LIMIT 子句
倒叙排列后仅显示第一行
1.10 正则匹配
MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用REGEXP 这个关键字来指定正则表达式的匹配模式
Name 是1开头的姓名
mysql>select *from renyuan where name regexp “^1”;
Name 是u结尾的姓名
mysql>select *from renyuan where name regexp "u$"
Name 是 wan 和 wu之间至少1个g的姓名
mysql>select *from renyuan where name regexp "wang+wu";
2.多表查询
多表查询用于从多个关联表中提取组合数据,常见方式包括JOIN连接 和子查询,以下是关键知识点与使用场景:
准备数据
创建 test2 数据库
创建人员表和部门表
插入数据
2.1 子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
在开始实际的举例之前,先来学习一下 IN 这个操作符的用法,IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用。IN的语法结构如下:
<表达式> [NOT] IN <子查询>
当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE。若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。
查询平均年龄在 25 岁以上的部门名
查看技术部员工姓名
查看不足1人的部门名(子查询得到的是有人的部门 id)
2.2多表连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。
1.内连接(只连接匹配的行)
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字INNERJOIN来连接多张表,并使用 ON 子句设置连接条件。内连接的语法格式如下。
SELECT column name(s)FROM tablel
INNER JOIN table2 ON tablel.column name = table2. column name;
2.左连接(优先显示左表全部记录)
MySQL 除了内连接,还可以使用外连接。区别于MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分,有左连接和右连接之分。
左连接也可以被称为左外连接,在FROM子句中使用LEFTJOIN 或者 LEFTOUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行
3.右连接(优先显示右表全部记录)
右连接也被称为右外连接,在FROM子句中使用RIGHTJOIN或者RIGHTOUTERJOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录
五.MySQL 数据库用户授权
MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低。
1.创建用户
Mysq18 用户创建与授权的分离,必须先创建用户才能给用户授权
语法:
CREATE USER 用户名@来源地址 IDENTIFIED BY '密码'
用户名@来源地址: 用于指定用户名称和允许访问的客户机地址,即谁能连接、2能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.bdqn.com”“192.168.1.%”等。
IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分,则用户的密码将为空
执行以下操作可以添加一个名为“xiaogi”的数据库用户,并允许其从本机访问验证密码为“123456”
2.授权操作
授权语法:
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址
权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如*select, insert,update”。使用“all”表示所有权限,可授权执行任何操作。
数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。例如,使用“auth.*”表示授权操作的对象为 auth
执行以下操作可以为数据库用户'xiaoqi'@'localhost’,设置对 test 数据库中的所有表具有查询权限
切换到其他 Shell终端,以用户 xiaoqi 的身份连接数据库。在已授权的数据库上操作将被允许,否则将被拒绝。例如,允许用户xiaoqi 查询 test 数据库中表的数据记录,但禁止查询其他数据库中的表的记录。showdatabases只能看到被授权的库
在企业服务器的应用中,数据库与网站服务器有时候是相互独立的。因此在MySQL 服务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库。通常的做法是,创建一个或几个网站专用的数据库,并授予所有权限,限制访问的来源 IP 地址。
例如,执行以下操作可以新建bdgn数据库,并授权从IP地址为192.168.4.19 的主机连接,用户名为“dbuser”,密码为“pwd@123”,允许在bdqn 数据库中执行所有操作
mysqI> CREATE DATABASE bdqn ;
mysql> CREATE USER 'dbuser'@’192.168.4.19’IDENTIFIED BY ’pwd@123’
mysql> GRANT all ON bdqn.* To 'dbuser @ 192.168.4.19’
3.查看权限
SHOW GRANTS语句:专门用来查看数据库用户的授权信息,通过FOR子可指定查看的用户对象(必须与授权时使用的对象名称一致),语句格式如下所示。
SHOW GRANTS FOR 用户名@来源地址
执行以下操作可以查看用户 dbuser 从主机 192.168.4.19 访问数据库时的授权信息。
mysql> SHOW GRANTS FOR 'dbuser'@'192.168.4. 19'
4.撤销权限
REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作,语句格式如下所示。
REVOKE 权限列表ON数据库名.表名 FROM 用户名@来源地址
执行以下操作可以撤销用户 xiaoqi 从本机访问数据库 test 的所有权限
mysql> REVOKE all ON test.* FROM 'xiaoqi'@'localhost';
mysql>SHOW GRANTS FOR 'xiaoqi' @'localhost';