连接查询
在实际开发中,一般一个业务会对应多张表,因此大部分情况下都不是从单表中查询数据,而是多张表联合查询数据从而取出最终的结果。这也是关系型数据库存在的原因。
分类
根据年代划分:
SQL92:旧的语法
SQL99:较新的语法
根据表的连接方式划分:
内连接:分为等值连接,非等值连接,自连接
外连接:分为左外连接(左连接),右外连接(右连接)
全连接
笛卡尔积现象 (笛卡尔乘积现象)
现象:当两张表进行连接查询时,如果没有条件限制的话,最终查询结果条数将会是两张表记录条数的乘积。
避免笛卡尔乘积现象:添加条件进行过滤
取表的别名:提高执行效率,增强可读性
注:添加条件进行过滤并不会减少记录的匹配记录,仍然是两张表记录条数的乘积,只不过最终显示出来的是过滤之后的有效信息而已。
示例:
找到每个员工的部门名称
mysql> select dname,deptno from dept;//部门名称以及部门编号
+------------+--------+
| dname | deptno |
+------------+--------+
| ACCOUNTING | 10 |
| RESEARCH | 20 |
| SALES | 30 |
| OPERATIONS | 40 |
+------------+--------+
4 rows in set (0.00 sec)
mysql> select ename,deptno from emp;//员工名称以及对应部门编号
+--------+--------+
| ename | deptno |
+--------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| WARD | 30 |
| JONES | 20 |
| MARTIN | 30 |
| BLAKE | 30 |
| CLARK | 10 |
| SCOTT | 20 |
| KING | 10 |
| TURNER | 30 |
| ADAMS | 20 |
| JAMES | 30 |
| FORD | 20 |
| MILLER | 10 |
+--------+--------+
14 rows in set (0.00 sec)
使用:select ename,dname from emp,dept;
查出来的结果为两张表记录条数的乘积,即14*4=56。
过程:从员工表的第一位员工开始匹配,依次匹配四个部门而没有进行任何过滤,也就是说每一位员工均和四个部门进行了匹配。
进行 where 过滤:
select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno;
结果为
mysql> select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)
不再有冗余