MySQL中常见的连接查询有:等值连接,使用=连接两列数据,所有能够匹配的结果都会被显示出来;内连接,关键字INNER JOIN ON,连接效果等同于等值连接;左连接,关键字LEFT JOIN ON,关键字左侧的表的所有数据均显示,关键字右侧的表匹配内容显示,无对应内容使用NULL填充;右连接,关键字RIGHT JOIN ON,关键字右侧的表的所有数据均显示,关键字左侧的表匹配内容显示,无对应内容使用NULL填充;一般情况下,左连接和右连接可以实现相同的连接效果.如果对这部分内容感兴趣,可以从黑马程序员获取测试相关课程了解一下.
一般所说的左连接,外连接是指左外连接,右外连接.做个简单的测试你看吧.
先说左外连接和右外连接:
ID NAME
---------- --------------------
①. aaa
ID AGE
---------- ----------
左外连接:
ID NAME ID AGE
---------- -------------------- ---------- ----------
右外连接:
右外连接过程正好相反.
再看内连接:
会.
先连接后过滤:左连接leftjoin后,连接的右边的表未匹配到话会显示空值,但是加筛选条件就会把这些空值筛选掉,这些空值有部分其实用左连接是要保留下来的,结果经过过滤给过滤掉了,所以呢左连接的数据变少了,还是会被查出来的.
SQL查询左连接、右连接、内连接.左连接的定义是以左表为基础,根据ON后给出的两表的条件将两表连接起来.结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分.
左连接:返回包括左表中的所有记录和右表中联结字段相等的记录;
右连接:返回包括右表中的所有记录和左表中联结字段相等的记录;
全连接:返回两个连接表的所有记录;mysql没有全连接
内连接:返回两个连接表连接字段相同的记录;
union:对两个结果集进行并集,并去重,当交换两个select语句顺序后,最终结果与不交换时无区别;
union all:对两个结果集进行并集,不去重,当交换两个select语句顺序后,最终结果与不交换时有区别;
举个例子 有一个学生表 班级 姓名 一个成绩表 姓名 成绩 我们需要返回X班的所有学生的成绩,但是班上有人缺考,也就是成绩表里没有姓名,我们先用on得到的就是有考试成绩的名字,通过外连接,我们就可以得到全班人的名字以及成绩.
先上结论:
在两个表关联字段上建立索引解决此问题,下面的内容比这句话爽多了,请继续看
表结构如下:
users(用户)表:id,name
integal_record(分数记录)表:id,user_id,integal_id
其中,integal_record表的user_id关联着users表的id,业务目的是查询每个员工阅读次数、评论次数和积分总和,查询语句如下:
(里面写死的值是我从mybatis里扣出来的)
查询时间快半分钟是无法让人接受的,从表象的SQL语句来说,首先我们看到有很多SUM函数,所以呢我们来测试下SUM函数的计算时间,如下查询每个人阅读的累计次数:
可以看出来计算时间很长和SUM函数没什么关系,再看整个SQL除了一些SUM函数外就剩下users表左联integal_record表,我们把条件去掉,直接就写个左查询试试
查看结果:
我们看到type字段的结果是All,也就是代表全表扫描,那么就好办了,建立索引即可,其中users表中的id属于主键,策略自增,有默认的索引,不在考虑范围内,我们仅需对integral_record表增加索引即可:
继续执行左联语句查看运行时间:
时间仍然很久,索引并没有起作用,这里排除一些逃避困难时的迷信想法:mysql有bug 或者navicat有bug,有网络问题 哈哈哈.....我们来看左联的关键属性:
发现mtemp(integal)表的检索方式从all变成了ref,索引,快的一批,深呼吸....
希望继续遇到这种sql需要优化的问题来增加sql调优相关经验
以上就是土嘎嘎小编为大家整理的mysql左连接查询怎么相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!