MySQL基础篇2

1. 函数

  • 函数的使用可提高代码效率,提高代码的可维护性;
  • 不同的DBMS拥有自己独特的函数,所以使用函数时需要格外注意,由此导致使用函数的SQL可移植性变差;
  • 函数分为内置函数和自定义函数;
  • 内置函数有数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等,可进一步分为单行函数、聚合函数(或分组函数)

在这里插入图片描述

1.1 单行函数

  • 操作数据对象;
  • 接受参数返回一个结果;
  • 只对一行进行变换
  • 每行返回一个结果
  • 可以嵌套;
  • 参数可以是一列或一个值;

1.1.1 数值函数

  • 基本函数:
  • RAND函数生成区间为[0,1)左闭右开区间;
    在这里插入图片描述
  • 角度与弧度之间的转换:
    在这里插入图片描述
  • 三角函数:

在这里插入图片描述

  • 指数函数、对数函数:
    在这里插入图片描述
  • 进制之间的转换:
    在这里插入图片描述

1.1.2 字符串函数

  • MySQL中字符串索引下标从1开始

在这里插入图片描述

  • STRCMP函数比较两字符串的大小,如果s1>s2,则返回1,反之返回-1,若二者相等则返回0;
  • 如果substr在str中不存在,则LOCATE函数返回结果为0;
    在这里插入图片描述
    在这里插入图片描述

1.1.3 日期、时间函数

  • 获取日期、时间:
    在这里插入图片描述

  • 日期与时间戳的转换:
    在这里插入图片描述

  • 获取月份、星期、星期数、天数等函数:
    在这里插入图片描述

  • 日期的操作函数:

在这里插入图片描述

  • 时间和秒钟转换的函数:
    在这里插入图片描述
  • 计算日期和时间的函数:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 日期的格式化与解析:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    GET_FORMAT函数中date_type和format_type参数取值如下:
    在这里插入图片描述

1.1.4 流程控制函数

  • CASE函数中,ELSE结构为可选项,可不写;
    在这里插入图片描述
/*练习:查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。*/
# 流程控制函数
SELECT *,CASE department_id
				WHEN 10 THEN salary*1.1
				WHEN 20 THEN salary*1.2
				WHEN 30 THEN salary*1.3
				END total_salary
FROM employees
WHERE department_id IN (10,20,30);

1.1.5 加密与解密函数

  • PASSWORD、ENCODE/DECODE函数在MySQL8.0中已经弃用;
  • 加密工作可在后端实现,将加密后的数据存储在数据库中,无需将数据存储在数据库中再进行加密;
    在这里插入图片描述

1.1.6 信息函数

  • CONNECTION_ID()表示一个唯一的连接ID;

在这里插入图片描述

1.1.7 其他函数

  • FORMAT函数起到与ROUND函数类似的作用,区别在于FORAMT函数如果n的值小于或者等于0,则只保留整数部分;
  • 在进行IP地址转换时,点分十进制方式表示IPv4地址时,每个数值范围为0~255共256大小,所以可从右往左将每个位置视为幂为0,1,2,3,将其转换为整数时,可使用底数为256的指数函数计算:以“192.168.1.100”为例,计算方式为192乘以256的3次方,加上168乘以256的2次方,加上1乘以256,再加上100;

在这里插入图片描述

1.2 聚合函数/分组函数

  • 聚合函数作用于一组数据,并对一组数据返回一个值
  • 聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用;

在这里插入图片描述

1.2.1 常用聚合函数

  • SUM、AVG只适用于数值类型,会自动过滤NULL值;
  • MAX、MIN适用于数值类型、字符串类型、日期时间类型,会自动过滤NULL值;
  • COUNT适用于任何类型,用于统计指定字段在查询结果中的个数(只统计指定字段非空情况):
    1)可使用COUNT(*)、COUNT(1)、COUNT(指定字段)统计满足条件的记录数量,但COUNT(指定字段)的方式有可能会出错,原因是此方式只统计字段非空的情况;
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 公式:AVG=SUM/COUNT;

1.2.2 GROUP BY进行分组

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
  • 可以使用GROUP BY子句将表中的数据分成若干组;
  • SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中;
  • 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中;
  • 声明在FROM之后,ORDER BY之前;
  • 可在GROUP BY中使用WITH ROLLUP, 表现为在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总体情况;当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

1.2.3 HAVING进行条件过滤

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING condition]
[ORDER BY column];
  • 声明在GROUP BY后面;
  • 建议配合GROUP BY使用;
  • 过滤条件不涉及聚合函数时,使用WHERE;过滤条件涉及聚合函数时,使用HAVING;

1.2.4 HAVING与WHERE

在这里插入图片描述

2. SQL完整结构及底层执行过程

2.1 查询语句完整结构

SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#其中:
#(1)from:从哪些表中筛选
#(2)on:关联多表查询时,去除笛卡尔积
#(3)where:从表中筛选的条件
#(4)group by:分组依据
#(5)having:在统计结果中再次筛选
#(6)order by:排序
#(7)limit:分页

2.2 执行过程

在这里插入图片描述

3.子查询

在这里插入图片描述

  • 也可称为嵌套查询,指一个查询语句嵌套在另一个查询语句内部的查询;

  • SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较;

  • 子查询(内查询)在主查询之前一次执行完成;

  • 子查询的结果被主查询(外查询)使用;

  • 注意事项:
    1)子查询要包含在括号内
    2)将子查询放在比较条件的右侧
    3)单行操作符对应单行子查询,多行操作符对应多行子查询

  • from型的子查询:子查询是作为from的一部分,子查询要用()引起来,并且要给这个子查询取别
    , 把它当成一张“临时的虚拟的表”来使用。

  • 子查询不仅可用于SELECT结构,也可用于更新、删除操作中;

3.1 子查询分类

  • 内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
  • 内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询

3.1.1 单行子查询

单行比较操作符
在这里插入图片描述

3.1.2 多行子查询

  • 也称为集合比较子查询;
  • 内查询返回多行;
  • 使用多行比较操作符;
  • ANY表示只要与其中某一个比较满足条件即可,ALL则表示要与所有值比较且满足条件

在这里插入图片描述

3.1.3 相关子查询

在这里插入图片描述

  • 内查询与主查询有关,内查询每次执行需要借助主查询传入的信息,子查询中使用主查询中的列;
  • 内查询执行多次,每执行一次外部查询,子查询都要重新计算一次;
  • 相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询;
    在这里插入图片描述
  • 在完整SELECT结构中,除了GROUP BY、LIMIT处,其他位置均可使用子查询

3.1.3.1 EXISTS 与 NOT EXISTS关键字

  • 关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行
    1)如果在子查询中不存在满足条件的行:条件返回 FALSE;继续在子查询中查找;
    2)如果在子查询中存在满足条件的行:不在子查询中继续查找;条件返回 TRUE;
  • NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE;

如:

# 查询公司管理者的employee_id,last_name,job_id,department_id信息
select e.employee_id,e.last_name,e.job_id,e.department_id
from employees e
where exists (
	select manager_id
    from employees e2
    where e2.manager_id=e.employee_id
);

# 查询departments表中,不存在于employees表中的部门的department_id和department_name
select department_id,department_name
from departments d
where not exists (
	select *
    from employees e
    where e.department_id=d.department_id
);

核心内容:

  • 单行函数:数值函数:基本函数;字符串函数;日期、时间函数;
  • 聚合函数;
  • SQL完整结构和执行过程;
  • 子查询

资料来源:

  • 尚硅谷

猜你喜欢

转载自blog.csdn.net/qq_43665602/article/details/130450374