Oracle数据库入门之多表连接与子查询
Oracle表连接 概述:SQL/Oracle使用表连接从多个表中查询数据 格式:select 字段列表 from table1,table2 where table1.column1=table2.column2; 说明:当被连接的多个表中存在同名字段时,必须在该字段前加上table.作为前缀 如果没有限定where连接条件,否
Oracle表连接
概述:SQL/Oracle使用表连接从多个表中查询数据
格式:select 字段列表 from table1,table2 where table1.column1=table2.column2;
说明:当被连接的多个表中存在同名字段时,必须在该字段前加上“table.”作为前缀
如果没有限定where连接条件,否则就会出现笛卡尔集的不现实或没有实用意义的结果
举例:select empno, ename, sal, emp.deptno, dname, loc from emp, dept;--这时得到的就是笛卡尔集。此时得到70条记录
select empno, ename, sal, emp.deptno, dname, loc from emp, dept where emp.deptno=dept.deptno;--得到14条记录
类型:Oracle8i之前的表连接(支持SQL92标准):等值连接(Equijoin)、非等值连接(Non—Equijoin)、自连接(Self join)
外连接(Outer join):左外连接、右外连接
Oracle9i新引入的连接形式(支持SQL99规范):交叉连接(Cross join)、自然连接(Natural join)、使用Using或On子句建立连接
内连接(Inner join)、外连接(Outer join):左外连接、右外连接、全外连接
补充:多表连接中可使用AND操作符增加查询条件,使用表别名可以简化查询,使用表名(表别名)前缀可提高查询效率
而连接n个表,则至少需要n-1个连接条件。如select a.ename, a.deptno, b.dname from emp a, dept b where a.deptno=b.deptno;
样本:hr帐户也是Oracle自带的样本帐户,里面有很多样本表,其数据量及复杂程度都要比scott强一些
hr帐户缺省是锁定的,可以在OEM中将其解锁并设密码。其中的employees表是scott中的emp表的增强版
另外还有departments和locations表的数据看起来都比较真实。这三个表通常用于复杂的多表连接查询
等值连接(Equijoin)
举例:select empno, ename, emp.deptno, dname from emp, dept where emp.deptno=dept.deptno;
非等值连接(Non—Equijoin)
问题:如何查得每个员工的工资等级
举例:select empno, ename, sal, grade 工资等级 from emp,salgrade where sal between losal and hisal;
外连接(Outer join)
概述:外连接运算符为(+)。使用外连接可以看到参与连接的某一方不满足连接条件的记录
传统的外连接分为左外连接和右外连接两种。实际开发中,外连接的使用频率要比等值连接少一些
语法:select 字段列表 from table1,table2 where table1.column1(+)=table2.column2;
select 字段列表 from table1,table2 where table1.column1=table2.column2(+);
说明:table1.column1(+)=table2.column2;--显示所有符合条件的记录,同时table2中不符合连接条件的记录也会显示出来
table1.column1=table2.column2(+);--显示所有符合条件的记录,同时table1中不符合连接条件的记录也会显示出来
补充:在SQL99规范中,内连接(Inner Join)只返回满足连接条件的数据,,而外连接还返回不满足连接条件的行
分类:左外联接(Left Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行
右外联接(Right Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行
满外联接(Full Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的行
举例:select employee_id, last_name, salary, department_id, department_name
form employees left join departments using(department_id);--返回107行
自连接(Self join)
概述:自连接诶本质就是把一个表当作两个表来使用,只是定义不同的别名而已
平时很少使用自连接,但有时确实只有采用自连接的方式才能解决某些问题
问题:如何查得每个员工及其上司的工号和姓名
举例:select a.empno, a.ename, a.mgr, b.ename from emp a, emp b where a.mgr=b.empno;
SQL99连接语法
概述:SQL1999规范中规定的连接查询语法。两个以上的表进行连接时应依次分别指定相临的两个表之间的连接条件
语法:select 字段列表
from table1
[cross join table2]|
[natural join table2]|
[join table2 using(字段名)]|
[join table2 on(table1.column_name=table2.column_name)]|
[(left|right|full outer)join table2 on(table1.column_name=table2.column_name)];
[cross join table3]|
[natural join table3]|
[join table3 using(字段名)]|
[join table3 on(table2.column_name=table3.column_name)]|
[(left|right|full outer)join table3 on(table2.column_name=table3.column_name)]...;
说明:如果感觉新语法比较混乱,在没有强制性要求的时候,完全可以使用旧语法,二者不存在效率上的差异
交叉连接(Cross join)
概述:Cross join产生了一个笛卡尔集,其效果等同于在两个表进行连接时未使用WHERE子句限定连接条件
举例:select empno, ename, dname from emp a cross join dept b;--交叉连接实际上没有太大的意义
自然连接(Natural join)
概述:Natural join基于两个表中的全部同名列建立连接。从两个表中选出同名列的值均对应相等的所有行
如果两个表中同名列的数据类型不同,则出错。而且不允许在参照列上使用表名或别名作为前缀
举例:select demno, ename, sal, deptno, dname from emp natural jon dept;
Using子句
概述:如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求
可以在连接时使用USING子句来设置用于等值连接的列(参照列)名
同样不允许在参照列上使用表名或别名作为前缀
举例:select empno, ename, sal, deptno, dname form emp join dept using(deptno);
On子句
概述:如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用ON子句
举例:select empno, ename, sal, emp.deptno, dname from emp join dept on(emp.deptno=dept.deptno);
子查询(Sub Query)
概述:子查询在主查询前执行一次,主查询使用子查询的结果。比如查询所有比张三工资高的员工信息
子查询分为单行子查询(返回一行结果)和多行子查询(返回多行结果)两大类
语法:select 字段列表 form table where 表达式 operator(select 字段列表 from table);
比如select * from emp where sal>(select sal from emp where empno=7654);
注意:基于未知值的查询应考虑使用子查询。子查询必须包含在括号内
建议将子查询放在比较运算符的右侧,以增强可读性。除非进行Top—N分析,否则不要在子查询中使用ORDER BY子句
对单行子查询可以使用单行记录比较运算符。而对多行子查询则只能使用多行记录比较运算符
空值:如果子查询未返回任何行,则主查询也不会返回任何结果
比如select * from where sal>(select sal from emp where empno=8888);--不会返回任何结果
多值:如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符
比如select * from emp where sal>(select avg(sal) from group by deptno);--非法
TopN查询(TopN分析)
概述:即获得按照某种规则排序之后的前n条的记录。Oracle中通常采用子查询的方式实现TOPN查询
其实子查询可以认为是查到了一个临时表,或没有名字的临时视图
语法:select 字段列表 from (select 字段列表 from table order by 排序字段) where rownum
举例:select * from (select * from emp order by sal desc) where rownum
伪列rownum
概述:SELECT查询结果中会隐含的增加一个字段rownum,即伪列。rownum用起来很灵活,但也很容易出错
rownum伪列并不是数据表中或者子查询的虚拟表中真实存在的列,它只是查询结果中的一个伪列
它标记的是符合查询条件的结果的编号,第一条记录的rownum值为1,第二条记录的rownum值为2
可以理解为,符合查询条件的第一行记录编号为1,符合查询条件的第二行记录编号为2
例一:select * from emp where rownum>=5;--它执行后的结果是没有返回值
执行时先取出结果集中的,或者说是数据表中的第一条记录,并标记第一条记录的编号为1
判断后得知1小于5,不符合条件。随后便过滤掉这条记录了,接着判断下一条记录是不是符合条件
于是就又取出下一条记录,下一条记录的rownum还是从1开始。而rownum永远是从1开始的,结果可想而知
接着的下一条记录的编号还是1。即照此情形下去,记录的编号永远不会符合大于等于5的条件
也就是说在这条SQL语句的环境下,rownum永远也不会大于等于5。所以就不能指望用rownum进行区间排序
也就是说rownum>=5 and rownum
例二:select * from emp where rownum
该句执行后并不会得到预期的结果。虽然也会得到5条记录,但并不是工资降序排列后的前5个值
它返回的是emp表中的前5行记录,只不过显示的时候是按照工资进行降序排列之后的效果
执行时会先对where条件进行过滤,过滤后得到了原表中的前5条记录。然后再对表的前5条记录排序并输出
很显然这并不是我们想要得到的。我们希望的是先排序,排好了顺序之后再获取前面的5行信息
但若写成select * from emp order by sal desc where rownum
所以只能通过子查询的方式在一条语句中结合rownum伪列来实现TopN查询
分页:在JavaWeb编程中,经常会遇到分页显示的问题。有时需要在某一页显示一个区间的记录
比如显示第21条到第30条记录。在这种情况下,单纯的TopN查询显然不能满足要求
这时可以让子查询中的伪列变成一个真实存在的列,或者说让它变成能够进行比较运算的真实的列
述一:select rownum, a.* from (select * from emp order by sal desc) a;
这里如果将a.*写成*的话,就会出现缺失表达式的错误。而子查询不是真实的表,所以只能靠它的别名
它的运行结果是显示原emp中的所有记录,而且还多出了一列ROWNUM的记录,列值是从1到14的连续数字
此时的rownum还是虚的,仍然不能执行where rownum>=5 and rownum
因为rownum实际上是等于本次查询14行记录中的每一行记录的伪列号
从第一行开始永远等于1,如果不符合大于等于5的条件的话,第一行记录就会被过滤掉了
而下一行记录的伪列号还是从1开始的,便又会出现“例一”中的结果,所以此时仍不能进行区间排序
述二:这时可以给rownum起一个别名,如myno。然后再把刚才的整条语句作为一个子查询
即select * from (select rownum myno, a.* from (select * from emp order by sal desc) a);
整个括号括起来的又充当了一个子查询。这个子查询会得到n+1条记录,其中第一条记录是myno字段
这时的myno就是一个实际存在的结果了。如果把子查询当作一个真实的表,这个表中应该有n+1个字段
都是真实存在的字段,一个字段叫myno,其它的是原来emp中的所有字段
然后在语句中将查询条件where myno>=5 and myno
这时再执行整条语句,得到的就是预期中的结果,即emp中工资排名在第5到第10名之间的员工信息
模板:select * from (select rownum myno, a.* from (select * from emp order by sal desc) a) where myno>=5 and myno
这就是在Oracle中利用TopN查询实现分页显示效果的SQL语句,也可以把当前的语法格式当作一个模板来记住
子查询可以当作是一个表,假想这个表是物理存在的,里面有n+1个真实存在的字段,其中一个字段叫myno
如果这时把条件改成where rownum>=5 and rownum
因为这个rownum指的根本不是子查询中的返回的结果rownum,而是这一次主查询中又得到的一个伪列

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

Oracle에 대한 솔루션은 개설 할 수 없습니다. 1. 데이터베이스 서비스 시작; 2. 청취자를 시작하십시오. 3. 포트 충돌을 확인하십시오. 4. 환경 변수를 올바르게 설정하십시오. 5. 방화벽이나 바이러스 백신 소프트웨어가 연결을 차단하지 않도록하십시오. 6. 서버가 닫혀 있는지 확인하십시오. 7. RMAN을 사용하여 손상된 파일을 복구하십시오. 8. TNS 서비스 이름이 올바른지 확인하십시오. 9. 네트워크 연결 확인; 10. Oracle 소프트웨어를 다시 설치하십시오.

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

Oracle Cursor Closure 문제를 해결하는 방법에는 다음이 포함됩니다. Close 문을 사용하여 커서를 명시 적으로 닫습니다. For Update 절에서 커서를 선언하여 범위가 종료 된 후 자동으로 닫히십시오. 연관된 PL/SQL 변수가 닫히면 자동으로 닫히도록 사용 절에서 커서를 선언하십시오. 예외 처리를 사용하여 예외 상황에서 커서가 닫혀 있는지 확인하십시오. 연결 풀을 사용하여 커서를 자동으로 닫습니다. 자동 제출을 비활성화하고 커서 닫기를 지연시킵니다.

Oracle에서 FOR 루프 루프는 커서를 동적으로 생성 할 수 있습니다. 단계는 다음과 같습니다. 1. 커서 유형을 정의합니다. 2. 루프를 만듭니다. 3. 커서를 동적으로 만듭니다. 4. 커서를 실행하십시오. 5. 커서를 닫습니다. 예 : 커서는 상위 10 명의 직원의 이름과 급여를 표시하기 위해주기별로 만들 수 있습니다.

Oracle 데이터베이스를 중지하려면 다음 단계를 수행하십시오. 1. 데이터베이스에 연결하십시오. 2. 즉시 종료; 3. 셧다운은 완전히 중단됩니다.

SQL 문은 Oracle의 동적 SQL을 사용하여 런타임 입력을 기반으로 작성 및 실행할 수 있습니다. 단계에는 다음이 포함됩니다 : 동적으로 생성 된 SQL 문을 저장할 빈 문자열 변수 준비. 즉시 실행 또는 준비 명령문을 사용하여 동적 SQL 문을 컴파일하고 실행하십시오. 바인드 변수를 사용하여 사용자 입력 또는 기타 동적 값을 동적 SQL로 전달하십시오. 동적 SQL 문을 실행하려면 즉시 실행 또는 실행을 사용하십시오.

Centos 시스템에서 Hadoop 분산 파일 시스템 (HDF)을 구축하려면 여러 단계가 필요합니다. 이 기사는 간단한 구성 안내서를 제공합니다. 1. 초기 단계에서 JDK를 설치할 준비 : 모든 노드에 JavadevelopmentKit (JDK)을 설치하면 버전이 Hadoop과 호환되어야합니다. 설치 패키지는 Oracle 공식 웹 사이트에서 다운로드 할 수 있습니다. 환경 변수 구성 : /etc /프로파일 파일 편집, Java 및 Hadoop 설정 설정 시스템에서 JDK 및 Hadoop의 설치 경로를 찾을 수 있습니다. 2. 보안 구성 : SSH 비밀번호가없는 로그인 SSH 키 : 각 노드에서 ssh-keygen 명령을 사용하십시오.
