只有left join和right join时候,表的顺序不同,对结果有影响,
跟表中的字段没有关系,跟where条件也没有关系。
如果是inner join 表的顺序也不影响结果。
这个是条件
a表、b表就是一个打个比方,假如在数据库中建立了两张表格,一个叫A表、另一个就是B表。就跟讲故事,不知道那两个人名字,但知道他们做了事情,为了方便描述,一般我们会假定这两个人为“张三”、“李四”;不知道我说明白了没;
在本课程中所指A、B表;
A表如下
id user_name
1 孙悟空
2 唐僧
3 猪八戒
4 沙和尚
B表如下
id user_name
1 孙悟空
2 牛魔王
3 蛟魔王
是增加的.
简单还不好啊,真是的,
关联的表在2到3个还可以,如果更多的话会很慢了,可以借助建立索引来优化查询效率,但是一般建议表的关联查询不超过3个。
应该不是。可以测一下。
JOIN 是 inner join 的缩写。
Left join 是left outer join的缩写
1.括号中的子查询连接两张表,很好理解。
2.子查询得到的集合再去连接user_kills表,条件c.id = d.user_id,很好理解。
条件c.kills <= d.kills的作用,使得杀怪最多的天数只出现一次,第二多的天数出现两次,如此类推。
重复出现的次数,其实就等于杀怪数的排名。放两个图,不懂的人结合图细细品一下。
3.GROUP BY c.user_name, c.timestr分组。GROUP BY有去除重复的作用,此时的表:
4.HAVING COUNT(*) <= 2,把重复出现次数小于等于2的保留,也就是杀怪最多的两天。
有人可能会卡在这一步,觉得不好理解。可以结合第二步来看,虽然分组后看不到重复,但是通过函数可以计算出来。
再放个图(没加HAVING COUNT(*) <= 2的时候,而且增加count列,方便理解),还不懂就没救了。
5.ORDER BY c.user_name, c.kills DESC,排序就不用解释了吧。
就是西游记中,人物结局的称号
确定你打出的''是英文输入法的吗?
select 查询出来的结果集默认是无序的
执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。
CREATE TABLE `user1` (
`id` int(11) NOT NULL COMMENT '主键',
`user_name` varchar(255) DEFAULT NULL COMMENT '姓名',
`over` varchar(255) DEFAULT NULL COMMENT '结局',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `blog`.`user1`(`id`, `user_name`, `over`) VALUES (1, '唐僧', '旃檀功德佛');
INSERT INTO `blog`.`user1`(`id`, `user_name`, `over`) VALUES (2, '猪八戒', '净坛使者');
INSERT INTO `blog`.`user1`(`id`, `user_name`, `over`) VALUES (3, '孙悟空', '斗战胜佛');
INSERT INTO `blog`.`user1`(`id`, `user_name`, `over`) VALUES (4, '沙僧', '金身罗汉');
CREATE TABLE `user2` (
`id` int(11) NOT NULL COMMENT '主键',
`user_name` varchar(255) DEFAULT NULL COMMENT '姓名',
`over` varchar(255) DEFAULT NULL COMMENT '结局',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `blog`.`user2`(`id`, `user_name`, `over`) VALUES (1, '孙悟空', '成佛');
INSERT INTO `blog`.`user2`(`id`, `user_name`, `over`) VALUES (2, '牛魔王', '被降服');
INSERT INTO `blog`.`user2`(`id`, `user_name`, `over`) VALUES (3, '蛟魔王', '被降服');
INSERT INTO `blog`.`user2`(`id`, `user_name`, `over`) VALUES (4, '鹏魔王', '被降服');
INSERT INTO `blog`.`user2`(`id`, `user_name`, `over`) VALUES (5, '狮驼王', '被降服');
?怎么上传文件?我想传一个sql文件,传不上来
不可以,日期不对
不能的
这个老师讲的,诉求是求出孙悟空的拜把子兄弟没有去取经的,应该是取右表除孙悟空之外的所有的元素
(left outer join 左外连接) 等同于 (left join 左连接)。
这个具体得看执行计划,join两表的连接条件有索引的话,数据库会根据连接条件获取满足条件的数据,并进行相应的优化,一般来说数据量小的话,走不走索引影响不大,数据量达到一定级别且连接条件的字段有索引,数据库就会走索引
left join即left outer join是左连接,若有A\B两张表,意思是查询出A表的全部数据和与之对应的B表数据,B表中没有的数据就用null代替;而right outer join是右连接,意思是查询出B表的全部数据和与之对应的A表数据。怎么会划等号?查出的数据都不一样的
打怪表在哪
参考这个吧 , 被你这个问题问的我也很懵逼 , 我找了这个文档链接 , 里面也没见到使用 is not null的
https://www.cnblogs.com/logon/p/3748020.html
这个代码老师讲的说不行呀,然后换一个操作
关键是不止4个人啊,另外一张表也有孙悟空。。。
哈哈哈,你问的问题就是答案。他的作用就是获取所有数据在一列上面,然后遍历。假如你想要所有数据,然后不在同一列,你取出来 就要进行数据合并 然后遍历 或者两列分开遍历。
关联查询
left join 加上的: where b.字段名 is null ; 或者 right join 加: where a.字段名 is null
去掉相同的部分就行