mysql连接查询_mysql连接查询如何利用索引 - CSDN
精华内容
参与话题
  • MySQL中使用连接查询

    2019-06-19 20:59:30
    连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接); 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)! 连接查询的意义: 在用户查看数据的时候,需要显示的数据...

    连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接);

    最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)!

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

    SQL中将连接查询分成四类:交叉连接内连接,外连接自然连接。

    在介绍之前先创建两张表作为联系(my_stu,my_class)

    1.交叉连接

     cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积.

    select * from my_stu cross join my_class;

     

    注意:

    笛卡尔积没有意义: 应该尽量避免(交叉连接没用)。交叉连接存在的价值: 保证连接这种结构的完整性

    2.内连接

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

    基本语法

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

    select * from my_stu inner join my_class on c_id = my_class.id;

    注意:

    内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)!

    内连接还可以使用where代替on关键字(where没有on效率高)!

    3.外连接

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

    外连接分为两种: 是以某张表为主: 有主表

    Left join: 左外连接(左连接), 以左表为主表

    Right join: 右外连接(右连接), 以右表为主表

    基本语法:

    左表 left/right join 右表 on 左表.字段 = 右表.字段;

    3.1左连接

    select *, my_class.c_name, my_class.room from my_stu left join my_class on my_stu.c_id=my_class.id;

    3.2右连接

    select s.*, c.c_name as c_name, c.room from my_stu as s right join my_class as c on s.c_id = c.id;

    注意:

    虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.

    字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

    4.自然连接

    自然连接: natural join, 自然连接, 就是自动匹配连接条件: 系统以字段名字作为匹配模式(同名字段就作为条件, 多个同名字段都作为条件,连接之后会合并同名字段).

    自然连接: 可以分为自然内连接和自然外连接.

    4.1自然内连接:

    左表 natural join 右表;

    select * from my_stu natural join my_class;

    4.2自然外连接

    左表 natural left/right join 右表

    select * from my_stu natural left join my_class;

     

    多表连接: A表 inner join B表 on 条件 left join C表 on条件 ...

    执行顺序: A表内连接B表,得到一个二维表, 左连接C表形成二维表...

    转载于:https://www.cnblogs.com/zxf100/p/6837566.html

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

    万次阅读 多人点赞 2019-08-14 10:44:52
    一、内连接查询 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 连接查询汇总(极简)

    千次阅读 2019-09-26 14:08:29
    MYSQL-连接查询: # 连接查询:把多张表进行记录的连接(按照某个条件进行数据的拼接) # 分类 1,内链接 2,外连接 # 左外 # 右外 3,自然连接 4,交叉连接 MYSQL-内链接 : # inner join (inner关键字...

    MYSQL-连接查询:       

        # 连接查询:把多张表进行记录的连接(按照某个条件进行数据的拼接)
        # 分类
            1,内链接
            2,外连接
                # 左外
                # 右外
            3,自然连接
            4,交叉连接

    MYSQL-内链接 : 

        # inner join (inner关键字可以省略)  [inner join比left join快]
        # 从左表中取出每一条记录,与右表中的所有记录进行匹配
        # 匹配必须是某个条件,在左表和右表中相同【公共部分】,才会保留结果.否则,不保留
        # 基本语法
            SELECT * FROM [左表] innder join [右表] on [左表].[字段]=[右表].[字段];
        # 内连接,可以没有on,那么系统会保留所有的结果,没错.又是传说中的笛卡尔积
        # '还可以使用where代替on,但是效率没有on高'

    例子
    排他性: A,B表中至少有1个匹配时,才返回行。两表的【交集】
    SQL语句如下:
    select A.name,B.address from A 
    inner join B
    on A.id = B.A_id

    查询结果为:
    name     address
    张     北京
    王     上海

    inner join  内连接等价于下面的sql:
    SELECT A.name, B.address
    FROM A, B
    WHERE A.id = B.A_id

    MYSQL-外连接:  

    1, 左外         

       左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。

    通俗:就是2张表,查左表满足条件的所有以及右表中含有左表条件的数据,where (右表条件)..is not null显示不为null的数】
        # 以某张表为主,取出里面的所有记录.每条与另外一张表.不管能不能匹配上条件.最终都会保留.如果不能匹配,那么其他表的字段都置空
       
            # left join (left join 是left outer join的简写)
            # 基本语法
                SELECT
                    ...
                FROM
                    [左表]
                LEFT JOIN
                    [右表]
                ON
                    [条件]
            # 会把左边所有的数据都显示出来,如果右表没有匹配的数据.以null显示
           例:SELECT * from a_table a LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);

        2,右外

        右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
       【通俗:就是2张表,查右表满足条件的所有以及左表中含有右表条件的数据,where (左表条件)..is not null显示不为null的数】
        
            # right join
            # 基本语法
                SELECT
                    ...
                FROM
                    [左表]
                RIGHT JOIN
                    [右表]
                ON
                    [条件]
            # 会把右表所有的数据都显示出来,如果左表没有匹配的数据.以null显示
            例:SELECT * from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id (where a_id is not NULL);

    MYSQL-自然连接:

        # natural join
        # MYSQL方言,其他数据库不一定有
        # '自动的匹配连接条件',但是.不怎么建议使用.是以'字段名称作为匹配模式'
        # 基本语法
            SELECT ...FROM [表1] natural join [表2];        //内连接
                * 自动使用同名字段作为连接条件,结果中会合并该字段
            SELECT ...FROM [表1] left natural join [表2];    //左外自然连接
            SELECT ...FROM [表1] right natural join [表2];    //右外自然连接

    MYSQL-交叉连接: 

        # cross join
        # 从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配.而且匹配一定保留(没有条件匹配不带条件where...)
        # 而连接本身字段就会增加(保留)    --    笛卡尔积(笛卡尔是没有意义的,【尽量要避免】)
        # 存在的价值:保证连接这种结构的完整性而已.
        # 基本语法
            SELECT * from [左表] cross join [右表];    == select * from [左表],[右表];
            select * from emp cross join dept;

            # 也可以加上条件
            select * 
                from emp e 
            cross join 
                dept d 
            on e.deptno=d.deptno ;

        【两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。】

    MYSQL-全外: 

        # 全外(MYSQL不支持,但是我们可以通过其他方式实现)
        # 这个就是,左右两表都是相同的,两个表的所有内容都必须全部出来,如果没有对应记录的,就用null填充

        select * from 表1 left outer join 表2 on 表1.字段=表2.字段
            union 
        select * from 表1 right outer join 表2 on 表1.字段=表2.字段;
        -联合查询 ,把他们的结果集合并一下就出来了
        
        例: SELECT * from a_table a LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL) UNION SELECT * from a_table a
    LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);

    例子:https://blog.csdn.net/plg17/article/details/78758593

    展开全文
  • Mysql中的关联查询(内连接,外连接,自连接)

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

    在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询

    一,内连接查询

    是指所有查询出的结果都是能够在连接的表中有对应记录的。

    以t_employee(员工表)和t_dept(部门表)为例:

    t_employee表中的记录如下:dept代表该员工所在的部门


    t_dept表中记录如下:


    可以发现,其中人力资源部里没有员工(这里只是举例,可能与实际不符,但主要在于逻辑关系),而赵七没有对应的部门,现在想要查询出员工姓名以及其对应的部门名称:

    此时,就要使用内连接查询,关键字(inner join)

    在这里说一下关联查询sql编写的思路,1,先确定所连接的表,2,再确定所要查询的字段,3,确定连接条件以及连接方式

    select 
    e.empName,d.deptName
    from t_employee e
    INNER JOIN t_dept d
    ON e.dept = d.id;
    查询的结果如下:


    其中,没有部门的人员和部门没有员工的部门都没有被查询出来,这就是内连接的特点,只查询在连接的表中能够有对应的记录,其中e.dept = d.id是连接条件



    二,左外连接查询

    是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null。例如:

    查询所有员工姓名以及他所在的部门名称:在内连接中赵七没有被查出来,因为他没有对应的部门,现在想要把赵七也查出来,就要使用左外连接:

    SELECT e.empName,d.deptName
    from t_employee e
    LEFT OUTER JOIN t_dept d 
    on d.id = e.dept;


    在这里,t_employee就是左表,也就是基准表,用基准表的数据去匹配右表的数据,所以左表的记录是全部会查询出来的,如果右表没有记录对应的话就显示null

    查询结果:


    关键字是left outer join,等效于left join,在关联查询中,做外连接查询就是左连接查询,两者是一个概念

    三,右外连接是同理的,只是基准表的位置变化了而已

    比如:查询所有的部门和对应的员工:

    SELECT e.empName,d.deptName
    from t_employee e
    RIGHT OUTER JOIN t_dept d 
    on d.id = e.dept;
    这里只是把left修改成了right,但是基准表变化了,是以右表的数据去匹配左表,所以左外连接能做到的查询,右外连接也能做到
    查询结果:



    四,全外连接

    顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。例如:

    select e.empName,d.deptName
         FROM t_employee e 
         left JOIN t_dept d
         ON e.dept = d.id
    UNION
    select e.empName,d.deptName
         FROM t_employee e 
         RIGHT JOIN t_dept d
         ON e.dept = d.id;
    查询结果:


    如果在oracle中,直接就使用full outer join关键字连接两表就行了


    五,自连接查询

    自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名

    例如:查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表

    SELECT e.empName,b.empName
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    查询结果:

    在这里,b表是虚拟化出的表,我们可以通过查询了解b表的记录:

    SELECT e.empName,b.empName,b.*
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    查询结果:


    后面的四个字段就是虚拟化出的b表的所有记录,但看这四个字段其实就是记录所有是上司的员工的信息

    所以,自连接查询一般用作表中的某个字段的值是引用另一个字段的值,比如权限表中,父权限也属于权限。



    展开全文
  • MySQL连接查询

    千次阅读 2019-05-08 23:43:33
    首先创建两个表 ...1.内连接查询(INNOR JOIN) 使用普通sql语句 select fruits.id,name,price,num from fruits,orders where fruits.id=orders.id; 使用内连接查询语句(结果与上图相同) s...
  • mysql连接查询

    2020-09-08 21:34:11
    mysql连接查询 连接查询 连接查询:将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接);最终结果是:记录数有可能变化,字段数一定会增加(至少两张表的合并) 连接查询的意义:在用户查看...
  • SQL的几种连接查询数据库数据:1.内连接2.外连接2.1.左联接:2.2.右连接:2.3.全连接:3.交叉连接 SQL连接可以分为内连接、外连接、交叉连接。 数据库数据: stu表book表 1.内连接 1.1.等值连接:在连接条件中使用...
  • Mysql多表连接查询的执行细节(一)

    万次阅读 多人点赞 2019-12-11 15:04:18
    本篇博客会说明一下问题: 1. 驱动表如何选择; 2. 两表关联查询的内在逻辑是怎样的 3. *多表连接如何执行?是先两表连接的结果集然后关联第三张表,还是一条记录贯穿全局
  • 基于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_...
  • 查询Mysql最大连接数和当前连接

    万次阅读 2018-08-24 16:15:48
    最大连接数:show variables like ‘%max_connections%’; 当前连接数:show full processlist;
  • MySQL连接查询语句(内连接,外连接)

    千次阅读 2020-09-05 15:22:51
    连接查询 内连接 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全连接和oracle全连接查询、区别

    千次阅读 2020-01-08 20:51:40
    oracle的全连接查询可以直接用full on,但是在mysql中没有full join,mysql使用union实现全连接 > 注:mysql利用左连接和右连接分别查询出左右两边的数据 然后利用union去重合并(去掉两边都有的重复数据)
  • mysql 数据库连接查询

    千次阅读 2018-11-15 20:48:07
    show full processlist; show open tables where In_use > 0; show processlist; select * from information_schema.processlist where db = '数据库名称' and command != 'Sleep' and Time &... ...
  • 连接查询则不同,以左外连接为例,他是以左表为主表,而右表只需要配合左表,查出符合条件的数据。左外连接用的索引是左表原有的索引,所以效率还是比较快的。 推荐一篇博客: https://www.cnblo...
  • 交叉连接 、内连接 、外连接 、带IN关键字的子查询 、带EXISTS关键字的子查询 、带ANY关键字的子查询 、带ALL关键字的子查询 、带比较运算符的子查询
  • MySql中左连接查询突然变得很慢

    千次阅读 2019-08-03 03:06:20
    MySql中左连接查询突然变得很慢 表结构: A表 userId,name B表 wId,userId,address A表左连接B表查询时,平时查询都非常的块,这几天突然变得很慢。 一个查询花了0.888S。 使用explain表达式查询,发现了...
  • MySQL三个表的连接查询

    万次阅读 2017-10-11 11:21:00
    select first_name,title,salary,s.to_date from employees e  inner join titles t on e.emp_no = t.emp_no inner join salaries s on e.emp_no = s.emp_no where e.emp_no = 10001
  • mysql 连接两个查询

    2011-10-12 16:24:45
    select id from tp_message where type=0 and isdelete=0 and to_uid=3 and source_message_id=0   union all select source_message_id id
  • mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多表连接查询 外链接之左连接 右连接 mysql 数据操作 多表查询 多表连接查询 全外连接 ...
  • SELECT pi.real_name realName,pi.idnum FROM c_info pi left join c_ca c on pi.ca_id = c.id left join c_tr t on c.id = t.ca_id WHERE t.trstatus in (2,3) and idnum = ?
1 2 3 4 5 ... 20
收藏数 398,705
精华内容 159,482
关键字:

mysql连接查询