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的区别
Join on/inner join on/full join on/full outer join on/left join on/right join on/cross join on; 在使用jion时,on和where条件的区别;
left join 过滤条件写在on后面和写在where 后面的区别
本篇文章是对Oracle的left join中on和where的区别进行了详细的分析介绍,需要的朋友参考下
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1....
优先级 ...在left join下,两者的区别: on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。 where则是在生成临时表之后使用的条件,此时已经不管是否使
ON 子句与 WHERE 子句的不同 一种更好地理解带有 WHERE … IS NULL 子句的复杂匹配条件的简单方法 Matching-Conditions 与 Where-conditions 的不同 关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(...
NOT IN、JOIN、IS NULL、NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B on A.a = B.a where B.a is null 语句三:select ...
我们在写SQL时候,往往会需要格式化或多表联合查询,现在来一个实例看看这个问题 SELECT t.id, t.topic_...LEFT JOIN student_commit_history sch on t.id = sch.topic_id where sch.student_id =41 AND sch.create_t
update a set a.up_end=up*@zk/100,a.dis_cnt=@zk,a.amtn=up*@zk/100*qty,a.amt=up*@zk/100*qty, a.tax=0 from tf_pos a left join tf_pos_z b on a.os_no=b.os_no where a.os_no=@os_no and a.itm=@itm ...
table a(id, type):id type ———————————-1 1 2 1 3 2 table b(id, class):id class ———————————1 12 2sql语句1:select a.*, b.* from a left join b on a.id = b.id and a.type = ...
主要介绍了mysql中left join设置条件在on与where时的用法区别,结合实例形式分析了mysql中left join设置条件在on与where时的相关用法区别与操作注意事项,需要的朋友可以参考下
表名1 LEFT| RIGHT JOIN 表名2 USING (列名) [WHERE 条件表达式] ; 【例】 查找Members表中所有订购过图书的会员的姓名。 SELECT Distinct 姓名 FROM Members JOIN Sell USING (用户号); 与下列语句等价: SELECT ...
本篇文章是对mysql left( right )join使用on与where筛选的差异进行了详细的分析介绍,需要的朋友参考下
left join seorder as t4 on t4.finterid=t3.forderinterid where isnull(t4.fbillno,'no')<>'no' and t2.finterid=@finterid240 return end --控制委外加工生产任务单领料日期不对小于计划开工日期 if (@...
代码如下:select a.f_username from ( SELECT /*+parallel(gu,4)*/distinct gu.f_username FROM t_base_...playid=4 and gu.f_paymoney>=1500 ) A left join ( select from t_base_vip_customes and ((vu.f_passeddate