MySQL基础
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;
扫描二维码关注公众号,回复:
15026212 查看本文章
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完整结构和执行过程;
- 子查询;
资料来源:
- 尚硅谷