多表查询,使用连接在多表中查询数据
多表查询
在了解了单表查询后,与单表查询类似的想法——多表查询也就应运而生
按照常理,其语法格式与单表查询类似,于是按照我们的想法有如下的代码:
select * from employees;--107
select * from departments;--27
select * from employees,departments order by salary;--27 * 107
但是结果我们发现,employees表中的107行数据,departments中的27行数据,在第三行的结果居然多达107*27条,这是不科学的,一个雇员居然将所有的部门信息全部纳入,这明显是不符合常理的,而这种现象,就被称作笛卡尔积。
-
笛卡尔积
笛卡尔积会在下面条件下产生:- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
因此为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
那如何得到我们想要的数据,就是接下来要学习的内容了。 -
Oracle连接
使用连接在多个表中查询数据。
语法格式SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;
在 WHERE 子句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀-
等值连接
--oracle的等值连接 --当两张表查询时 对于两张表中都存在的字段 则必须指明所查询的字段来自于那张表 使用表名.字段名来指定 -- 在等值连接中 如果一张表中存在null值 而另一张表中不存在 则不会显示该条记录 -- 可以避免笛卡尔积的产生 select first_name,last_name,employees.department_id,department_name from employees,departments where employees.department_id = departments.department_id;
结果得到106条数据,因为员工中有一人没有部门。
同时我们也该了解一下主键外键,如图:
-
表的别名的使用
要知道的是,我们可以在多表查询时,为每张表起一个别名,与之前的别名规则相似,表的别名不能使用as,
区分重复的列名
使用表名前缀在多个表中区分相同的列
在不同表中具有相同列名的列可以用表的别名加以区分
表的别名
使用别名可以简化查询。
使用表名前缀可以提高执行效率
运用这个规则之前的代码可改写为:select first_name,last_name,dept
-