`
tigers20010
  • 浏览: 48602 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2009-12-07传智播客 数据库——orcale表连接和子查询 (转载)

阅读更多
数据库比较枯燥,我说的是使用数据库不是做数据库。总是用SQL语句那么跑来跑去,想把数据库讲解的十分有趣,着实不是一件容易的事。只是在PLSQL里编写SQL语句,然后调用、查看结果。虽然数据库很枯燥,但它在项目中的功用却是十分重要的。我原未如此的深入使用过数据库,近两天一见,其功能也让我十分兴奋,以前自己写的小东西,走了些弯路!




     无论如何还是要搞好数据库的,尤其是Oracle数据库。明天是最后一天学习数据库了,终于要把这块阵地给解放了!


     OK,来看重点内容吧!




     常用的分组函数,这个比较重要,在其他数据库中也有:

1.        AVG,求平均值。如果某一记录为null,则不加入平均值的计算。(不加入被除数)

2.        COUNT,求表中所有符合条件的记录数。如果某一记录为null,则不计算在内!

3.        MAX,求最大值。

4.        MIN,求最小值。

5.        SUM,求合。



还有一个特殊的函数NVL,将字段值为空的记录替换为指定的值,AVG(NVL(commission_pct,0)。比如上面的AVG函数将null记录剔除在外。这样调用就不会把null值的记录剔除在外了:NVL(AVG(NVL(commission_pct,0)))。



Group by 子句,是最低级的运算语句,它被放置在语句的最后,对Group by子句分组的记录进行过滤应使用having语句。Where是用于Group by之前的记录过滤。在Select列表中出现的字段,如果不是在组函数中,那么它必须也被放置到Group by子句中。



接下来是十分重要的内容:多表连接和子查询!



首先让我们来回顾一下“外键”字段,比如有一个部门表,有一个员工表。员工表中使用的部门ID就是一个外键,这个部门ID就是部门表中的ID。这样设计有益于节省空间、快速查询和易于管理等特点。这样的表查询的操作比较多,我们应该如何实现便利、快速的查询呢?难道从员工表中取出部门ID然后再到部门表中查询这个ID?NO,这样太麻烦了,访问量多了,明显会使速度降下来。所以表连接出现了!表连接就是将多个表,根据表之间的相关字段关系连接起来,就像一张表一样。对这一大张表的操作十分方便、快捷!



Oracle的语法,使用表连接从多个表中查询数据:

SELECT          table1.column, table2.column

FROM                            table1, table2

WHERE          table1.column1 = table2.column2;

在 WHERE 子句中写入连接条件。

当多个表中有重名列时,必须在列的名字前加上表名作为前缀。



例,查询员工的姓名和所在部门:



其中的E和D分别是表EMP和表DEPT的别名,这里不能使用AS。

EMP表中的DEPTNO字段是个外键,它指向DEPT表中的DEPTNO。



在Oracle中都有哪些表连接?在Oracle8i之前有:

1.        等值连接 – Equijoin,这是连接操作中最常见的一种。通常在存在主外键约束条件的多表上建立的,连接中的两个字段通过等号建立等值关系。如上面的例子是使用主外键对两个表的连接,还可以对多个表连接,此时可以使用AND增加WHERE子句的连接条件。

2.        非等值连接 -- Non-equijoin。例,通过EMP表和SALGRADE(薪水等级)表,查询员工薪水所处等级:



语句也可写成:

SELECT E.ENAME,E.JOB,S.GRADE

FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL


使用JOIN ON语句,更直观些!它是9i中加入的,可以使用多个JOIN ON语句,连接多个表,它们之间不需要添加任何关键字,比如“AND”。

3.        外连接 -- Outer join,外连接可以查询出不满足条件的记录,它分为左外连接和右外连接(继续关注下面9i中的外连接)。

左外连接:



正是子句中的“(+)”起的作用,这样将DEPTNO表中的所有记录都显示出来了,即使有没有员工的部门也显示了。

右外连接:



正是子句中的“(+)”起的作用,将EMP表中的记录全部显示出来了,即使没有部门的员工也显示了。

4.        自连接 -- Self join,就是连接自己。例,取对员工对应的领导:



因为公司所有职员都在一张表中(包括领导),所以为了查找出对应员工的领导,使用了自连接。自连接就像是为自己创建了一个引用。



到Oracle9i时,新增加的连接(SQL1999适应性连接):

1.   交叉连接 -- Cross joins,产生了一个笛卡尔积,就象是在连接两个表格时忘记加入一个WHERE子句一样。相互交叉,返回的记录数正好是两个表记录数的乘积。转一个兄弟对交叉链接的介绍:http://tech.techweb.com.cn/thread-384787-1-1.html



上面的语句与这个功效一样:

SELECT E.ENAME,E.JOB,D.DNAME

FROM EMP E,DEPT D




2.   自然连接 -- Natural joins,基于两个表中列名完全相同的多个列产生连接。从两个表中选出连接列的值相等的所有行,如果两个列的名称相同,但是具有不同的数据类型,则查询会返回一个错误。



EMP表与DEPT表中的DEPTNO字段名称相同,且类型相同。



3.   使用Using子句的连接

如上面(2)的例子,如果两个字段的名称相同,但类型不同就会出现错误。此时可以在语句后边加上USING(字段名)子句,来设置用于等值连接,只要值可比,类型不同也可以。



4.   完全外连接或者左右外连接

左外连接:

显示左边表中所有行,即使在右边的表中没有可对应的列值。这与8i中的右外连接是相同的,但这个更直观的指向左边,而不像8i中那样反着。





右外连接:

显示右边表中所有行,即使在左边的表中没有可对应的列值。这与8i中的左外连接是相同的,但这个更直观的指向右边,而不像8i中那样反着。





完全外连接:显示连接表中的所有记录,包括不存在对应记录的记录。全外连接是对两个表中的记录都不加限制。



5.   搞不懂里边的条件语句还有什么用。不加上就语法错误!(外连接中可以使用任意的连接条件





子查询:

之前我们学习的都是直接使用某一固定或函数返回值做为限定条件,但这能满足我们的操作吗?即使有连接这样看起来十分强大的功能。当然不能,子查询解决了更多的问题!



SELECT select_list

FROM   table

WHERE  expr  operator

(SELECT select_list FROM  table);



1、子查询在主查询前执行一次

2、主查询使用子查询的结果

3、子查询语句中不能使用外部的别名



使用子查询的注意事项:

1、子查询要用括号括起来

2、将子查询放在比较运算符的右边(增强可读性)

3、只有在执行Top-N分析时,子查询中才需要使用Order by子句

4、在Oracle8i之前的版本中,子查询不能包含Order by子句

5、对单行子查询使用单行运算符

6、对多行子查询使用多行运算符



子查询的种类:

1.        单行单列子查询:只包含一个字段的查询,返回的查询结果也只包含一行数据

2.        多行单列子查询:只包含了一个字段,但返回的查询结果可能多行或者零行

3.        多列子查询:包含多个字段的返回,查询结构可能是单行或者多行。



单行子查询所使用的比较运算符:

Operator
Meaning

=
Equal to

>
Greater than

>=
Greater than or equal to

<
Less than

<=
Less than or equal to

<>
Not equal to


例,查询薪金小于平均薪金的员工,对他们加强培训提高工作技能,涨工资:





多行子查询所使用的比较运算符:

Operator
Meaning

IN
与IN列表中任意一个值相等

ANY
与子查询返回的任意一个值比较,ANY通常与大小写符号搭配使用,不单独使用。可以是<ANY 和>ANY :

<ANY 小于子查询数据中的最大值

>ANY 大于子查询数据中的最小值

ALL
与子查询返回的每一个值比较,ALL通常与大小写符号搭配使用,不单独使用。可以是<ALL 和>ALL :

>ALL 指大于子查询数据中的最大值

<ALL 指小于子查询数据中的最小值




例,查询出比平均工资高的员工,给他们升职和更多成长的机会:





以上都只是简单的举了几个例子,函数和语句等组合应用,会让你感到吃惊,功能惊人。当然,我也这只是一个程序员对数据库的了解。DBA玩的就深一些,那里有更强大的功能,主要是对表优化的。先不深入了,这些够用了,明天讲解Oracle触发器、存储过程、视图等!



下面例出三个今日老冯给我们做的练习:
1. 查询各个管理者的编号及其手下员工的最低工资,其中最低工资不能低于1200,没有管理者的员工不计算在内。





2. 查询所有部门的名称,loc,员工数量和工资平均值。





3. 查询在loc为纽约的部门工作的员工的员工号,ename,deptno,job(使用连接查询,子查询两种查询方式)







OK,欢迎明天的到来,数据库这块算是完了!



加油!



分享到:
评论

相关推荐

    orcale表连接和子查询

    在Oracle中,表连接和子查询是两种关键的查询技术,用于从多个表中获取数据和执行复杂的逻辑。 首先,我们来看看表连接。表连接允许我们将两个或多个相关表的数据合并在一起,以便在一个查询中同时获取多个表的信息...

    orcale数据库连接字符串

    orcale数据库连接字符串

    Pl\Sql连接Orcale远程数据库无需安装Orcale客户端

    标题中的“Pl\Sql连接Oracle远程数据库无需安装Oracle客户端”意味着我们可以使用PL/SQL Developer这款工具,不依赖Oracle客户端软件,就能实现对远程Oracle数据库的连接和管理。Oracle客户端通常包含许多组件,如...

    用数据库连接池连接orcale数据库

    在IT行业中,数据库连接池是优化数据库操作的关键技术之一,特别是在高并发的Web应用程序中。数据库连接池允许程序管理预设数量的数据库连接,避免了每次请求时创建新连接的开销,提高了性能并减少了资源消耗。本篇...

    Orcale数据库全方面学习-第四课

    根据给定的文件信息,我们可以总结出以下关于Oracle数据库中多表查询的重要知识点: ### Orcale数据库全方面学习-第四课:多表查询 #### 详细介绍 **标题**:“Orcale数据库全方面学习-第四课”表明这是一系列...

    pdm连接oracle数据库

    ### pdm连接oracle数据库知识点详解 #### 一、PDM简介与Oracle数据库连接的重要性 产品数据管理(Product Data Management, PDM)系统是企业信息化的重要组成部分,用于管理与产品相关的所有数据,包括设计文档、...

    orcale数据库超详细ppt

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,以其高效、稳定和强大的功能而闻名。这份"Oracle数据库超详细PPT"显然是一份全面深入的学习资料,旨在帮助用户快速掌握Oracle数据库的操作与管理。...

    Orcale数据库全方面学习-第六课

    根据提供的文件信息,本文主要介绍了Oracle数据库中的子查询(subquery)概念及其应用。子查询是一种重要的SQL查询技术,能够嵌套在另一个查询之中,帮助解决复杂的数据筛选问题。接下来,我们将详细介绍子查询的...

    geoserver2.14.0 oracle 数据库连接

    在GIS(地理信息系统)领域,GeoServer是一款广泛使用的开源服务器软件,它...记住,安全性和性能优化也是在实际操作中需要考虑的重要因素,例如定期更新JDBC驱动,合理配置数据库连接池,以及根据需要调整查询性能。

    安装BarTender后链接ORCALE数据库报错。 未找到Orcale客户端和网络组件。

    安装BarTender后链接ORCALE数据库报错。 未找到Orcale客户端和网络组件。这些组件是由Orcale公司提供的,是Orcale7.3.3版(或更高)客户软件安装的一部分。 已安装客户端仍然报错 研究很久,内附所有资料信息

    mysql+orcale表生成实体

    综上所述,"mysql+orcale表生成实体"涵盖了数据库与编程语言之间的桥梁——ORM,以及如何通过注解来描述这种映射关系。这不仅简化了数据库操作,也使得代码更具有可读性和可维护性。然而,需要注意的是,虽然ORM带来...

    Orcale数据库操作笔记

    在数据库查询方面,SQL(结构化查询语言)是与Oracle交互的主要工具。基本的查询语句包括SELECT,用于从表中检索数据。例如,"SELECT * FROM 表名;" 可以获取表中的所有数据。更复杂的查询可能涉及WHERE子句进行条件...

    数据库基础——SQL语言全面学习

    例如,DDL用于创建和修改表结构,DML用于插入、更新和删除数据,DQL用于查询数据,DCL则用于控制数据库访问权限。在第3章中,详细介绍了SQL的语法和使用。 4. **数据连接**: 数据连接是将不同数据源的数据集成在...

    DB2和orcale数据库表分区方法和数据库的备份与恢复

    DB2和Oracle数据库表分区方法和数据库备份与恢复 DB2数据库表分区是指将大型表拆分为多个小的、独立的部分,每个部分称为一个分区。分区的目的是为了提高表的可管理性、可扩展性和查询性能。DB2数据库提供了 RANGE ...

    Oracle连接查询子查询以及存储过程触发器讲解

    在Oracle中,连接查询和子查询以及存储过程与触发器是数据库管理与开发中的核心概念,下面将对这些主题进行深入讲解。 首先,让我们探讨**连接查询**。在数据库操作中,连接查询用于合并两个或更多表的数据,根据...

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    您可能感兴趣的文章:常用的Oracle doc命令(收藏)Oracle 多行记录合并/连接/聚合字符串的几种方法Oracle中字符串连接的实现方法php连接oracle数据库及查询数据的方法plsql连接oracle数据库报ora 12154错

    Oracle数据库3种主要表连接方式对比

    ### Oracle数据库三种主要表连接方式对比 在Oracle数据库中,为了获取来自多个表的数据,我们需要使用不同的连接方式来实现这一目的。本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL...

    Excel通过VBA连接Oracle数据库

    2. **创建Recordset对象**:Recordset对象用于存储从数据库查询到的结果。你可以通过Connection对象的`Execute`方法执行SQL查询,返回一个Recordset。 ```vba Dim rs As New ADODB.Recordset rs.Open "SELECT * ...

    企业级数据库(orcale)\第09讲

    【企业级数据库(Oracle)——第09讲】 在企业级数据库管理中,Oracle数据库系统是全球广泛应用的关系型数据库管理系统之一,尤其在大型企业和金融机构中占据主导地位。本讲主要聚焦于Oracle数据库的核心特性和使用...

    c# 连接oracle数据库和对数据库的基本操作

    总的来说,C#与Oracle数据库的连接和操作主要依赖于Oracle提供的ODP.NET库。通过`OracleConnection`、`OracleCommand`和相关的数据访问对象,你可以轻松地执行各种数据库操作。请确保在实际应用中,根据具体需求调整...

Global site tag (gtag.js) - Google Analytics