数据库学习笔记6-连接查询 | 8月更文挑战

344 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

连接查询

  • 连接查询是将多张表进行记录的连接,按照某个指定的条件进行数据的拼接

  • 连接查询结果得到的记录数可能会有变化,字段数一定会增加

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

  • 连接查询分类:内连接、外连接、自然连接、交叉连接

交叉连接

  • cross join:从一张表中循环取出每一条记录,每条记录都会去另外一张表进行匹配,因为没有匹配条件,所以匹配结果一定会保留,最终连接本身字段就会增加(保留),结果就是笛卡尔积,得到的数据没有什么意义

  • 基本语法

    • 左表 cross join 右表
    • from 左表,右表 --就是多表查询
    select * from my_pri1 cross join t2;
    
    select * from my_pri1,t2;
    

内连接

  • inner join:从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件,在左表中与右表中相同时,最终才会保留结果,否则不保留
  • 基本语法
    • 左表 [inner] join 右表 on 左表.字段 = 右表.字段
    • on表示连接条件,条件子弹就是代表相同的业务含义,就是当 左表.字段 = 右表.字段时才会保留结果
select * from my_pri1 inner join t2 on my_pri1.pri_id = t2.id;

--简写,就是使用join,省略inner
select * from my_pri1  join t2 on my_pri1.pri_id = t2.id;

-- 使用别名
select * from my_pri1 as p join t2 as t on p.pri_id = t.id;

-- 省略 as
select * from my_pri1  p join t2  t on p.pri_id = t.id;
  • 若是内连接不使用on之后的条件进行查询,就相当于交叉连接,得到的结果也是一个笛卡尔积
  • 内连接可以使用where代替on关键字,但是where没有on效率高
select * from my_pri1 p join t2 t where p.pri_id = t.id;

外连接

  • outer join:以某张表为主(主表),取出主表中的每一条数据,然后每条记录与另外一张表(副表)进行连接,不管能不能匹配上条件,最终都会保留,能匹配,正确保留,不能正确匹配的,将副表的字段全部置空

  • 外连接分类

    • left join:左外连接(左连接),以左表为主表
    • right join:右外连接(右连接),以右表为主表
    -- 左连接
    select * from my_pri1 p left join t2 t on p.pri_id = t.id;
    
    -- 右连接
    select * from my_pri1 p right join t2 t on p.pri_id = t.id;
    
    • 虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.
    • 左连接和右连接可以互转.

自然连接

  • natural join:自然连接就是自动匹配连接条件,系统以字段名字作为匹配模式,同名字段就作为条件,多个同名字段都作为条件

  • 自然连接分类

    • 自然内连接:左表 natural join 右表
    • 自然连接自动使用同名字段作为连接条件,连接之后合并同名字段
    select * from my_pri1 natural join t2;
    
    • 自然外连接: 左表 natural left/right join 右表
    select * from my_pri1 natural left join t2;