MySQL的多表查询问题

多表查询

为了消除数据的冗余,我们存数据的时候,会把完整的数据信息,分散到多张表来存储。
但是,用户通常需要的是一个完整的全面的信息,那么在查询的时候,就需要把这些分散的信息 拼接 。——多表查询

“拼接” 《=》 连接

连接查询

    交叉连接:(笛卡尔积)

         cross join
        将两张表的信息结合在一起(表1 | 表2 ):
            select * from 表1 cross join 表2(on );
            或者隐式的写法select * from 表1,表2;
        笛卡尔积:
            实现两张表的拼接,并不确保数据的正确性。
            拼接过程:
                1.对于两张表中的数据,不管有没有关系, 全部 两两组合。
            

            
            

    内连接:

        概述:
            返回连接表中  符合连接条件  及 查询条件的  数据行
            比之于交叉连接,更加关注参与连接的数据的内容。

        
        显式内连接: inner join + on
            select * from + 表1重命名 + inner join关键字 + 表2重命名 + on 判断条件
            
            select * from customer c inner join orders o on c.id=o.customer_id;
                customer c : 给customer 表重命名 / orders o :给orders 表重命名为o
                inner join : 内连接方式拼接左右两表。
                on : 判断连接条件 (重命名的 c 表的id属性,是否等于 重命名的o表的customer_id)
                    这里的 on 的判断条件需要在两个表中对应好。
                (这里重命名的 c 和 o 可以看成是对表的引用)    
                

        
        隐式内连接: inner join + where
            select * from customer c,orders o where c.id=o.customer_id;
            
            

    外链接:

        概述:
             会将  所有人的 情况  都会显式出来,如果不满足条件,就会以null的形式显式
        比之于内连接:内连接只返回符合条件的数据行,而外链接,就会将以基准表的所有信息都显示出来

        左外链接:
            left outer join 关键字,在 on 子句中设定连接条件。
            
            select * from customer c left outer join orders o on c.id=o.customer_id;
            效果:以左边为基准表,左表的每一行数据都必须出现在结果集当中,
                1.如果满足连接条件,就正常拼接;
                2.如果不满足连接条件,那么左边的不满足连接条件的数据记录就会放在结果集的最后,并且左表数据放入其中,右表数据全为NULL;
                
        右外链接:
            right outer join 关键字(连接两表),在 on 子句中设定连接条件。
            效果:以右表为基准表,右表的每一行数据都必须出现在结果集中。
                与左外连接只是表的基准不一样。
                
        在连接之后还可以 + where 来进行新表的条件过滤。
            eg. select * from customer c left outer join orders o on c.id=o.customer_id where price>200;
                
   
    

where 子句的工作模式:            

    作用:筛选和过滤;
    筛选的对象:表 中的每一行数据。
    遍历表中的每一行数据,然后根据过滤条件,对每一行数据记录进行判断(true/false)
    如果过滤结果为true,就加入结果集中。
            

*****在关系数据库中,所有的数据都存在一张二维表中;所以表的  拼接 、 查询的结果都是一张二维表。
    (所以where 就能够作用在 所有的二维表中,只要where前面的代码 表示的是一张二维表。)
            
    
            

嵌套查询(子查询):详见后面

    概述:是指在  where 子句 或  from 子句中 又嵌入 select。
    分类:
            相关子查询 : 依赖于所生成的父表。
            不相关子查询 : 不依赖与所生成的父表。

    select * from orders where customer_id={select id from customer where name like '%郭靖%'};
        {}中得到的就是符合条件的另一张表的id属性。
    
    相当于在两张表中分别进行查询。
    
SQL 注释:
    单行注释:-- 这里写注释 --
    多行注释: /* */


联合查询:

    关键字:union
    求两张表的  并集。ÿ
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值