格式:select * from 表1,表2 得到的查询结果是两张表数据的乘积,然后拼接起来的表。在实际开发中没有太大的意义。
真正的开发中,这样的才是常用的:select * from emp e1 ,dept d1 where e1.deptno=d1.deptno;这就是常用到的表拼接。
内连接:隐式内连接:
等值内连接,和我们上边的例子是一样的。e1.deptno=d1.deptno;
自连接:
显示内连接:select * from 表1 inner join 表2 on 连接条件;inner关键字可以省略。
外连接左外连接:left outer join ;左表中的全部的记录,如果右表没有记录就显示为空
右外连接:right outer join;右表用的所有记录,如果左表没有对应的记录就显示为空。
子查询:查询语句里边嵌套查询语句。通过嵌套来解决复杂的问题。需求:查询最高工资的员工信息。select * from emp where sal=(select max(sal) from emp);
多行子查询需要注意的问题:一定要注意空值的问题,控制不代表不占空间。最好的方法是加上一个判断 先来一个子查询,查出所有的不为空的数据行,再做多行查询。
exists(查询语句):存在的意思。数据量比较大的时候是非常高效的。
伪列是用来表示行号,系统自动生成的。rownum不能做大于号判断,这能小于号判断。
select rownum ,e1.* from emp e1 where rownum>2; 查询出来的结果是空。因为不能做大于号判断。
其它练习:
去除表中重复的记录:
并集运算:union union all
查询语句1 union 查询语句2 ;得到的结果是去重后的结果,并且会根据第一列进行默认的排序。
查询语句1 union all 查询语句2 ;得到的是全部的结果,即使有重复的也会保留。
差集运算:关键字 minus
查询语句1 minus 查询语句2 ;
集合运算中的注意事项:列的类型要一致,最好是列按照顺序写,否则就会列的类型不匹配。列的数量也一定要一致,否则就会报错 。如果数据来源与两张不同的表,两张表的列又不相同,那么谁少列,就用null来补齐。