自学内容网 自学内容网

【MySQL】高级查询技巧 JOIN、GROUP BY、ORDER BY、UNION 应用案列解析

🐇明明跟你说过:个人主页

🏅个人专栏:《MySQL技术精粹》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、MySQL起源

2、MySQL应用场景

二、MySQL高级查询技巧 

1、连接查询(JOIN)

2、分组查询(GROUP BY) 

3、排序查询(ORDER BY) 

4、联合查询(UNJOIN)


一、引言

1、MySQL起源

MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS),它最初由瑞典公司 MySQL AB 开发。MySQL 以其高效性、可靠性、开放源代码等特点广受开发者和企业的欢迎。它作为一个流行的数据库系统,广泛用于网站开发、企业应用、数据仓库等领域。

  

2、MySQL应用场景

Web 应用开发:

  • MySQL 是 LAMP(Linux、Apache、MySQL、PHP/Perl/Python)和 WAMP(Windows、Apache、MySQL、PHP/Perl/Python)等流行开发堆栈的一部分。
  • 它被广泛用于支撑网站和网络应用程序,例如博客平台、内容管理系统(CMS)、电子商务网站等。

在线事务处理(OLTP)系统:

  • 适用于需要频繁进行插入、更新和查询操作的应用,如银行系统、股票交易系统等。
  • MySQL 提供了 ACID(原子性、一致性、隔离性、持久性)特性以确保数据的完整性和可靠性。

数据分析与报告:

  • 虽然 MySQL 主要是一个 OLTP 数据库,但它也可以用于轻度的数据分析工作,如生成报表或执行简单的聚合查询。
  • 对于更复杂的数据分析任务,通常会将数据导出到专门的数据仓库中。

分布式应用:

  • MySQL 支持主从复制和集群技术,可以在分布式的环境中提供高可用性和容错能力。
  • 这对于需要跨多个地理位置运行的服务非常重要。

云服务:

  • MySQL 可以部署在云平台上,作为即服务(DBaaS)提供给用户,方便快捷地创建和管理数据库实例。
  • 例如,阿里云、AWS、Google Cloud 等都提供了基于 MySQL 的云数据库服务。

移动应用后端:

  • 移动应用经常需要连接到服务器端数据库来存储用户信息、设置、游戏进度等。
  • MySQL 经常用作这些应用的后端数据库解决方案。

二、MySQL高级查询技巧 

1、连接查询(JOIN)

在 MySQL 中,连接查询(JOIN) 是一种非常强大的查询工具,它允许我们从两个或更多的表中检索数据,并将它们基于某些条件组合成一行。JOIN 是处理关系型数据库中多个表之间关系的核心功能之一。通过连接查询,我们可以实现复杂的数据提取,合并多个表的数据。

连接查询的基本概念
连接查询有不同的类型,最常见的几种类型有:

  • INNER JOIN:内连接
  • LEFT JOIN (OUTER):左外连接
  • RIGHT JOIN (OUTER):右外连接
  • FULL JOIN (OUTER):全外连接
  • CROSS JOIN:交叉连接

INNER JOIN - 内连接
内连接是最常用的连接类型,它返回两个表中符合连接条件的交集部分。如果两个表中的某行没有匹配的记录,那么这一行就不会出现在查询结果中。

语法:

SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

示例:

假设有两个表:

  • employees(员工表),包括字段:employee_id, name, department_id
  • departments(部门表),包括字段:department_id, department_name

如果要查询每个员工及其所在的部门名称,可以使用内连接:  

SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

这个查询将返回所有在 employees 表和 departments 表中都存在的匹配记录。

  

LEFT JOIN (OUTER) - 左外连接
左外连接返回左边表(table1)中的所有记录,以及右边表(table2)中与之匹配的记录。如果右边表中没有匹配记录,那么查询结果中右边表的字段将返回 NULL。

语法:

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

示例:

如果我们想要查询所有员工的名字以及他们的部门名称,即使有些员工没有分配部门,可以使用左连接:

SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

如果某个员工没有部门,那么 department_name 列将返回 NULL

  

RIGHT JOIN (OUTER) - 右外连接
右外连接与左外连接类似,但它返回的是右边表(table2)中的所有记录,以及左边表(table1)中与之匹配的记录。如果左边表中没有匹配记录,那么左边表的字段将返回 NULL。

语法:

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例:

假设我们想查询所有部门及其员工,即使某些部门没有员工,我们可以使用右连接:

SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

如果某个部门没有员工,那么 employee_id name 列将返回 NULL。

FULL JOIN (OUTER) - 全外连接
全外连接返回左右两个表中的所有记录,如果没有匹配的记录,则填充 NULL。MySQL 本身并不直接支持 FULL JOIN,但是我们可以通过组合 LEFT JOIN 和 RIGHT JOIN 来模拟全外连接。

语法(模拟):

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例:

模拟全外连接查询员工和部门表中的所有记录:

SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id
UNION
SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

这个查询将返回所有员工和所有部门,无论是否有匹配记录。

  

CROSS JOIN - 交叉连接
交叉连接返回两个表的笛卡尔积,即 table1 中的每一行都会与 table2 中的每一行组合。交叉连接没有 ON 子句,它会返回 table1 行数乘以 table2 行数的结果。

语法:

SELECT columns
FROM table1
CROSS JOIN table2;

示例:

假设有 colors 表和 sizes 表,colors 表有三种颜色(Red, Green, Blue),sizes 表有两种尺寸(Small, Medium)。交叉连接将返回每个颜色与每个尺寸的组合。

SELECT colors.color, sizes.size
FROM colors
CROSS JOIN sizes;

这个查询将返回:

Red    Small
Red    Medium
Green  Small
Green  Medium
Blue   Small
Blue   Medium

   

2、分组查询(GROUP BY) 

在 MySQL 中,分组查询(GROUP BY) 是一个非常常见且强大的操作,用于将结果集按照某一列或多列进行分组。分组查询通常与聚合函数(如 COUNT()、SUM()、AVG()、MAX()、MIN() 等)结合使用,用于计算每个分组的统计信息。

GROUP BY 基本语法
基本的 GROUP BY 语法如下:

SELECT column1, column2, ..., aggregate_function(columnN)
FROM table
WHERE condition
GROUP BY column1, column2, ...;
  • column1, column2, ... 是你希望进行分组的字段。
  • aggregate_function(columnN) 是一个聚合函数,用于对每个分组的数据进行计算(如 COUNT(), SUM(), AVG() 等)。
  • WHERE 子句可用于在分组前筛选数据。
  • GROUP BY 子句指定按照哪些列进行分组。

GROUP BY 的常见聚合函数

  • COUNT(): 计算分组中的行数。
  • SUM(): 计算某列的总和。
  • AVG(): 计算某列的平均值。
  • MAX(): 返回某列中的最大值。
  • MIN(): 返回某列中的最小值。

GROUP BY 示例
基本示例:统计每个部门的员工人数
假设有一个 employees(员工表)如下:

  

如果我们要统计每个部门的员工数量,可以使用 GROUP BY COUNT() 函数:

SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;

结果:

    

使用多个列进行分组:统计每个部门和职位的员工数量
假设 employees 表中还包含 job_title 字段。如果要查询每个部门和职位的员工数量,可以使用多个字段进行分组:

SELECT department_id, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_title;

 结果:  

聚合函数:求每个部门的平均工资
假设在 employees 表中还有一个 salary(工资)字段,查询每个部门的平均工资:

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

 结果:

  

3、排序查询(ORDER BY) 

在 MySQL 中,排序查询(ORDER BY) 用于对查询结果进行排序。排序操作可以基于一个或多个列进行,并且可以选择升序(ASC)降序(DESC)排序。默认情况下,ORDER BY 会按照升序排序。

基本语法

SELECT column1, column2, ...
FROM table
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
  • column1, column2, ...:指定排序的列,可以是一个或多个列。
  • ASC:升序排序(默认值)。
  • DESC:降序排序。

单列排序
假设有一个 employees 表,如下所示:

  

按工资升序排序:

SELECT employee_id, name, salary
FROM employees
ORDER BY salary ASC;

结果: 

  

使用 ORDER BY 排序日期列
如果列是日期类型,ORDER BY 也会按照日期的顺序进行排序。

按雇佣日期升序排序:

SELECT employee_id, name, hire_date
FROM employees
ORDER BY hire_date ASC;

结果:

  

4、联合查询(UNOIN)

在 MySQL 中,联合查询(UNION) 用于将两个或多个查询的结果集合并为一个结果集。UNION 会将不同查询的结果合并,并去掉重复的行。如果你希望保留所有的行(包括重复的行),可以使用 UNION ALL。

需要注意的是,UNION 和 JOIN 是两种不同的操作,UNION 用于将结果集按行合并,而 JOIN 用于在多个表之间按列关联数据。

UNION 基本语法

SELECT column1, column2, ...
FROM table1
WHERE condition
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition;
  • 每个查询的列数必须相同,而且相应列的数据类型应当兼容。
  • UNION 默认会去掉重复的记录。如果需要保留重复记录,使用 UNION ALL

UNION 示例
假设有两个表 employeescontractors,他们都有 name salary 字段。

  

   

基本联合查询
我们想将 employees contractors 表的 namesalary 合并成一个结果集:

SELECT name, salary FROM employees
UNION
SELECT name, salary FROM contractors;

结果:

   

  • 去重:UNION 会自动去除重复的记录。例如,如果 employees 和 contractors 表中有重复的名字(如相同的 name 和 salary),它们只会显示一次。 

保留重复记录(使用 UNION ALL)
如果我们希望保留重复的记录,可以使用 UNION ALL:

SELECT name, salary FROM employees
UNION ALL
SELECT name, salary FROM contractors;

结果:

 如果 employees contractors 表中的某些记录完全相同,它们会在结果集中出现多次。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于MySQL的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!  


原文地址:https://blog.csdn.net/weixin_53269650/article/details/145100300

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!