SQL查询_高级查询
一、子查询
子查询出现的位置一般为条件语句,oracle会先执行子查询,再执行父查询,子查询会单独运算,不会与其他数据源进行笛卡尔积运算,子查询可以访问父查询的数据源,父查询不能访问子查询的数据源,子查询可以出现在插入、更新、查询、删除当中,更加有效的限制where子句中的条件
语句:select * from employee where emp_id in (select emp_id from employee where emp_salary>5000);
语句:select * from employee e where exists (select emp_id from t_employee where emp_id=e.emp_id);
二、联合查询
联合查询是对查询结果集的操作,包含union(并集,会去重)、union all(并集,显示重复的数据)、intersect(交集)、minus
2.01、 union查询union查询将两个查询结果进行并集操作,并将重复的记录删除,相当于执行并集操作后,再执行一次distinct
语句:
select '张三' newname,5000 newsalary from dual union select emp_name newname,emp_salary newsalary from employee;
NEWNAME NEWSALARY
-------------------- ----------------------
韩明 4500
李丽 6000
李四 4500
王兰 4600
张三 5000赵飞 6000
备注:union操作的各结果集,只要把证列数相同,且各列的类型一致,列名可以不一致 ,若列名不一致,同一使用第一个查询结果集中的列名
2.02、 union all查询union all查询也是并集操作,但不删除重复的记录
语句:select '张三' newname,5000 newsalary from dual union all select emp_name newname,emp_salary newsalary from employee;
NEWNAME NEWSALARY
-------------------- ----------------------
张三 5000
张三 5000
李四 4500
赵飞 6000
韩明 4500
王兰 4600李丽 6000
2.03、 intersect查询intersect查询用于两个结果集的交集
语句:select '张三' newname,5000 newsalary from dual intersect select emp_name newname,emp_salary newsalary from employee;
NEWNAME NEWSALARY
-------------------- ----------------------
张三 5000
2.04、 minus查询
minus查询可以看作集合间的减法运算,第一个集合看成被减数,第二个看成减数
语句:select emp_name newname,emp_salary newsalary from employee minus select '张三' newname,5000 newsalary from dual;
NEWNAME NEWSALARY
-------------------- ----------------------
韩明 4500
李丽 6000
李四 4500
王兰 4600赵飞 6000三、联接
联接用于指定多数据源(表、视图)之间如何组合,以形成最终的数据源 ,包含:自然联接、内联接、外联接:左联接、外联接:右联接、外联接:完全联接
3.01、自然联接
自然联接将两个数据源中相同名称的列进行联接,不必明确指定执行联接的列,关键字:natrual join
语句:select * from employee natural join department;
EMP_DEPARTMENT EMP_ID EMP_NAME ID POSITION
-------------------- -------------------- -------------------- -------------- --------------------
设计部 0001 张三 0001 深圳
工程部 0005 王兰 0003 上海
工程部0002李四0003 上海项目部0006李丽 0002 深圳
项目部0004韩明 0002 深圳
项目部0003赵飞 0002 深圳
备注:其中EMP_DEPARTMENT是两个表中的相同列,EMP_ID 、EMP_NAME是employee 表中的列, ID、POSITION是department中的列,自然联接根据两个表中相同的列联接,显示两个表中的所有列,无多大实际意义,联接列必须同名
3.02、内联接
内联接需要在from中使用联接条件,可以自行定义所要联接的列
语句:
select * from employee e inner join department d on e.emp_id=d.id;EMP_ID EMP_NAME EMP_DEPARTMENT ID EMP_DEPARTMENT POSITION
-------------------- -------------------- ---------------------- -------------- -------------------------------- -----------------------------------------
0001 张三 设计部 0001 设计部 深圳
0003 赵飞 项目部 0003 工程部 上海
0002 李四 工程部 0002 项目部 深圳
内联接一般可以用where 代替,在开发中比较少用 ,内联接会将两数据源中联接列中相同的值显示出来
3.03、外联接___左联接
外联接与内联接不同,内联接中的两个数据源的地位是并列关系,二者具有平等的关系,而外联接将其中的一个数据源指定为基表(主表),另一个数据源可以看作为附表 ,在最终的数据源中,一定含有基表中的数据,而附表中的数据是否出现,则以具体的联接条件而定,左联接中left jion左边的表为主表,右边的表为附表
语句:select * from employee e left join department d on e.emp_id=d.id;
EMP_ID EMP_NAME EMP_DEPARTMENT ID EMP_DEPARTMENT POSITION
-------------------- -------------------- ----------------- --------- ------------------ ---------------
0001 张三 设计部 0001 设计部 深圳
0003 赵飞 项目部0003 工程部上海0002 李四 工程部0002 项目部深圳
0004 韩明 项目部
0005 王兰 工程部0006 李丽 项目部
备注:主表employee 中的所有数据都显示left join中省略了outer,实际为left outer join
3.04、外联接___右联接
右表联接中right join 右边的表为主表,左边的表为附表
语句:select * from employee e right join department d on e.emp_id=d.id;
EMP_ID EMP_NAME EMP_DEPARTMENT ID EMP_DEPARTMENT POSITION
-------------------- -------------------- -------------------- ---------- -------------------- --------------------
0001 张三 设计部 0001 设计部 深圳
0002 李四工程部0002 项目部深圳0003 赵飞项目部0003 工程部上海
0007 商务部 深圳
3.05、外联接___完全联接
完全联接是左联接和右联接的组合,先执行一个左联接,再执行一个右联接,最后将两个结果集执行union操作,从而获取最终的数据源
语句:select * from employee e full join department d on e.emp_id=d.id;
EMP_ID EMP_NAME EMP_DEPARTMENT ID EMP_DEPARTMENT POSITION
-------------------- -------------------- -------------------- ---------- -------------------- --------------------
0001 张三 设计部 0001 设计部 深圳
0002 李四 工程部 0002 项目部 深圳
0003 赵飞 项目部 0003 工程部 上海
0004 韩明 项目部
0005 王兰 工程部
0006 李丽 项目部0007 商务部 深圳
备注:尽量避免使用完全联接,会降低查询性能