当前位置: 首页 > article >正文

【07】MySQL中的DQL(数据查询语言)详解

文章目录

  • 一、基础查询:SELECT语句
    • 1.1 查询指定列的数据
    • 1.2 查询所有列的数据
    • 1.3 查询去重数据
  • 二、FROM 子句
  • 三、连接查询:JOIN 语句
    • 3.1 INNER JOIN
    • 3.2 LEFT JOIN(或 LEFT OUTER JOIN)
    • 3.3 RIGHT JOIN(或 RIGHT OUTER JOIN)
  • 四、条件查询:WHERE 子句
    • 4.1 基本查询条件
    • 4.2 使用 AND、OR 组合多个条件
    • 4.3 使用 LIKE 模糊查询
    • 4.4 使用 IN 查询多个值
  • 五、分组查询: GROUP BY 子句
    • 5.2 使用聚合函数
    • 5.3 HAVING 子句
  • 六、排序:ORDER BY 子句
    • 6.1 基本排序
    • 6.2 多列排序
  • 七、分页查询:LIMIT 子句
  • 八、综合示例
  • 九、总结

在这里插入图片描述


MySQL中的数据查询语言(DQL,Data Query Language)主要用于从数据库中查询和获取数据。常见的DQL语句包括 SELECT、FROM、JOIN、GROUP BY、ORDER BY 等。本文将深入解析这些常用查询语句的功能和用法,并通过具体的示例帮助你理解如何在实际项目中使用这些语句。

一、基础查询:SELECT语句

SELECT 语句是用于查询数据的基础语句,允许你从一个或多个表中检索数据。其基本语法如下:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

1.1 查询指定列的数据


SELECT first_name, last_name 
FROM employees;

上面的查询从 employees 表中获取 first_name 和 last_name 两列的数据。

1.2 查询所有列的数据

SELECT * FROM employees;

SELECT * 语句表示查询该表中的所有列。虽然可以用 * 来表示所有列,但在实际项目中,建议明确指定需要的列,以优化性能。

1.3 查询去重数据

SELECT DISTINCT department FROM employees;

DISTINCT 关键字用于去重查询结果,只返回唯一的 department 值。

二、FROM 子句

FROM 子句用于指定查询的表或多个表。它通常与 JOIN 子句配合使用,尤其在涉及多个表连接查询时。

SELECT first_name, last_name 
FROM employees;

在这条语句中,FROM 后面跟的是 employees 表,表示我们要从 employees 表中查询数据。

三、连接查询:JOIN 语句

JOIN 用于将两个或多个表的数据根据某些条件结合起来。常见的 JOIN 类型有:INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。

3.1 INNER JOIN

INNER JOIN 返回的是两个表中符合连接条件的交集部分。

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

这条语句查询了 employees 表和 departments 表的连接结果,其中两个表通过 department_id 字段关联。INNER JOIN 只返回那些在两个表中都存在的记录。

3.2 LEFT JOIN(或 LEFT OUTER JOIN)

LEFT JOIN 返回左表中的所有记录以及右表中符合连接条件的记录。如果右表没有匹配的记录,结果中右表的字段将为 NULL。

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

此查询返回所有员工的信息,即使他们没有所属的部门。

3.3 RIGHT JOIN(或 RIGHT OUTER JOIN)

RIGHT JOIN 与 LEFT JOIN 相对,返回右表中的所有记录,以及左表中符合连接条件的记录。如果左表没有匹配的记录,结果中左表的字段将为 NULL。

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

该查询将返回所有部门的信息,即使某些部门没有员工。

数据库连接语句图示(图来源网上)
在这里插入图片描述

四、条件查询:WHERE 子句

WHERE 子句用于过滤查询结果。它可以使用各种比较操作符、逻辑操作符来定义过滤条件。

4.1 基本查询条件

SELECT * 
FROM employees 
WHERE salary > 50000;

此查询返回所有薪水大于50000的员工记录。

4.2 使用 AND、OR 组合多个条件

SELECT * 
FROM employees
WHERE salary > 50000 AND department_id = 3;

这条查询返回薪水大于50000且部门ID为3的员工记录。

4.3 使用 LIKE 模糊查询

SELECT * 
FROM employees
WHERE first_name LIKE 'A%';

LIKE 用于模糊查询,这里 A% 表示所有以 “A” 开头的名字。

4.4 使用 IN 查询多个值

SELECT * 
FROM employees
WHERE department_id IN (1, 2, 3);

该查询返回部门ID为1、2或3的员工记录。

五、分组查询: GROUP BY 子句

GROUP BY 用于将查询结果按某一列或多列分组,通常与聚合函数(如 COUNT、SUM、AVG、MAX、MIN 等)一起使用。

5.1 基本用法

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

此查询按部门分组,统计每个部门的员工数量。

5.2 使用聚合函数

COUNT:计算个数
SUM:求和
AVG:取平均数
MAX:取最大值
MIN:取最小值

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

该查询返回每个部门的平均薪资。

5.3 HAVING 子句

HAVING 用于过滤分组后的数据,类似于 WHERE,但 WHERE 作用于单行记录,HAVING 作用于分组后的结果。

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 60000;

这条查询返回平均薪水大于60000的部门信息。

分组前筛选与分组后筛选的区别

使用关键字筛选的表位置
分组前筛选where原始表group by的前面
分组后筛选having分组后的结果group by的后面

六、排序:ORDER BY 子句

ORDER BY 用于对查询结果进行排序,默认按升序排序(ASC),也可以指定降序排序(DESC)。

6.1 基本排序

SELECT * 
FROM employees
ORDER BY salary DESC;

该查询按薪资从高到低排序员工数据。

6.2 多列排序

SELECT * 
FROM employees
ORDER BY department_id ASC, salary DESC;

这里首先按 department_id 升序排序,如果部门ID相同,再按 salary 降序排序。

七、分页查询:LIMIT 子句

LIMIT 用于限制查询结果的条数,常用于分页查询。

SELECT * 
FROM employees
ORDER BY salary DESC
LIMIT 10;

此查询返回薪水最高的前10条记录。

八、综合示例

假设我们有两个表:employees 和 departments,我们可以组合多个查询语句,进行复杂的数据查询。

SELECT employees.first_name, employees.last_name, departments.department_name, AVG(employees.salary) AS avg_salary
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id
WHERE employees.salary > 50000
GROUP BY departments.department_id
HAVING avg_salary > 60000
ORDER BY avg_salary DESC
LIMIT 5;

这条查询执行以下操作:

  1. 从 employees 和 departments 表连接数据。
  2. 过滤出薪水大于50000的员工。
  3. 按部门分组,计算每个部门的平均薪水。
  4. 只返回平均薪水大于60000的部门。
  5. 按平均薪水降序排列结果。
  6. 限制返回前5条记录。

九、总结

MySQL的DQL语句为我们提供了强大的数据查询功能,掌握 SELECT、FROM、JOIN、WHERE、GROUP BY、ORDER BY 等语句,可以帮助我们有效地从数据库中提取和分析数据。在实际开发中,我们通常需要结合多种查询语句进行复杂的数据处理和分析,确保查询效率和结果的准确性。


http://www.kler.cn/a/419073.html

相关文章:

  • android shader gl_Position是几个分量
  • 数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall
  • mapstruct DTO转换使用
  • EDA软件研发的DevOps平台
  • [网络安全]sqli-labs Less-5 解题详析
  • 【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道
  • 【JavaWeb maven基础知识总结】
  • RabbitMQ rabbitmq.conf配置文件详解
  • 算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
  • spring boot3.3.5 logback-spring.xml 配置
  • git基本操作说明
  • 网络原理(1)(JavaEE)
  • 【leetcode100】螺旋矩阵
  • 数据资产管理是什么?为什么重要?核心组成部分(分类分级、登记追踪、质量管理、安全合规)、实施方法、未来趋势、战略意义
  • 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程
  • Web API - Clipboard
  • Qt PDF 前置课
  • RTC 实时时钟实验
  • oracle RAC各版本集群总结和常用命令汇总
  • C语言——库函数
  • 最大值(Java Python JS C++ C )
  • 课程答疑微信小程序设计与实现
  • 概率论——假设检验
  • 【北京迅为】iTOP-4412全能版使用手册-第十九章 搭建和测试TFTP服务器
  • C++之2048(2.0版)
  • go并发设计模式runner模式