首页 > 数据库 >MySQL查询详解:单表查询、多表查询、分组查询、子查询

MySQL查询详解:单表查询、多表查询、分组查询、子查询

时间:2024-05-30 11:29:12浏览次数:25  
标签:多表 name employees 查询 单表 department id SELECT

效率工具
云服务器

MySQL查询详解:单表查询、多表查询、分组查询、子查询

在现代应用程序中,数据库是存储和管理数据的核心,而MySQL作为一种广泛使用的关系型数据库管理系统,提供了强大的查询功能。本文将详细探讨MySQL中的单表查询、多表查询、分组查询和子查询,帮助程序员掌握这些关键技能。

一、单表查询

单表查询是指在一个表中检索数据。基本的单表查询操作包括SELECT、WHERE、ORDER BY和LIMIT等。

1.1 SELECT语句

SELECT语句用于从表中检索数据。以下是一个基本的SELECT语句示例:

SELECT * FROM employees;

该语句从employees表中检索所有列的数据。我们还可以选择特定的列:

SELECT first_name, last_name, salary FROM employees;

1.2 WHERE子句

WHERE子句用于筛选满足特定条件的记录。以下示例显示薪水大于50000的员工:

SELECT first_name, last_name, salary FROM employees WHERE salary > 50000;

可以使用多个条件组合:

SELECT first_name, last_name, salary FROM employees WHERE salary > 50000 AND department_id = 1;

1.3 ORDER BY子句

ORDER BY子句用于对结果集进行排序。以下示例按薪水从高到低排序:

SELECT first_name, last_name, salary FROM employees ORDER BY salary DESC;

1.4 LIMIT子句

LIMIT子句用于限制返回的记录数量。以下示例返回前5条记录:

SELECT first_name, last_name, salary FROM employees ORDER BY salary DESC LIMIT 5;

二、多表查询

多表查询是指在多个表中检索和合并数据。常用的多表查询包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

2.1 INNER JOIN

INNER JOIN返回两个表中匹配的记录。以下示例将employees表和departments表按department_id进行内连接:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

2.2 LEFT JOIN

LEFT JOIN返回左表中的所有记录,以及右表中匹配的记录。以下示例返回所有员工及其所属的部门信息,如果没有部门,则显示NULL:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

2.3 RIGHT JOIN

RIGHT JOIN返回右表中的所有记录,以及左表中匹配的记录。以下示例返回所有部门及其员工信息,如果没有员工,则显示NULL:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

2.4 FULL JOIN

MySQL不直接支持FULL JOIN,可以通过UNION实现。以下示例返回所有员工和部门信息,包括没有匹配的记录:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
UNION
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

三、分组查询

分组查询用于将结果集按一个或多个列进行分组,通常与聚合函数一起使用,如COUNT、SUM、AVG、MAX和MIN。

3.1 GROUP BY子句

GROUP BY子句用于将结果集按一个或多个列分组。以下示例按部门统计员工人数:

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

3.2 HAVING子句

HAVING子句用于筛选分组后的结果集,通常与GROUP BY一起使用。以下示例筛选出员工人数大于10的部门:

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

3.3 聚合函数

聚合函数用于计算一组值并返回单个值。以下示例展示了几个常用的聚合函数:

  • 计算每个部门的平均薪水:
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
  • 计算每个部门的最高薪水:
SELECT department_id, MAX(salary) AS max_salary
FROM employees
GROUP BY department_id;

四、子查询

子查询是嵌套在另一个查询中的查询,通常用于复杂的查询场景。子查询可以返回单个值、行或表。

4.1 标量子查询

标量子查询返回单个值。以下示例返回薪水最高的员工的名字:

SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

4.2 行子查询

行子查询返回单行数据。以下示例返回薪水最高的员工的详细信息:

SELECT first_name, last_name, salary
FROM employees
WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);

4.3 表子查询

表子查询返回一个表。以下示例返回所有薪水高于平均薪水的员工:

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

4.4 关联子查询

关联子查询依赖于外部查询中的值。以下示例返回每个部门中薪水高于部门平均薪水的员工:

SELECT e.first_name, e.last_name, e.salary
FROM employees e
WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);

五、总结

通过本篇文章,我们详细探讨了MySQL中的单表查询、多表查询、分组查询和子查询。无论是简单的单表查询,还是复杂的多表关联查询、分组统计和嵌套子查询,这些技术都是构建强大数据库应用的基石。

标签:多表,name,employees,查询,单表,department,id,SELECT
From: https://blog.csdn.net/lkp1603645756/article/details/139319519

相关文章

  • 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的
    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件查询处理类似的处理过程,因此本篇随笔探讨两种不同查询在前端界面上的展示效......
  • 日常开发中注意点总结(三)对于分页查询、详情查询总到底哪些字段该回传回来,数据库的回传
    还有个问题,对于分页查询、详情查询这些接口中,到底是哪些字段应该回传给前台,其实还是依赖于前台需要对哪些字段做展示,需要使用哪些字段。一般对于resVo响应实体,都是包含哪些应该返回的字段(前端应该展示的字段),这种的再后面查询数据库的时候,直接查询该展示的字段,这是没有任何异......
  • 分布式任务调度内的 MySQL 分页查询优化
    一、背景介绍最近在线上环境发现了一条执行较慢的分页查询,高并发执行,产生了大量的慢查询日志,CPU使用率逐步升高。通过观察它的执行时间,发现该SQL查询时快时慢,执行时间并不稳定,以至于在高并发执行场景时,数据库来不及响应,数据库服务变慢。二、分析定位2.1定位SQL执行......
  • 多重查询 5 个只有 1 个 ID 的表,连接查询从 5 个表中获取结果
    关于我的表格,我正在为我喜欢玩的一款游戏创建一个脚本,如果人们的账户分配了XYZ语句,我就会创建一个脚本。它基于4个表。1个表保存了带有比赛ID的过往比赛,下一个表保存了比赛ID与玩家ID的关系,表3保存了玩家ID与游戏内ID的关系,而最后一个表保存了有关分配给他们的声......
  • 基于Spring Boot框架的分页查询和文件上传
    分页查询分析要想从数据库中进行分页查询,我们要使用LIMIT关键字,格式为:limit开始索引每页显示的条数假设一页想展示10条数据 查询第1页数据的SQL语句是:select*fromemplimit0,10;查询第2页数据的SQL语句是:select*fromemplimit10,10;查询第3页的数据的SQL......
  • mysql 函数实现父子查询
    DELIMITER//CREATEFUNCTIONget_all_father(rootIdINT)RETURNSvarchar(1000)DETERMINISTICBEGINDECLAREsTempVARCHAR(1000);DECLAREsTempParVARCHAR(1000);SETsTemp='';SETsTempPar=rootId;#循环递归WHILEsTemp......
  • mysql实现oracle的start with递归查询
    oracle查询语句selectdept_codefrom表名startwithdept_code='41311046430000001'connectbyPRIORid=PARENT_ID结果如下:改为mysql查询,实用函数实现selectsd.*from (select*from表名)sd, (select@pid:=(selectidfrom表名wheredept_code='4131......
  • 如何处理慢查询?
    处理慢查询是优化数据库性能的重要部分。下面给出一些处理慢查询的常见策略和技术:SQL优化:分析并优化执行较慢的SQL语句,可以使用数据库的查询分析工具(如MySQL的explain)来分析SQL语句的执行计划,并根据需要优化索引、重构查询语句、降低查询复杂度等。索引优化:在数据库表上创......
  • ElasticSearch之Doc结构中常规操作(新增字段、查询数据)
    背景:腾讯云上的ElasticSearch服务,操作客户端:Kibana1.在ES中指定doc_field_name内部新增字段的指令:PUTes_index_name/_mapping/${doc_field_name}{"properties":{"newFieldName":{"type":"integer"}}}备注:其中”es_index_nam......
  • 2 SAP前台操作手册-MM模块-采购管理-(标准/委外/寄售)采购信息记录创建、修改、显示、
    0总体说明SAP实施项目中,到了第3个阶段-系统实现,在这个阶段,因为蓝图汇报已经结束,配置也差不多完成了,自开发还在进行中,SAP标准功能下,可以进行基础业务的前台操作了,在实现阶段的尾端,客户指定的关键用户(俗称KU-KeyUser)会进行前台业务操作和练习,提高熟练程度,同时需要在外部SAP顾......