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

news/2024/12/3 7:18:03/

文章目录

  • 一、基础查询: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.ppmy.cn/news/1551935.html

相关文章

重塑企业报修效率:报修进度查询功能深度解析与优化方向

在当下快节奏的现代企业运营环境中,设备设施的维护修理工作扮演着举足轻重的角色。无论是生产线上繁忙的机械部件,还是办公区不可或缺的电子装备,任何故障的出现都将直接影响企业的生产效率和日常运营。因此,构建一个高效且便捷的…

C/C++基础知识复习(32)

1) 什么是 C 中的函数对象?它有什么特点? 函数对象(Function Object) 是一个可以像函数一样调用的对象。换句话说,函数对象是重载了 operator() 运算符的类或结构体的实例。由于 C 中一切都是对象,函数对象…

【Unity插件】Shiny SSR 2 - Screen Space Reflections

Shiny SSR 2介绍 Shiny SSR 2 - Screen Space Reflections增加了屏幕空间反射到您的实时场景,使他们更加现实。 这个包包含2个针对每个渲染管道进行优化的包: -Shiny SSR 2 - Screen Space Reflections支持内置渲染关系。 Shiny SSR 2 - Screen Spac…

RTC 实时时钟实验

利用 ALIENTEK 2.8 寸 TFTLCD 模块来显示日期和时间,实现一个简单的时钟。 STM32F1 RTC 时钟简介 STM32 的实时时钟( RTC )是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数 的计数器,在相应软件配置下&#xf…

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录: 个人中心、修改密码…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识,发现了一份特别好的文档快乐的 Linux 命令行,翻译者是happypeter,作者当年也在慕课录制了react等前端相关的视频,通俗易懂,十分推荐 关于Linux的目录,多数博客已有详细介绍…

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(2):洛谷P1162:填涂颜色

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(2):洛谷P1162:填涂颜色 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成…

最新保姆级Linux下安装与使用conda:从下载配置到使用全流程

目录 1.前言 2.什么是conda 3.miniconda和anaconda的对比与选择 4.安装前需要确认的东西(非常重要) (1)安装的目录 (2)安装目录剩余的空间大小 (3)bashrc配置文件位置&#xff0…