MySQL查询进阶——从函数到表连接的使用你还记得吗

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MySQL查询进阶——从函数到表连接的使用你还记得吗

一、MySQL函数的使用


mysql中内置了很多函数,每个函数都代表一个特定功能


1、单行函数


特点:每行数据都会产生一个对应的结果

表中有多少行,就会有多少行的结果

位置:select之后,from之前 或作为筛选条件

concat(…,列名,…,列名)

用来拼接多列的值


例如:以firstname+lastname的形式显示所有员工的姓名

select concat(first_name,last_name) as 全名 from employees

mod(值1,值2)

求值1和值2的取余结果 ,相当于数学运算中的 %(值1%值2)


标准SQL规范中不存在%取余的写法,所以取余操作应该使用mod()

例如:select mod(10,3) from dual

注: dual为虚拟表,作用为使当前SQL符合语法规范,不写时会做自动填充

length(列名|数据)

获取长度


查询所有firstname长度>6的员工信息

select * from employees where length(first_name)>6

now() | sysdate()

获取系统当前时间


select now()

select SYSDATE()

select now() from dual


2、多行函数(组函数)


以组为单位获取结果,一组得到一个结果

如果未手动进行分组,则默认整张表为一组

sum(列名)

求某一列的总和

avg(列名)

求某一列的平均值

max(列名)

求某一列的最大值

min(列名)

求某一列的最小值

count(列名)

求某一列值的个数(非空)

示例:


-- 组函数操作salary
select 
SUM(salary) 总和,AVG(salary) 平均值,MAX(salary) 最大值,min(salary) 最小值,COUNT(salary) 非空值的数量
from employees
-- 计算表中绩效列不为空的员工数量
select COUNT(commission_pct) from employees
-- 求表中的行数
select COUNT(*) from employees
select COUNT(employee_id) from employees


二、MySQL的分组


在MySQL中一个组就是一个操作单位

简单分组

select 列名 from 表名 group by 列名

以部门为单位求每个部门的平均薪资

select department_id,AVG(salary) 平均薪资 from employees group by department_id

where + 分组


-- 查询部门id为10、20、30的部门的平均薪资、
select department_id,AVG(salary) 平均薪资 
from employees
where department_id in(10,20,30) -- 先筛选
GROUP BY department_id -- 后分组查询


having + 分组


select department_id,AVG(salary) 平均薪资 
from employees
group by department_id -- 先分组
having department_id in(10,20,30)  -- 后筛选


分组中 where 和 having 的区别


where是在分组前执行,having是在分组后执行

where不能在分组时使用组函数,但是having可以

当两者都可使用时,优先使用where,效率更高


三、分页以及查询关键字的执行顺序


limit:用来限制显示的查询结果条数,通常用于分页查询

select 列名 from 表名 limit 显示的起始下标,显示条数


查询所有员工数据的前十条

select * from employees limit 0,10

select * from employees limit 10 下标为0时可以省略

当limit和其他查询关键字联用时,limit一定最后执行


查询的执行顺序:


语法顺序  执行顺序


select    5
from    1
where   2
group by  3
having    4
order by  6
limit   7


四、子查询


当一个SQL需要借助于另一个SQL的执行结果,在当前SQL中嵌套另一个SQL,该写法称为子查询


1、where子查询


1.1、单值子查询


嵌套的子SQL只会返回一行一列的结果

-- 查询员工id为100的员工的部门id

select department_id from employees where employee_id=100


-- 子查询::查询员工id为100的员工所在的部门信息


select * from departments 
where department_id=(select department_id from employees where employee_id=100)


优先执行内层SQL,再执行外层SQL

子SQL需写入小括号

1.2、多值子查询

嵌套的子SQL会返回多个结果

--查询firstname中包含s的员工所在的部门信息


select * from departments 
where department_id in(select department_id from employees where first_name like '%s%')


2、from子查询


将子SQL的查询结果临时看做一张表进行后续操作
-- 获取薪资最高的前十个员工的平均薪资
-- 先获取薪资最高的前十名员工的薪资
select salary from employees ORDER BY salary desc LIMIT 10
-- 子查询:再根据子SQL的查询结果临时通过别名构建一张数据表进行查询
select avg(salary) from (select salary from employees ORDER BY salary desc LIMIT 10) as e


五、表连接


当查询结果需要从多张表中获取时,则需要将多张表连接起来进行查新操作

表连接的前提:


多张表之间必须存在关联关系(外键)

外键通常连接的是另一张表的主键

在进行表连接时作为连接条件使用


1、内连接

语法:


select 表1.列名,表2.列名,... 
from 表1 inner join 表2
on 连接条件


特点:对两张表同时进行约束,只有当所有表都符合连接条件,才会显示信息

使用:inner可省


2、(左)外连接

语法:


select 表1.列名,表2.列名,... 
from 表1(左表) left outer join 表2(右表)
on 连接条件


特点:只对右表做约束,左表中的数据都会显示,右表中只有符合连接条件的才会显示

使用:outer可省

左外连接和右外连接就是left和right的不同,位置不同,通常用左外连接

使用:

-- 查询所有的员工信息及符合连接条件的部门信息


select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id


全外连接:


将两个查询结果进行合并显示

查询语句1 union 查询语句2

使用:


-- 内连接
select e.*,d.*  
from employees e inner join departments d
on  e.department_id=d.department_id
union -- 对内连接和左连接的查询结果进行合并
-- 左连接
select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id


union会对合并结果进行去重

union all不会对结果去重

特点:合并双方都不做约束

合并双方的查询结果字段的个数、顺序必须一致

实际开发中,使用频率较高的是内连接和左外连接


3、自连接


概念:是特殊的表连接,参与连接的是同一张表

具体使用:


表中的某两个字段之间存在关联关系


-- 查询:员工id、员工姓名-firstname、直接领导的id、直接领导的姓名
select e1.employee_id 员工id,e1.first_name 员工姓名,e2.employee_id 领导id,e2.first_name 领导姓名
from employees e1 LEFT JOIN employees e2-- e1代表获取员工信息的表,e2代表获取领导信息的表
ON e1.manager_id=e2.employee_id -- 把两个有关联关系的字段作为连接条件


判断同一字段,作为连接条件


-- 查询工资相同的员工信息
select e1.employee_id 员工1的id,e1.salary 员工1的工资,e2.employee_id 员工2的id,e2.salary 员工2的工资
from employees e1 LEFT JOIN employees e2
on e1.salary=e2.salary -- 连接条件
where e1.employee_id<e2.employee_id -- 防止判断的双方是同一个人,并去重
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
4月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
4月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
6月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
329 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
252 14
|
4月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
129 15
|
4月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
4月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
5月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
483 9
|
4月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
7月前
|
关系型数据库 MySQL 数据库
MySQL报错:未知系统变量'tx_isolation'及隔离级别查询
记住,选择合适的隔离级别,就像是在风平浪静的湖面上找到适合的划船速度——既要快到能赶上午饭(性能),又不至于翻船(数据一致性问题)。
301 3

推荐镜像

更多