欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > DQL(数据查询语言) 的详细技术说明

DQL(数据查询语言) 的详细技术说明

2025/10/18 15:35:06 来源:https://blog.csdn.net/weixin_51288065/article/details/148701125  浏览:    关键词:DQL(数据查询语言) 的详细技术说明

以下是 DQL(数据查询语言) 的详细技术说明,涵盖语法结构、核心子句及高级功能:


🔍 DQL 核心:SELECT 语句结构

SELECT [DISTINCT]1,2, 聚合函数()  
FROM 表名  
[JOIN 关联表 ON 条件]  
[WHERE 过滤条件]  
[GROUP BY 分组列]  
[HAVING 分组后过滤]  
[ORDER BY 排序列 [ASC|DESC]]  
[LIMIT 行数]  
[OFFSET 起始位置];

📌 1. 基础查询

操作语法示例说明
查询所有列SELECT * FROM employees;返回表中全部字段
查询指定列SELECT name, salary FROM employees;投影特定字段
去重查询SELECT DISTINCT dept_id FROM employees;消除重复值
列别名SELECT name AS 姓名, salary*12 AS 年薪 FROM employees;结果集列重命名

⚙️ 2. 条件过滤 (WHERE)

条件类型运算符示例说明
比较运算salary > 10000>, <, >=, <=, =, <>
逻辑运算age >= 25 AND salary < 20000AND, OR, NOT
模糊匹配name LIKE '张%'% (任意字符), _ (单字符)
范围匹配id IN (101, 102, 105)IN, BETWEEN 1000 AND 5000
空值判断email IS NULLIS NULL, IS NOT NULL

📊 3. 数据分组 (GROUP BY)

操作语法示例说明
单列分组SELECT dept_id, AVG(salary) FROM employees GROUP BY dept_id;按部门计算平均薪资
多列分组SELECT dept_id, job_role, COUNT(*) FROM employees GROUP BY dept_id, job_role;多维度统计
常用聚合函数COUNT(), SUM(), AVG(), MAX(), MIN()需配合 GROUP BY 使用

🎯 4. 分组后过滤 (HAVING)

-- 筛选平均薪资>8000的部门  
SELECT dept_id, AVG(salary)  
FROM employees  
GROUP BY dept_id  
HAVING AVG(salary) > 8000;  

⚠️ WHERE 区别

  • WHERE 在分组过滤原始数据
  • HAVING 在分组过滤聚合结果

🔗 5. 表连接 (JOIN)

连接类型语法示例结果说明
内连接SELECT * FROM orders INNER JOIN customers ON orders.cust_id = customers.id;仅返回匹配成功的行
左外连接SELECT * FROM employees LEFT JOIN departments ON employees.dept_id = departments.id;左表全保留 + 右表匹配值
右外连接SELECT * FROM departments RIGHT JOIN employees ON departments.id = employees.dept_id;右表全保留 + 左表匹配值
全外连接SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.key = tableB.key;返回所有行(MySQL 通过 UNION 模拟)
交叉连接SELECT * FROM colors CROSS JOIN sizes;笛卡尔积(所有组合)

🔁 6. 子查询 (Subquery)

类型语法示例说明
标量子查询SELECT name, (SELECT MAX(salary) FROM employees) AS max_sal FROM employees;返回单行单列值(可替代常量)
行子查询SELECT * FROM orders WHERE (cust_id, amount) IN (SELECT cust_id, MAX(amount) FROM orders GROUP BY cust_id);返回单行多列
关联子查询SELECT name, salary FROM employees e1 WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.dept_id = e1.dept_id);引用外部查询变量
EXISTS 子查询SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.cust_id = c.id);检查是否存在相关记录

📈 7. 高级功能

排序 (ORDER BY)
SELECT name, salary  
FROM employees  
ORDER BY salary DESC, name ASC;  -- 先按薪资降序,再按姓名升序
分页 (LIMIT/OFFSET)
SELECT * FROM products  
ORDER BY price DESC  
LIMIT 10 OFFSET 20;  -- 跳过前20条,取10条(第21-30条)
窗口函数 (Window Functions)
SELECT name, department,salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank  -- 部门内薪资排名
FROM employees;
公共表表达式 (CTE)
WITH high_salary_emps AS (SELECT * FROM employees WHERE salary > 10000
)
SELECT dept_id, COUNT(*) FROM high_salary_emps GROUP BY dept_id;

🧩 8. 组合查询 (UNION)

-- 合并两个查询结果(自动去重)
SELECT city FROM customers
UNION  
SELECT city FROM suppliers;-- 保留重复记录
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;

⚠️ 关键注意事项

  1. 执行顺序
    FROM
    JOIN
    WHERE
    GROUP BY
    HAVING
    SELECT
    ORDER BY
    LIMIT
  2. 别名使用
    • SELECT 中定义的别名不能在 WHERE 中使用
    • 可在 ORDER BYHAVING 中使用
  3. NULL 处理
    • 聚合函数忽略 NULL 值(COUNT(列) 不计数 NULL)
    • 条件 WHERE col = NULL 无效 → 需用 IS NULL

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词