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 还是right join 的时候 on 后面的只允许是两个表中的关联字段,多个的话使用and连接,如果你写了某一个表的条件在里面,就像上面的例子,其实a.uname='mike'是不起作用的。所以在使用left join 和right join的时候需要注意,如果不是两个表的关联字段都需要写在where语句的后面。
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
分享到:
相关推荐
left_join_on_and与left_join_on_where的区别
6. ON与WHERE的区别:在JOIN操作中,ON子句用于指定连接条件,而WHERE子句用于过滤结果集。ON子句的条件应用于确定哪些记录应该组合在一起,而WHERE子句的条件则应用于已经组合后的结果集。换句话说,ON是在连接之前...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.d2 WHERE condition1 [AND conditionN]; ``` 若 `conditionK` 涉及到右表 `t2` 的列,并且不是 `t2.column IS NULL` 类型的条件,那么可以优化为 Inner Join: ```sql ...
Mysql 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...
LEFT JOIN TABLE_PARAMS b ON a.TBL_ID = b.TBL_ID AND b.PARAM_KEY = 'bucketing_version' LEFT JOIN DBS c ON a.DB_ID = c.DB_ID WHERE b.TBL_ID IS NULL AND c.NAME = 'dw'; ``` 2. **优化TEZ参数配置**: ...
当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...
### SQL语句JOIN中ON和WHERE的区别 #### 引言 在SQL中,JOIN操作用于合并两个或多个表中的行。正确理解`ON`和`WHERE`子句的区别对于高效地编写查询至关重要。本文将详细解释这两者的不同,并通过具体的例子来加深...
现在,让我们来探讨`LEFT JOIN`与`WHERE`关键字的区别。`WHERE`子句通常用于在单个表格中过滤记录,而不是连接多个表格。在JOIN操作中,`WHERE`子句通常用于在连接后进一步限制结果集,它作用于整个结果集,而不仅仅...
Dim leftJoin = (From l In leftTable _ Join r In rightTable On l.Key Equals r.Key Into gj = Group _ From r In gj.DefaultIfEmpty() Select New With {l.Key, l.Value, r.Key, r.Value}) Dim rightJoin = ...
SELECT * FROM t_institution i LEFT OUTER JOIN t_teller t ON i.inst_no = t.inst_no WHERE i.inst_no = "5801" 右外连接(Right Outer Join) 右外连接是将右边表的全部行与左边表中的匹配行连接起来,例如: ...
2. SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size AND tab2.name='AAA') 在这个查询中,ON条件同时考虑了tab1.size = tab2.size和tab2.name='AAA',因此在生成中间表时就已经过滤了一部分记录。...
在SQL语言中,`LEFT JOIN` 和 `COUNT` 是两种非常重要的操作,它们在数据库查询中扮演着关键角色。在这个问题中,我们看到一个数据表 `TPL_WORD1`,它包含字段 `Wordid`(主键)、`idFuid`(上一级节点ID)和 `Name`...
总结一下,`ON` 和 `WHERE` 在 `LEFT JOIN` 中的主要区别在于: 1. `ON` 用于在生成临时表时定义连接条件,无论条件是否满足,都会返回左表的所有行。 2. `WHERE` 在临时表生成后进行过滤,如果它包含了连接条件,...
在使用LEFT JOIN和RIGHT JOIN时,条件筛选可以使用ON和WHERE子句。它们之间的差异是很多人容易混淆的地方。ON子句是在连接操作中对连接条件进行指定,而WHERE子句通常用于对结果集进行过滤。由于这两者在查询的逻辑...
这意味着在LEFT JOIN中,WHERE子句的条件会减少最终结果中的行数,而在INNER JOIN中,WHERE子句的条件与ON子句的效果相同,因为它们都在连接时应用。 在性能方面,虽然SQL语句6和7的逻辑效果相同,但它们的执行计划...
总结一下,Left Join中on与where的关键区别在于: 1. on的执行顺序在join之前,它决定了哪些记录会参与连接操作。 2. where的执行顺序在join之后,它决定了哪些记录会被最终展示在结果集中。 3. on用于指定连接条件...