精华内容
下载资源
问答
  • 【MySQL】多表联合查询、连接查询、子查询

    万次阅读 多人点赞 2019-06-03 17:08:20
    联合查询的意义: 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的. 联合查询order by的使用 在联合查询中: order by不能...

    【1】连接查询

    连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

    内连接查询

    内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表

    内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

    基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
    on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

    当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。

    内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。

    例:

    select a.id,a.name,a.sex,b.country,b.city,b.street 
    from student a 
    join addr b 
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    外连接查询

    以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。

    左连接

    left join: 左外连接(左连接), 以左表为主表
    基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;

    左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a left join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    右连接

    right join: 右外连接(右连接), 以右表为主表
    基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
    右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a right join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    【2】联合查询

    联合查询
    联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。
    可以使用unionunion all关键字进行操作

    语法格式如下:

    select 语句1
    union[union 选项]
    select 语句2
    union|[union 选项]
    select 语句n
    

    其中union选项有两个选项可选
    all:表示无论重复都输出
    distinct: 去重(整个重复)(默认的)

    select *from addr
    union all
    select *from addr;
    

    在这里插入图片描述

    select id,addrid 
    from addr 
    union all 
    select id,addrid 
    from student;
    

    在这里插入图片描述联合查询只要求字段一样, 跟数据类型和顺序无关

    select id,addrid,sex,score 
    from student 
    union all 
    select sex,addrid,id,score 
    from student;
    

    在这里插入图片描述
    联合查询的意义:

    1. 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
    2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

    联合查询order by的使用
    在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

    select *from student 
    where sex="woman" 
    order by score
    union
    select *from 
    student where sex="man" 
    order by score;
    

    这种情况是会报错的。因为语句中不允许出现两个order by。

    select *from student where sex="woman" 
    union
    select *from student where sex="man" order by score;
    

    如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了,因为又把前边sex分好的类打乱了

    (select *from student 
    where sex="woman" 
    order by score )
    union
    (select *from 
    student where sex="man" 
    order by score;)
    

    这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有产生最后的效果,所以应该改成如下:

    select *from
    (select *from student 
    where sex="woman" 
    order by score)student
    union
    select *from
    (select *from student 
    where sex="man" 
    order by score)student ;
    

    也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。
    在这里插入图片描述

    【3】子查询

    通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择

    带in关键字的子查询

    使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
    如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

    例:查询成绩大于80的学生的所有信息,
    先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录。

    select *
    from student 
    where score in
    (select score from student where score>80);
    

    在这里插入图片描述

    带比较运算符的子查询

    如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
    经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

    select *
    from student 
    where score> 
    (select score 
    from scholarship
    where dengji=1);
    

    查询奖学金等级为1的学生信息

    带exists的子查询

    exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),
    exists是接在where之后
    exists返回的结果只有0和1.

    例:如果存在成绩大于90的人则列出整个表的记录

    select *
    from student 
    where exists
    (select *from student where score>90);
    

    在这里插入图片描述

    带any关键字的子查询

    any关键字表示满足其中的任意一个条件使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid<any
    (select addrid 
    from addr);
    

    在这里插入图片描述

    带all关键字的子查询

    all和any刚好是相反的,all关键字表示满足所有结果使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid>all
    (select addrid 
    from addr);
    

    在这里插入图片描述

    展开全文
  • 在用于共享的大数据中,不确定数据通过对精确数据的泛化处理来实现,具有均匀分布特性,这一特性不利于精确查 询,但可为关联规则挖掘结果集的粒度查询提供便利。首先,通过UFI-DM算法进行挖掘并构建关联规则库,...
  • MySQL多表关联查询优化

    千次阅读 2019-11-28 10:37:20
    最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。 避免临时表 通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客) 最容易造成使用临时表,...

    背景

    最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。

    避免临时表

    通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客

    最容易造成使用临时表,GROUP BY 与临时表的关系 :
      1. 如果GROUP BY 的列没有索引,产生临时表.
      2. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表.
      3. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
      4. 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
      5. 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.
      6. 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.
    如果业务需求没法更改,也不需要强制去掉临时表。

    缩小数据范围

    接下来进行优化第二步,将临时表缩小到最小范围。SQL 执行过程大体如下:

    1. 执行FROM语句
    2. 执行ON过滤
    3. 添加外部行
    4. 执行where条件过滤
    5. 执行group by分组语句
    6. 执行having
    7. select列表
    8. 执行distinct去重复数据
    9. 执行order by字句
    10. 执行limit字句

    当两个表进行Join操作时,主表的Where限制可以写在最后,但从表分区限制条件不要写在Where条件中,建议写在ON条件或者子查询中。主表的分区限制条件可以写在Where条件中(最好先用子查询过滤)。示例如下:

    select * from A join (select * from B where dt=20150301)B on B.id=A.id where A.dt=20150301; 
    select * from A join B on B.id=A.id where B.dt=20150301; --不允许 
    select * from (select * from A where dt=20150301)A join (select * from B where dt=20150301)B on B.id=A.id;
    

    第二个语句会先Join,后进行分区裁剪,数据量变大,性能下降。在实际使用过程中,应该尽量避免第二种用法。

    展开全文
  • 多表查询 多表连接基本查询 使用一张以上的表做查询就是多表查询。 语法: SELECT {DISTINCT} * | 列名 .. FROM 表名 别名,表名1 别名 {WHERE 限制条件 ORDER BY 排序字段 ASC | DESC .. .} 范例:查询员工...

    SQL

    多表查询

    多表连接基本查询
    • 使用一张以上的表做查询就是多表查询。
    • 语法:
    SELECT {DISTINCT} * | 列名 ..
         FROM 表名 别名,表名1 别名 {WHERE 限制条件
        ORDER BY 排序字段 ASC | DESC .. .}
    

    范例:查询员工表和部门表

    • 员工表
      在这里插入图片描述
    • 部门表
      在这里插入图片描述
    • 查询员工表和部门表
      在这里插入图片描述
    • 我们发现产生的记录数是 48 条,我们还会发现 emp 表是12条,dept 表是 4 条,48 正是 emp 表和dept 表的记录数的乘积,我们称其为笛卡尔积。
    • 如果多张表进行一起查询而且每张表的数据很大的话笛卡尔积就会变得非常大,对性能造成影响,想要去掉笛卡尔积我们需要关联查询。
    • 在两张表中我们发现有一个共同的字段是 depno,depno 就是两张表的关联的字段,我们可以使用这个字段来做限制条件,两张表的关联查询字段一般是其中一张表的主键,另一张表的外键。
    • 示例图:
      在这里插入图片描述
      关联之后我们发现数据条数是12 条,不再是 48 条。
    • 多表查询我们可以为每一张表起一个别名。
    • 示例图:
      在这里插入图片描述

    范例:查询出雇员的编号,姓名,部门的编号和名称,地址

    • 示例图:
      在这里插入图片描述

    范例:查询出每个员工的上级领导

    • 分析:emp 表中的 mgr 字段是当前雇员的上级领导的编号,所以该字段对 emp 表产生了自身关联,可以使用 mgr 字段和 empno 来关联。
    • 示例图:
      在这里插入图片描述

    范例:在上一个例子的基础上查询该员工的部门名称

    • 分析:只要在上一个例子基础上再加一张表的关联,使用 deptno 来做关联字段即可
    • 示例图:
      在这里插入图片描述

    范例:查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级

    • 示例图:
      在这里插入图片描述

    以上操作完整源码:

    --查询员工表和部门表
    select * from emp, dept;
    
    --关联查询员工表和部门表
    select * from emp, dept  where emp.deptno = dept.deptno;
    
    select * from emp e, dept d where e.deptno = d.deptno;
    
    --查询出雇员的编号,姓名,部门的编号和名称,地址
    select e.empno, e.ename, d.deptno, d.dname, d.loc
      from emp e, dept d
     where e.deptno = d.deptno;
     
     ---查询出每一个员工的上级领导
     select e.empno, e.ename, e1.empno, e1.ename
       from emp e, emp e1
      where e.mgr = e1.empno;
      
      --查询每一个员工的上级领导和部门名称
      select e.empno, e.ename, e1.empno, e1.ename, d.dname
        from emp e, emp e1, dept d
       where e.mgr = e1.empno
         and e.deptno = d.deptno;   
        
    --查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级
    select e.empno,
           e.ename,
           d.dname,
           decode(s.grade,
                  1,
                  '一级',
                  2,
                  '二级',
                  3,
                  '三级',
                  4,
                  '四级',
                  5,
                  '五级',
                  '无级') egrade,
           e1.ename,
           decode(s1.grade,
                  1,
                  '一级',
                  2,
                  '二级',
                  3,
                  '三级',
                  4,
                  '四级',
                  5,
                  '五级',
                  '无级') e1grade
      from emp e, dept d, salgrade s, emp e1, salgrade s1
     where e.deptno = d.deptno
       and e.sal between s.losal and s.hisal
       and e.mgr = e1.empno
       and e1.sal between s1.losal and s1.hisal
    

    如有错误,欢迎指正!

    展开全文
  • hive表关联查询,什么情况下会发生数据倾斜,应该如何解决? ** 倾斜原因: map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特性、建表时考虑不周等原因造成的reduce 上的数据量差异过大...

    **

    hive表关联查询,什么情况下会发生数据倾斜,应该如何解决?

    **

    倾斜原因:

    map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特性、建表时考虑不周等原因造成的reduce 上的数据量差异过大。

    解决方案:

    (1)参数调节:

    hive.map.aggr = true

    hive.groupby.skewindata=true

    有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。

    第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;

    第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。

    (2)SQL 语句调节:

    1)选用join key分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表做join 的时候,数据量相对变小的效果。

    2)大小表Join:

    使用map join让小的维度表(1000 条以下的记录条数)先进内存。在map端完成reduce.

    3)大表Join大表:

    把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。

    4)count distinct大量相同特殊值:
    count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

    展开全文
  • 在上篇文章史上最简单MySQL教程详解(基础篇)之数据库设计范式及应用举例我们介绍过,在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的中。当我们需要将这些数据重新合成...
  • 数据仓库中,一般不常或不会变动的信息存放在一个当前全量中(当前全量中也会存储常重要信息,但那只是一个当前值),而经常会变动的重要的要记录历史的数据(如状态、余额等)一般存放在拉链中。...
  • 多表关联导致数据重复的问题

    千次阅读 2016-10-12 11:10:47
    做综合月报时,需要张接口表关联数据关联时,中间有一个接口数据有重复,会导致整个数据块有问题。 在做综合月报时,因为规整库人口数据中有8个区划不在t_dim_area中。导致left join 时,会有部分数据...
  • 多表关联出现重复数据原因

    千次阅读 2017-04-11 17:34:00
    多表联合查询的时候,可能会产生多条重复数据,出现的原因: 1.可能是你用来进行 join的列,具有重复数据。 今天下午在写sql的时候,由于没有注意到该列的值并不是唯一的,所以导致查询出来的有N条重复数据 ...
  • 详解MongoDB中的多表关联查询($lookup)管道的概念聚合框架$lookup的功能及语法主要功能基本语法例子说明$unwind的功能及语法例子 你越是认真生活,你的生活就会越美好——弗兰克·劳埃德·莱特 《人生果实》经典...
  • 多表关联查询(Oracle)

    万次阅读 2014-06-21 12:41:23
    有时一个查询结果需要从两个或两个以上表中提取字段数据,此时需要使用多表关联查询。  1)笛卡尔积关联  create table a(  id number(7),  name varchar2(20));  create table b(  id number(7),...
  • 作者:聿明leslie ...来源:知乎 ...A,B两个表数据规模十几万,数据规模都不大,单机MySQL够用了,在单机的基础上要关联数据,先说一个极端情况,A,B两个都没有索引,并且关联是笛卡尔积,那关联结...
  • 面试官:为什么mysql不建议执行超过3表以上的多表关联查询? weixin_343727282019-06-13 21:26:001240收藏2 版权 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之...
  • 不会快,因为最终执行的语句是一样的。要想提高速度,结合一下自己的经验:1,多加条件约束,多用and,尽量把要查的东西精确定位出来,少用like in这样的语句;...3,各要定义主键,这样在数据的检索上会快很
  • 数据库多表查询关联查询SQL语句

    千次阅读 2019-09-11 20:15:09
    意思就是向左关联某个记录,以左边的那个的记录为基准,通过关联条件,将关联表的相关符合要求的记录一起找出来,找出来的记录条数就是左边的记录数 具体用法如下: SELECT column_name(s) FROM table_name1...
  • 概述:前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join),...
  • 个人博客:www.liusongs.com 原文链接:mysql join多表查询 count数据增多爬坑记录(tp5)
  • 捡重点说,总之引发查询出重复数据就是因为,之间关联的关系不是一对一的,可能是一对的所以会把那张表数据也就查询出来,导致数据重复。 解决方法:group by 字段1   即:(左表字段:右表字段=1:时...
  • mysql单表多次自关联查询

    千次阅读 2016-07-07 20:38:06
    要求一条sql查询出所有符合条件的id及其对应的推荐id,推荐id也有脏数据得去过滤。感到一个查了查去,绕晕了。 好消息: 大家对此sql没有啥好优化的建议。我提议废了这个接口。 改成次遍历去查,用代码实现就...
  • 关于mysql当中给数据量特别大的两个关联查询的时候解决查询速度很慢的解决方法
  • 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join),而PG是...
  • 数据量较大时的多表关联问题

    千次阅读 2019-08-23 14:21:59
    先看一下问题,请对比下面两条sql语句,哪种写法更合适?...最后给出建议:数据量大的表尽量不要进行多表关联关联的表越多,走索引的概率越小。 如果数据架构设计不合理,非要一次性从多个大表里面那数...
  • 百万级数据表查询优化

    千次阅读 2019-03-25 14:18:34
    概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越,原本的SQL查询...这个SQL查询关联两个数据表,一个是攻击IP用户主要是记录IP的信息,如...
  • 在实际工作当中,有一次碰到了多表联合查询但两分钟才出来结果,但A表和B表都不算大,A表只有五万多条数据,B表只有两万条数据,从中查出符合条件的数据并不需耗时那么长.最后经组长指导才发现A表没有建立索引,最后用...
  • Sql语句批量更新数据(多表关联)

    千次阅读 2019-07-04 13:37:47
    最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid...
  • 今天在写多表关联查询的sql语句时,出现了查询出的记录有重复的现象,尽管更改了内联,左右外连接,还是会出现重复的记录,查询出的结果就像下面这样: 下面是我原来的sql语句: SELECT * FROM `students` a left ...
  • MyBatis多表联合查询resultType的返回值

    千次阅读 2020-05-22 16:33:03
    一般数据按参数类型返回 <select id="queryCarIdList" resultType="long"> select id from t_car_car </select> <select id="queryDept" resultType="string"> SELECT deptname FROM t_car_...
  • 1.1通过时间列将大分为个小,缩小数据范围,减少扫描纪录数,这样添加分区索引后存在个B+索引,单分区查询时相对应索引树也小 1.1.1 在本地任意盘符下创建存放小的文件夹 1.1.2 通过...
  • 创建两个 执行下列查询语句 ...显然 person中的数据出现了两次 ,left join 以主为主 ,我们在今后的开发要注意类似的问题 执行下面的语句也是同样的效果 SELECT * from persona ,people...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 192,993
精华内容 77,197
关键字:

表关联查询数据变多