多表连接子查询

表连接

  • Left join: 以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,
  • Inner join: 查询结果是左右连接的交集
  • Right join:和left相反

嵌套循环关联

SELECT   *    FROM    tbl1 a    LEFT JOIN     tbl2 b    ON    a.col1 = b.col1  
Paste_Image.png

由图可见, 在MySQL内部是这样关联的, 所以耗时也是a.time * b.time

子查询

上面看到的表连接, 我们可以将多个表连在一起查询更丰富的内容。
子查询的含义是:当一个查询是另一个查询的条件时。 通过多表连接和子查询可以完成更为丰富的功能。

按照返回结果集分类

  • 表子查询:返回的结果集是一个行的集合,N行N列(N>=1)。表子查询经常用于父查询的FROM子句中。
  • 行子查询:返回的结果集是一个列的集合,一行N列(N>=1)。行子查询可以用于福查询的FROM子句和WHERE子句中。�列子查询:返回的结果集是一个行的集合,N行一列(N>=1)。
  • 标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值。可以指定一个标量表达式的任何地方,都可以用一个标量子查询。

按照对返回结果的调用方法分类

  • where型子查询:(把内层查询结果当作外层查询的比较条件)� (把内层查询结果当作外层查询的比较条件)
    • 不用order by 来查询最新的商品
 select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
- 取出每个栏目下最新的产品(goods_id唯一)
select cat_id,goods_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
  • from型子查询:(把内层的查询结果供外层再次查询)�
    用子查询查出挂科两门及以上的同学的平均成绩

    • 先查出哪些同学挂科两门以上
select name,count(*) as gk from stu where score < 60 having gk >=2;
- 以上查询结果,我们只要名字就可以了,所以再取一次名字
select name from (select name,count(*) as gk from stu having gk >=2) as t;
- 找出这些同学了,那么再计算他们的平均分
select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name;
  • exists型子查询(把外层查询结果拿到内层,看内层的查询是否成立)
    • 查询哪些栏目下有商品,栏目表category,商品表goods
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);
  • 关联子查询
    关联子查询是指一个包含对表的引用的子查询,该表也显示在外部查询中。通俗一点来讲,就是子查询引用到了主查询的数据数据。很明显,一般情况下关联子查询的效率是比较低下的,实际上本例中的关联子查询例子也仅是为了演示关联子查询的原理及用法。如果可以的话,关联子查询尽量使用 JOIN 或其他查询来代替。

多表连接子查询的应用

分页优化

limit 1000,20,此时mysql排序出前1020条记录后仅仅返回第1001到1020条记录,前1000条记录都会被抛弃,查询和排序的代价非常高。

select id,title from collect limit 1000,10; --很快;基本上0.01秒就OK
select id,title from collect limit 90000,10; --从9万条开始分页, 8-9秒完成
select id from collect order by id limit 90000,10;-- id是做过索引的, 所以它的排序很快0.04秒
SELECT id,title,content FROM collect WHERE id IN (SELECT id FROM collect ORDER BY id limit 90000, 10);; 通过子查询很快就可以查到了

分解关联查询提高性能

         select * from tag
         join tag_post on tag_post.tag_id = tag.id
         join post on tag_post.post_id = post.id
         where tag.tag = 'mysql';
 
         可以分解成下面这些查询来代替
 
         select * from tag where tag = 'mysql';
         select * from tag_post where tag_id = 1234;
         select * from post where post.id in (123,456,9890);

1) 让缓存的效率更高。
应用缓存;mysql查询缓存
2) 执行单个查询可以减少锁的竞争。
3) 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展
4) 查询本身的效率也可能会有所提升。
使用 IN () 代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效
5) 可以减少冗余记录的查询。
在应用层做关联查询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。这样的重构还可能减少网络和内存的消耗。
6) 这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联。某些场景哈希关联的效率要高很多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容