半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(三)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!

二. as 取别名

  • 表里的名字没有变,只影响了查询出来的结果

案例:

SELECT s_name as `name` FROM student

1f442275ab194b72a7689b01fbd1fb99.png

  • 使用as也可以为表取别名 (作用:单表查询意义不大,但是当多个表的时候取别名就好操作,当不同的表里有相同名字的列的时候区分就会好区分)

三. distinct 去除重复记录

  • 注意:当查询结果中所有字段全都相同时 才算重复的记录

案例

SELECT DISTINCT * FROM student


fbae5772fb744a79adc1adc43aee4d77.png


指定字段

  1. 星号表示所有字段
  2. 手动指定需要查询的字段
SELECT DISTINCT s_name,s_birth FROM student


3afe0916f1f84530948fd55a33e6285a.png

  1. 还可也是四则运算
  2. 聚合函数

四. group by 分组

  • group by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

语法:

select 字段名 from 表名 group by 字段名称;

1. 单个字段分组

SELECT COUNT(*)FROM student GROUP BY s_sex;

890e8b1fef52458c926ae286fc032d07.png

2. 多个字段分组

SELECT s_name,s_sex,COUNT(*) FROM student GROUP BY s_name,s_sex;

f6b31c834872470f8416047532692aa6.png

  • 注意:多个字段进行分组时,需要将s_name和s_sex看成一个整体,只要是s_name和s_sex相同的可以分成一组;如果只是s_sex相同,s_sex不同就不是一组。

五. having 过滤

HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中显示的任意项。

我们如果要查询男生或者女生,人数大于4的性别

SELECT s_sex as 性别,count(s_id) AS 人数 FROM student GROUP BY s_sex HAVING COUNT(s_id)>4

666914d0b8ee4899902a785c57a77b53.png

六. order by 排序

  • 根据某个字段排序,默认升序(从小到大)

语法:

select * from 表名 order by 字段名;

1. 一个字段,降序(从大到小)

SELECT * FROM student ORDER BY s_id DESC;

845119940241447e9041c8e4180803cc.png

2. 多个字段

SELECT * FROM student ORDER BY s_id DESC, s_birth ASC;

f750c5745edb49659815fb190b578b0d.png

  • 多个字段 第一个相同在按照第二个 asc 表示升序

limit 分页

  • 用于限制要显示的记录数量

语法1:

select * from table_name limit 个数;

语法2:

select * from table_name limit 起始位置,个数;

案例:

  • 查询前三条数据
SELECT * FROM student LIMIT 3;

caa9275fa8e0476384a95fed9f289ce6.png

  • 从第三条开始 查询3条
SELECT * FROM student LIMIT 2,3;


caaa4bd61f584abd92ac1c35a758f564.png

注意:起始位置 从0开始

经典的使用场景:分页显示

  1. 每一页显示的条数 a = 3
  2. 明确当前页数 b = 2
  3. 计算起始位置 c = (b-1) * a

子查询

  • 将一个查询语句的结果作为另一个查询语句的条件或是数据来源, 当我们一次性查不到想要数据时就需要使用子查询。
SELECT
  * 
FROM
  score 
WHERE
  s_id =(
  SELECT
    s_id 
  FROM
    student 
WHERE
  s_name = '赵信')

8610d0e67a424359aec6a5768b107267.png

1. in 关键字子查询

  • 当内层查询 (括号内的) 结果会有多个结果时, 不能使用 = 必须是in ,另外子查询必须只能包含一列数据

子查询的思路:

  1. 要分析 查到最终的数据 到底有哪些步骤
  2. 根据步骤写出对应的sql语句
  3. 把上一个步骤的sql语句丢到下一个sql语句中作为条件
SELECT
  * 
FROM
  score 
WHERE
  s_id IN (
  SELECT
    s_id 
  FROM
    student 
WHERE
  s_sex = '男')


695a8cadfe7246488a6d5b19c3ee470d.png

exists 关键字子查询

  • 当内层查询 有结果时 外层才会执行

多表查询

1. 笛卡尔积查询

  • 笛卡尔积查询的结果会出现大量的错误数据即,数据关联关系错误,并且会产生重复的字段信息 !

2. 内连接查询

  • 本质上就是笛卡尔积查询,inner可以省略。

55ea38eec2914c2abdf62d57701a9eb4.png

语法:

select * from  表1 inner join 表2;

3. 左外连接查询

  • 左边的表无论是否能够匹配都要完整显示,右边的仅展示匹配上的记录


6f13463d6f8947bebc4a4c41cd41b341.png

  • 注意: 在外连接查询中不能使用where 关键字 必须使用on专门来做表的对应关系

4. 右外连接查询

  • 右边的表无论是否能够匹配都要完整显示,左边的仅展示匹配上的记录

a09cbedbf5e749289b7850802ae06ba9.png

DCL(Data Control Language)语句:即数据控制语句

  • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。

关键字

  • GRANT
  • REVOKE

查看用户权限

当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用SHOW GRANTS FOR语句来查询用户的权限。

例如:

mysql> SHOW GRANTS FOR test;
+-------------------------------------------+
| Grants for test@%                         |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)

GRANT语句

  • 对于新建的MySQL用户,必须给它授权,可以用GRANT语句来实现对新建用户的授权。

格式语法

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
    TO user [, user] ...
    [WITH GRANT OPTION]
object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}
priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}
user:
    (see Section 6.2.4, “Specifying Account Names”)
auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'
}
resource_option: {
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

权限类型(priv_type)

  • 授权的权限类型一般可以分为数据库、表、列、用户。
授予数据库权限类型

授予数据库权限时,priv_type可以指定为以下值:


SELECT:表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。

INSERT:表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。

DELETE:表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。

UPDATE:表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。

REFERENCES:表示授予用户可以创建指向特定的数据库中的表外键的权限。

CREATE:表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。

ALTER:表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。

SHOW VIEW:表示授予用户可以查看特定数据库中已有视图的视图定义的权限。

CREATE ROUTINE:表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。

ALTER ROUTINE:表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。

INDEX:表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。

DROP:表示授予用户可以删除特定数据库中所有表和视图的权限。

CREATE TEMPORARY TABLES:表示授予用户可以在特定数据库中创建临时表的权限。

CREATE VIEW:表示授予用户可以在特定数据库中创建新的视图的权限。

EXECUTE ROUTINE:表示授予用户可以调用特定数据库的存储过程和存储函数的权限。

LOCK TABLES:表示授予用户可以锁定特定数据库的已有数据表的权限。

SHOW DATABASES:表示授权可以使用SHOW DATABASES语句查看所有已有的数据库的定义的权限。

ALL或ALL PRIVILEGES:表示以上所有权限。


授予表权限类型

授予表权限时,priv_type可以指定为以下值:


SELECT:授予用户可以使用 SELECT 语句进行访问特定表的权限。

INSERT:授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限。

DELETE:授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限。

DROP:授予用户可以删除数据表的权限。

UPDATE:授予用户可以使用 UPDATE 语句更新特定数据表的权限。

ALTER:授予用户可以使用 ALTER TABLE 语句修改数据表的权限。

REFERENCES:授予用户可以创建一个外键来参照特定数据表的权限。

CREATE:授予用户可以使用特定的名字创建一个数据表的权限。

INDEX:授予用户可以在表上定义索引的权限。

ALL或ALL PRIVILEGES:所有的权限名。


授予列(字段)权限类型
  • 授予列(字段)权限时,priv_type的值只能指定为SELECT、INSERT和UPDATE,同时权限的后面需要加上列名列表(column-list)。
授予创建和删除用户的权限
  • 授予列(字段)权限时,priv_type的值指定为CREATE USER权限,具备创建用户、删除用户、重命名用户和撤消所有特权,而且是全局的。

ON

  • 有ON,是授予权限,无ON,是授予角色。如:
-- 授予数据库db1的所有权限给指定账户
GRANT ALL ON db1.* TO 'user1'@'localhost';
-- 授予角色给指定的账户
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';

对象类型(object_type)

  • 在ON关键字后给出要授予权限的object_type,通常object_type可以是数据库名、表名等。

权限级别(priv_level)

指定权限级别的值有以下几类格式:

*:表示当前数据库中的所有表。

.:表示所有数据库中的所有表。

db_name.*:表示某个数据库中的所有表,db_name指定数据库名。

db_name.tbl_name:表示某个数据库中的某个表或视图,db_name指定数据库名,tbl_name指定表名或视图名。

tbl_name:表示某个表或视图,tbl_name指定表名或视图名。

db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name指定存储过程名或函数名。


被授权的用户(user)

'user_name'@'host_name'


  • Tips:'host_name’用于适应从任意主机访问数据库而设置的,可以指定某个地址或地址段访问。
  • 可以同时授权多个用户。

user表中host列的默认值

host 说明
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1


host_name格式有以下几种:


使用%模糊匹配,符合匹配条件的主机可以访问该数据库实例,例如192.168.2.%或%.test.com;

使用localhost、127.0.0.1、::1及服务器名等,只能在本机访问;

使用ip地址或地址段形式,仅允许该ip或ip地址段的主机访问该数据库实例,例如192.168.2.1或192.168.2.0/24或192.168.2.0/255.255.255.0;

省略即默认为%。


身份验证方式(auth_option)

  • auth_option为可选字段,可以指定密码以及认证插件(mysql_native_password、sha256_password、caching_sha2_password)。

加密连接(tls_option)

  • tls_option为可选的,一般是用来加密连接。

用户资源限制(resource_option)

  • resource_option为可选的,一般是用来指定最大连接数等。
参数 说明
MAX_QUERIES_PER_HOUR count 每小时最大查询数
MAX_UPDATES_PER_HOUR count 每小时最大更新数
MAX_CONNECTIONS_PER_HOUR count 每小时连接次数
MAX_USER_CONNECTIONS count 用户最大连接数


权限生效

  • 若要权限生效,需要执行以下语句:
FLUSH PRIVILEGES;

REVOKE语句

  • REVOKE语句主要用于撤销权限。

语法格式

  • REVOKE语法和GRANT语句的语法格式相似,但具有相反的效果
REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
    FROM user [, user] ...
REVOKE PROXY ON user
    FROM user [, user] ...

若要使用REVOKE语句,必须拥有MySQL数据库的全局CREATE USER权限或UPDATE权限;

第一种语法格式用于回收指定用户的某些特定的权限,第二种回收指定用户的所有权限;


TCL(Transaction Control Language)语句:事务控制语句

什么是事物?

  • 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

事务的ACID属性

  • 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态
  • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
  • 持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

分类

  • 隐式事务:事务没有明显的开启和结束的标记(比如insert,update,delete语句)
  • 显式事务:事务具有明显的开启和结束的标记(autocommit变量设置为0)

事务的使用步骤

开启事务

  • 默认开启事务
SET autocommit = 0 ;

提交事务

COMMIT;

回滚事务

ROLLBACK ;

查看当前的事务隔离级别

select @@tx_isolation;

设置当前连接事务的隔离级别

set session transaction isolation level read uncommitted;

设置数据库系统的全局的隔离级别

set global transaction isolation level read committed ;

【常用函数】


  • MySQL提供了众多功能强大、方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求。本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时查看。

(这里使用 Navicat Premium 15 工具进行演示)

87caf7415ffd4a50b2c035de378a8413.png


因为内容太多了这里只演示一些常用的


一. 数学函数

对数值型的数据进行指定的数学运算,如abs()函数可以获得给定数值的绝对值,round()函数可以对给定的数值进行四舍五入。

1. ABS(number)

  • 作用:返回 number 的绝对值
SELECT
 ABS(s_score)
FROM
  score;

6cadf07104e24fe5b7b4315ae1bb00d6.png


998d03dea4d74686b6f59ea57d593fe9.png

  • ABS(-86) 返回:86
  • number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。

2. PI()

  • 例1:pi() 返回:3.141592653589793
  • 例2:pi(2) 返回:6.283185307179586
  • 作用:计算圆周率及其倍数

3. SQRT(x)

  • 作用:返回非负数的x的二次方根

4. MOD(x,y)

  • 作用:返回x被y除后的余数

5. CEIL(x)、CEILING(x)

  • 作用:返回不小于x的最小整数

6. FLOOR(x)

  • 作用:返回不大于x的最大整数

7. FLOOR(x)

  • 作用:返回不大于x的最大整数

8. ROUND(x)、ROUND(x,y)

  • 作用:前者返回最接近于x的整数,即对x进行四舍五入;后者返回最接近x的数,其值保留到小数点后面y位,若y为负值,则将保留到x到小数点左边y位
SELECT ROUND(345222.9)


602b47635e254481a156bf045ea3b6a6.png

  • 参数说明: numberExp 需要进行截取的数据 nExp 整数,用于指定需要进行截取的位置,>0:从小数点往右位移nExp个位数, <0:从小数点往左

nExp个位数 =0:表示当前小数点的位置


9. POW(x,y)和、POWER(x,y)

  • 作用:返回x的y次乘方的值

10. EXP(x)

  • 作用:返回e的x乘方后的值

11. LOG(x)

  • 作用:返回x的自然对数,x相对于基数e的对数

12. LOG10(x)

  • 作用:返回x的基数为10的对数

13. RADIANS(x)

  • 作用:返回x由角度转化为弧度的值

14. DEGREES(x)

  • 作用:返回x由弧度转化为角度的值

15. SIN(x)、ASIN(x)

  • 作用:前者返回x的正弦,其中x为给定的弧度值;后者返回x的反正弦值,x为正弦

16. COS(x)、ACOS(x)

  • 作用:前者返回x的余弦,其中x为给定的弧度值;后者返回x的反余弦值,x为余弦

17. TAN(x)、ATAN(x)

  • 作用:前者返回x的正切,其中x为给定的弧度值;后者返回x的反正切值,x为正切

18. COT(x)

  • 作用:返回给定弧度值x的余切

二. 字符串函数

1. CHAR_LENGTH(str)

  • 作用:计算字符串字符个数
SELECT CHAR_LENGTH('这是一个十二个字的字符串');

1a7643e3a9e2473ebcc6cc197ddc847e.png


2. CONCAT(s1,s2,…)

  • 作用:返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL
SELECT CONCAT('拼接','测试');

5bf70d552d7544378760d172b2ebbbef.png

3. CONCAT_WS(x,s1,s2,…)

  • 作用:返回多个字符串拼接之后的字符串,每个字符串之间有一个x
SELECT CONCAT_WS('-','测试','拼接','WS')


2d028c963f2644bda52859b473d0d8f0.png

4. INSERT(s1,x,len,s2)

  • 作用:返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符
SELECT INSERT('测试字符串替换',2,1,'牛');


dcc86c26d71d4e50b9db799cf3e1fc53.png


5. LOWER(str)和LCASE(str)、UPPER(str)和UCASE(str)

  • 作用:前两者将str中的字母全部转换成小写,后两者将字符串中的字母全部转换成大写
SELECT LOWER('JHGYTUGHJGG'),LCASE('HKJHKJHKJHKJ');


e941fbd3b6ee4567b3c8d239c3bc9b88.png

SELECT UPPER('aaaaaa'),UCASE('vvvvv');

c5ba7e4cda9b473184c2242c7a85bd7a.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 SQL 关系型数据库
MySQL阅读网上MySQL文章有感的杂记
MySQL阅读网上MySQL文章有感的杂记
61 0
|
关系型数据库 MySQL Linux
让安装变简单:Linux下安装Mysql一篇文章搞定
让安装变简单:Linux下安装Mysql一篇文章搞定
156 0
|
6月前
|
SQL 关系型数据库 MySQL
一篇文章解析mysql的 行转列(7种方法) 和 列转行
一篇文章解析mysql的 行转列(7种方法) 和 列转行
2025 0
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
406 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
存储 缓存 关系型数据库
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
|
6月前
|
SQL 关系型数据库 MySQL
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
|
6月前
|
存储 SQL 关系型数据库
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
89 0
|
6月前
|
Cloud Native 关系型数据库 MySQL
AnalyticDB MySQL文章汇总
AnalyticDB MySQL文章汇总
80 0
|
SQL 存储 关系型数据库
MySQL的第一篇文章——了解数据库、简单的SQL语句
MySQL的第一篇文章——了解数据库、简单的SQL语句
|
SQL 关系型数据库 MySQL
mybatis-plus代码生成器(+24篇MySql/MyBatis-Plus文章)
mybatis-plus代码生成器(+24篇MySql/MyBatis-Plus文章)
106 0