精华内容
下载资源
问答
  • 关于MySQL外连接查询的NULL

    千次阅读 2017-10-14 10:43:01
    left join 或 right join : 1) select * from 表1 left join 表2 on 表1=表2 ...总结:外连接查询如果非主表有条件,必须加在 :left Join .. on .. and (条件) ; 这样才不会过滤掉表2 的null值(有空再补图)

    left join 或 right join :

    1) select * from 表1 left join 表2 on 表1=表2 where 表1.id>10 ; 
       //不考虑表2 的重复值有40条数据
       返回 表1 的所有数据40条。如果表2中没有对应的值以null 返回。
    
       1.1) select * from 表1 right join 表2 on 表1=表2 where 表1.id>10 ; 
           这时主表是 表2 ,如果表1中没有对应的值会以 null 返回,并且会被where条件过滤掉;
           //不考虑表2 的重复值有40条数据
           返回 表2 的数据30条。如果表1中没有对应的值会被过滤(10条)。
    
    2) select * from 表1 left join 表2 on 表1=表2 
       where 表1.id>10 and 表2.time>unix_timestamp('2017-09-01'); 
       //不考虑表2 的重复值有20条数据
       返回 表1 的20条数据。如果表2中没有对应的值null则会被过滤调。
    
    3) select * from 表1 left join 表2 on 表1=表2 and 表2.time>unix_timestamp('2017-09-01') 
       where 表1.id>10 ; 
       //不考虑表2 的重复值有30条数据(10条是表2的null值)
       返回 表1 的30条数据。如果表2中没有对应的值以null 返回。
    
    总结:外连接查询如果非主表有条件,必须加在 :left Join .. on .. and (条件) ; 这样才不会过滤掉表2 的null值(有空再补图)
    
    展开全文
  • 用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接外连接( 左()连接、右()连接、全()连接)。 MySQL版本:Server version: 5.6.31 MySQL Community Server ...

    用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。

    MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL)

    数据库表:a_table、b_table

    主题:内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接)

    前提

    建表语句:

    CREATE TABLE `a_table` (
      `a_id` int(11) DEFAULT NULL,
      `a_name` varchar(10) DEFAULT NULL,
      `a_part` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    CREATE TABLE `b_table` (
      `b_id` int(11) DEFAULT NULL,
      `b_name` varchar(10) DEFAULT NULL,
      `b_part` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    表测试数据:



    一、内连接

    关键字:inner join on
    语句:select * from a_table a inner join b_table bon a.a_id = b.b_id;
    执行结果:


    说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

    二、左连接(左外连接)

    关键字:left join on / left outer join on
    语句:select * from a_table a left join b_table bon a.a_id = b.b_id;
    执行结果:


    说明:
    left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
    左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

    三、右连接(右外连接)

    关键字:right join on / right outer join on
    语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;
    执行结果:


    说明:
    right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
    与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。


    四、全连接(全外连接)

    MySQL目前不支持此种方式,可以用其他方式替代解决。

    五、补充,MySQL如何执行关联查询

    MySQL认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表匹配才叫关联,所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至基于单表查询)都可以是一次关联。
    当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。请看下面的例子中的简单的查询:

    查询语句:select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);
    假设MySQL按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示MySQL将如何完成这个查询:
    outer_iter = iterator over tbl1 where col1 in (5, 6)
    outer_row = outer_iter.next
    while outer_row
        inner_iter = iterator over tbl2 where col3 = outer_row.col3
        inner_row = inner_iter.next
        while inner_row
            output [ outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
        outer_row = outer_iter.next
    end
    上面的执行计划对于单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要上面外层的基本操作。对于外连接,上面的执行过程仍然适用。例如,我们将上面的查询语句修改如下:
    select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);
    那么,对应的伪代码如下:
    outer_iter = iterator over tbl1 where col1 in (5, 6)
    outer_row = outer_iter.next
    while outer_row
        inner_iter = iterator over tbl2 where col3 = outer_row.col3
        inner_row = inner_iter.next
        if inner_row
            while inner_row
                output [ outer_row.col1, inner_row.col2]
                inner_row = inner_iter.next
            end
        else
            output [ outer_row.col1, null]
        end
            outer_row = outer_iter.next
    end
    说明:第五部分摘自《高性能MySQL 第三版》








    展开全文
  • 连接查询 连接查询:将多张表连到一起进行查询(会导致记录数行和字段数列发生改变) 连接查询的意义 在关系型数据库设计过程中,实体(表)与实体之间是存在很多联系的。...外连接:左外连接(左连接)和右...

    连接查询

    连接查询:将多张表连到一起进行查询(会导致记录数行和字段数列发生改变)

    连接查询的意义

    在关系型数据库设计过程中,实体(表)与实体之间是存在很多联系的。在关系型数据库表的设计过程中,遵循着关系来设计:一对一,一对多和多对多,通常在实际操作的过程中,需要利用这层关系来保证数据的完整性。

    连接查询分类

    连接查询一共有以下几类:

    交叉连接

    内连接

    外连接:左外连接(左连接)和右外连接(右连接)

    自然连接

    交叉连接

    交叉连接:将两张表的数据与另外一张表彼此交叉

    原理

    1、 从第一张表依次取出每一条记录

    2、 取出每一条记录之后,与另外一张表的全部记录挨个匹配

    3、 没有任何匹配条件,所有的结果都会进行保留

    4、 记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数  + 第二张表字段数(笛卡尔积)

    语法

    基本语法:表1 cross join 表2;

    应用

    交叉连接产生的结果是笛卡尔积,没有实际应用。

    内连接

    内连接:inner join,从一张表中取出所有的记录去另外一张表中匹配:利用匹配条件进行匹配,成功了则保留,失败了放弃。

    原理

    1、 从第一张表中取出一条记录,然后去另外一张表中进行匹配

    2、 利用匹配条件进行匹配:

    2.1 匹配到:保留,继续向下匹配

    2.2 匹配失败:向下继续,如果全表匹配失败,结束

    语法

    基本语法:表1 [inner] join 表2 on 匹配条件;

    1、 如果内连接没有条件(允许),那么其实就是交叉连接(避免)

    2、 使用匹配条件进行匹配

    3、 因为表的设计通常容易产生同名字段,尤其是ID,所以为了避免重名出现错误,通常使用表名.字段名,来确保唯一性

    4、 通常,如果条件中使用到对应的表名,而表名通常比较长,所以可以通过表别名来简化

    5、 内连接匹配的时候,必须保证匹配到才会保存

    6、 内连接因为不强制必须使用匹配条件(on)因此可以在数据匹配完成之后,使用where条件来限制,效果与on一样(建议使用on)

    应用

    内连接通常是在对数据有精确要求的地方使用:必须保证两种表中都能进行数据匹配。

    外连接

    外链接:outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据。

    外连接分为两种:左外连接(left join),右外连接(right join)

    左连接:左表是主表

    右连接:右表是主表

    原理

    1、 确定连接主表:左连接就是left join左边的表为主表;right join就是右边为主表

    2、 拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录

    3、 如果满足匹配条件:保留;不满足即不保留

    4、 如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录:从表对应的字段值都未NULL

    语法

    基本语法:

    左连接:主表 left join 从表 on 连接条件;

    右连接:从表 right join 主表 on连接条件;

    左连接对应的主表数据在左边;右连接对应的主表数据在右边:

    特点

    1、 外连接中主表数据记录一定会保存:连接之后不会出现记录数少于主表(内连接可能)

    2、 左连接和右连接其实可以互相转换,但是数据对应的位置(表顺序)会改变

    应用

    非常常用的一种获取的数据方式:作为数据获取对应主表以及其他数据(关联)

    Using关键字

    是在连接查询中用来代替对应的on关键字的,进行条件匹配。

    原理

    1、 在连接查询时,使用on的地方用using代替

    2、 使用using的前提是对应的两张表连接的字段是同名(类似自然连接自动匹配)

    3、 如果使用using关键字,那么对应的同名字段,最终在结果中只会保留一个。

    语法

    基本语法:表1 [inner,left,right] join 表2 using(同名字段列表); //连接字段

    总结:应避免使用交叉连接,看情况使用内连接或者外连接,当要以一表数据为主,使得查询的记录数不会少于此表记录数时考虑外连接,当严格按照条件进行匹配时,使用内连接比较合适,当两表条件字段名一致时,可以使用using关键字。 

    展开全文
  • Mysql—— 内连接、左连接、右连接以及全连接查询

    万次阅读 多人点赞 2018-10-05 23:03:31
    一、内连接查询 inner join 关键字:inner join on 语句:select * from a_table a inner join b_table b on a.a_id = b.b_id; 说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集...

    获取 boy 、girl 表下载地址

    一、内连接查询  inner join

    关键字:inner  join   on

    语句select * from a_table a inner join b_table b on a.a_id = b.b_id;

    说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

    案例解释:在boy表和girl 表中查出两表 hid 字段一致的姓名(gname,bname),boy表和girl 表如下:

          

    采用内连接查询方式:

    SELECT boy.hid,boy.bname,girl.gname FROM boy INNER JOIN girl ON girl.hid = boy.hid;

    查询结果如下:

    二、左连接查询 left join

    关键字:left join on / left outer join on

    语句:SELECT  * FROM a_table a left join b_table b ON a.a_id = b.b_id;

    说明: left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

    案例解释:在boy表和girl 表中左连接查询,boy表和girl 表如下:

          

    采用内连接查询方式:

    SELECT boy.hid,boy.bname,girl.gname FROM boy LEFT JOIN girl ON girl.hid = boy.hid;

    查询结果如下:

    三、右连接 right join

    关键字:right join on / right outer join on

    语句:SELECT  * FROM a_table a right outer join b_table b on a.a_id = b.b_id;

    说明:right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

    案例解释:在boy表和girl 表中右连接查询,boy表和girl 表如下:

          

    采用内连接查询方式:

    SELECT boy.hid,boy.bname,girl.gname FROM boy RIGHT JOIN girl ON girl.hid = boy.hid;

    查询结果如下:

    四、全连接 union

    关键字:union /union all

    语句:(select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB )

             或 (select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB );

    union语句注意事项:

             1.通过union连接的SQL它们分别单独取出的列数必须相同;

             2.不要求合并的表列名称相同时,以第一个sql 表列名为准;

             3.使用union 时,完全相等的行,将会被合并,由于合并比较耗时,一般不直接使用 union 进行合并,而是通常采用union all 进行合并;

             4.被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;

               (select id,name from A order by id) union all (select id,name from B order by id); //没有排序效果

               (select id,name from A ) union all (select id,name from B ) order by id; //有排序效果

    案例解释:将a表和b表合并,表结构如下:

              

    采用 union 全连接:

    union会自动将完全重复的数据去除掉,a、b表中"c"的值都为15,所以只显示一行。

    采用 union all 全连接:

    union all会保留那些重复的数据;

    左右连接练习题:

    根据给出的表结构按要求写出SQL语句。t 表(即Team表)和 m 表(即Match表) 的结构如下:

         

    t 表(即Team表)和 m 表(即Match表) 的内容如下:

             

    t 表和 m 表下载地址

    m 表(即Match表) 的 hostTeamID 与 guestTeamID 都与 t 表(即Team表) 中的 teamID 关联。请查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出: 拜仁   2:0  不来梅  2006-6-21

    ===============================================================================

    解决方案:

    第一步:先以 m 表左连接 t 表,查出 m 表中 hid 这列对应的比赛信息:

    SELECT m.mid,t.tname,m.mres,m.matime as time FROM m LEFT JOIN t ON t.tid = m.hid;

    查询结果记为结果集 t1 ,t1 表如下:

    第二步:先以 m 表左连接 t 表,查出 m 表中 gid 这列对应的比赛信息:

    SELECT m.mid,t.tname,m.mres,m.matime FROM m LEFT JOIN t ON t.tid = m.gid;

    查询结果记为结果集 t2 ,t2 表如下:

    第三步:以结果集 t1 为基础左连接查询结果集 t2,查询条件为两者比赛序号(mid)相同。

    SELECT t1.tname,t1.mres,t2.tname,t1.time FROM 
    (SELECT m.mid,t.tname,m.mres,m.matime as time FROM m LEFT JOIN t ON t.tid = m.hid) 
    as t1 
    LEFT JOIN 
    (SELECT m.mid,t.tname,m.mres,m.matime as time FROM m LEFT JOIN t ON t.tid = m.gid) 
    as t2 
    ON t1.mid = t2.mid WHERE t1.time BETWEEN '2006-06-01' AND '2006-07-01';

    查询结果如下:

    全连接练习题:

    A表和B表结构如下,请将两表合并:

                

    合并要求:A表中a:5,B表中a:5,因此合并后表中a对应的值为10;要求查出的结果样本如下:

    采用 union all 全连接,然后使用from 子查询:

    SELECT id,SUM(num) as num FROM ((SELECT id,num FROM a) UNION ALL(SELECT id,num FROM b)) as tb GROUP BY id;
    

     

     

    展开全文
  • MySQL连接查询语句(内连接,连接)

    千次阅读 2018-11-30 15:19:45
    连接查询连接 select suppliers.s_id,s_name,f_name,f_price from suppliers,fruits where suppliers.s_id = fruits.s_id 上述查询等价于inner join on 内连接查询 select suppliers.s_id,s_name,f_...
  • mysql连接查询

    千次阅读 2019-02-24 19:25:57
    mysql连接查询连接查询:以左表为主表,右表为从表,查询符合条件的数据 1.当右表中数据匹配不到时展示为空 例: 左表两条数据,按条件匹配到右表一条数据且匹配左表第一条,结果展示两条数据,且第二条数据右...
  • MySQL 连接查询 1.使用连接查询的场景 将多张表进行记录的连接查询(按照某个字段指定的条件进行数据的拼接); 进行数据的拼接(两张表的内容显示在一个结果表中 使用连接查询) 最终的结果是:记录数有可能变化,...
  • Mysql中的关联查询(内连接外连接,自连接)

    万次阅读 多人点赞 2017-12-25 14:32:15
    在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询 一,内连接查询 是指所有查询出的结果都是能够在连接...
  • MySQL连接查询及子查询

    千次阅读 2016-03-07 21:53:15
    在校招的各种银行类笔试题中,...(2)外连接查询(左外连接查询和右外连接查询) 2.内连接查询(INNER JOIN) 内连接使用比较运算符进行表间某列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新
  • 由于需要获取所有客户的基本信息,如果采用左连接加以实现,必须从左至右依次连接客户表和订单表,此时客户表将作为左表。 select cName 姓名 , ordersID 订单 ID, ordersDate 下单日期 from customer c left join ...
  • mysql连接查询及合并查询

    千次阅读 2018-06-02 17:09:28
    mysq 的连接查询分为内连接查询外连接查询连接查询:inner join on:两边的数据进行笛卡尔积操作。 链接查询:left join:以左边为主。righr join:以右表为主。 创建测试表: create table join2( id ...
  • MySql自身连接查询

    千次阅读 2017-10-17 11:03:57
    一直没用到自身连接查询,今天做习题,遇到了,不多说,上代码: *题目: 查询和李军同性别并同班的同学SNAME 这是用到的表 22 土办法: Select sname from student where ssex=(select ssex fromstudent where ...
  • Mysql连接查询

    万次阅读 多人点赞 2017-01-07 17:04:51
    连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照...
  • 1.首先谈一谈数据库的连接查询有什么作用? 简单的说就是在实际生活中,当我们查询某些数据的时候,一张表不可能为我们提供足够多的数据,其次在数据库的设计的时候,考虑到表的结构和...左外连接查询 ( left join)...
  • MySQL连接查询

    千次阅读 2019-05-08 23:43:02
    首先创建两个表 ...1.内连接查询(INNOR JOIN) 使用普通sql语句 select fruits.id,name,price,num from fruits,orders where fruits.id=orders.id; 使用内连接查询语句(结果与上图相同) s...
  • 连表查询(内查询,左查询,右查询,全外查询) 说明 正文 创建表单 1:创建部门表:department 2:创建员工表:employee 内连接连接连接 全外连接 连表查询(内查询,左查询,右查询,全外查询...
  • mysql连接、自然连接外连接的区别

    万次阅读 多人点赞 2018-12-02 23:57:12
    连接、自然连接外连接的区别
  • MySQL】多表联合查询连接查询、子查询

    万次阅读 多人点赞 2019-06-03 17:08:20
    文章目录 【1】连接查询连接查询 外连接查询连接连接 【2】联合查询 【3】子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键字的子查询 【1】连接查询 连接...
  • MySQL连接查询——MySQL 基础查询你会了吗?

    千次阅读 多人点赞 2020-05-09 20:30:49
    文章目录2、MySql连接查询2.1、内连接(sql92 和sql99)2.1.1、sql92`1、等值连接`2、 为表起别名6、可以加排序吗?7、可以实现三表连接吗?2、非等值连接3、自连接2.1.2、sql99标准1、等值连接2、非等值连接3、 自...
  • MySQL连接查询中索引的重要性

    千次阅读 2014-12-05 14:22:08
    在mysql中,我们要从多张表中读取数据时,往往需要用到连接查询。连接查询通过两张表中符合连接...本文我们以一个学生选课的例子,来分析下左连接的性能,并引入索引进行对比,从而说明mysql连接查询中索引的重要性。
  • MySQL查询有很多种比如:内连接链接,子查询,全笛卡尔积等等。求全笛卡尔积效率是最低的,为什么呢,因为求几张表的全笛卡尔积,会生成一张临时表,而这张临时表是没有索引的 ,所以效率是最低的。连接查询则...
  • 基于MySQL数据库的连接查询

    千次阅读 多人点赞 2018-12-04 15:43:23
    用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接外连接( 左()连接、右()连接、全()连接)。 MySQL版本:mysql5.1.17 管理工具版本:navicat12 数据库表:a_...
  • 常见的高级查询包括多表连接查询、内连接查询外连接查询与组合查询等,今天我们先来学习最常用、面试也很容易被问到的连接查询。 我们今天以一个简单的学生信息表(学生ID、学生姓名、学生性别)与一个学生成绩表...
  • outer可以省略不写,下边的右连接和全连接也一样:左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必须要全部显示出来,如下图:这里第一个查询中,company表在左边,因此就以company为基准...
  • Mysql 多表连接查询

    万次阅读 多人点赞 2018-05-08 19:27:21
    本文部分内容转载至:Mysql 多表查询详解,同时感谢原作者的整理与创作;
  • 为了演示方便,提前准备了两张表...连接分为:内连接外连接、交叉连接 一、内连接( 最常用 )  定义:仅将两个表中满足连接条件的行组合起来作为结果集。   关键词:INNER JOIN  select * from employee
  • 先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。 笛卡尔积又叫笛卡尔乘积,是由一个笛卡尔人提出来的,简单地来说就是两个集合相乘...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,027,051
精华内容 410,820
关键字:

mysql外连接查询

mysql 订阅