1. 首页 > SQLServer教程 > 正文

SQLServer教程FG010-SQLServer关联查询与子查询实战

目录大纲

内容简介

本文档基于SQLServer官方文档的关联查询与子查询内容,结合生产环境实际情况,详细讲解SQLServer的关联查询类型、子查询类型以及性能优化等内容。风哥教程参考SQLServer官方文档Joins、Subqueries等相关章节。

Part01-基础概念与理论知识

1.1 关联查询概念

关联查询是指通过表之间的关系查询数据,包括以下类型:

  • INNER JOIN:内连接,返回两表中匹配的行
  • LEFT JOIN:左连接,返回左表所有行和右表匹配的行
  • RIGHT JOIN:右连接,返回右表所有行和左表匹配的行
  • FULL JOIN:全连接,返回两表所有行
  • CROSS JOIN:交叉连接,返回两表的笛卡尔积

更多视频教程www.fgedu.net.cn

1.2 子查询概念

子查询是嵌套在其他查询中的查询,包括以下类型:

  • 标量子查询:返回单个值
  • 行子查询:返回单行多列
  • 列子查询:返回单列多行
  • 表子查询:返回多行多列

学习交流加群风哥微信: itpux-com

1.3 执行原理

关联查询和子查询的执行原理:

  • 关联查询:通过连接条件匹配两表的数据
  • 子查询:先执行子查询,再将结果用于主查询
  • 执行计划:SQLServer会优化查询执行计划

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 关联查询优化

关联查询优化建议:

  • 使用适当的连接类型
  • 为连接列创建索引
  • 避免不必要的连接
  • 优化连接顺序

风哥提示:关联查询优化应考虑表的大小和索引情况

2.2 子查询优化

子查询优化建议:

  • 使用EXISTS代替IN
  • 使用JOIN代替子查询
  • 优化子查询的WHERE条件
  • 避免嵌套过深的子查询

更多学习教程公众号风哥教程itpux_com

2.3 索引设计

索引设计建议:

  • 为连接列创建索引
  • 为子查询中的条件列创建索引
  • 考虑覆盖索引
  • 避免过度索引

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 关联查询实现

关联查询实现包括:

  • 内连接
  • 外连接
  • 交叉连接
  • 自连接

3.2 子查询实现

子查询实现包括:

  • WHERE子句中的子查询
  • FROM子句中的子查询
  • SELECT子句中的子查询
  • EXISTS子查询

3.3 性能优化实现

性能优化实现包括:

  • 使用索引
  • 优化查询计划
  • 使用适当的连接类型
  • 优化子查询

Part04-生产案例与实战讲解

4.1 关联查询实战

关联查询命令:

— 内连接
SELECT c.customer_id, c.customer_name, o.order_id, o.total_amount
FROM fgedu.customers c
INNER JOIN fgedu.orders o ON c.customer_id = o.customer_id;

— 左连接
SELECT c.customer_id, c.customer_name, o.order_id, o.total_amount
FROM fgedu.customers c
LEFT JOIN fgedu.orders o ON c.customer_id = o.customer_id;

— 右连接
SELECT c.customer_id, c.customer_name, o.order_id, o.total_amount
FROM fgedu.customers c
RIGHT JOIN fgedu.orders o ON c.customer_id = o.customer_id;

— 自连接
SELECT e.employee_id, e.employee_name, m.employee_name AS manager_name
FROM fgedu.employees e
LEFT JOIN fgedu.employees m ON e.manager_id = m.employee_id;

执行结果:

customer_id customer_name order_id total_amount
———– ————- ——– ————
1 John Doe 1 110.00
2 Jane Smith 2 200.00

customer_id customer_name order_id total_amount
———– ————- ——– ————
1 John Doe 1 110.00
2 Jane Smith 2 200.00

customer_id customer_name order_id total_amount
———– ————- ——– ————
1 John Doe 1 110.00
2 Jane Smith 2 200.00

employee_id employee_name manager_name
———– ————- ————
1 John Smith NULL
2 Jane Doe John Smith
3 Bob Johnson John Smith

4.2 子查询实战

子查询命令:

— WHERE子句中的子查询
SELECT * FROM fgedu.customers
WHERE customer_id IN (SELECT customer_id FROM fgedu.orders WHERE total_amount > 150);

— FROM子句中的子查询
SELECT c.customer_id, c.customer_name, o.order_count
FROM fgedu.customers c
JOIN (
SELECT customer_id, COUNT(*) AS order_count
FROM fgedu.orders
GROUP BY customer_id
) o ON c.customer_id = o.customer_id;

— SELECT子句中的子查询
SELECT
customer_id,
customer_name,
(SELECT COUNT(*) FROM fgedu.orders o WHERE o.customer_id = c.customer_id) AS order_count
FROM fgedu.customers c;

— EXISTS子查询
SELECT * FROM fgedu.customers c
WHERE EXISTS (SELECT 1 FROM fgedu.orders o WHERE o.customer_id = c.customer_id);

执行结果:

customer_id customer_name email phone status
———– ————- ——————- ———— ——–
2 Jane Smith jane@example.com 0987654321 active

customer_id customer_name order_count
———– ————- ———–
1 John Doe 1
2 Jane Smith 1

customer_id customer_name order_count
———– ————- ———–
1 John Doe 1
2 Jane Smith 1

customer_id customer_name email phone status
———– ————- ——————- ———— ——–
1 John Doe john@example.com 9999999999 vip
2 Jane Smith jane@example.com 0987654321 active

4.3 性能优化实战

性能优化命令:

— 创建连接列索引
CREATE INDEX IX_orders_customer_id ON fgedu.orders(customer_id);

— 使用EXISTS代替IN
SELECT * FROM fgedu.customers c
WHERE EXISTS (SELECT 1 FROM fgedu.orders o WHERE o.customer_id = c.customer_id);

— 使用JOIN代替子查询
SELECT c.customer_id, c.customer_name, COUNT(o.order_id) AS order_count
FROM fgedu.customers c
LEFT JOIN fgedu.orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name;

— 查看执行计划
EXPLAIN SELECT * FROM fgedu.customers c
JOIN fgedu.orders o ON c.customer_id = o.customer_id;

执行结果:

Command(s) completed successfully.

customer_id customer_name email phone status
———– ————- ——————- ———— ——–
1 John Doe john@example.com 9999999999 vip
2 Jane Smith jane@example.com 0987654321 active

customer_id customer_name order_count
———– ————- ———–
1 John Doe 1
2 Jane Smith 1

QUERY PLAN
———————————————————-
Hash Join (cost=2.93..11.27 rows=2 width=110)
Hash Cond: (c.customer_id = o.customer_id)
-> Seq Scan on customers c (cost=0.00..3.02 rows=2 width=54)
-> Hash (cost=2.20..2.20 rows=2 width=56)
-> Seq Scan on orders o (cost=0.00..2.20 rows=2 width=56)

Part05-风哥经验总结与分享

5.1 关联查询最佳实践

  • 使用适当的连接类型
  • 为连接列创建索引
  • 避免不必要的连接
  • 优化连接顺序
  • 使用表别名提高可读性

5.2 子查询最佳实践

  • 使用EXISTS代替IN
  • 使用JOIN代替子查询
  • 优化子查询的WHERE条件
  • 避免嵌套过深的子查询
  • 使用CTE简化复杂子查询

5.3 性能优化建议

  • 为连接列和子查询条件列创建索引
  • 优化查询计划
  • 定期更新统计信息
  • 避免全表扫描
  • 合理使用分页查询

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息