今天我们学习的是多表查询中的连接查询,而连接查询又有以下分类:
- 内连接
- 外连接
- 左外连接
- 右外连接
- 全外连接:MySQL不支持
- 自然连接
今天我们主要学习内容就是内连接以及自然连接。首先我们来了解什么是内连接。内连接也叫连接,是最早的一种连接。内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
内连接对应的sql语句有以下两个:
- 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.列名=别名2.列名
- 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.列名=别名2.列名
1.笛卡尔积
在学习内连接之前,我们首先要知道什么是笛卡尔积。笛卡尔积引用自数学,在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积。
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
数据库user中有两个表,分别是emp表和dept表,他们的笛卡尔积如图1-1所示:
图1-1 笛卡尔积
emp表中的记录数是15,dept表中的记录数是4,而使用:select * from emp,dept语句查询出来的结果集的行数是60行。通过以上sql语句查询的结果其实就是emp表与dept表的笛卡尔积。结果集的左半部分是emp表的数据,右半部分是dept表的数据,其中emp表中每条记录出现的次数是4次,因此结果集的总记录数是60。
我们很少使用表的笛卡尔积,因为笛卡尔积中有很多数据都是没有任何意义的,例如图1-1中的第一条记录,甘宁的deptno是20,而该条记录却和deptno为10的dept表记录连接在一起。
2.内连接(方言)
(1)查询每个员工的信息以及所在部门信息,对应的sql语句是:select * from emp,dept where emp.deptno=dept.deptno,如图1-2所示:
图1-2 内连接
图1-2中有14条记录,以上sql语句的where条件的作用就是去除图1-1中emp的deptno值与dept的deptno值不相同的记录。理论上说图1-2中查询结果应该有15条记录,由于emp表中名为张三的记录,他的deptno的值为50,而dept表中根本没有这个部门,即表示,该条记录不满足连接条件emp.deptno=dept.deptno,因此张三那条记录被过滤掉。
select * from emp,dept where emp.deptno=dept.deptno是内连接的方言形式,所谓方言就是指该条sql语句只适用于mysql数据库,而在其他数据库中就不能进行内连接查询。
之前我们给待查询的列起过别名,在进行多表查询时,我们也可以给表起别名,如:select * from emp e,dept d where e.deptno=d.deptno。表的别名不仅可以在where条件中使用,还可以在select子句后面使用。
3.内连接(标准)
同样查询每个员工的姓名,工资以及部门名称,对应的sql语句是:select e.ename,e.sal,d.dname from emp e inner join dept d on e.deptno=d.deptno。其中on关键字与where关键字有同样的效果,查询结果如图1-3所示:
图1-3 内连接查询
以上查询结果获得的过程可以理解为:首先将两个表做笛卡尔积,然后根据条件去掉不满足要求的,最后再选择ename、sal、dname这三个列。
内连接的标准sql语句中on关键字不能换成where关键字,所谓的标准是指该sql语句不仅适用于MySQL数据库还适用于其他数据库。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/java/253113.html