SQL查询技巧全 Strategy Guide

连接查询的步骤

1.确认要查询数据的表

2.取笛卡尔积

3.确认表与表之间的连接条件

4.确认查询的字段条件

5.精删查询字段

聚合查询

聚合查询是 一种对数据库 行与行之间 的 操作

聚合函数

COUNT

统计行数或非空值数量

-- 统计表中所有行数
SELECT COUNT(*) FROM employees;

-- 统计特定列非NULL值的数量
SELECT COUNT(department) FROM employees;

SUM

计算数值列的总和

-- 计算工资总和
SELECT SUM(salary) FROM employees;

-- 带条件的求和
SELECT SUM(salary) FROM employees WHERE department = 'Sales';

AVG

计算数值列的平均值

-- 计算平均工资
SELECT AVG(salary) FROM employees;

-- 保留两位小数
SELECT ROUND(AVG(salary), 2) FROM employees;

MAX/MIN

获取列中的最大/最小值

-- 获取最高工资
SELECT MAX(salary) FROM employees;

-- 获取最低工资
SELECT MIN(salary) FROM employees WHERE hire_date > '2020-01-01';

分组查询

GROUP BY

指定分组字段

HAVING子句

对聚合结果进行过滤(类似 WHERE, 但用于聚合后)。

查询公司内收入大于5000的员工

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;

合并查询

SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;

  • UNION :自动去重。
  • UNION ALL :保留所有行,包括重复项,性能更高。

连接查询

内连接(INNER JOIN)

SELECT A.column1, B.column2
FROM tableA A(别名)
(INNER) JOIN tableB B(别名)ON A.key = B.key;

多表连接

SELECT A.column1 , B.column2, C.column3 (x.xx 选中表中对应的数据 ,避免数据的二重性)
FROM tableA A
JOIN tableB B ON A.key1 = B.key1
JOIN tableC C ON B.key2 = C.key2;

外连接(FULL JOIN)

左连接(LEFT JOIN) & 右连接(RIGHT JOIN)

如果是联合查询时

完全显示左表那就是左连接(

左连接 返回左表中的所有记录,无论右表中是否有匹配的记录。

如果 右表 中没有匹配的记录,结果中右表 的字段将显示为NULL。

)

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

完全显示右表那就是右连接(右侧同理)

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

自连接(SELF JOIN)

SELECT a.column1, b.column2
FROM 表名 as a, 表名 as b
WHERE a.字段 = b.字段;

SELECT a.column1, b.column2
FROM 表名 as a
JOIN 表名 as b ON a.字段 = b.字段;

子查询(嵌套查询)

-- 子查询方式
SELECT nameFROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY');

-- JOIN方式
SELECT e.name FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY';

相关子查询:子查询依赖主查询的每一行数据

WHERE EXISTS (SELECT 1 FROM departments WHERE departments.id = employees.department_id))。

非相关子查询:子查询独立执行,不依赖主查询

WHERE salary > (SELECT AVG(salary) FROM employees))。

EXISTS/NOT EXISTS子查询

复制代码
SELECT name FROM departments d 
WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.id);

EXISTS 后的查询语句

如果存在返回结果 则就执行外层查询,如果返回为一个空结果集 则不执行查询

(相当于if条件语句 有结果存在返回 true 没有则返回结果false)

一条SQL语句各部分的执行顺序

select distinct id ,name,avg(age)from student join class on student,class_id = class.id where class.id = 1 group by student.id having avg(age) > 0order by student.id asc limit 100;

(不考虑能执行成功)

from -- > join on -- > where -- > group by -- > having -- > select -- > distinct -- > order by -- > limit

相关推荐
EatFan1 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长1 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
jinyishu_1 小时前
向量数据库入门:记录结构、索引、检索与选型
数据库
写后端的胖头鱼5 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
路远的数据库笔记5 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰5 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
kaiyou20266 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
mjhcsp6 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
ShineWinsu6 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
lie..6 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle