笛卡儿积
多表查询,书写方式,表名之间用,号隔开。这样多张表里面的数据全部查出来,查出来的方式就是笛卡尔及的方式(完全组合)
这样查出来的数据,有很多是无效的数据.
内连接
可以通过设计数据库的时候,表与表之间的属性关联查询,过滤出有效的信息,
显式内连接
SELECT * FROM employee e1,enterprise e2 WHERE e1.enterpriseId = e2.id
内连接就是红色的部分。左右连接就是绿加红 右外连接 就是黄加红
隐式内连接:
隐式内连接和显式内连接没有本质区别
外连接:
以一张表为基础,将这张表的所有数据全部查出来,然后跟另一表有关联,如果关联到则显示该信息,如果没有关联则显示null
左外连接
SELECT * FROM employee e1 LEFT JOIN enterprise e2 ON e1.emploeeId=e2.id;
右外连接
SELECT * FROM employee e1 RIGHT JOIN enterprise e2 ON e1.emploeeId=e2.id;
表的别名
使用表的别名有两种原因:
1. 为了方便
2. 如果有重复的表中进行多表查询,则必须使用别名
1. 直接在表的名字后面加空格,然后起新的名字
SELECT * FROM employee e1,enterprise e2 WHERE e1.enterpriseId = e2.id
2. As 与直接取名没有区别 但是看sql语句会比较容易查看
SELECT * FROM employee AS e1,enterprise As e2 WHERE e1.enterpriseId = e2.id
查询总结:
1. oid 通过对象主键查询
2. Hql 推荐使用
3. Criteria 单表查询
4. Sql (更复杂的查询)
5. 对象导航查询
Hql多表查询
内连接
String hql="from Employee e inner join e.Enterprise";
查出来的结果封装的一条记录中也是一个集合
第一条是Employee职工信息 也包含企业信息
第二条是Enterprise企业信息
内容重复了 迫切内连接只返回一个对象
String hql="from Employee e inner join fetch e.Enterprise";
from Employee e left join e.Enterprise
右外连接
from Employee e right join e.Enterprise
Feach 迫切 加了关键字,最总的结果集封装的就是一个对象,不加就封装成一个集合