MySQL的基础学习(下)

本文详细介绍了MySQL中的数据排序(包括单列和多列排序)、分页原理与实现、以及单行函数、聚合函数如AVG、SUM、MIN、MAX和COUNT的使用,以及GROUPBY和HAVING子句在数据分组过滤中的应用。

1. 排序数据

1.1 排序规则

  • 使用 ORDER BY 子句排序

    • ASC(ascend): 升序

    • DESC(descend):降序

  • ORDER BY 子句在SELECT语句的结尾。

1.2 单列排序

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date ;

1.3 多列排序

SELECT last_name, department_id, salary
FROM   employees
ORDER BY department_id, salary DESC;
  • 可以使用不在SELECT列表中的列排序。

  • 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

2. 分页

2.1 背景

背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?

背景2:表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?

2.2 实现规则

  • 分页原理

    所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。

  • MySQL中使用 LIMIT 实现分页

  • 格式:

 LIMIT [位置偏移量,] 行数
 

  • 第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。

  • 举例

--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;

--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;

--第21至30条记录: 
SELECT * FROM 表名 LIMIT 20,10;

MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。

  • 分页显式公式:(当前页数-1)*每页条数,每页条数

SELECT * FROM table 
LIMIT(PageNo - 1)*PageSize,PageSize;
  • 注意:LIMIT 子句必须放在整个SELECT语句的最后!

  • 使用 LIMIT 的好处

约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。

2.3 拓展

在不同的 DBMS 中使用的关键字可能不同。在 MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。

  • 如果是 SQL Server 和 Access,需要使用 TOP 关键字,比如:

SELECT TOP 5 name, hp_max FROM heros ORDER BY hp_max DESC
  • 如果是 DB2,使用FETCH FIRST 5 ROWS ONLY这样的关键字:

    SELECT name, hp_max FROM heros ORDER BY hp_max DESC FETCH FIRST 5 ROWS ONLY
  • 如果是 Oracle,你需要基于 ROWNUM 来统计行数:

    SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;

    需要说明的是,这条语句是先取出来前 5 条数据行,然后再按照 hp_max 从高到低的顺序进行排序。但这样产生的结果和上述方法的并不一样。我会在后面讲到子查询,你可以使用

    SELECT rownum, last_name,salary
    FROM (
        SELECT last_name,salary
        FROM employees
        ORDER BY salary DESC)
    WHERE rownum < 10;

    得到与上述方法一致的结果。

    3. 单行函数和聚合函数

    3.1 单行函数

  • 操作数据对象

  • 接受参数返回一个结果

  • 只对一行进行变换

  • 每行返回一个结果

  • 可以嵌套

  • 参数可以是一列或一个值

3.1.1 基本函数

 
3.1.2 三角函数
3.1.3 指数与对数
3.1.4 进制间的转换
3.1.5 字符串函数
 
ASCII(S)返回字符串S中的第一个字符的ASCII码值
CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同
LENGTH(s)返回字符串s的字节数,和字符集有关
CONCAT(s1,s2,......,sn)连接s1,s2,......,sn为一个字符串
CONCAT_WS(x, s1,s2,......,sn)同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上x
INSERT(str, idx, len, replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
REPLACE(str, a, b)用字符串b替换字符串str中所有出现的字符串a
UPPER(s) 或 UCASE(s)将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s)将字符串s的所有字母转成小写字母
LEFT(str,n)返回字符串str最左边的n个字符
RIGHT(str,n)返回字符串str最右边的n个字符
LPAD(str, len, pad)用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad)用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s)去掉字符串s左侧的空格
RTRIM(s)去掉字符串s右侧的空格
TRIM(s)去掉字符串s开始与结尾的空格
TRIM(s1 FROM s)去掉字符串s开始与结尾的s1
TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1
TRIM(TRAILING s1 FROM s)去掉字符串s结尾处的s1
REPEAT(str, n)返回str重复n次的结果
SPACE(n)返回n个空格
STRCMP(s1,s2)比较字符串s1,s2的ASCII码值的大小
SUBSTR(s,index,len)返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、MID(s,n,len)相同
LOCATE(substr,str)返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0
ELT(m,s1,s2,…,sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
FIELD(s,s1,s2,…,sn)返回字符串s在字符串列表中第一次出现的位置
FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串
REVERSE(s)返回s反转后的字符串
NULLIF(value1,value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1

注意:MySQL中,字符串的位置是从1开始的。

3.1.6 日期和时间函数
3.1.6.1 获取日期、时间
3.1.6.2 日期与时间戳的转换
3.1.6.3 获取月份、星期、星期数、天数等函数
3.1.6.4 日期的操作函数

EXTRACT(type FROM date)函数中type的取值与含义:

3.1.6.5 时间和秒钟转换的函数
3.1.6.6 计算日期和时间的函数

 上述函数中type的取值:

3.1.6.7 日期的格式化与解析

上述非GET_FORMAT函数中fmt参数常用的格式符:

GET_FORMAT函数中date_type和format_type参数取值如下:

3.1.7 流程控制函数

 流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。

3.1.8 加密与解密函数

加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在保证数据库安全时非常有用。  

3.2 聚合函数

  • 聚合函数类型

    • AVG()

    • SUM()

    • MAX()

    • MIN()

    • COUNT()

3.2.1 AVG和SUM函数

 可以对数值型数据使用AVG 和 SUM 函数。

SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM   employees
WHERE  job_id LIKE '%REP%';
3.2.2 MIN和MAX函数

可以对任意数据类型的数据使用 MIN 和 MAX 函数。  

SELECT MIN(hire_date), MAX(hire_date)
FROM	  employees;
3.2.3 COUNT函数
  • COUNT(*)返回表中记录总数,适用于任意数据类型

SELECT COUNT(*)
FROM	  employees
WHERE  department_id = 50;
  • COUNT(expr) 返回expr不为空的记录总数。

SELECT COUNT(commission_pct)
FROM   employees
WHERE  department_id = 50;
3.2.4 GROUP BY
3.2.4.1 基本使用

可以使用GROUP BY子句将表中的数据分成若干组

SELECT column, group_function(column)
FROM table
[WHERE    condition]
[GROUP BY    group_by_expression]
[ORDER BY    column];
明确:WHERE一定放在FROM后面

 在SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中

 SELECT   department_id, AVG(salary)
FROM     employees
GROUP BY department_id ;

 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中

SELECT   AVG(salary)
FROM     employees
GROUP BY department_id ; 

3.2.4.2 使用多个列分组
 

 SELECT   department_id dept_id, job_id, SUM(salary)
FROM     employees
GROUP BY department_id, job_id ;

3.2.4.3 GROUP BY中使用WITH ROLLUP

使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。  

SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;

注意:

当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

 

3.2.5 HAVING

过滤分组:HAVING子句

  1. 行已经被分组。

  2. 使用了聚合函数。

  3. 满足HAVING 子句中条件的分组将被显示。

  4. HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。

 例:

SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值