文章目录

  • 概述
  • 等值连接
  • 两表连接(❤)
  • 三个表连接
  • 不等值连接
  • 外连接
  • SQL99
  • using连接
  • 自然连接
  • 多表连接
  • on子句(❤)
  • 自连接
  • 练习



概述

  • SQL中的表对应Java中的类,从而多个表对应多个类
  • 内连接:内点积,不匹配的行滤除
  • 外连接:外点积

等值连接

  • 不添加过滤条件,会产生笛卡尔积错误
  • 例如:下图若无where条件,则每个员工信息和部门表匹配,左边100条员工记录,右边按理只对应相同部门号的部门名,但没有where条件,右边每个部门名都来匹配

JAVA criteria 多表查询 java多表联合查询_JAVA criteria 多表查询

两表连接(❤)

JAVA criteria 多表查询 java多表联合查询_外连接_02

  • 上图未简写
  • 下图为简写形式
  • 若该列为一表独有,不需要指明,若该列是两表共有,即作为桥梁列,则要显式指明哪个表的这个列
  • 内连接时,若左表在右表中找不到对应的内容,则该项纪录被剔除,如员工属于某部门(左表),部门有部门名(右表),当某员工的部门为null时,则右表找不到,该项记录则被剔除

JAVA criteria 多表查询 java多表联合查询_表连接_03


三个表连接

JAVA criteria 多表查询 java多表联合查询_多表查询_04


不等值连接

JAVA criteria 多表查询 java多表联合查询_外连接_05

  • 使用between and语句

外连接

JAVA criteria 多表查询 java多表联合查询_外连接_06


JAVA criteria 多表查询 java多表联合查询_外连接_07

  • 同理可得右外连接
  • 这种方式不能实现全连接

  • 左表中多了一个数据记录,右表中找不到部门ID与之对应,则少的表(右表)添加“+”,形成左外连接
  • 左外连接:除了两表中都满足的条件输出(内连接)外,额外返回左表中不满足条件的记录
  • 左外连接右边补加号,使得行数相同

SQL99

using连接

  • using局限性在于列名要一样,数据类型也要一样
  • 如下例所示,两个表中的对应列名都叫department_id且数据类型相同才行

自然连接

JAVA criteria 多表查询 java多表联合查询_多表查询_08

  • 所有列名一样来连接,即有多个连接条件(两表中的共有列名都相同作为条件来连接)

多表连接

JAVA criteria 多表查询 java多表联合查询_多表查询_09

  • 多个join和on配套使用,类比添加where过滤条件
  • 好处在于join可修改,如下文

on子句(❤)

JAVA criteria 多表查询 java多表联合查询_外连接_10

  • 左外连接:left join
  • 右外连接:right join
  • 满外连接:full join

自连接

  • 看成特殊的多表连接方式,理解为复制了多份自己的表

JAVA criteria 多表查询 java多表联合查询_表连接_11

  • 用法参照多表等值连接(有无前缀由列名是否共有决定)

练习

JAVA criteria 多表查询 java多表联合查询_多表查询_12

  • 注意第26点
  • JAVA criteria 多表查询 java多表联合查询_表连接_13

  • -
  • 强行左外连接

JAVA criteria 多表查询 java多表联合查询_内连接_14

  • 三个表的连接

JAVA criteria 多表查询 java多表联合查询_JAVA criteria 多表查询_15

  • 隐式三表连接(虽然查询的列名两个表就有,但过滤条件在第三个表中)