学生表数据
班级表数据
部门表数据
内连接 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
1. 交叉连接查询(基本不会使用-得到的是两个表的乘积) (这种查询时候会产生笛卡尔积)
多表查询会产生笛卡尔积:
假设集合a={b,c},集合b={0,1,2},则两个集合的笛卡尔积为{(b,0),(b,1),(b,2),(c,0),(c,1),(c,2)}
实际运行环境线下,应避免使用权笛卡尔积
解决方案:在where加入有效的条件-->等值连接(等值连接找的是列的值一样的数据,跟列名称和列类型无关)
语法:
1.1 select * from A,B;
1.2 select * from A cross join B;
1.3 select * from A natural join B;(自然连接,底层先笛卡尔积,然后按照所有同名同值列自动进行等值筛选。)
2. 内连接查询(使用的关键字 inner join )
隐式内连接: select * from A,B where 条件;
显示内连接: select * from A inner join B on 条件;后面接 两张表中中需要关联的字段 (字段名称不需要一样 A.id = B.id )
select * from A inner join B using 条件;using 后面接 两张表中都存在的字段 (字段名称 一样)
外连接
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).
左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录
右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录
内连接 交叉连接例子
内连接 隐式内连接 等值连接(等值连接找的是列的值一样的数据,跟列名称和列类型无关)
内连接 自然连接(自然连接,底层先笛卡尔积,然后按照所有同名同值列自动进行等值筛选。)
内连接 显示内连接
左外连接(先把dept表的did=3的列的值改为30,让学生表did=3的部门在部门表里不存在)右连接同理。
左外连接的含义:两个表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录