ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL:每个查询的定义与用法

MySQL:每个查询的定义与用法

一. SELECT语句基础

定义
SELECT语句用于从数据库表中检索数据。它是SQL中最基本和最常用的命令。

语法解析

SELECT column1, column2, ... -- 选择要检索的列
FROM table_name -- 指定数据来源的表
[WHERE condition] -- 可选的筛选条件
[ORDER BY column_name [ASC|DESC]] -- 可选的排序
[LIMIT number]; -- 可选的返回行数限制

详细解释
- SELECT:指定要返回的列,可以使用*表示所有列
- FROM:指定数据来源的一个或多个表
- WHERE:过滤条件,只有满足条件的行才会被返回
- ORDER BY:对结果集进行排序
- LIMIT:限制返回的行数

二. WHERE条件筛选

定义
WHERE子句用于过滤记录,只返回满足指定条件的行。

比较运算符

-- 定义:精确匹配查询
SELECT * FROM employees WHERE salary = 5000; -- 等于

-- 定义:范围比较查询
SELECT * FROM employees WHERE salary > 5000; -- 大于
SELECT * FROM employees WHERE salary < 5000; -- 小于
SELECT * FROM employees WHERE salary >= 5000; -- 大于等于
SELECT * FROM employees WHERE salary <= 5000; -- 小于等于
SELECT * FROM employees WHERE salary <> 5000; -- 不等于

-- 定义:范围区间查询
SELECT * FROM employees WHERE salary BETWEEN 3000 AND 6000; -- 在3000-6000之间

逻辑运算符定义

-- 定义:AND要求所有条件都满足
SELECT * FROM employees
WHERE salary > 5000 AND department_id = 1; -- 工资>5000且部门=1

-- 定义:OR要求至少一个条件满足
SELECT * FROM employees
WHERE salary > 5000 OR department_id = 1; -- 工资>5000或部门=1

-- 定义:NOT否定条件
SELECT * FROM employees
WHERE NOT department_id = 1; -- 部门不等于1

-- 定义:复杂逻辑组合
SELECT * FROM employees
WHERE (salary > 5000 OR commission_pct IS NOT NULL) -- 括号优先执行
AND hire_date > '2020-01-01';

模糊查询定义

-- 定义:LIKE用于模式匹配,%匹配任意字符序列
SELECT * FROM employees WHERE first_name LIKE 'J%'; -- 以J开头
SELECT * FROM employees WHERE first_name LIKE '%n'; -- 以n结尾
SELECT * FROM employees WHERE first_name LIKE '%oh%'; -- 包含oh

-- 定义:_匹配单个字符
SELECT * FROM employees WHERE first_name LIKE 'J_'; -- J开头,两个字符
SELECT * FROM employees WHERE first_name LIKE 'J__'; -- J开头,三个字符

NULL值处理定义

-- 定义:IS NULL检查空值
SELECT * FROM employees WHERE commission_pct IS NULL;

-- 定义:IS NOT NULL检查非空值
SELECT * FROM employees WHERE commission_pct IS NOT NULL;

-- 定义:COALESCE函数处理空值,返回第一个非空值
SELECT
first_name,
COALESCE(commission_pct, 0) AS commission -- 如果commission_pct为NULL则返回0
FROM employees;

三. JOIN连接查询

定义
JOIN用于根据两个或多个表之间的相关列合并行。用于从多个表中检索数据。

INNER JOIN定义
-- 定义:内连接返回两个表中匹配的行
SELECT
e.first_name,
e.last_name,
d.department_name
FROM employees e -- e是employees表的别名
INNER JOIN departments d ON e.department_id = d.department_id; -- 连接条件

解释:只返回employees和departments表中department_id匹配的记录。

LEFT JOIN定义

-- 定义:左连接返回左表所有记录和右表匹配的记录
SELECT
e.first_name,
d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

解释:返回所有员工记录,即使某些员工没有分配部门(department_name为NULL)。

RIGHT JOIN定义

- 定义:右连接返回右表所有记录和左表匹配的记录
SELECT
e.first_name,
d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

解释:返回所有部门记录,即使某些部门没有员工(first_name为NULL)。

自连接定义

-- 定义:表与自身连接,用于查询层次结构数据
SELECT
e1.first_name AS '员工姓名',
e2.first_name AS '经理姓名'
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;

解释:通过manager_id字段将员工表与自身连接,查找每个员工的经理。

四. 聚合函数与分组

聚合函数定义
聚合函数对一组值执行计算并返回单个值。

-- 定义:COUNT计算行数
SELECT COUNT(*) AS total_employees FROM employees; -- 总员工数
SELECT COUNT(DISTINCT department_id) AS unique_departments FROM employees; -- 不重复部门数

-- 定义:SUM计算总和
SELECT SUM(salary) AS total_salary FROM employees; -- 工资总额

-- 定义:AVG计算平均值
SELECT AVG(salary) AS average_salary FROM employees; -- 平均工资

-- 定义:MAX/MIN找最大最小值
SELECT MAX(salary) AS max_salary FROM employees; -- 最高工资
SELECT MIN(salary) AS min_salary FROM employees; -- 最低工资

GROUP BY定义

-- 定义:按部门分组统计
SELECT
department_id,
COUNT(*) AS employee_count, -- 每个部门的员工数
AVG(salary) AS avg_salary -- 每个部门的平均工资
FROM employees
GROUP BY department_id; -- 按department_id分组

解释:将员工按部门分组,然后对每个组计算统计值。

HAVING定义

-- 定义:HAVING对分组后的结果进行筛选
SELECT
department_id,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000; -- 只显示平均工资>5000的部门

解释:WHERE在分组前过滤行,HAVING在分组后过滤组。

五. 子查询

定义
子查询是嵌套在其他SQL查询中的查询。
标量子查询定义

-- 定义:返回单个值的子查询
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees); -- 子查询返回平均工资

解释:子查询`(SELECT AVG(salary) FROM employees)`返回一个值(平均工资),主查询使用这个值进行比较。

列子查询定义

-- 定义:返回一列值的子查询,通常与IN一起使用
SELECT * FROM employees
WHERE department_id IN (
SELECT department_id FROM departments
WHERE location_id = 1700 -- 子查询返回特定位置的部门ID列表
);

解释:子查询返回一个部门ID列表,主查询检查员工的部门ID是否在这个列表中。

EXISTS子查询定义

-- 定义:检查子查询是否返回任何行
SELECT * FROM departments d
WHERE EXISTS (
SELECT 1 FROM employees e
WHERE e.department_id = d.department_id -- 关联子查询
);

解释:对于每个部门,检查是否存在属于该部门的员工。EXISTS返回布尔值。

关键概念总结

1. **SELECT**:数据检索的核心命令
2. **WHERE**:行级过滤条件
3. **JOIN**:多表数据关联
4. **GROUP BY**:数据分组聚合
5. **HAVING**:分组结果过滤
6. **子查询**:查询嵌套,解决复杂问题
7. **索引**:提高查询性能的数据结构

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进