MySQL:25---内连接、外连接查询(inner join、left join、right join)

连接查询

①概念:在关系数据库管理系统中,当查询数据时,通过连接运算符查询出存放在多个表中的不同实体信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询

②分类

  • 内连接
  • 外连接

一、内连接查询(inner join、natural join)

  • 概念:使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组成新纪录。(只有满足条件的记录才能出现在结果关系中)
  • 内连接查询也称为等同查询。就是在表关系的笛卡尔积数据记录中,保留表关系中所有相匹配的数据,而舍弃不匹配的数据

create table suppliers
(
s_id        int            not null auto_increment,
s_name  char(50)  not null,
s_city     char(10)  null,
s_zip      char(50)  null,
s_call     char(50)  not null,
primary  key(s_id)
);

  •  查看fruits和suppliers两个表的结构,都有s_id字段,下面查询通过s_id字段建立联系

MySQL:25---内连接、外连接查询(inner join、left join、right join)

1.演示一(使用where)

  • 上面两个表通过s_id建立联系。where子句作为过滤条件
  • 查询suppliers中的s_name,s_id。查询fruits中f_name,f_price
  • 因为suppliers和fruits中都有s_id,因此需要指定suppliers中的s_id需要用.来表示

MySQL:25---内连接、外连接查询(inner join、left join、right join)

2.等值查询(inner join)

  • 查询结果与where相同
  • 两个表通过inner join指定关系,on作为连接的条件
  • 连接条件中的连接运算符为=,就成为等值查询

MySQL:25---内连接、外连接查询(inner join、left join、right join)

iinner join与where的区别:inner join是ANSI SQL的标准规范,使用inner join连接语法能确保不会忘记连接条件。where子句在某些时候会影响查询的性能

3.不等值查询(inner join)

  • 与等值查询的原理相同,就是查询的连接条件不是=号,就是不等值查询

4.自连接查询

  • 概念:在一个连接查询中,设计的表都是同一个表,称为自连接查询(是一种特殊的内连接)
  • 特点:在物理上为同一个表,但逻辑上分为两张表

MySQL:25---内连接、外连接查询(inner join、left join、right join)

  • 查询的是一个表,为了产生二义性,对表使用别名
  • where连接两个表,并按照第2个表的f_id对数据进行过滤

5.自然连接(natural join)

  • 首先根据表关系中相同名称的字段进行记录匹配,然后去掉重复的字段。
  • 还可以理解为在等值连接中把目标列中的重复的属性列去掉,成为自然连接

MySQL:25---内连接、外连接查询(inner join、left join、right join)

二、外连接查询(left join、right join)

概念:内连接只返回符合查询条件和连接条件的行。外连接查询的结果中不仅包含符合条件的行,还包括左表(左外连接或左连接)或右表(右外连接或右连接)的所有数据行

分类:

  • 左外连接或左连接(返回包括左表中的所有记录和左表中连接字段相等的记录)
  • 右外连接或右连接(返回包括右表中的所有记录和右表中连接字段相等的记录)

create table orders
(
o_num   int           not null auto_increment,
o_date   datetime not null,
c_id        int           not null,
primary key(o_num)
);

  • outer关键字可以省略

1.left join(左外连接)

  • 在customers和orders表中,查询所有客户,包括没有订单的客户,SQL语句如下
  • 因为左外连接会显示左表所有的数据,而c_id为10002的用户没有o_num,所以显示为NULL

MySQL:25---内连接、外连接查询(inner join、left join、right join)

2.right join(右外连接)

  • 同理,因为右外连接会显示右表所有的数据,而o_num等于30004的订单没有相应的c_id,所以显示为NULL

MySQL:25---内连接、外连接查询(inner join、left join、right join)

三、符合条件连接查询

概念:在连接查询的过程中,通过添加过滤条件,限制查询的结果,使查询的结果更加准确

  • 在customers和orders表中,使用inner join语法查询customers表中的ID为10001的客户的订单信息

MySQL:25---内连接、外连接查询(inner join、left join、right join)

  • 在fruits和suppliers表之间,使用inner join进行内连接查询,并对查询结果进行排序

MySQL:25---内连接、外连接查询(inner join、left join、right join)