SQL连接

SQL中大概有这么几种JOIN:
  cross join
  inner join
  left outer join
  right outer join
  full outer join
  
  他们都是基于cross join(笛卡尔乘积),举例说明
  
  A_test表
   Id a_name a_describe
   1 a11111 a11111
  2 a22222 a22222
  3 a33333 a33333
  B_test表
   Id b_name b_describe
   1 b11111 01
   1 b11111 02
  2 b22222 01
  2 b22222 02
  3 b44444 04
  select * from a_test a //查询出所有a表中的所有记录 3条
  select * from b_test b //查询出所有b表中的所有记录 5条
  
  select * from a_test a cross join b_test b //a b 两表的笛卡尔乘积 即所有的组合 共15条记录
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  1 a11111 a111111 2 b22222 01
  1 a11111 a111111 2 b22222 02
  1 a11111 a111111 4 b44444 01
  2 a22222 a222222 1 b11111 01
  2 a22222 a222222 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  2 a22222 a222222 4 b44444 01
  3 a33333 a333333 1 b11111 01
  3 a33333 a333333 1 b11111 02
  3 a33333 a333333 2 b22222 01
  3 a33333 a333333 2 b22222 02
  3 a33333 a333333 4 b44444 01
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  1 a11111 a111111 2 b22222 01
  1 a11111 a111111 2 b22222 02
  1 a11111 a111111 4 b44444 01
  2 a22222 a222222 1 b11111 01
  2 a22222 a222222 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  2 a22222 a222222 4 b44444 01
  3 a33333 a333333 1 b11111 01
  3 a33333 a333333 1 b11111 02
  3 a33333 a333333 2 b22222 01
  3 a33333 a333333 2 b22222 02
  3 a33333 a333333 4 b44444 01
  select * from a_test a inner join b_test b on a.id = b.id
  //在笛卡尔乘积的结果集中去掉不符合连接条件的行 包含于笛卡尔乘积
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  select * from a_test a left outer join b_test b on a.id = b.id
  //是在inner join的结果集上加上左面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的右表部分每个字段都用NUll填充
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  3 a33333 a333333 NULL NULL NULL
  select * from a_test a right join b_test b on a.id = b.id
  //是在inner join的结果集上加上右面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的左表部分每个字段都用NUll填充
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  NULL NULL NULL 4 b44444 01
  select * from a_test a full outer join b_test b on a.id = b.id
  //是在inner join的结果集上加上左、右两面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的右、左表两部分每个字段都用NUll填充
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  NULL NULL NULL 4 b44444 01
  3 a33333 a333333 NULL NULL NULL

你可能感兴趣的:(sql)