精华内容
下载资源
问答
  • 10g中的几个概念(表空间,数据库名,实例名   解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是...
    oracle 10g中的几个概念(表空间,数据库名,实例名
     
    解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。
    表空间的设计理念:
    1.Oracle表空间之基本概念
       ORACLE数据库被划分成称作为表空间的逻辑区域——形成ORACLE数据库的逻辑结构。一个ORACLE数据库能够有一个或多个Oracle,而一个表空间则对应着一个或多个物理的数据库文件。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引、聚簇、回退段和临时段等。

      每个ORACLE数据库均有SYSTEM表空间,这是数据库创建时自动创建的。SYSTEM表空间必须总要保持联机,因为其包含着数据库运行所要求的基本信息(关于整个数据库的数据字典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE软件产品要求的表)。 
      一个小型应用的ORACLE数据库通常仅包括SYSTEM表空间,然而一个稍大型应用的ORACLE数据库采用多个表空间会对数据库的使用带来更大的方便。 
    2.Oracle表空间之作用 
      表空间的作用能帮助DBA用户完成以下工作: 
      1.决定数据库实体的空间分配; 
      2.设置数据库用户的空间份额; 
      3.控制数据库部分数据的可用性; 
      4.分布数据于不同的设备之间以改善性能; 
      5.备份和恢复数据。 
      用户创建其数据库实体时其必须于给定的表空间中具有相应的权力,所以对一个用户来 
      说,其要操纵一个ORACLE数据库中的数据,应该: 
      1.被授予关于一个或多个表空间中的RESOURCE特权; 
      2.被指定缺省表空间; 
      3.被分配指定表空间的存储空间使用份额; 
      4.被指定缺省临时段表空间。 
     
    一、数据库名
    1.数据库名的概念
         数据库名(db_name)就是一个数据库的标识,就像人的身份证号一样。如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。
    数据库名在$ORACLE_HOME/admin/db_name/pfile/init.ora文件中
    ###########################################
    # Database Identification
    ###########################################
    db_domain=""
    db_name=orcl
        在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
    2.数据库名的作用
         数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
         有很多Oracle安装文件目录是与数据库名相关的,如:
         winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...
         又如参数文件pfile:
         winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729
         如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也要指明DB_NAME。
    3.修改数据库名
      建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。
      现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
    (1)关闭数据库。
    (2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
    (3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
    4.查询当前数据库名
       方法一: select name from v$database;
       方法二:show parameter db
       方法三:查看参数文件
    二、数据库实例名
    1.数据库实例名的概念(instance_name)
          先来解释以下,实例是什么东西。实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合,它根本不需要一个与其相关联的数据库,没有任何数据文件也可以启动实例。下面是Oralce的启动过程:
       sqlplus / as sysdba
       sql>startup nomount #启动了一个实例,现在SGA分配了,进程在运行,除数据库所有的东西都启动了
       sql>alter database mount#利用控制文件(init.ora文件中指定)定位重作文件、数据文件、临时文件
       sql>alter database open#数据库可供任何人通过这个实例访问。
        所以可以这么理解:大家访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
       实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。
    实例名和SID是一一对应的,名字相同,但在存储位置不同。
    2.实例和数据库   
        实例和数据库之间的区别如下:
      (1)实例是临时的,它只在相关的进程和内存集合存在时存在;数据库是永久的,只要文件存在它就存在
      (2)一个实例在其生存期内可安装和打开单个数据库;数据库可以被很多实例安装和打开,或者一个接一个的实例安装和打开,或者由多个实例同时安装和打开(RAC)
          顺便提一下RAC,简单来说RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每天机器运行一个实例,每个实例都打开同一个数据库 (这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。
         数据库实例名(instance_name)用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。例如,要去连接一个数据库服务器,就必须知道其数据库实例名,只知道数据库名是没有用的。与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数 据库名和实例名可以相同也可以不同。在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群) 中,数据库名和实例名是一对多的关系(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安 全运行) 。
    3.查询当前数据库实例名
    方法一:select instance_name from v$instance;
    方法二:show parameter instance
    三、ORACLE_SID
        在实际中,对于数据库实例的标识有时使用实例名,有时使用ORACLE_SID,它们有什么区别呢?
    (ORACLE_SID)
    OS<----------------> ORACLE 数据库 <--------(instance_name(实例名))
        上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但 instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到;而ORACLE_SID参数则是操作系统环境变量,与 ORACLE_BASE、ORACLE_HOME等用法相同,用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在winnt平台,是“TNS:协议适配器错误”。
    四、数据库域名与全局数据库名
     1.概念与联系  
         使用数据库名(da_name)对一个数据库进行唯一标识,这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数 据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了db_domain参数,这样在数 据库的标识是由db_name和db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们 将db_name和db_domain两个参数用‘.’连接起来,表示一个数据库,并将该数据库的名称称为global_name,即它扩展了 db_name。db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。
        数据库域名(db_domain):定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。
        全局数据库名(global_name):对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法标识数据库。该值是在创建数据库时决定的,缺省值为db_name. db_domain。在以后对参数文件中db_name与db_domain参数的任何修改不影响global_name的值,如果要修改 Global_name,只能用alter database rename global_name to 命令进行修改,然后修改相应参数。
    2.查询数据库域名
           方法一:select value from v$parameter where name = 'db_domain';
           方法二:show parameter domain
           方法三:在参数文件中查询
    3.例子
    全国交通GIS系统的分布式数据库,其中:
    吉林节点: jl.jtgis
    吉林长春节点: cc.jl.jtgis
    河北节点: hb.jtgis
    河北石家庄节点:sjz.hb.jtgis
    这些就是数据库域名,数据库域名在存在于参数文件中,她的参数是db_domain.
    全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:orcl.jl.jtgis
    五、数据库服务名    
          该参数是oracle8i新引进的。在8i以前,我们用SID来表示数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多网络服务名,设置繁琐。为了方便并行环境中的设置,引进了service_name参数。该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。
        该参数的缺省值为db_name.db_domain,即等于global_name.如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库 服务名与数据库名相同。一个数据库可以对应多个service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即 service_name 不必与SID一样。
          从Oracle8i开始的oracle网络组件,数据库与客户端连接的主机字符串使用的是数据库服务名。之前用的是SID,即数据库实例名。
    查询数据库服务名
         方法一:select value from v$parameter where name = 'service_name';
         方法二:show parameter service_name
    六、网络服务名
          网络服务名(net_service_name),又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在 tnsnames.ora文件中。
    可以通过netmgr来新建网络服务名。
      网络服务名是从客户端的角度出发,当客户端连接远程数据库或其他服务时,可以指定网络服务名。因此需要使用一个或多个命名方法将此Net服务名解析为连接数据库或其他服务的连接描述符,看下面:
      [本地]——将存储在本地客户机的tnsnames.ora文件中的网络服务名解析为连接描述符。
      [Oracle Names]——由Oracle名字服务器提供为网络上的每个Oracle Net服务提供解析方法
      [主机名]——通过TCP/IP环境中的主机别名连接到Oracle数据库服务
      [Sun NIS]/[DCE CDS]——专用系统用的,在Windows 2000系统环境下不适用
     
    ===============================================================================================

    2012-02-23 12:02 54人阅读 评论(0) 收藏 举报
     刚接触ORACLE的人肯定会对实例和数据库感到困惑,实例到底代表些什么?|
    为什么会有这个概念的出现?
    ORACLE实例 = 进程 + 进程所使用的内存(SGA)
    实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态
    数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
    数据库是永久的,是一个文件的集合

    ORACLE实例和数据库之间的关系
    1.临时性和永久性
    2.实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
    3.一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数
    据库
    4.一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分
    的体现!

    下面对实例和数据库做详细的诠释:
    在Oracle领域中有两个词很容易混淆,这就是“实例”(instance)和“数据库”(database)。
    作为Oracle术语,这两个词的定义如下:
    数据库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle 10g的自动存储
    管理(Automatic Storage Management,ASM)或RAW分区时,数据库可能不作为操作系统
    中单独的文件,但定义仍然不变。
    实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算
    机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到
    磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,
    不过你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。

    这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库
    可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准
    确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例
    子。是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是
    一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;
    而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任
    何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也
    成立:一个数据库上只有一个实例对其进行操作。不过,Oracle的真正应用集群(Real
    Application Clusters,RAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的
    多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理
    磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高
    度可用的系统,可用于构建可扩缩性极好的解决方案。

    下面来看一个简单的例子。假设我们刚安装了Oracle 10g10.1.0.3。我们执行一个纯软件安装,
    不包括初始的“启动”数据库,除了软件以外什么都没有。
    通过pwd命令可以知道当前的工作目录(这个例子使用一个Linux平台的计算机)。我们的
    当前目录是dbs(如果在Windows平台上,则是database目录)。执行ls–l 命令显示出这个
    目录为“空”。其中没有init.ora 文件,也没有任何存储参数文件(stored parameter file,SPFILE);
    存储参数文件将在以后讨论。


    使用ps(进程状态)命令,可以看到用户ora10g运行的所有进程,这里假设ora10g是Oracle
    软件的所有者。此时还没有任何Oracle数据库进程。

    然后使用ipcs 命令,这个UNIX命令可用于显示进程间的通信设备,如共享内存、信号量等。
    目前系统中没有使用任何通信设备。

    然后启动SQL*Plus(Oracle的命令行界面),并作为SYSDBA连接(SYSDBA账户可以在数据
    库中做任何事情)。连接成功后,SQL*Plus报告称我们连上了一个空闲的实例:

    我们的“实例”现在只包括一个Oracle服务器进程,见以下输出中粗体显示的部分。此时
    还没有分配共享内存,也没有其他进程。


    现在来启动实例:

    这里提示的文件就是启动实例时必须要有的一个文件,我们需要有一个参数文件(一种简单
    的平面文件,后面还会详细说明),或者要有一个存储参数文件。现在就来创建参数文件,
    并放入启动数据库实例所需的最少信息(通常还会指定更多的参数,如数据库块大小、控制
    文件位置,等等)。

    然后再回到SQL*Plus:

    这里对startup命令加了nomount选项,因为我们现在还不想真正“装载”数据库(要了解
    启动和关闭的所有选项,请参见SQL*Plus文档)。注意,在Windows上运行startup命令之
    前,还需要使用oradim.exe实用程序执行一条服务创建语句。现在就有了所谓的“实例”。
    运行数据库所需的后台进程都有了,如进程监视器(process monitor,PMON)、日志写入器
    (log writer,LGWR)等,这些进程将在以后详细介绍。

    再使用ipcs 命令,它会首次报告指出使用了共享内存和信号量,这是UNIX上的两个重要的
    进程间通信设备:

    注意,我们还没有“数据库”呢!此时,只有数据库之名(在所创建的参数文件中),而没
    有数据库之实。如果试图“装载”这个数据库,就会失败,因为数据库根本就不存在。下面
    就来创建数据库。有人说创建一个Oracle数据库步骤很繁琐,真是这样吗?我们来看看:

    这里创建数据库就是这么简单。但在实际中,也许要使用一个稍有些复杂的CREATE DATABASE
    命令,因为可能需要告诉Oracle把日志文件、数据文件、控制文件等放在哪里。不过,我
    们 现 在 已 经 有 了 一 个 完 全 可 操 作 的 数 据 库 了 。 可 能 还 需 要 运 行
    $ORACLE_HOME/rdbms/admin/ catalog.sql脚本和其他编录脚本(catalog script)来建立我们
    每天使用的数据字典(这个数据库中还没有我们使用的某些视图,如ALL_OBJECTS),但不
    管怎么说,数据库已经有了。可以简单地查询一些Oracle V$视图(具体就是V$DATAFILE、
    V$LOGFILE和V$CONTROLFILE),列出构成这个数据库的文件:

    Oracle使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关
    闭这个数据库,再试图打开,就会发现数据库无法打开:


    一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,
    必须先丢弃这个实例,并创建一个新的实例。
    重申一遍:实例是一组后台进程和共享内存。
    数据库是磁盘上存储的数据集合。
    实例“一生”只能装载并打开一个数据库
    数据库可以由一个或多个实例(使用RAC)装载和打开。
    前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才
    导致人们很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。
    不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有5个不同的数据库。测试
    主机上任意时间点只会运行一个Oracle实例,但是它访问的数据库每天都可能不同(甚至
    每小时都不同),这取决于我的需求。只需有不同的配置文件,我就能装载并打开其中任意
    一个数据库。在这种情况下,任何时刻我都只有一个“实例”,但有多个数据库,在任意时
    间点上只能访问其中的一个数据库。所以,你现在应该知道,如果有人谈到实例,他指的就
    是Oracle的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访
    问一个数据库,但是一个实例一次只能访问一个数据库。

    展开全文
  • python中的and和or运算逻辑--短路逻辑

    千次阅读 2018-04-09 19:20:48
    原文链接为了防止原文链接失效,所以复制了一份。python中 and 和 or ...在Python中,None、任何数值类型中的0、字符串“”、元组()、列表[]、字典{}都被当作False,还有自定义类型,如果实现了 __ nonzer...


    原文链接

    为了防止原文链接失效,所以复制了一份。

    python中 and 和 or 运算的核心思想 ——— 短路逻辑

    1. 包含一个逻辑运算符

      首先从基本的概念着手,python中哪些对象会被当成 False 呢?而哪些又是 True 呢?

    在Python中,None、任何数值类型中的0、空字符串“”、空元组()、空列表[]、空字典{}都被当作False,还有自定义类型,如果实现了  __ nonzero __ () 或 __ len __ () 方法且方法返回 0 或False,则其实例也被当作False,其他对象均为True。

      下面是最简单的逻辑运算:

        True  and True    ==> True                  True  or True    ==> True
        True  and False   ==> False                 True  or False   ==> True
        False and True    ==> False                 False or True    ==> True
        False and False   ==> False                 False or False   ==> False

      利用上面两点我们就可以举一些例子:

    example 1

        >>> a = [0, 1, '' ,3]
        >>> a[0] and a[1]
        0

      a[0] = 0 , a[1] = 1 , 所以 a[0] and a[1] 就变成了 0 and 1 (False and True),所以为 0 (False)。

    example 2

        >>> a = [0, 1, '' ,3]
        >>> a[2] and a[1]
        ''

      两个同时为 False ,返回左边的值。

    2. 包含两个及以上的逻辑运算符

      逻辑运算符 and / or 一旦不止一个,其运算规则的核心思想就是短路逻辑。好的,那我们就来了解一下短路思想(本人归纳,可能与网上其他人的有些出入,且听我慢慢分析):

    表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。

    表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。

    若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。

      可能有点抽象,没关系,我们接下来就举一些例子。

      这里有一个巧妙的方法,能让我们直观地了解 python 处理这些逻辑语句时的短路情况(我也是跟别人学的)

      好了,就让我们从简单的开始,假设全是 and 语句 或者全是 or 语句:

    example 1

        1>  def a():
        2>      print 'A'
        3>      return []
        4>  def b():
        5>      print 'B'
        6>      return []
        7>  def c():
        8>      print 'C'
        9>      return 1
        10> def d():
        11>     print 'D'
        12>     return []
        13> def e():
        14>     print 'E'
        15>     return 1
        16>
        17> if a() and b() and c() and d() and e():
        18>     print 'ok'
        
        #显示结果如下
        A
        

      a() 为假 ,其后均为 and 语句,全部短路,最终只返回 a() 的表达式。记住,所有被短路的表达式均不会被输出。所以,此处仅仅打印 A 。

    example 2

        1>  def a():
        2>      print 'A'
        3>      return 1
        4>  def b():
        5>      print 'B'
        6>      return 1
        7>  def c():
        8>      print 'C'
        9>      return []
        10> def d():
        11>     print 'D'
        12>     return []
        13> def e():
        14>     print 'E'
        15>     return 1
        16>
        17> if a() and b() and c() and d() and e():
        18>     print 'ok'
    
        #显示结果如下
        A
        B
        C

      python 从左至右先执行 a() ,a() 返回的逻辑值为 True,后面是 and 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() and b() 输出 b() 的逻辑值 True,接着与 c() 进行逻辑运算,b() and c() 输出 c() 的逻辑值 False,而其后均为 and 语句, 则全部短路,最终只打印了 A B C 。

    example 3

        1>  def a():
        2>      print 'A'
        3>      return 1
        4>  def b():
        5>      print 'B'
        6>      return []
        7>  def c():
        8>      print 'C'
        9>      return 1
        10> def d():
        11>     print 'D'
        12>     return []
        13> def e():
        14>     print 'E'
        15>     return 1
        16>
        17> if a() or b() or c() or d() or e():
        18>     print 'ok'
    
        #显示结果如下
        A
        ok

      a() 的逻辑值为 True ,其后均为 or 语句,全部短路,最终只打印了 A,而 if 语句为 True ,所以还要打印一个 ok。

    example 4

        1>  def a():
        2>      print 'A'
        3>      return []
        4>  def b():
        5>      print 'B'
        6>      return []
        7>  def c():
        8>      print 'C'
        9>      return 1
        10> def d():
        11>     print 'D'
        12>     return []
        13> def e():
        14>     print 'E'
        15>     return 1
        16>
        17> if a() or b() or c() or d() or e():
        18>     print 'ok'
    
        #显示结果如下
        A
        B
        C
        ok

      python 从左至右先执行 a() ,a() 返回的逻辑值为 False,后面是 or 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() or b() 输出 b() 的逻辑值 False,接着与 c() 进行逻辑运算,b() or c() 输出 c() 的逻辑值 True,而其后为 or 语句, 则全部短路,最终只打印了 A B C ok。


      下面我们就来讲一下 and 与 or 语句同时存在的情况:

    example 5

        1>  def a():
        2>      print 'A'
        3>      return []
        4>  def b():
        5>      print 'B'
        6>      return []
        7>  def c():
        8>      print 'C'
        9>      return 1
        10> def d():
        11>     print 'D'
        12>     return []
        13> def e():
        14>     print 'E'
        15>     return 1
        16> def f():
        17>     print 'F'
        18>     return 1
        19> def g():
        20>     print 'G'
        21>     return []
        22> def h():
        23>     print 'H'
        24>     return 1
        25>
        26> if a() and b() and  c() and d() or e() and f() or g() and h():
        27>     print 'ok'
    
        #输出结果如下:
        A
        E
        F
        ok

      别以为语句很长就很难,我们好好分析一下,从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。最终只打印了A E F ok 。(结合我总结的短路逻辑的三点好好理解,应该没问题。

    3. 三元运算操作符

      在python2.5 之前,python 是没有三元操作符的,Guido Van Rossum 认为它并不能帮助 python 更加简洁,但是那些习惯了 c 、 c++ 和 java 编程的程序员却尝试着用 and 或者 or 来模拟出三元操作符,而这利用的就是python的短路逻辑。

      三元运算操作符 bool ? a : b ,若 bool 为真则 a ,否则为 b 。

      转化为 python 语言为:

            bool and a or b

      如何理解呢? 首先 a , b 都为真,这是默认的。如果 bool 为真, 则 bool and a 为真,输出 a ,短路 b 。如果 bool 为假,短路 a,直接 bool or b ,输出 b 。

      换一种更简单的写法:

            return a if bool else b


    本文参考资料(在此表示感谢!):

    [Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑 

    python的“短路”效应

    Python 里 and、or 的计算规则是怎样的?

    python and与or

    深入Python(3): and、or以及and-or

    python 短路逻辑和条件表达式

    展开全文
  • 基于均匀概率无穷乘积在匕ukasiewicz三值命题逻辑中引入了公式可靠真度概念,证明了全体公式可靠真度值之集在[0,1]中没有孤立点;利用可靠真度定义了可靠相似度和伪距离,进而建立了逻辑度量空间,证明了...
  • MySQL中的重要概念

    2019-07-18 09:44:01
    1、什么是数据库事务?事务有什么特点? (1)数据库事务:指作为单个逻辑工作单元执行一系列操作,这些操作要么...(2)外键所在列可以重复,也可以未,但是不能创建对应表不存在外键值。 3、truncate...

    1、什么是数据库事务?事务有什么特点?
    (1)数据库事务:指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元。
    (2)事务的特点:
    1)原子性;
    2)一致性;
    3)隔离性;
    4)持久性。

    2、主键和外键的区别
    (1)主键所在的列的值是唯一的,而且不能为空;
    (2)外键所在的列可以重复,也可以为空,但是不能创建对应表中不存在的外键值。

    3、truncate与delete的区别
    在这里插入图片描述
    4、索引的作用和优缺点
    (1)作用:索引可以大大提高系统检索的性能。
    (2)优缺点
    1)优点:
    A、加快数据的检索速度;
    B、保证数据库表中每一行数据的唯一性;
    C、加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
    D、减少查询中分组和排序的时间;
    E、在查询的过程中,使用优化隐藏器,提高系统的性能。
    解释:优化隐藏就是指在执行查询语句、使用多表连接检索或者指定查询语句操作的对象表时,明确地指出应该使用的查询方法、连接算法或者对表的操作方式。

    2)缺点:
    A、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
    B、索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大了。
    解释:聚簇索引也叫簇类索引,是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。
    C、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    5、创建索引都有哪些注意的事项
    (1)适合创建索引的情况:
    1)在经常需要搜索的列上,可以加快搜索的速度;
    2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
    3)在经常用在连接的列,可以加快连接的速度。
    4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
    5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序的查询时间。
    6)在经常使用在where子句中的列上面创建索引,加快条件的判断速度。

    (2)不适合创建索引的情况
    1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引并不能提高查询速度。相反,由于增加了索引,反而降低系统的维护速度和增加了空间需求。
    2)对于那些只有很少数据值(唯一性差)的列也不应该增加索引。这是因为,由于这些列的取值很少,增加索引并不能明显加快检索速度。
    3)对于那些定义text、image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
    4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

    6、SQL语句分为哪几类?
    (1)DDL(Data Definition Language):数据定义语言,定义对数据库对象的操作,如:库、表、列和索引,代表指令:CREATE、TRUNCATE、ALTER、RENAME。
    (2)DML(Data Mainpulation Language):数据操作语言,定义对数据库记录的操作,代表指令:INSERT、UPDATE、DALATE、SELECT等。
    (3)MCL(Data Control Language):数据控制语言,定义对数据库、表、字段和用户的访问权限和安全级别。代表指令:GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。

    7、MySQL存储引擎是什么?有哪些?
    (1)存储引擎:指数据库管理系统存储数据、建立索引和更新查询数据等技术的实现方法。
    (2)存储引擎分类:MySQL的核心就是插件式存储引擎、支持多种存储引擎,如:MyISAM、InnoDB、Memory三个引擎,它们的特性不同。InnoDB支持事务,MyISAM不支持事务;InnoDB不支持全文索引,MyISAM引擎支持全文索引。

    8、MySQL支持哪些索引?
    1)主键索引(primary key);
    2)唯一索引(unique);
    3)普通索引(index);
    4)全文索引(fulltext)。

    9、什么是存储过程?
    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象(call)来调用存储过程。

    10、视图的优缺点
    (1)优点:
    1)可以有选择性的选取数据库里的一部分;
    2)用户可以通过简单的查询从复杂的查询中得到结果;
    3)视图可以从多个表中检索数据,维护数据的独立性;
    4)对于相同的数据可以产生不同的视图;
    5)视图可以提高安全性,因为需要足够的访问权限。

    (2)缺点:性能影响
    因为查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么就无法更改数据。

    11、列举几种表连接方式以及区别?
    (1)连接方式:
    1)内连接;
    2)外连接;
    3)自连接;
    4)交叉连接;

    (2)连接方式说明:
    1)内连接:只有两个元素表相匹配才能在结果集中显示。
    2)外连接:
    A、左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配不会显示。
    B、右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的数据全部显示,匹配表的不匹配就不显示。
    C、全外连接:连接的表中不匹配的数据全部会显示出来。
    3)交叉连接:笛卡尔效应,显示的结果时连接表数的乘积。。

    12、数据库三范式
    1)第一范式:确保每列保持原子性;
    2)第二范式:确保表中的每列都和主键相关;
    3)第三范式:确保表中的每列都和主键列直接相关。
    注意:数据库设计最重要的是看性能和需求,需求>性能>表结构,不能一味的去追求范式建立数据库。

    13、SQL的关键字执行顺序

    from > on > join > where >group by > with > having > select > distinct > order by > limit
    

    14、场景分析
    【例】如果右1000万条数据,执行库查询时如何提高查询效率?
    问题分析:从1000万这个数字可以定位到考察数据量特别大的情况下如何提升查询效率。
    (1)数据库设计方面
    1)建立索引;
    2)数据表分区;
    3)尽量使用固定长度的字段;
    4)限制字段长度;
    5)分表、分库。

    (2)数据库I/O方面
    1)增加缓冲器;
    2)涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度;
    3)改善物理设备,比如更换固态硬盘;

    (3)在SQL语句方面
    1)优化SQL语句,较少比较次数;
    2)限制返回的记录数,进行分页查询;

    展开全文
  • 概念:实际上是基于前面元素和后面元素之间一种相邻关系结构 特点: 1.是由n(n>=0)个元素组成有序序列 2.都有唯一第一个元素和唯一一个最后元素,当n=0时,线性表为表。线性 表每个元素,初第一...
    (1)线性表
    概念:实际上是基于前面元素和后面元素之间的一种相邻关系的结构
    特点:
    1.是由n(n>=0)个元素组成的有序序列
    2.都有唯一的第一个元素和唯一一个最后元素,当n=0时,线性表为空表。线性


    表每个元素,初第一个外,都有且仅有一个前驱元素,初最后一个元素外,都有


    且仅有一个后续元素
    3.在该序列中,所有的元素都有相同的结构,要么是同样类型的数据,要么是同


    样类型的复杂结构。


    (2)顺序表
    概念:顺序表是线性表在顺序存储形式下构成的表
    特点:
    1.顺序表的存储是指在内存中,在一段连续的存储单元中存储的线性表。
    2.逻辑结构上相邻的数据元素(直接前驱和直接后续)在存储位置(或物理位置)


    上也相邻。根据上述只要知道首地址和每个数据元素所占的字节数,就可以求出


    第n个数据元素的地址


    (3)链表
    概念:链表也是一种有顺序的表,其内容可以存储在一组任意的存储单元中,所


    谓任意的存储单元,即这组存储单元可以是连续,也可以是不连续的,这就需要


    在存储元素本身信息的同时,还有存储下一个元素的位置,由此构成一个链状结


    构,称其为链表。
    特点:
    1.链表的头部(头结点)只表示整个链表的起始位置,而无任何信息。对于最后


    一个结点(尾结点),后面无任何元素,其表示元素的位置的地址用“^”来表


    示,程序实现中用“null”来表示
    2.每个结点都有两个区域(数据域和指针域)。
    3.每个操作都从头结点开始
    4.每个节点的指针域都指向下一个结点的地址,尾节点除外(尾节点的指针域为


    null)


    (4)线性表的逻辑结构
    概念:相邻元素之间所满足的前驱和后续的逻辑关系。
    特点:
    1.每个元素都有唯一的前驱和后续,起始元素和结束元素除外(起始元素只有后


    续,结束元素只有前驱)


    (5)线性表的存储结构
    概念:线性表在计算机中的表示形式,可以分为顺序存储结构和链式存储结构
    特点:
    (1)顺序存储结构用一段连续的空间来存储,有利于节省存储空间
    (2)链式存储结构存储在一组任意的存储单元,所谓的任意存储单元,即这组存


    储段元可以是连续的,也可以是不连续的
    展开全文
  • 要想学好数据结构中的树,就必须要理解树的基础概念,要不然会越学越乱 树:是n(n>=0)个结点的有限集合,n=0时,称为树,树是属于逻辑结构 而任意非空树应满足: 1)有且仅有一个特定的称为根的结点 2)当n>...
  • python中 and 和 or 运算的核心思想 ——— 短路逻辑 ...在Python中,None、任何数值类型中的0、字符串“”、元组()、列表[]、字典{}都被当作False,还有自定义类型,如果实现了 __ nonzero __ () 或 __ l...
  • 复数向量的概念高中就有学过,而所谓内积空间则是两个向量上函数并返回一个标量二元运算,它结果是欧几里得空间标准内积。两个向量点积写作a·b,数量积及标量积。相信学过高数同学应该不会陌生。 对于...
  • 通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现指针的时候进行打日志或其他操作。 注:如果对Java8新特性中的lambda表达式与Stream不熟悉的可以去补一下基础,了解概念。 首先...
  • 1.1 数据模型 1.1.1 二维表: 关系数据库就是用户所看到的二维表集合形式的数据库。...一个表中的一个列或一组列,用于引用同一个表或另一个表中的主键。 如果外键是主键的一部分,则FK不能为。 1.1.4 列完整性 ...
  • ——这个概念应该是这几个概念中最好理解一个,但是值得一提是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大量逐字节编号大数组,然后把这个数组叫做物理地址...
  • linux高端内存和低端内存的概念

    千次阅读 2013-03-18 13:44:06
    高端内存是Linux一个重要的概念,初涉Linux时曾经对这个概念非常迷惑。实际上这个概念比较简单,理解这个概念,需要追溯一下Linux内存管理。  从前,CPU地址总线只有32位。32地址总线无论是从逻辑上还是...
  • 其实啊,我们把HBase想象成一个大映射关系,再者,本来,HBase存储数据可以理解为一种key和value映射关系,但有不是简简单单映射关系那种,... 列在列簇依照字典排序。例如,列簇是基础信息或公司域名或...
  • 概念的外延是一个集合。外延的集合指代的是概念。 所以可以把集合论(包括集合的定义和运算)看作是逻辑的形式化表示。 1....外延中的对象与概念的关系: a ...首先约定:空概念 Æ ;论域 R :是逻辑运算的前提...
  • 二叉树基本概念:二叉树是递归定义,其节点有左右子树之分,逻辑上二叉树有五种形态:1)二叉树 2)只有一个根节点二叉树 3)只有左子树 4)只有右子树 5)完全二叉树 二叉树创建 private static class ...
  • RTOS特点: 必须要有一个中断,其服务要保证在一个给定时间内完成...硬件开销部分,从中断到来,过了若干个周期才会把中断标志位IFR置位,然后通过对IFR的逻辑判断是否响应中断,需要话,把指令流水线排,然后
  • 基本概念

    2018-12-02 18:05:52
    基本概念 图 G 是由两个集合:顶点集 V(G) 和边集 E(G) 组成,记作G=( V(G),E(G) ),简称G=(V,E)。 V是顶点有穷非空集合 ...不同结构中逻辑关系对比 在线性结构,数据元素之间仅具有线性关系; 在...
  • 二叉树基本概念

    2018-10-25 22:16:25
    树形结构也是由结点(结构中的逻辑单元,可用于保存数据)和结点之间的连接关系(一种后继关系)构成。 1. 几个基本概念 1.1 二叉树定义: 二叉树是结点的结点的有穷集合。这个集合或者是空集,或者其中有一个称为根...
  • 数据库几个概念

    2019-02-14 20:07:10
    关系模型完整性约束 实体完整性:关系必须有主键,...  索引是一种数据库对象(数据结构),是一个单独、物理数据库结构,它是某个表一列或若干列值集合和相应指向表物理标识这些值数据页的逻辑...
  • 基本概念

    2020-09-13 12:23:58
    一 概述 树是n(n>=0)个节点的有限集。当n=0时,称为树。在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点。 当n>1时,其余节点可分为m(m>... 树中的所有结点可以有零个或
  • 关系模型基本概念

    万次阅读 2019-05-03 12:21:24
    关系数据结构:关系模型只包含单一数据结构----关系,在用户看来关系模型数据的逻辑结构是一张扁平二维表 关系操作(操作对象和结果都是集合): 查询:选择、投影、连接、并、差、交、笛卡尔积 更新...
  • 链表的概念及结构

    2019-07-25 16:34:31
    首先我们知道链表在逻辑上是有前后关系的,在物理结构上不保证有前后关系,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 在实际中,链表的结构非常多样,要学习链表就要知道链表常用的变量的含义,在链表...
  • 异常概念 异常是发生在程序执行过程中阻碍程序正常执行的错误事件,当一个程序出现...Java中的异常处理机制主要处理运行时错误。 异常分类: 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。 抛...
  • 线性表基本概念

    2018-03-02 10:57:27
    设序列第i(i表示逻辑位序)个元素为ai(1≤i≤n),线性表一般表示为: (a1,a2,…ai,ai+1,…,an)其中a1为第一个元素,又称做表头元素,a2为第二个元素,an为最后一个元素,又称做表尾元素。 ...
  • 线性表 (一)、定义【逻辑结构】 线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列,其中n为表长,当n = 0时线性表...ai是线性表中的“第i个”元素线性表中的位序 a1是表头元素;an是表尾元素。 除第一个元
  • Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在,那么把一组data files 捻在一起就成为一个表空间; 在ORACLE数据库,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下...
  • 模块:从逻辑上组织python代码(变量,函数,类等),本质就是.py结尾的python脚本文件,例如test.py 模块名为 test 包:逻辑上用来组织模块,本质上是一...import的本质是将模块中的代码执行一遍,并赋值给模块名...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 620
精华内容 248
关键字:

逻辑中的空概念