关于数据库中使用 left join on ...and ...和 left join on ....where ...区别,和使用group by 要注意的情...

SQL左连接与分组技巧
本文探讨了SQL中LEFT JOIN的不同用法,包括ON...AND...与ON...WHERE...的区别,并通过具体案例展示了如何正确使用这些语法。此外,还讨论了GROUP BY的使用注意事项及其与HAVING子句的配合。
关于数据库中使用 left join on ...and ...和 left join on ....where ...区别,和使用group by 要注意的情况

create table UserAccount
(
UID int,
UName varchar(50),
JoinDate datetime
)


insert into UserAccount values(1,'Jimmy','2006-10-3')
insert into UserAccount values(2,'Jack','2006-10-25')
insert into UserAccount values(3,'Mike','2006-11-13')
insert into UserAccount values(4,'Tom','2006-9-5')


create table ChargeHistory(UId int,ChargeDate datetime,Amount int)

insert into ChargeHistory values(1,'2007-3-1',50)
insert into ChargeHistory values(1,'2007-2-15', 30)
insert into ChargeHistory values(2,'2007-2-1' ,40)
insert into ChargeHistory values(3,'2007-1-15' ,60)
insert into ChargeHistory values(2,'2007-1-15' ,50)
insert into ChargeHistory values(3,'2007-1-1' ,100)
insert into ChargeHistory values(1,'2006-12-20' ,60)


select * from UserAccount
select * from ChargeHistory

1
Jimmy 2006-10-03 00:00:00.000 2
Jack 2006-10-25 00:00:00.000 3
Mike 2006-11-13 00:00:00.000 4
Tom 2006-09-05 00:00:00.000

1
2007-03-01 00:00:00.000 50 1
2007-02-15 00:00:00.000 30 2
2007-02-01 00:00:00.000 40 3
2007-01-15 00:00:00.000 60 2
2007-01-15 00:00:00.000 50 3
2007-01-01 00:00:00.000 100 1
2006-12-20 00:00:00.000 60





假设有一个游戏帐户充值网站

系统内有两个表

UserAccount

UID
UName
JoinDate

1
Jimmy
2006-10-3

2
Jack
2006-10-25

3
Mike
2006-11-13

4
Tom
2006-9-5





ChargeHistory

UId
ChargeDate
Amount

1
2007-3-1
50

1
2007-2-15
30

2
2007-2-1
40

3
2007-1-15
60

2
2007-1-15
50

3
2007-1-1
100

1
2006-12-20
60







1. 建表并填充数据

2. 完成如下操作:

A. 查询用户名为mike的充值记录,包含如下列

UName,UId,JoinDate,ChargeDate,Amount

B. 查询用户Id为1共充值多少金额.包含

UName,UId,JoinDate,Amount

C. 统计每个用户的充值总额,结果如下

UId
UName
Amount
JoinDate

1
Jimmy
140
2006-10-3

2
Jack
90
2006-10-25

3
Mike
160
2006-11-13

4
Tom
Null
2006-9-5







select A.UID,A.UName,A.JoinDate,B.ChargeDate,B.Amount from UserAccount A
left join ChargeHistory B on A.UID=B.UID and a.uname='mike' 这里的结果是:不是我们想要的结果因为:

--通过以下结果我们可以看出:左连接是left join 嘛,无非是左边表为基础, 扫描右边表匹配的记录
--按条件 a.uname='mike', 来扫描右边表的记录
--对于右边表的每条记录, 显然 a.uname='mike' 这个条件都是成立.


Jimmy 2006-10-03 00:00:00.000 NULL NULL 2
Jack 2006-10-25 00:00:00.000 NULL NULL 3
Mike 2006-11-13 00:00:00.000 2007-01-15 00:00:00.000 60 3
Mike 2006-11-13 00:00:00.000 2007-01-01 00:00:00.000 100 4
Tom 2006-09-05 00:00:00.000 NULL NULL







select A.UID,A.UName,A.JoinDate,B.ChargeDate,B.Amount from UserAccount A
left join ChargeHistory B on A.UID=B.UID where A.UNAME='Mike'所以这里要使用where .where是left join 后筛选结果.

结果:

Mike 2006-11-13 00:00:00.000 2007-01-15 00:00:00.000 60 3
Mike 2006-11-13 00:00:00.000 2007-01-01 00:00:00.000 100 4

--但是inner join 是选择符合条件的数据出来
select A.UID,A.UName,A.JoinDate,B.ChargeDate,B.Amount from UserAccount A
inner join ChargeHistory B on A.UID=B.UID and a.uname='mike'

--group by 的操作:
--有函数存在 :sum,count,min,avg,max
--slecect多少个字段,group by 多少个字段
select A.UID,A.UName,A.JoinDate,sum(B.amount) from UserAccount A left join ChargeHistory B ON A.uID=B.UID WHERE A.UID=1
group by a.uid,A.UName,A.JoinDate



--这里还要注意 having的用法:是用来在group by 后再筛选数据的
select A.UID,A.UName,A.JoinDate,sum(B.amount) from UserAccount A left join ChargeHistory B ON A.uID=B.UID
group by a.uid,A.UName,A.JoinDate
having A.UID=1





转于:http://www.cnblogs.com/tinachang021/archive/2008/09/25/1298949.html
<think>好的,我需要回答用户关于SQL Server中JOIN ON语法的问题,包括作用、使用场景示例。首先,我得回顾一下JOIN的基本概念,然后整理不同类型JOIN区别,比如INNER JOINLEFT JOIN等。用户提供的引用中有提到LEFT JOIN的语法示例,可以引用那个例子。同时,引用4提到了ON条件后接ANDWHERE区别,这部分也需要解释清楚。 首先,JOIN ON的主要作用是根据两个表的共同列连接数据。需要说明它用于关联表,形成临时结果集。使用场景包括需要从多个表组合数据的查询,比如订单客户信息关联。然后,要给出每种JOIN类型的示例,特别是用户提到的LEFT JOIN,并且用代码块展示。 接下来,要注意用户提供的引用内容,比如引用2中的LEFT JOIN示例,需要正确引用并标注[^2]。同时,关于ONWHERE区别,引用4提到过,这部分需要详细说明,比如ON是连接条件,WHERE是过滤结果集。 还要检查是否需要遵守系统级指令,比如数学表达式用$...$,但这个问题可能不涉及数学公式,所以可能不需要。但需要确保中文回答,结构清晰,分点说明。最后生成相关问题,可能涉及其他JOIN类型、性能优化、实际应用案例等。 现在需要组织内容,确保每个部分都涵盖,并正确引用提供的资料。可能的结构是: 1. 作用:关联表,组合数据 2. 使用场景:多表查询,统计分析,数据整合 3. 语法示例:不同JOIN类型的例子,特别是LEFT JOIN 4. ONWHERE区别:引用4的解释 5. 其他注意事项:索引优化,性能影响(引用3提到ALTER INDEX,可能相关) 最后生成相关问题,比如不同JOIN区别,优化方法,实际案例等。</think>### SQL Server中JOIN ON语法详解 #### 一、作用 `JOIN ON` 是 SQL Server 中用于**关联多个表**的关键语法,通过指定连接条件将不同表中的行组合成临时结果集。其核心作用包括: - **数据关联**:基于共同列(如外键)将多个表的数据横向拼接。 - **结果筛选**:通过 `ON` 后的条件过滤有效关联数据[^4]。 #### 二、使用场景 1. **多表数据查询**:例如查询订单表时关联客户表以获取客户姓名。 2. **统计分析**:如统计每个部门的销售额时需要连接部门表销售表。 3. **数据整合**:将分散在不同表中的信息合并为完整视图(如商品信息+库存信息)。 #### 三、语法示例 ##### 1. 基础语法 ```sql SELECT 列名 FROM 表1 [INNER/LEFT/RIGHT/FULL] JOIN 表2 ON 表1.共同列 = 表2.共同列; ``` ##### 2. 不同JOIN类型示例 - **INNER JOIN**(默认):仅返回匹配的行。 ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` - **LEFT JOIN**:返回左表所有行,右表无匹配时填充`NULL`。 ```sql SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.CommonColumn = 表2.CommonColumn; ``` - **RIGHT JOIN**:与LEFT JOIN相反,返回右表所有行。 - **FULL JOIN**:返回左右表全部行,无匹配时填充`NULL`。 #### 四、`ON`与`WHERE`的区别 - **ON**:定义表连接时的匹配条件,影响关联过程。 - **WHERE**:在连接完成后过滤结果集。 例如,以下查询会保留左表所有行,但仅筛选右表满足条件的匹配: ```sql SELECT * FROM 表A LEFT JOIN 表B ON 表A.ID = 表B.ID AND 表B.Status = 'Active' -- ON中定义连接部分过滤 WHERE 表A.Amount > 100; -- WHERE过滤最终结果 ``` #### 五、性能注意事项 1. **索引优化**:确保连接列(如`CustomerID`)已建立索引,可加速关联过程[^3]。 2. **避免过多JOIN**:超过3个表的连接可能影响性能,需评估是否需要冗余字段或临时表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值