【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;
这条查询执行以下操作:
- 从 employees 和 departments 表连接数据。
- 过滤出薪水大于50000的员工。
- 按部门分组,计算每个部门的平均薪水。
- 只返回平均薪水大于60000的部门。
- 按平均薪水降序排列结果。
- 限制返回前5条记录。
九、总结
MySQL的DQL语句为我们提供了强大的数据查询功能,掌握 SELECT、FROM、JOIN、WHERE、GROUP BY、ORDER BY 等语句,可以帮助我们有效地从数据库中提取和分析数据。在实际开发中,我们通常需要结合多种查询语句进行复杂的数据处理和分析,确保查询效率和结果的准确性。