不可以,日期不对
这个具体得看执行计划,join两表的连接条件有索引的话,数据库会根据连接条件获取满足条件的数据,并进行相应的优化,一般来说数据量小的话,走不走索引影响不大,数据量达到一定级别且连接条件的字段有索引,数据库就会走索引
left join即left outer join是左连接,若有A\B两张表,意思是查询出A表的全部数据和与之对应的B表数据,B表中没有的数据就用null代替;而right outer join是右连接,意思是查询出B表的全部数据和与之对应的A表数据。怎么会划等号?查出的数据都不一样的
关联查询
是三个表,第三个标的的目的是要算出max(kills)
加了where b.user_id = c.user_id这个条件,max(c.kills)是可变的(会求出3个userid的各个的最大值,然后去外面卡where条件),不加,这个值是固定的(是这些userid里最大的一个值,无意义)。
where b.kills = (select max(c.kills) from user_kills as c where b.user_id = c.user_id);可以这么理解:括号外的where b.user_id依次取数,但是只要满足括号内where b.user_id = c.user_id,即把同类ID最大的kills返回,相当于有一个分组条件;若不加上的话,只返回kills中最大的值,这个值是唯一的
c是user_kills的别名(user_kills有两个别名),max是用来求最大值的函数
是user_kills表的kills字段
实际就是两条数据
(user1 a
join user_kills b on a.id = b.user_id
join user_kills c on c.user_id = b.user_id
group by a.user_name , b.timestr , b.kills
having b.kills = MAX(c.kills))相当于虚拟了一个表,
然后(select a.user_name , b.timestr , b.kills from )是从这个虚拟表中挑选的。
对于上面的虚拟表 先用两个join把三个表关联起来,group是对这个虚拟表的数据的排序,having 字句是减小范围用的。
各位,现提供该课程建库建表脚本代码共享如下。
-- 注意自己是否需要建库 -- create database if not exists mysqldv1; -- 新建 user1 表 create table if not exists user1 ( id smallint unsigned primary key auto_increment, user_name varchar(40), over varchar(40) ); -- 新建 user2 表 create table if not exists user2 ( id smallint unsigned primary key auto_increment, user_name varchar(40), over varchar(40) ); -- 新建 user_kills 表 create table if not exists user_kills ( id smallint unsigned primary key auto_increment, user_id smallint unsigned, timestr timestamp default CURRENT_TIMESTAMP, kills smallint unsigned ); -- 插入 user1 表数据 insert into user1(user_name,over) values ('唐僧', '旃檀功德佛'); insert into user1(user_name,over) values ('猪八戒', '净坛使者'); insert into user1(user_name,over) values ('孙悟空', '斗战胜佛'); insert into user1(user_name,over) values ('沙僧', '金身罗汉'); -- 插入 user2 表数据 insert into user2(user_name,over) values ('孙悟空', '成佛'); insert into user2(user_name,over) values ('牛魔王', '被降服'); insert into user2(user_name,over) values ('蛟魔王', '被降服'); insert into user2(user_name,over) values ('鹏魔王', '被降服'); insert into user2(user_name,over) values ('狮驼王', '被降服'); -- 插入 user_kills 表数据 insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-01-10'), 10); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-01'), 2); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-05'), 12); insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-01-10'), 3); insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-02-11'), 5); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-06'), 1); insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-01-11'), 20); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-12'), 10); insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-02-07'), 17);
加粗部分是分别查出杀怪最大的数并赋给where条件查询相应的name 和 data
他使用条件查询出来数据,再使用聚合函数与查询数据交叉查询出最大数据。
c表查询的是最大的打怪数量,不一样,b表示整个第二张表,c查出来的结果是猪八戒
因为数据比较少,同一时间段3个人没有同时打怪
c 是select MAX(c.kill) from user_kills c where c.user_id = b.user_id 这部分sql语句的,使用c是因为多张表关联查询或者是有子查询的时候使用别名便于区分
对啊,这样做其实就行了