当前位置: 代码迷 >> 综合 >> 连接,分页
  详细解决方案

连接,分页

热度:24   发布时间:2023-10-18 00:19:34.0

一、连接查询

--1. 内连接:  inner join 2张表建立连接,必须要返回满足条件的数据,数据不能有null值 

--2. 外连接:   outer join 2张表建立连接,必须要返回满足条件的数据,数据可以有null值

   1) 左外连接 :  表名1 left outer join 表名2    ...on  :列出的数据以表1中的数据为主,不会出空值,只会出现在表2

   2)右外连接 :  right outer join   ...on :列出的数据以表2中的数据为主,不会出空值,只会出现在表1

   3) 完全外连接  full join

--3. 自连接:   自己连自己,本质上是内连接,返回满足条件数据。

二、子查询及分类

--概念: 嵌入到另一个select语句中的一个select语句,简称select语句嵌套 ,通过子查询,可以使简单的语句,组成强大的语句  。层次?  

--语法: select ...  (select *   ... (select ...) 

--子查询分类: 1.单行子查询(一行结果)  2.多行(多行)  3. 多列  4.关联  5.嵌套子查询  

1.--单行子查询

--概念: 内部的select语句给外部的select语句返回0行或1行

--单行子查询写在何处? ( 可以加在select,where,having,from  这些位置都可以放置) 

--举例: 查询员工薪水高于smith薪水的员工  

select sal 

from emp 

where sal>(select sal from emp 

where ename=upper('smith'));

2.子查询还可以包含多列

例如,通过多列子查询查询出每个部门员工的最低工资,然后再查询出满足这些条件的商品信息

SELECT deptno, sal FROM EMP  

WHERE (deptno, sal) 

IN (SELECT deptno, MIN(sal) FROM emp GROUP BY deptno);

3.--关联子查询(父查询需要子查询的结果,子查询也需要父查询的结果  )   

--举例: 查询每个部门中,高出本部门平均工资的员工的编号和姓名 

select empno,ename

from emp outer1

where sal>(select avg(sal) from emp inner1 where outer1.deptno=inner1.deptno ) 

 

--查询emp表中是否存在可以管理别的员工的员工  (上级)  --exists

select empno,ename

from emp e1   --上级表

where empno in

(select mgr

from emp e2

where e2.mgr=e1.empno ) --员工表

三、rowid 和rownum

--在Oracle数据库中的每一行都有一个唯一的行标识符,它用于Oracle数据库内部存储行的物理位置。 

例如,查看EMP表的信息

SELECT    ROWID, empno  FROM   EMP;

 

--ROWNUM可以返回结果集的行号,查询返回的第一行编号为1,第二行编号为2,依此类推

例如,查询EMP表的相关信息

SELECT   ROWNUM, empno, ename, deptno  FROM   EMP;

 

--ROWNUM行号并不是永久固定的,是每次动态重新生成的。此时如果想查找第6-10条记录,用between…and…的方式是没有数据的。这个时候要想真正的实现这种查询思路:先查询前10条记录,之后再显示5条记录,要依靠子查询完成。

SELECT * FROM (

SELECT ROWNUM M,EMPNO,ENAME,JOB,HIREDATE,SAL FROM EMP

WHERE ROWNUM<=10

) TEMP    WHERE TEMP.M>5;

按照这种方式,只需要替换掉最大最小值就可以实现分页的思想

 

 

  相关解决方案