BTN如何设定一张纸怎么做才能变成钱包在运行后不用解锁钱包直接进入挖矿状态。另:设了staking=1或true无效果

新人专享好礼凡未购买过小册的用户,均可领取三张 5 折新人专享券,购买小册时自动使用专享券,最高可节省 45 元。小册新人 5 折券最高可省 15 元小册新人 5 折券最高可省 15 元小册新人 5 折券最高可省 15 元注:专享券的使用期限在领券的七天内。一键领取购买小册时自动使用专享券前往小册首页本活动仅适用于小册新用户知道了Qtum量子链Staking(PoS挖矿)教程Qtum采用PoS共识机制,与比特币等采用的PoW机制有所不同。与比特币中挖矿类似,Qtum PoS机制中称为Staking。每次Staking成功可累计获得至少4 QTUM作为奖励。实际获得奖励一般超过4QTUM,因为交易手续费和合约调用费用也将作为Staking奖励。开始Staking需满足两个基本条件:运行Qtum全节点,并保持在线(不需要矿机,任何PC/Mac,甚至树莓派都可以运行Qtum全节点);拥有QTUM量子币(无论数量多少都可以Staking,但拥有Qtum数量越多,挖到矿的可能性越高)。如果你还没有QTUM量子币,请先通过各种平台获取一定数量QTUM备用。Qtum官方核心钱包可以运行Qtum全节点,是目前唯一支持Staking的钱包。请注意,手机钱包暂不支持Staking。有两种方式进行Staking:方式一:用命令行运行qtumd进行Staking;方式二:用PC版qtum-qt钱包进行Staking。方式一适用于熟悉Linux/OSX/Windows命令行操作的用户,包括树莓派用户;方式二适用于适用有图形界面钱包的用户。读者可以根据自身需求选择其中一种方式进行Staking。两种方式完全等效,Staking(挖矿)效果没有任何区别。qtumd运行和交互的方法请参考教程《》中“获取Qtum节点”和“部署Qtum节点”部分。按照以上教程运行qtumd:./qtumd -daemon
复制代码Staking功能在钱包未加密时将默认开启,无需其他设置。?首先获取钱包地址,命令为:./qtum-cli getnewaddress
复制代码命令将返回一个新生成的地址,地址以Q开头。可以向该地址转入一笔或多笔QTUM用于Staking。读者可以用同样方法生成任意多地址,并向地址中转入任意多笔Qtum进行Staking。注意:刚转入的QTUM需要等待500个区块确认才可用于Staking,即大概需要等待17小时。这与Qtum采用的MPoS共识机制有关,对其运行原理感兴趣的读者可以参考《》进一步了解。在区块同步完成后,可以通过./qtum-cli getbalance查看钱包余额,或./qtum-cli listunspent查看所有UTXO。()。建议在QTUM转入500个区块后再进行以下步骤,因为确认数小于500个的UTXO无法进行Staking。通过以下命令可以查看staking状态:./qtum-cli getstakinginfo
复制代码运行类似结果如下:{
"enabled": true,
"staking": true,
"errors": "",
"currentblocksize": 1000,
"currentblocktx": 0,
"pooledtx": 5,
"difficulty": 280176,
"search-interval": 46,
"weight": ,
"netstakeweight": 9029,
"expectedtime":
复制代码其中enabled代表是否开启Staking功能,该功能是默认开启的;staking代表目前是否有QTUM正在Staking,true即代表正在Sweight代表目前正在staking的Qtum数量,单位是10^-8QTUM,本例子中约0.532QTUM;expectedtime代表目前你挖到矿的期望时间,单位是秒。如果读者不需要对钱包加密,请跳过此步骤。但是钱包未加密状态下,通过钱包收发QTUM将钱包可以通过encryptwallet命令进行加密,进一步保证资金安全。然而,在钱包加密的状态下,Staking功能将被默认关闭。加密后./qtum-cli getstakinginfo将获得如下结果:{
"enabled": true,
"staking": false,
"errors": "",
"currentblocksize": 1000,
"currentblocktx": 0,
"pooledtx": 94,
"difficulty": 171153,
"search-interval": 0,
"weight": ,
"netstakeweight": 1881,
"expectedtime": 0
复制代码注意staking状态变为false,说明没有在Staking。通过如下walletpassphrase命令可以对钱包进行解锁:./qtum-cli walletpassphrase "&你设置的密码&"
复制代码其中第一个参数为用户加密时设置的密码,第二个参数为需要解锁的时间,单位是秒,可以根据用户需要进行设置;第三个参数表示是否只解锁staking功能,设置为true则表示只解锁用于Staking,而发送QTUM仍需要输入密码。若第三个参数缺省,则表示完全解锁钱包,不仅可以Staking,也可以正常发送QTUM。解锁后用getstakinginfo可查看状态,一切正常的话即可以在钱包加密状态下Staking了。Qtum-qt钱包的基本使用方法请参考。目前支持的Mac/Linux/Windows,用户可以自行下载安装。打开已经安装好的Qtum钱包。如果钱包中已有QTUM可跳过此步骤。若钱包中无QTUM,则向钱包地址中转入一定数量的QTUM,方法请参考。注意,新转入的QTUM需要等待500个区块(约17小时)的成熟时间,才可进行Staking。因此,建议用户等待500个区块后再进行以下步骤。通过钱包右下角的闪电标志可以查看Staking的状态。若闪电为实心,表示正在Staking。将鼠标放到闪电标志上,可以看到Staking相关信息,如下图所示:Staking表示正在挖矿;Your weight is表示当前你正在参与Staking的QTUM数量,单位是1QTUM;Network weight is表示网络中正在参与Staking的QTUM数量,单位是1QTUM;Expected time表示挖到矿的期望时间,单位是天。若闪电为空心,表示不在Staking。可能的原因有:钱包里没有超过500个区块确认的QTUM -- 解决方法:这时请向钱包转入QTUM,并等待500个区块(约17小时);钱包处于锁定状态 -- 解决方法:解锁钱包。若无闪电标志,说明禁用了Staking功能钱包未开启staking功能 -- 解决方法:修改运行参数或配置文件,开启Staking。如果用户顺利挖到一个区块,可以累积获得超过4QTUM的奖励。关于挖矿奖励有以下几点需要注意:奖励会以一笔新交易的形式发送给你,命令行用户可通过getbalance命令查看余额变化,qt钱包用户可以直接看到收入的交易;Staking成功,你会立刻收到一笔0.4QTUM的奖励;剩余3.6QTUM的奖励会在500个区块(约17个小时)之后,在连续九个区块中奖励给你,每个区块你将获得0.4QTUM,与上条中0.4QTUM合计共4QTUM;Staking成功的那个币(UTXO)将被锁定500个区块,直到500区块之后才可以进行交易或继续进行Staking。为了不让资金锁定太久,用户可以选择将一个大的UTXO分成若干个较小的UTXO,这样只有挖到矿的那个UTXO会被锁定;这一奖励机制和Qtum采用的MPoS机制有关,有兴趣了解原理的读者可以参考《》。Qtum钱包会默认开启Staking,但有些情况用户或交易所想要关闭该功能。有以下几种方式可以停止Staking:1 命令行用户可以在运行时加上-staking=false选项,如:./qtumd -staking=false -daemon
复制代码启动qt钱包的命令:./qtum-qt -staking=false
复制代码2 在配置文件qtum.conf中添加staking=false,3 锁定钱包,钱包在锁定状态下会自动停止Staking。多位小程序一线的开发团队负责人、开源作者及行业领袖参会,为开发者带来一场关于微信小程序的盛会,八折票限时发售中!分享教程Qtum采用PoS共识机制,与比特币等采用的PoW机制有所不同。与比特币中挖矿类似,Qtum PoS机制中称为Staking。每次Staking成功可累计获得至少4 QTUM作为奖励。实际获得奖励一般超过4QTUM,因为交易手续费和合约调用费用也将作为Staking奖励。开始Staking需满足两个基本条件:运行Qtum全节点,并保持在线(不需要矿机,任何PC/Mac,甚至树莓派都可以运行Qtum全节点);拥有QTUM量子币(无论数量多少都可以Staking,但拥有Qtum数量越多,挖到矿的可能性越高)。如果你还没有QTUM量子币,请先通过各种平台获取一定数量QTUM备用。Qtum官方核心钱包可以运行Qtum全节点,是目前唯一支持Staking的钱包。请注意,手机钱包暂不支持Staking。有两种方式进行Staking:方式一:用命令行运行qtumd进行Staking;方式二:用PC版qtum-qt钱包进行Staking。方式一适用于熟悉Linux/OSX/Windows命令行操作的用户,包括树莓派用户;方式二适用于适用有图形界面钱包的用户。读者可以根据自身需求选择其中一种方式进行Staking。两种方式完全等效,Staking(挖矿)效果没有任何区别。方式一:用命令行运行qtumd进行Staking1. 运行qtumdqtumd运行和交互的方法请参考教程《》中“获取Qtum节点”和“部署Qtum节点”部分。按照以上教程运行qtumd:./qtumd -daemon
Staking功能在钱包未加密时将默认开启,无需其他设置。?2. 转入QTUM量子币首先获取钱包地址,命令为:./qtum-cli getnewaddress
命令将返回一个新生成的地址,地址以Q开头。可以向该地址转入一笔或多笔QTUM用于Staking。读者可以用同样方法生成任意多地址,并向地址中转入任意多笔Qtum进行Staking。注意:刚转入的QTUM需要等待500个区块确认才可用于Staking,即大概需要等待17小时。这与Qtum采用的MPoS共识机制有关,对其运行原理感兴趣的读者可以参考《》进一步了解。在区块同步完成后,可以通过./qtum-cli getbalance查看钱包余额,或./qtum-cli listunspent查看所有UTXO。()。建议在QTUM转入500个区块后再进行以下步骤,因为确认数小于500个的UTXO无法进行Staking。3. 查看Staking状态通过以下命令可以查看staking状态:./qtum-cli getstakinginfo
运行类似结果如下:{
"enabled": true,
"staking": true,
"errors": "",
"currentblocksize": 1000,
"currentblocktx": 0,
"pooledtx": 5,
"difficulty": 280176,
"search-interval": 46,
"weight": ,
"netstakeweight": 9029,
"expectedtime":
其中enabled代表是否开启Staking功能,该功能是默认开启的;staking代表目前是否有QTUM正在Staking,true即代表正在Sweight代表目前正在staking的Qtum数量,单位是10^-8QTUM,本例子中约0.532QTUM;expectedtime代表目前你挖到矿的期望时间,单位是秒。4. 加密的钱包如何Staking?如果读者不需要对钱包加密,请跳过此步骤。但是钱包未加密状态下,通过钱包收发QTUM将钱包可以通过encryptwallet命令进行加密,进一步保证资金安全。然而,在钱包加密的状态下,Staking功能将被默认关闭。加密后./qtum-cli getstakinginfo将获得如下结果:{
"enabled": true,
"staking": false,
"errors": "",
"currentblocksize": 1000,
"currentblocktx": 0,
"pooledtx": 94,
"difficulty": 171153,
"search-interval": 0,
"weight": ,
"netstakeweight": 1881,
"expectedtime": 0
注意staking状态变为false,说明没有在Staking。通过如下walletpassphrase命令可以对钱包进行解锁:./qtum-cli walletpassphrase "&你设置的密码&"
其中第一个参数为用户加密时设置的密码,第二个参数为需要解锁的时间,单位是秒,可以根据用户需要进行设置;第三个参数表示是否只解锁staking功能,设置为true则表示只解锁用于Staking,而发送QTUM仍需要输入密码。若第三个参数缺省,则表示完全解锁钱包,不仅可以Staking,也可以正常发送QTUM。解锁后用getstakinginfo可查看状态,一切正常的话即可以在钱包加密状态下Staking了。方式二:用PC版Qtum-qt钱包StakingQtum-qt钱包的基本使用方法请参考。目前支持的Mac/Linux/Windows,用户可以自行下载安装。1. 打开Qtum qt钱包打开已经安装好的Qtum钱包。2. 转入QTUM量子币如果钱包中已有QTUM可跳过此步骤。若钱包中无QTUM,则向钱包地址中转入一定数量的QTUM,方法请参考。注意,新转入的QTUM需要等待500个区块(约17小时)的成熟时间,才可进行Staking。因此,建议用户等待500个区块后再进行以下步骤。3. 查看Staking状态通过钱包右下角的闪电标志可以查看Staking的状态。若闪电为实心,表示正在Staking。将鼠标放到闪电标志上,可以看到Staking相关信息,如下图所示:Staking表示正在挖矿;Your weight is表示当前你正在参与Staking的QTUM数量,单位是1QTUM;Network weight is表示网络中正在参与Staking的QTUM数量,单位是1QTUM;Expected time表示挖到矿的期望时间,单位是天。若闪电为空心,表示不在Staking。可能的原因有:钱包里没有超过500个区块确认的QTUM -- 解决方法:这时请向钱包转入QTUM,并等待500个区块(约17小时);钱包处于锁定状态 -- 解决方法:解锁钱包。若无闪电标志,说明禁用了Staking功能钱包未开启staking功能 -- 解决方法:修改运行参数或配置文件,开启Staking。关于Staking奖励如果用户顺利挖到一个区块,可以累积获得超过4QTUM的奖励。关于挖矿奖励有以下几点需要注意:奖励会以一笔新交易的形式发送给你,命令行用户可通过getbalance命令查看余额变化,qt钱包用户可以直接看到收入的交易;Staking成功,你会立刻收到一笔0.4QTUM的奖励;剩余3.6QTUM的奖励会在500个区块(约17个小时)之后,在连续九个区块中奖励给你,每个区块你将获得0.4QTUM,与上条中0.4QTUM合计共4QTUM;Staking成功的那个币(UTXO)将被锁定500个区块,直到500区块之后才可以进行交易或继续进行Staking。为了不让资金锁定太久,用户可以选择将一个大的UTXO分成若干个较小的UTXO,这样只有挖到矿的那个UTXO会被锁定;这一奖励机制和Qtum采用的MPoS机制有关,有兴趣了解原理的读者可以参考《》。如何关闭Staking功能Qtum钱包会默认开启Staking,但有些情况用户或交易所想要关闭该功能。有以下几种方式可以停止Staking:1 命令行用户可以在运行时加上-staking=false选项,如:./qtumd -staking=false -daemon
启动qt钱包的命令:./qtum-qt -staking=false
2 在配置文件qtum.conf中添加staking=false,3 锁定钱包,钱包在锁定状态下会自动停止Staking。
A u t h o r : @jstarheadThe following article deals with different coldstaking solutions and the mea...
Cosmsos Hub - 基于 Tendermint 的 Proof of Stake 区块链系统
Atom - Cosmsos Hub 原生代币
Atom holder - Atom...
王爽《汇编语言》电子版(pdf 格式)下载 立即下载
上传者: Speed&em&staking&/em& 时间:
综合评分: 5 积分/C币:2 上传资源
yjwffgip456
关注 查看TA...
在谈到Qtum时 ,我多次提到“前瞻性放样”作为我们“智能放样协议”的一部分。 这听起来像是一种很酷的技术,但究竟是什么呢? 我只会在技术上稍微回答一下。
所以,如果你已经阅读过我的第3版文章的证明...
cosmos被看作是一种跨链互操作的解决方案,可以将区块链连接到一起。跨链互操作仅仅是Cosmos尝试解决的一个问题, Cosmos想要颠覆的不仅仅跨链,让我们一起从头深入了解Cosmos背后的细节。...
Qtum账户抽象层(AAL)实现简析
Qtum设计上以比特币UTXO为基础账户模型,并实现了支持EVM规范的智能合约,这是通过账户抽象层(Account Abstract Layer, AAL)...
本教程包含Qtum量子链的部署、运行以及RPC调用等内容。教程假设读者能够熟练使用Linux,Mac或Windows命令行。若您不符合此要求,或只关心Qtum qt钱包的使用方法,请参考另一篇Qtum...
硅谷Live / 实地探访 / 热点探秘 / 深度探讨帅初(Patrick Dai),2017年《福布斯》中国 30 under 30、中国科学院博士辍学、Qtum量子链创始人兼CEO,过去5年一直致...
量子链(Qtum)主干网络已经于日发布,到目前为止,运行稳定。目前持有基于ETH网络的QTUM ERC20代币的用户需要按照以下方法1:1兑换为Qtum的主网络币。gate.io平台...
这篇文章我们就来讲讲QTUM钱包地址生成方式吧
前面说了一些关于区块链生成钱包地址的方法说了一下, 那么该如何用代码去生成钱包地址呢? 之前我在做钱包的时候, 搜了很多资料, 很少有写如何去生成钱包...
没有更多推荐了,对象...&67
连接Oracle.&113
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ü& Oracle安装
ü& Oracle创建用户和角色
ü& 客户端链接Oracle服务器
在第一学期我们已经接触过关系型数据库SQL Server,对数据库、表、记录、表的增删改查操作等这些基本的概念已经了解。Oracle是基于对象的关系型数据库,Oracle也是用表的形式对数据存储和管理,并且在Oracle的操作中添加了一些面向对象的思想。
Oracle数据库是Oracle(中文名称叫甲骨文)公司的核心产品,Oracle数据库是一个适合于大中型企业的数据库管理系统。在所有的数据库管理系统中(比如:微软的SQL
Server,IBM的DB2等),Oracle的主要用户涉及面非常广,包括:银行、电信、移动通信、航空、保险、金融、电子商务和跨国公司等。Oracle产品是免费的,可以在Oracle官方网站上下载到安装包,另一方面Oracle服务是收费的。
Oracle公司成立以来,从最初的数据库版本到Oracle7、Oracle8i、Oracle9i,Oracle10g到Oracle11g,虽然每一个版本之间的操作都存在一定的差别,但是Oracle对数据的操作基本上都遵循SQL标准。因此对Oracle开发来说版本之间的差别不大。
很多人没有学习Oracle就开始发怵,因为人们在误解Oracle,认为Oracle太难学了,认为Oracle不是一般人用的数据库,其实任何数据库对应用程序研发人员来说,都是大同小异,因为目前多数数据库都支持标准的SQL。在Oracle这本书中,我们能学习到:
?&&Oracle的安装
?&&Oracle数据管理
?&&常用子查询及常用函数
?&&PL/SQL编程
?&&Oracle基本管理
由于在第一学期已经接触了SQL Server,Oracle数据库的概念不是很难,主要是实践,因此在本书的学习中,认真的完成上机练习是学习好本书的关键。
接下来我们先从Oracle安装开始,接触一些Oracle中基本的概念。
Oracle数据库产品是免费的,我们可以从Oracle的官方网站(http://www.oracle.com)下载到程序安装包,Oracle在Windows下的安装非常方便,安装开始后,一直点击安装程序的“下一步”即可。
1.&&&&&&&下载Oracle10g后,解压到一个文件夹下,单击“setup.exe”文件即可启动安装界面。如下图:
图1&&Oracle安装启动界面
Oracle主目录位置就是Oracle准备安装的位置,称为“Oracle_Home”,一般Oracle根据当前计算机的硬盘大小默认给出一个合适的位置。Oracle安装时可以只安装Oracle软件,然后单独创建数据库,也可以在上图中选中“创建启动数据库”复选框,在安装Oracle产品时,同时创建一个数据库,对初学者来说,推荐这样安装。填写全局数据库名,以及管理员的密码。全局数据库名是数据库在服务器网络中的唯一标识。
2.&&&&&&&点击“下一步”,就会出现如下图内容,开始对Oracle服务器进行环境检查,主要查看服务器是否符合Oracle安装的条件,比如是否支持、系统内存是否符合Oracle安装的最低要求等。
图2&&Oracle安装前环境检查
3.&&&&&&&Oracle检查通过后,单击“下一步”,就会列出所有安装Oracle过程中的默认选项。
图3&&Oracle默认安装设置
4.&&&&&&&单击“安装”按钮,进入安装界面,这一过程经历时间比较长,根据计算机的性能不同有很大差别。
图4&&Oracle安装
5.&&&&&&&上图完成后,进入了各种Oracle工具的安装阶段,包括网络配置向导,iSQL*plus等(后面课程中讲解)。如下图所示:
图5&&Oracle各种工具的安装
6.&&&&&&&接下来自动启动DBCA(Database Configuration Assistant)进入创建默认数据库阶段。
图6& DBCA下安装数据库
&&&&&&&& Oracle中的数据库主要是指存放数据的文件,这些文件在Oracle安装完成后,在计算机硬盘上都能找到,包括数据文件、控制文件和数据库日志文件。
数据库创建后会有一系列为该数据库提供服务的内存空间和后台进程,称为该数据库的实例。每一个数据库至少会有一个实例为其服务。实例中的内存结构称为系统全局区(SGA),系统会根据当前计算机系统的性能给SGA分配非常可观的内存空间。
Oracle创建数据库不能像SQL Server那样用一个简单的CREATE DATABASE命令就能完成,在创建数据库的过程中还需要配置各种参数。虽然有DBCA工具向导,但是仍然需要进行比较麻烦的配置。
虽然一个Oracle数据库服务器中可以安装多个数据库,但是一个数据库需要占用非常大的内存空间,因此一般一个服务器只安装一个数据库。每一个数据库可以有很多用户,不同的用户拥有自己的数据库对象(比如:数据库表),一个用户如果访问其他用户的数据库对象,必须由对方用户授予一定的权限。不同的用户创建的表,只能被当前用户访问。因此在Oracle开发中,不同的应用程序只需使用不同的用户访问即可。
7.&&&&&&&数据库创建完毕后,需要设置数据库的默认用户。Oracle中为管理员预置了两个用户分别是SYS和SYSTEM。同时Oracle为程序提供了一个普通用户scott,口令管理中,可以对数据库用户设置密码,设置是否锁定。&Oracle客户端使用用户名和密码登录Oracle系统后才能对数据库操作。
图7&&DBCA下的口令管理
图8& 为system,sys,scott用户设置密码
&&&&&&&&&默认的用户中,SYS和SYSTEM用户是没有锁定的,安装成功后可以直接使用,SCOTT用户默认为锁定状态,因此不能直接使用,需要把SCOTT用户设定为非锁定状态才能正常使用。
&&&&&&&&&这一步完成后,Oracle系统安装成功。
Oracle数据库中,默认情况下,所有系统的数据,SQL关键字等都是大写的,在操作过程中,Oracle会自动把这些内容转换为大写,因此用户操作时不需考虑大小写问题,一般情况下,为了良好的程序风格,程序中建议关键字用大写,非关键字可以使用小写。
Oracle服务器安装成功后,就可以通过客户端工具连接Oracle服务器了,可以到Oracle官方下载Oracle专用的客户端软件,大多客户端工具都是基于Oracle客户端软件的。接下来介绍几种常用的Oracle客户端工具。
?&&SQL*Plus工具
该工具是Oracle系统默认安装下,自带的一个客户端工具。在Windows命令行中输入“sqlplusw”命令,就能够启动该工具了。
图9& SQL*Plus工具
输入用户名和密码后,如果SQL*Plus与数据库服务器在同一台计算机上,并且当前服务器下只有一个数据库实例,那么“主机字符串”可以不用填写。
SQL*Plus工具虽然是Oracle自带的工具,但是在现实开发中,基于该环境对开发不方便,因此很少使用。
SQL*Plus连接成功后就如图所示:
图10&&SQL*Plus工具登录后
?&&SQL*Plus命令行工具
该命令行工具,提供了与数据库交互的能力和维护数据库的能力,包括了Oracle自带的SQL*Plus工具的全部功能,在Oracle管理中经常使用。在命令行中输入:“sqlplus
/nolog”即可启动该工具。如下图:
图11& 启动SQL*Plus命令行工具
&&&&&&&&&输入“sqlplus /nolog”命令后,只是启动了一个客户端进程,并没有与服务器连接,连接到Oracle服务器的命令是:
conn&用户名/密码&as&连接身份@服务器连接字符串
1.&&&&&&&连接身份:表示该用户连接后拥有的权限。
?&&sysdba:即数据库管理员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制、管理功能、创建数据库。sys用户必须用sysdba身份才能登录,system用户可以用普通身份登录。
?&&sysyoper:即数据库操作员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。
?&&normal:即普通用户,权限只有查询某些数据表的数据。默认的身份是normal用户。
2.&&&&&&&客户端工具可以根据“服务器连接字符串”对服务器进行连接,有了连接字符串后客户端就可以像操作本机一样操作远程数据库,因此“服务器连接字符串”的配置也叫本地网络服务配置,如果SQL*Plus工具启动在服务器上,并且服务器上只有一个数据库实例的情况下,连接字符串可以缺省,在连接字符串中包括连接服务器的协议,服务器的地址,服务器的端口等设置,Oracle服务名等,该配置文件在Oracle安装目录下的:&network/ADMIN/
tnsnames.ora。该文件是一个文本文件,用记事本打开后如下所示:
图12& 服务器连接字符串配置
?&&配置本地网络服务名
&&&&&&&&&本地网络服务名,即客户端与服务器的连接字符串,本地网络服务名是客户端的配置,Oracle客户端安装后,可以使用客户端自带的网络配置向导(Net
Configuration Assistant)进行配置:
1.&&&&&&&启动Net Configuration Assistant。选择“本地Net服务名配置”选项。如下图所示:
图13& 启动Net Configuration Assistant
2.&&&&&&&选择“下一步”,本步骤可以对本地网络服务名进行添加,删除,测试是否正常连接等操作,选择“添加”选项。
图14&&Net Configuration Assistant
3.&&&&&&&点击“下一步”,填写服务名,该服务名就是Oracle安装时(图1),为数据库取的全局数据库名。
图15& 服务名配置
4.&&&&&&&点击“下一步”,选择服务需要的协议,默认是TCP协议。推荐使用默认的TCP协议。
图16& 选择协议
5.&&&&&&&点击“下一步”,输入主机名,主机名可以是计算机名称,也可以是一个IP地址,主机如果是本机,可以使用本机计算机名称、“localhost”、“127.0.0.1”、或者本机的IP地址。
图17& 输入主机名和端口
6.&&&&&&&单击“下一步”,选择“是,进行测试”选项。进入下图界面。
图18& 测试成功
在测试时,默认采用的用户名和密码是system/manager进行测试,如果用户system的密码不是“manager”,有可能测试通不过,更改登录后,输入正确的用户名和密码后再进行测试即可。
7.&&&&&&&测试成功后,单击“下一步”,出现如下界面,这一步是为本地网络服务命名,即图12中的服务器连接字符串名。
图19& 为网络服务名命名
&&&&&&&&&点击“下一步”,配置就完成了,进入tnsnames.ora文件中查看,就出现了如图12中的内容。
?&&PL/SQL Developer工具
在实际Oracle开发中,经常使用一个功能强大的第三方工具:“PL/SQL Developer”工具。PL/SQL Developer基本上可以实现Oracle开发中的任何操作。它运行在客户端时必须先安装Oracle客户端,并且通过网络配置向导配置网络服务名后才能正常与服务器连接。
图20 PL/SQL Developer
Oracle在windows中安装完成后,会安装很多服务,下面介绍几个主要的服务。
图21&Oracle服务
?&&OracleService+服务名,该服务是数据库启动的基础,只有该服务启动了,Oracle数据库才能正常启动。这是必须启动的服务。
?&&OracleOraDb10g_home1TNSListener,该服务是服务器端为客户端提供的监听服务,只有该服务在服务器上正常启动,客户端才能连接到服务器。该监听服务接收客户端发出的请求,然后将请求传递给数据库服务器。一旦建立了连接,客户端和数据库服务器就能直接通信了。
?&&OracleOraDb10g_home1iSQL*Plus,该服务提供了用浏览器对数据库中数据操作的方式。该服务启动后,就可以使用浏览器进行远程登录并进行数据库操作了。如下图所示:
图22 iSQL*Plus
?&&OracleDBConsole+服务名,Oracle10g中的一个新服务。在Oracle9i之前,Oracle官方提供了一个基于图形界面的企业管理器(EM),从Oracle10g开始,Oracle提供了一个基于B/S的企业管理器,在操作系统的命令行中输入命令:emctl
start dbconsole,就可以启动OracleDbConsole服务,如下图所示:
图23&EM服务的启动
&&&&&&&&&服务启动之后,就可以在浏览器中输入上图中进入EM的地址,使用B/S方式管理Oracle服务器。
OracleService启动动后,就可以对数据库进行管理了,Oracle的启动和关闭是最基本的命令,在SQL*Plus中,启动Oracle必须是sys用户,命令格式是:
startup open
图24&Oracle服务启动
&&&&&&&& Oracle服务关闭用命令:shutdown immediate
图25&Oracle服务关闭
Oracle中,一般不会轻易在一个服务器上创建多个数据库,在一个数据库中,不同的项目由不同的用户访问,每一个用户拥有自身创建的数据库对象,因此用户的概念在Oracle中非常重要。Oracle的用户可以用CREATE
USER命令来创建。其语法是:
语法结构:创建用户
CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK]
语法解析:
&&&&&&&& LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态。锁定的用户无法正常的登录进行数据库操作。
代码演示:创建用户
SQL& CREATE USER jerry
2& IDENTIFIED BY tom
3& ACCOUNT UNLOCK;
Oracle在SQL*Plus中的命令以分号(;)结尾,代表命令完毕并执行,系统同时会把该命令保存在缓存中,缓存中只保存最近执行过的命令,如果重新执行缓存中的命令,直接使用左斜杠符号(/)。如果命令不以分号结尾,该命令只是写入缓存保存起来,但并不执行。
&&&&&&&&&尽管用户成功创建,但是还不能正常的登录Oracle数据库系统,因为该用户还没有任何权限。如果用户能够正常登录,至少需要CREATE
SESSION系统权限。
&&&&&&&& Oracle用户对数据库管理或对象操作的权利,分为系统权限和数据库对象权限。系统权限比如:CREATE SESSION,CREATE
TABLE等,拥有系统权限的用户,允许拥有相应的系统操作。数据库对象权限,比如对表中的数据进行增删改操作等,拥有数据库对象权限的用户可以对所拥有的对象进行对应的操作。
&&&&&&&&&还有一个概念就是数据库角色(role),数据库角色就是若干个系统权限的集合。下面介绍几个常用角色:
?&&CONNECT角色,主要应用在临时用户,特别是那些不需要建表的用户,通常只赋予他们CONNECT role。CONNECT是使用Oracle的简单权限,拥有CONNECT角色的用户,可以与服务器建立连接会话(session,客户端对服务器连接,称为会话)。
?&&RESOURCE角色,更可靠和正式的数据库用户可以授予RESOURCE role。RESOURCE提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)等。
?&&DBA角色,DBA role拥有所有的系统权限----包括无限制的空间限额和给其他用户授予各种权限的能力。用户SYSTEM拥有DBA角色。
一般情况下,一个普通的用户(如SCOTT),拥有CONNECT和RESOURCE两个角色即可进行常规的数据库开发工作。
&&&&&&&&&可以把某个权限授予某个角色,可以把权限、角色授予某个用户。系统权限只能由DBA用户授权,对象权限由拥有该对象的用户授权,授权语法是:
语法结构:授权
GRANT角色|权限 TO 用户(角色)
代码演示:授权
SQL& GRANT CONNECT TO
授权成功。
SQL& GRANT RESOURCE TO
授权成功。
语法结构:其他操作
//回收权限
REVOKE 角色|权限 FROM 用户(角色)
//修改用户的密码
ALTER USER&用户名&IDENTIFIED BY&新密码
//修改用户处于锁定(非锁定)状态
ALTER USER 用户名 ACCOUNT LOCK|UNLOCK
?&&Oracle是基于对象的关系型数据库,Oracle产品免费,服务收费。
?&&Oracle安装后默认会有两个管理员用户(system,sys)和一个普通用户Scott。
?&&Sql*plus是Oracle管理和数据操作的客户端工具。
?&&客户端链接服务器前,服务器要启动监听服务,并且客户端工具要安装Oracle客户端,并且在客户端要建立本地网络服务名。
?&&Oracle服务和监听启动后才能对数据库进行操作。
?&&用startup命令启动数据库,用shutdown命令关闭数据库。
?&&Oracle的角色包括了一系列系统权限和普通对象权限,可以把权限授权给角色,把权限或者角色授权给用户。
1.&&&&&&&描述Oracle安装过程中的关键点。
2.&&&&&&&描述创建本地网络服务名的步骤。
3.&&&&&&&描述Oracle主要服务的作用。
4.&&&&&&&Oracle使用什么命令才能启动和关闭。
5.&&&&&&&什么是Oracle权限和角色?他们的关系是什么?
6.&&&&&&&创建一个用户,并授权CONNECT和RESOURCE。
章节知识结构图
数据操作和查询
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ü& Oracle数据类型
ü& SQL建表和约束
ü& SQL对数据增删改
ü& SQL查询
ü& Oracle伪列
在第一学期的SQL Server学习中,已经知道,SQL是结构化查询语言(&),专门用于数据存取、数据更新及数据库管理等操作。并且已经学习了用SQL语句对数据库的表进行增删改查的操作。
在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给客户端。Oracle
SQL语句由如下命令组成:
?&&数据定义语言&Language(DDL)&,包括CREATE(创建)命令、ALTER(修改)命令、DROP(删除)命令等。
Data&Language(DML)&,包括INSERT(插入)命令、UPDATE(更新)命令、DELETE(删除)命令、SELECT
… FOR UPDATE(查询)等。
Data Query Language(DQL),包括基本查询语句、Order
By子句、Group By子句等。
(TCL),包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。
?&&数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令。
目前主流的数据库产品(比如:SQL Server、Oracle)都支持标准的SQL语句。数据定义语言,表的增删改操作,数据的简单查询,事务的提交和回滚,权限的授权和撤销等,Oracle与SQL
Server在操作上基本一致。
Oracle数据库的核心是表,表中的列使用到的常见数据类型如下:
CHAR(length)
存储固定长度的字符串。参数length指定了长度,如果存储的字符串长度小于length,用空格填充。默认长度是1,最长不超过2000字节。
VARCHAR2(length)
存储可变长度的字符串。length指定了该字符串的最大长度。默认长度是1,最长不超过4000字符。
NUMBER(p,s)
既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点,p默认是38为),s是指小数位数。
存储日期和时间,存储纪元、4位年、月、日、时、分、秒,存储时间从公元前4712年1月1日到公元后4712年12月31日。
不但存储日期的年月日,时分秒,以及秒后6位,同时包含时区。
存储大的文本,比如存储非结构化的XML文档
存储二进制对象,如图形、视频、声音等。
表1&&Oracle的部分数据类型
&&&&&&&&&对应NUMBER类型的示例:
格式
输入的数字
实际的存储
NUMBER(6,2)
NUMBER(4,2)
输入的数字超过了所指定的精度,数据库不能存储
表2&&Number示例
&&&&&&&&&对于日期类型,可以使用sysdate内置函数可以获取当前的系统日期和时间,返回DATE类型,用systimestamp函数可以返回当前日期、时间和时区。
图1&&sysdate和sysTimestamp
&&&&&&&& Oracle的查询中,必须使用“select&列… from&表”的完整语法,当查询单行函数的时候,from后面使用DUAL表,dual表在系统中只有一行一列,该表在输出单行函数时为了select…from的语法完整性而使用。
Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下命令:
语法格式:ALTERTABLE命令
&&&ALTER TABLE&表名&ADD&约束名约束内容。
不论创建表还是约束,与SQL Server基本相同,注意:Oracle中default是一个值,而SQL
Server中default是一个约束&,因此Oracle的default设置可以在建表的时候创建。
案例1:创建一个学生信息(INFOS)表和约束
代码演示:Oracle创建表和约束
CREATE TABLE INFOS
&&STUID VARCHAR2(7) NOT NULL,&&&&--学号 学号=‘S’+班号+2位序号
&&STUNAME VARCHAR2(10) NOT NULL,& --姓名
&&GENDER VARCHAR2(2) NOT NULL,&&& --性别&
&&AGE NUMBER(2) NOT NULL,&&&&&&& --年龄
&&SEAT NUMBER(2) NOT NULL,&&&&&&& --座号
&&ENROLLDATE DATE,&&&&& --入学时间
&&STUADDRESS VARCHAR2(50)&DEFAULT&'地址不详',&&&&&&--住址
&&CLASSNO VARCHAR2(4) NOT NULL&&& --班号班号=学期序号+班级序号&
ALTER TABLE INFOS ADD&②&
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER&
CHECK(GENDER = '男' OR GENDER = '女')&③&
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT
CHECK(SEAT &=0 AND SEAT &=50)&&④
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE&
CHECK(AGE &=0 AND AGE&=100)&&⑤
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO&
CHECK((CLASSNO &='1001' AND CLASSNO&='1999') OR
(CLASSNO &='2001' AND CLASSNO&='2999'))&&⑥
ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME)&⑦&
代码解析:
①&&在Oracle代码中,“/”执行缓存区中的语句,由于缓冲区中只存储一条刚刚保存过语句,由于每条语句没有用分号结尾,只是保存在缓冲区,因此每条语句后面都有单独一行“/”。
③&&与 ④ ⑤ ⑥ ⑦一起创建各种check约束。其中⑦是唯一约束,表示该列值是唯一的,列中的值不能重复。
Oracle中创建外键约束与SQL Server相同。比如:现有成绩表定义如下:
案例2:创建一个成绩表(SCORES)表和约束
代码演示:Oracle创建表和约束
CREATE TABLE SCORES
&&&&ID NUMBER ,&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&--ID&&①
&&&&TERM VARCHAR2(2),&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& --学期 S1或S2
&&& & STUID VARCHAR2(7) NOT NULL,&&&&&&&&&&&&&&&&&& --学号
&&& & EXAMNO VARCHAR2(7) NOT NULL,&&&&&&&&&&&&&& --考号 E+班号+序号&&&&&
&&& & WRITTENSCORE NUMBER(4,1) NOT NULL,&&& --笔试成绩
&&& & LABSCORE NUMBER(4,1) NOT NULL&&&&&&&&&&&& --机试成绩
ALTER TABLE SCORES
&&& ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')
ALTER TABLE SCORES
&&& ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)&&②
代码解析:
①&&SQL Server中可以使用identify创建自动增长列,但是Oracle中的自动增长需要借助序列(Sequence)完成,在后面章节中讲解。
②&&Oracle中的外键约束定义。
数据操纵语言(DML)用于对数据库的表中数据进行添加、修改、删除和SELECT…For UPDATE(后面专门学习该查询)操作。对比一期学习过的SQL
Server操作,接下来一一介绍在Oracle中的操作。
?&&简单查询
数据查询是用SELECT命令从数据库的表中提取信息。SELECT语句的语法是:
语法结构:简单查询
SELECT *|列名|表达式&FROM&表名&WHERE&条件&ORDER
语法解析:
1.&&&&&&&*表示表中的所有列。
2.&&&&&&&列名可以选择若干个表中的列名,各个列表中间用逗号分隔。
3.&&&&&&&表达式可以是列名、函数、常数等组成的表达式。
4.&&&&&&&WHERE子句是查询的条件。
要求在查询的结果中排序,默认是升序&。
图2& 数据查询
&&&&&&&& Oracle中可以把查询的结果根据结果集中的表结构和数据形成一张新表。
语法结构:根据结果集创建表
CREATE TABLE&表名&AS SELECT语句
代码演示:根据结果集创建表
SQL& CREATE TABLE INFOS1 AS SELECT * FROM INFOS;
TABLE CREATED
&&&&&&&&&使用上面命令创建的新表中,不存在任何约束,并且把查询的数据一起插入到新表中。如果只复制表结构,只需使查询的条件不成立(比如where 1=2),就不会查询从出任何数据,从而复制一个表结构。
代码演示:复制表结构
SQL& CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;
TABLE CREATED
?&&数据插入
用INSERT命令完成对数据的插入。
语法结构:根据结果集创建表
INSERT INTO&表名(列名1,列名2……) VALUES (值1,值2……)
语法解析:
1.&&&&&&&列名可以省略。当省略列名时,默认是表中的所有列名,列名顺序为表定义中列的先后顺序。
2.&&&&&&&值的数量和顺序要与列名的数量和顺序一致。值的类型与列名的类型一致。
代码演示:向INFOS表和SCORES表中插入数据
SQL& INSERT INTO INFOS VALUES (& ①
& 2& 's100102', '林冲', '男', 22, 2,
& 3& TO_DATE(' 06:30:10','YYYY-MM-DD HH24:MI:SS '),& ②
& 4& '西安', '1001'
1 row inserted
SQL& INSERT INTO INFOS VALUES (
's100104','阮小二','男',26,3,SYSDATE,default,'1001');& ③
&1 row inserted
SQL&COMMIT;& ④
代码解析:
①&&表名后面缺省了列名,默认是表Infos中的所有列名,values中的值要与表中列一一对应,包括顺序和数据类型的对应。在SQL*Plus中一条语句可以写在多行,那么从第二行开始,sqlplus会为每一行前面给出行号。
②&&在Oracle中,日期是国际化的,不同的区域安装的数据库,默认的日期格式不同,因此为了程序便于移植,日期的输入要使用TO_DATE函数对日期格式化后输入,采用格式化字符串对日期进行格式化时,格式化字符串中字符不区分大小写,常见的格式化字符如下:
1.&&&&&&&&&yyyy表示四位年份
2.&&&&&&&&&mm表示两位月份,比如3月表示为03
3.&&&&&&&&&dd表示两位日期
4.&&&&&&&&&hh24表示小时从0-23,hh12也表示小时从0-11。
5.&&&&&&&&&mi&表示分钟
6.&&&&&&&&&ss表示秒
③&&在遇到存在默认值的列时,可以使用default值代替。
④&&commit是把用户操作(添加、删除、修改操作)提交,只有提交操作后,数据才能真正更新到表中,否则其他用户无法查询到当前用户操作的结果。
在Oracle中,一个INSERT命令可以把一个结果集一次性插入到一张表中。使用的语句是:INSERT INTO&表&SELECT子句,如下示例:
代码演示:INSERT向表中插入一个结果集
SQL& INSERT INTO INFOS2 SELECT * FROM INFOS;
5 rows inserted
在这种语法下,要求结果集中每一列的数据类型必须与表中的每一列的数据类型一致,结果集中的列的数量与表中的列的数量一致。比如表INFOS2,该表的结构与INFO表一样,那么可以把INFO表中的所有记录一次性插入到INFOS2表中。
Oracle的简单查询和SQL Server一样都可以在查询列中使用常量,如图:
图3& Select中的常量
可以使用刚才的做法,把该结果集中的数据插入到表INFOS中。
代码演示:INSERT向表中插入一个常量结果集
SQL& INSERT INTO INFOS
SELECT 's100106','卢俊义','男',23,5,
&&&&&& &&&&&&&&TO_DATE(' 08:00:10','YYYY-MM-DD HH24:MI:SS'),
&&&&&&&&&&&&&& '青龙寺','1001'
FROM DUAL;
1 rows inserted
SQL&COMMIT;
?&&更新数据
Oracle在表中更新数据的语法是:
语法结构:UPDATE操作
UPDATE&表名&SET&列名1=值,列名2=值……
WHERE&条件
代码演示:UPDATE操作
SQL& UPDATE INFOS SET CLASSNO='1002',STUADDRESS='山东莱芜'
WHERE STUNAME='阮小二';
1 rows updated
?&&删除数据
Oracle在表中删除数据的语法是:
语法结构:DELETE操作
DELETE FROM表名&WHERE&条件
代码演示:DELETE操作
SQL& DELETE FROM INFOS WHERE STUID='s100103';
1 ROW DELETED
SQL& COMMIT;
?&&TRUNCATE
在数据库操作中,&命令(是一个DDL命令)可以把表中的所有数据一次性全部删除,语法是:
语法结构:TRUNCATE
TRUNCATE TABLE&表名
TRUNCATE和DELETE都能把表中的数据全部删除,他们的区别是:
1.&&&&&&&TRUNCATE是DDL命令,删除的数据不能恢复;DELETE命令是DML命令,删除后的数据可以通过日志文件恢复。
2.&&&&&&&如果一个表中数据记录很多,TRUNCATE相对DELETE速度快。
由于TRUNCATE命令比较危险,因此在实际开发中,TRUNCATE命令慎用。
Oracle默认安装中,已经创建了一个SCOTT用户,默认密码是:tiger,该用户下有四张表分别是:雇员表(EMP),部门表(DEPT),工资登记表和奖金表,请参考本章后面的附表。接下来很多操作都是在该用户下完成的。
Oracle开发中,依然存在算术运算,关系运算,和逻辑运算。
?&&算术运算
Oracle中的算术运算符,没有C#中的算术运算符丰富,只有+、-、*、/四个,其中除号(/)的结果是浮点数。求余运算只能借助函数:MOD(x,y):返回x除以y的余数。
案例3:每名员工年终奖是2000元,请显示基本工资在2000元以上的员工的月工资,年总工资。
该案例的表请参见本章练习的附表1、附表2、附表3,这三张表是ORACLE
10g自带的。
代码演示:查询中的算术运算
SQL& SELECT ENAME,SAL,(SAL*12+2000) FROM EMP WHERE SAL&2000;
(SAL*12+2000)
6 rows selected
?&&关系运算和逻辑运算
Oracle中Where子句经中经常见到关系运算和逻辑运算,常见的关系运算有:
小于或者等于
大于或者等于
表3&&Oracle的关系运算符
逻辑运算符有三个:AND、OR、NOT
关系运算和逻辑运算与前面SQL Server学习过的一致。
?&&字符串连接操作符(||)
在Oracle中,字符串的连接用双竖线(||)表示。比如,在EMP表中,查询工资在2000元以上的姓名以及工作。
代码演示:字符串连接
SQL& SELECT (ENAME || 'is a ' || JOB) AS &Employee Details&& ①
& 2& FROM EMP
& 3& WHERE SAL&2000;
Employee Details
------------------------
JONESis a MANAGER
BLAKEis a MANAGER
CLARKis a MANAGER
SCOTTis a ANALYST
KINGis a PRESIDENT
FORDis a ANALYST
6 rows selected
代码解析:
①&&Oracle中字符串可以用单引号,也可以用双引号,在别名中存在空格时,必须用双引号。在表名、列名时用双引号。
在第一期学习过SQL的简单查询和连接查询。现在学习一些新的SQL操作符。
?&&消除重复行
在Oracle查询中结果中,可能出现若干行相同的情况,那么可以使用DISTINCT消除重复行。具体的用法如示例:
代码演示:DISTINCT消除重复行
SQL& SELECT DISTINCT DEPTNO FROM EMP;
?&&NULL操作
如果某条记录中有缺少的数据值,就是空值(NULL值)。空值不等于0或者空格,空值是指未赋值、未知或不可用的值。任何数据类型的列都可以包括NULL值,除非该列被定义为非空或者主键。
代码演示:EMP中的NULL值
SQL& SELECT ENAME,JOB,SAL,COMM FROM EMP WHERE SAL&2000;
7 rows selected
&&&&&&&&&在查询条件中NULL值用IS NULL作条件,非NULL值用NOT
IS NULL做条件。&&&
案例4:查询EMP表中没有发奖金的员工。
代码演示:NULL值查询
SQL& SELECT ENAME,JOB,SAL,COMM FROM EMP
2&& WHERE SAL&2000 AND COMM IS NULL;
?&&IN 操作
在Where子句中可以使用IN操作符来查询其列值在指定的列表中的行。比如:查询出工作职责是SALESMAN、PRESIDENT或者ANALYST的员工。条件有两种表示方法:
1.&&&&&&&WHERE job = 'SALESMAN ' OR job = 'PRESIDENT ' OR job = 'ANALYST '
2.&&&&&&&WHERE job IN ('SALESMAN', 'PRESIDENT', 'ANALYST')
代码演示:IN操作
SQL& SELECT ENAME,JOB,SAL FROM EMP
2& WHERE job IN ('SALESMAN', 'PRESIDENT', 'ANALYST');
7 rows selected
&&&&&&&&&对应IN操作的还有NOT IN,用法一样,结果相反。
?&&BETWEEN…AND…
在WHERE子句中,可以使用BETWEEN操作符来查询列值包含在指定区间内的行。比如,查询工资从1000到2000之间的员工。可以使用传统方法:
&&&&&&&& WHERE SAL&=1000 AND SAL&=2000
&&&&&&&&&也可以使用:
&&&&&&&& &&& WHERE SAL BETWEEN 1000 AND 2000
&&&&&&&&&BWTWEEN操作所指定的范围也包括边界。
代码演示:BETWEEN操作
SQL& SELECT ename,job,sal FROM EMP WHERE sal BETWEEN 1000 AND 2000;
6 rows selected
?&&LIKE模糊查询
在一些查询时,可能把握不准需要查询的确切值,比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询。模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_”:
?&&%:表示零个或者多个任意字符。
?&&_:代表一个任意字符。
语法是:LIKE&'字符串'[ESCAPE&'字符']。匹配的字符串中,&后面的“字符”作为转义字符。与一期SQLServer中ESCAPE用法相同。
通配符表达式
以S开头的字符串。
第二个字符时S的字符串。
'%30\%%' escape '\'
包含“30%”的字符串,“\”指转义字符,“\%”在字符串中表示一个字符“%”。
表4& 通配符示例
案例5:显示员工名称以J开头以S结尾的员工的姓名、工资和工资。
代码演示:LIKE操作
SQL& SELECT ENAME,JOB,SAL FROM EMP WHERE ENAME LIKE 'J%S';
ENAME&&&&&&JOB&&&&&&&&&&&& SAL
----------&&&--------- &&&&&&&---------
JONES&&&&&&MANAGER&&&& 2975.00
JAMES&&&&&&CLERK&&&&&&& &950.00
?&&集合运算
集合运算就是将两个或者多个结果集组合成为一个结果集。集合运算包括:
&(交集),返回两个查询共有的记录。
?&&UNION ALL(并集),返回各个查询的所有记录,包括重复记录。
?&&UNION(并集),返回各个查询的所有记录,不包括重复记录。
&(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以不同。
&&&&&&&&&案例6:查询出dept表中哪个部门下没有员工。只需求出dept表中的部门号和emp表中的部门号的补集即可。
代码演示:求补运算
SQL& SELECT DEPTNO FROM DEPT
&&2& MINUS
&&3& SELECT DEPTNO FROM EMP;
&&&&&&&&&前面学习过可以通过insert into …select把一个结果集插入到另一张结构相同的表中,因此可以使用union把若干条记录一次性插入到一张表中。
代码演示:用union插入多条数据
SQL& INSERT INTO DEPT
&&2& SELECT 50,'公关部','台湾' FROM DUAL
&&3& UNION
&&4& SELECT 60,'研发部','西安' FROM DUAL
&&5& UNION
&&6& SELECT 70,'培训部','西安' FROM DUAL
3 rows inserted
?&&连接查询
在SQL Server中已经学习过内联接(inner join)、外联接(outer join),外联接又分为左外联接(left
outer join)和右外联接(right outer join)。Oracle中对两个表或者若干表之间的外联接用(+)表示。
案例7:请查询出工资大于2000元的,员工姓名,部门,工作,工资。
由于部门名称在dept中,其他的信息在emp表中,需要内联接才能完成。
代码演示:内联接
SQL& SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
&&2& FROM emp e,dept d
&&3& WHERE e.deptno=d.deptno
&&4& AND e.SAL&2000;
ACCOUNTING
ACCOUNTING
6 rows selected
&&&&&&&&&也可以使用SQL/92标准中的内联接:
代码演示:内联接
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
&FROM EMP e&INNER JOIN&DEPT d&ON&e.DEPTNO=d.DEPTNO
WHERE e.SAL&2000&&&&&&&&&&&&&
这里INNER JOIN中,关键字INNER可以省略。
案例8:请查询出每个部门下的员工姓名,工资。
案例分析:
Emp表用外键deptno引用Dept表中的deptno,在Dept表中如果有某些部门没有员工,那么用内联接,没有员工的部门将无法显示,因此必须以Dept表为基准的外联接。
代码演示:外联接
SQL& SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
&&2& FROM EMP e ,DEPT d
&&3& WHERE& e.DEPTNO(+)=d.DEPTNO&&①
ACCOUNTING
ACCOUNTING
ACCOUNTING
OPERATIONS
&18 rows selected
代码解析:
①&&&(+):Oracle专用的联接符,在条件中出现在左边指右外联接,出现在右边指左外联接。
&&&&&&&&&也可以使用SQL/92标准的写法:
代码演示:外联接
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e&RIGHT OUTER JOIN&DEPT d&ON&e.DEPTNO=d.DEPTNO
&&&&&&&&&这里RIGHT OUTER JOIN中,关键字OUTER可以省略。
虽然Oracle自身的联接查询语法比较好写,同时容易理解,但是为了程序便于移植,推荐使用SQL/92表中的联接查询。同时也可以与SQL Server获得一致。
?&&Oracle SQL语句中有数据操纵语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)、事务控制语言(TCL)等等。
?&&DML语句包括增删改查语句,DDL语句包括数据库对象创建、修改和删除语句,数据控制命令包括GRANT、REVOKE等,事务控制命令有COMMIT、ROLLBACK等。
?&&数据库中建表常用的类型有:数字类型number(p,s),可变字符串varchar2(length),日期date。
?&&Oracle中default是一个值,在Oracle中不存在default约束。
?&&Oracle的增删改语句与SQL Server基本一致,都是使用INSERT、UPDATE、DELETE完成。
?&&Oracle高级查询中要注意:DISTINCT、NULL、IN、BETWEEN…AND…。
?&&集合操作有:UNION、UNION ALL、INTESECT、MINUS。
?&&联接查询有内联接和外联接。
1.&&&&&&&创建一查询,显示与Blake在同一部门工作的雇员的项目和受雇日期,但是Blake不包含在内。
2.&&&&&&&显示位置在Dallas的部门内的雇员姓名、变化以及工作。
3.&&&&&&&显示被King直接管理的雇员的姓名以及工资。
4.&&&&&&&创建一查询,显示能获得与Scott一样工资和奖金的其他雇员的姓名、受雇日期以及工资。
附表1:Scott表中的EMP表:员工表
员工编号,EMP表主键
VARCHAR2(10)
VARCHAR2(9)
员工的领导编号,引用EMPNO
NUMBER(7,2)
NUMBER(7,2)
员工部门编号,是表DEPT的外键。
附表2:Scott表中的DEPT表:部门表
部门编号,主键
VARCHAR2(14)
VARCHAR2(13)
附表3:Scott表中的SALGRADE表:工资等级表
此等级下最低工资
此等级下最高工资
章节知识结构图
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ü& 子查询
ü& 锁的概念
子查询在SELECT、UPDATE、DELETE语句内部可以出现SELECT语句。内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表。子查询的类型有:
1.&&&&&&&单行子查询:不向外部返回结果,或者只返回一行结果。
2.&&&&&&&多行子查询:向外部返回零行、一行或者多行结果。
案例1:查询出销售部(SALES)下面的员工姓名,工作,工资。
该问题可以用联接查询实现,由于所需的结果信息都在Emp表中,可以先从Dept表中查询出销售部对应的部门号,然后根据当前部门号再到Emp表中查询出符合该部门的员工记录即可。从销售表中查询出的结果可以作为Emp表中查询的条件,SQL语句实现如下:
代码演示:单行子查询
SQL& SELECT ENAME,JOB,SAL FROM EMP
& 2& WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES')&①
&6 rows selected
代码解析:
①&&内部查询的结果作为外部查询的条件。
需要注意:
?&&如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返还任何结果。
?&&在单行子查询中外部查询可以使用=、&、&、&=、&=、&&等比较运算符。
?&&内部查询返回的结果必须与外部查询条件中的字段(DEPTNO)匹配。
?&&如果内部查询返回多行结果则出现错误。
案例2:查询出Emp表中比任意一个销售员(“SALESMAN”)工资低的员工姓名、工作、工资。
销售员在Emp表中有很多条记录,每个人工资不相等,如果返回“比任意员工的工资还低”的条件,返回比“最高工资还低”即可。如果用子查询做,子查询中就会返回多条记录。用普通的关系符(&、&等)运行就会出错。这时候需要用关键字ANY。ANY放在比较运算符后面,表示“任意”的意思。
代码演示:ANY子查询
SQL& SELECT ENAME,JOB,SAL FROM EMP
& 2& WHERE SAL&ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN')&&①
&7 rows selected
代码解析:
①&&&any:比子查询结果中任意的值都小,也就是说,比子查询结果中最大值还小,那么同理&any表示比子查询结果中最小的还大。
案例3:查询出比所有销售员的工资都高的员工姓名,工作,工资。
ANY可以表示任意的,但本案例中要求比所有销售员工资都高,那么就要使用另外一个关键字ALL。ALL与关系操作符一起使用,表示与子查询中所有元素比较。
代码演示:ALL子查询
SQL& SELECT ENAME,JOB,SAL FROM EMP
& 2& WHERE SAL&ALL (SELECT SAL FROM EMP WHERE JOB='SALESMAN')&&①
6 rows selected
代码解析:
①&&&ALL:比子查询结果中所有值还要大,也就是说,比子查询结果中最大值还要大。&ALL表示比最小值还要小。
对于子查询还可以使用IN和NOT IN操作符进行操作。
在Oracle的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。接下来学习两个伪列:ROWID和ROWNUM。
表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行。ROWID值可以唯一的标识表中的一行。由于ROWID返回的是该行的物理地址,因此使用ROWID可以显示行是如何存储的。
代码演示:ROWID
SQL& SELECT ROWID,ENAME FROM EMP WHERE SAL&2000;
AAAMgzAAEAAAAAgAAD
AAAMgzAAEAAAAAgAAF
AAAMgzAAEAAAAAgAAG
AAAMgzAAEAAAAAgAAH
AAAMgzAAEAAAAAgAAI
AAAMgzAAEAAAAAgAAM
6 rows selected
在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数。
ROWNUM与ROWID不同,ROWID是插入记录时生成,ROWNUM是查询数据时生成。ROWID标识的是行的物理地址。ROWNUM标识的是查询结果中的行的次序。
案例4:查询出员工表中前5名员工的姓名,工作,工资。
代码演示:ROWNUM
SQL& SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM&=5;
案例5:查询出工资最高的前5名员工的姓名、工资和工资。
“工资最高的前5名”需要先降序排序,再取前5名,但是生成ROWNUM操作比排序要早,排序时已经连同ROWNUM一起排序了,因此不能直接在案例1的语句中直接加上Order
by就行,而是需要对排序的结果重新做二次查询,产生新的ROWNUM才能作为查询的条件依据。
代码演示:ROWNUM应用
SQL& SELECT ROWNUM,T.* FROM&&①
&&2&&&&& (SELECT ENAME,JOB,SAL
&&3&&&&&& FROM EMP ORDER BY SAL DESC) T&&②
&&4& WHERE ROWNUM&=5
代码解析:
①&&T是子查询②的别名,这里的ROWNUM是第二次查询后的ROWNUM。
案例6:查询出表EMP中第5条到第10条之间的记录。
这是分页的应用。在查询条件中,如果查询条件中ROWNUM大于某一正整数,则不返还任何结果。
代码演示:ROWNUM分页
SQL& SELECT * FROM
&&2&&&& (SELECT ROWNUM R,ENAME,JOB,SAL&&①
&&3&&&&& FROM EMP WHERE ROWNUM&=10)&&②
&&4& WHERE R&5&&③
代码解析:
①&&内部查询中得到ROWNUM&并且用别名R记录,供外层条件③使用。
②&&内部查询的ROWNUM,与外出的ROWNUM列是平等的两列。
③&&使用的R是内层产生的ROWNUM,在外层看来,内层查询的ROWNUM是正常的一列。
Oracle SQL提供了用于执行特定操作的专用函数。这些函数大大增强了SQL语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。Oracle数据库中主要使用两种类型的函数:
1.&&&&&&&&&单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如:MOD(x,y)返回x除以y的余数(x和y可以是两个整数,也可以是表中的整数列)。常用的单行函数有:
?&&字符函数:对字符串操作。
?&&数字函数:对数字进行计算,返回一个数字。
?&&转换函数:可以将一种数据类型转换为另外一种数据类型。
?&&日期函数:对日期和时间进行处理。
2.&&&&&&&&&聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。比如SUM(x)返回结果集中x列的总合。
?&&字符函数
字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。下表列出了常用的字符函数。
返回字符x的ASCII码。
CONCAT(x,y)
连接字符串x和y。
INSTR(x, str [,start] [,n)
在x中查找str,可以指定从start开始,也可以指定从第n次开始。
返回x的长度。
x转换为小写。
x转换为大写。
LTRIM(x[,trim_str])
把x的左边截去trim_str字符串,缺省截去空格。
RTRIM(x[,trim_str])
把x的右边截去trim_str字符串,缺省截去空格。
TRIM([trim_str FROM] x)
把x的两边截去trim_str字符串,缺省截去空格。
REPLACE(x,old,new)
在x中查找old,并替换为new。
SUBSTR(x,start[,length])
返回x的字串,从staart处开始,截取length个字符,缺省length,默认到结尾。
表1& 字符函数
SELECT ASCII('a') FROM DUAL
SELECT CONCAT('Hello', ' world') FROM DUAL
Hello world
SELECT INSTR('Hello world','or') FROM DUAL
SELECT LENGTH('Hello') FROM DUAL
SELECT LOWER('hElLO') FROM DUAL;
SELECT UPPER('hello') FROM DUAL
SELECT LTRIM('===HELLO===', '=') FROM DUAL
SELECT '=='||LTRIM('&& HELLO===') FROM DUAL
==HELLO===
SELECT RTRIM('===HELLO===', '=') FROM DUAL
SELECT '='||TRIM('&& HELLO&& ')||'=' FROM DUAL
SELECT TRIM('=' FROM '===HELLO===') FROM DUAL
SELECT REPLACE('ABCDE','CD','AAA') FROM DUAL
SELECT SUBSTR('ABCDE',2) FROM DUAL
SELECT SUBSTR('ABCDE',2,3) FROM DUAL
表2& 字符函数示例
?&&数字函数
数字函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。
x绝对值
大于或等于x的最小值
CEIL(5.4)=6
小于或等于x的最大值
FLOOR(5.8)=5
x为底y的对数
LOG(2,4)=2
x除以y的余数
MOD(8,3)=2
POWER(x,y)
POWER(2,3)=8
ROUND(x[,y])
x在第y位四舍五入
ROUND(3.456,2)=3.46
TRUNC(x[,y])
x在第y位截断
TRUNC(3.456,2)=3.45
表3& 数字函数
1.&&&&&&&ROUND(X[,Y]),四舍五入。
在缺省y时,默认y=0;比如:ROUND(3.56)=4。
y是正整数,就是四舍五入到小数点后y位。ROUND(5.654,2)=5.65。
y是负整数,四舍五入到小数点左边|y|位。ROUND(351.654,-2)=400。
2.&&&&&&&&TRUNC(x[,y]),直接截取,不四舍五入。
在缺省y时,默认y=0;比如:TRUNC (3.56)=3。
y是正整数,就是四舍五入到小数点后y位。TRUNC (5.654,2)=5.65。
y是负整数,四舍五入到小数点左边|y|位。TRUNC (351.654,-2)=300。
?&&日期函数
日期函数对日期进行运算。常用的日期函数有:
1.&&&&&&&&&ADD_MONTHS(d,n),在某一个日期d上,加上指定的月数n,返回计算后的新日期。d表示日期,n表示要加的月数。
图1&&ADD_MONTHS函数示例
2.&&&&&&&&&LAST_DAY(d),返回指定日期当月的最后一天。
图2&&LAST_DAY函数示例
3.&&&&&&&&&ROUND(d[,fmt]),返回一个以fmt为格式的四舍五入日期值,d是日期,fmt是格式模型。默认fmt为DDD,即月中的某一天。
?&&如果fmt为“YEAR”则舍入到某年的1月1日,即前半年舍去,后半年作为下一年。
?&&如果fmt为“MONTH”则舍入到某月的1日,即前月舍去,后半月作为下一月。
?&&默认为“DDD”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第二天。
?&&如果fmt为“DAY”则舍入到最近的周的周日,即上半周舍去,下半周作为下一周周日。
图3& ROUND函数示例
与ROUND对应的函数时TRUNC(d[,fmt])对日期的操作,TRUNC与ROUND非常相似,只是不对日期进行舍入,直接截取到对应格式的第一天。
4.&&&&&&&&&EXTRACT(fmt FROM d),提取日期中的特定部分。
fmt为:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。其中YEAR、MONTH、DAY可以为DATE类型匹配,也可以与TIMESTAMP类型匹配;但是HOUR、MINUTE、SECOND必须与TIMESTAMP类型匹配。
HOUR匹配的结果中没有加上时区,因此在中国运行的结果小8小时。
图4&&EXTRACT函数示例
?&&转换函数
转换函数将值从一种数据类型转换为另外一种数据类型。常用的转换函数有:
1.&&&&&&&&&TO_CHAR(d|n[,fmt])
把日期和数字转换为制定格式的字符串。fmt是格式化字符串,日期的格式化字符串前面已经学习过。
代码演示:TO_CHAR对日期的处理
SQL& SELECT TO_CHAR(SYSDATE,'YYYY&年&MM&月&DD&日& HH24:MI:SS') &date&& ①
& 2& FROM DUAL;
-----------------------
日 12:06:00
代码解析:
①&&在格式化字符串中,使用双引号对非格式化字符进行引用。
针对数字的格式化,格式化字符有:
指定位置处显示数字。
指定位置返回小数点
指定位置返回一个逗号
数字开头返回一个美元符号
科学计数法表示
数字前加一个本地货币符号
如果数字式负数则用尖括号进行表示
表4& 数字格式化字符
代码演示:TO_CHAR对数字的处理
SQL& SELECT TO_CHAR(-,'L9.9EEEEPR') &date&
& 2& FROM DUAL
--------------------
&&¥1.2E+05&
2.&&&&&&&&&TO_DATE(x [,fmt])
把一个字符串以fmt格式转换为一个日期类型,前面已经学习过。
3.&&&&&&&&&TO_NUMBER(x[,fmt])
把一个字符串以fmt格式转换为一个数字。fmt格式字符参考表3。
代码演示:TO_NUM函数
SQL& SELECT TO_NUMBER('-$12,345.67','$99,999.99') &NUM&
& 2& FROM DUAL
---------------
&-12345.67
?&&其他单行函数
1.&&&&&&&&&NVL(x,value)
如果x为空,返回value,否则返回x。
&&&&&&&&&案例7:对工资是2000元以下的员工,如果没有发奖金,每人奖金100元。
代码演示:NVL函数
SQL& SELECT ENAME,JOB,SAL,NVL(COMM,100) FROM EMP WHERE SAL&2000;
NVL(COMM,100)
7 rows selected
2.&&&&&&&&&NVL2(x,value1,value2)
如果x非空,返回value1,否则返回value2。
案例8:对EMP表中工资为2000元以下的员工,如果没有奖金,则奖金为200元,如果有奖金,则在原来的奖金基础上加100元。
代码演示:NVL2函数
SQL& SELECT ENAME,JOB,SAL,NVL2(COMM,comm+100,200) &comm&
& 2& FROM EMP WHERE SAL&2000;
8 rows selected
?&&聚合函数
聚合函数同时对一组数据进行操作,返回一行结果,比如计算一组数据的总和,平均值等。
平均值
AVG(表达式)
SUM(表达式)
最小值、最大值
MIN(表达式)、MAX(表达式)
COUNT(表达式)
表 5& 聚合函数
案例9:求本月所有员工的基本工资总和。
代码演示:SUM函数
SQL& select sum(sal)
& SUM(SAL)
----------------
& &&&29025
案例10:求不同部门的平均工资。
代码演示:AVG函数下的分组查询
SQL& SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO;
DEPTNO&& AVG(SAL)
--------- &&&&&----------
&&& 30 &&&
&&& 20&&& 2175
&&& 10 &&&
?&&Oracle常用函数有字符相关的函数、数字相关的函数、日期相关的函数、转换函数等。
?&&EXTRACT函数能够获取日期中的某个字段的值。
?&&TO_CHAR函数能够把数字和日期转换成固定的字符串格式。TO_DATE&&&&&&&&&函数能够把固定格式的字符串转换为日期类型。
?&&子查询中有返回单行的子查询和返回多行的子查询。
?&&Oracle中存在ROWID、ROWNUM等伪列。
1.&&&&&&&描述TO_CHAR和TO_DATE函数的用法。
2.&&&&&&&描述EXTRACT函数的用法。
3.&&&&&&&你知道有哪些关于日期函数的用法?
章节知识结构图
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ü& 同义词概念
ü& 序列的应用
ü& 视图的概念
ü& 索引的概念
ü& 表空间的概念
数据库对象是数据库的组成部分,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作。前面已经接触过的数据库对象有表、用户等。
今天将学习更多的Oracle数据库对象:
?&&同义词:就是给数据库对象一个别名。
?&&序列:Oracle中实现增长的对象。
?&&视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。
?&&索引:对数据库表中的某些列进行排序,便于提高查询效率。
同义词(Synonym)是数据库对象的一个别名,Oracle可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:
?&&私有同义词:拥有CREATE SYNONYM权限的用户(包括非管理员用户)即可创建私有同义词,创建的私有同义词只能由当前用户使用。
?&&公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。
&&&&&&&&&创建同义词的语法是:
语法结构:同义词
CREATE [OR REPLACE] [PUBLIC] SYSNONYM [schema.]synonym_name
FOR [schema.]object_name
语法解析:
①&&CREATE [OR REPLACE:]表示在创建同义词时,如果该同义词已经存在,那么就用新创建的同义词代替旧同义词。
②&&PULBIC:创建公有同义词时使用的关键字,一般情况下不需要创建公有同义词。
③&&Oracle中一个用户可以创建表、视图等多种数据库对象,一个用户和该用户下的所有数据库对象的集合称为Schema(中文称为模式或者方案),用户名就是Schema名。一个数据库对象的全称是:用户名.对象名,即schema.object_name。
如果一个用户有权限访问其他用户对象时,就可以使用全称来访问。比如:
代码演示:System用户访问Scott用户的Emp表
SQL& conn system/manager@
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL&& SELECT ENAME,JOB,SAL FROM SCOTT.EMP WHERE SAL&2000;& ①
&6 rows selected
代码解析:
①&&管理员用户可以访问任何用户的数据库对象,SYSTEM用户访问SCOTT用户的EMP表时,必须使用SCOTT.EMP。
案例1:创建一个用户XiaoMei,该用户拥有CONNECT角色和RESOURCE角色。为SCOTT用户的EMP表创建同义词,并通过同义词访问该EMP表。
代码演示:创建同义词并访问
SQL& CONN system/manager@
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL& CREATE USER XiaoMei IDENTIFIED BY XiaoM &①
User created
SQL& GRANT CONNECT TO XiaoM
Grant succeeded
SQL& GRANT RESOURCE TO XiaoM
Grant succeeded
SQL& GRANT CREATE SYNONYM TO XiaoM
Grant succeeded
SQL& CONN XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL& CREATE SYNONYM MyEmp FOR SCOTT.EMP; &②
Synonym created
SQL& SELECT * FROM MYEMP; &③
SELECT * FROM MYEMP
ORA-00942: 表或视图不存在
SQL& CONNECT SCOTT/tiger@ORCL
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SCOTT
SQL& GRANT ALL ON EMP TO XiaoM &④
Grant succeeded
SQL& CONNECT XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL&& SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL&2000;& ⑤
&6 rows selected
代码解析:
①&&在管理员用户下创建用户XiaoMei,对用户XiaoMei授予CONNECT和RESOURCE角色。为了XiaoMei能够创建序列,必须授予系统权限:CREATE
②&&在XiaoMei用户下,为SCOTT.EMP创建私有同义词MyEmp,同义词MyEmp只能在XiaoMei用户下使用。访问MyEmp就是访问SCOTT.EMP对象。
③&&访问MyEmp对象出错:对象不存在。因为XiaoMei如果访问MyEmp,就相当于访问SCOTT.EMP对象,那么SCOTT用户必须对XiaoMei授予相应的权限。
④&&SCOTT用户下,把EMP表的所有权限(增删改查)授予XiaoMei。
⑤&&对MyEmp执行查询操作。MyEmp就可以像在本地的表一样使用。
删除同义词使用的语法是:
语法结构:删除同义词
DROP [PUBLIC] SYNONYM [schema.]sysnonym_name
语法解析:
①&&PUBLIC:删除公共同义词。
②&&同义词的删除只能被拥有同义词对象的用户或者管理员删除。
③&&此命令只能删除同义词,不能删除同义词下的源对象。
序列(Sequence)是用来生成连续的整数数据的对象。序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成。创建序列的语法是:
语法结构:创建序列
CREATE SEQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]
语法解析:
①&&START WITH:从某一个整数开始,升序默认值是1,降序默认值是-1。
②&&INCREMENT BY:增长数。如果是正数则升序生成,如果是负数则降序生成。升序默认值是1,降序默认值是-1。
③&&MAXVALUE:指最大值。
④&&NOMAXVALUE:这是最大值的默认选项,升序的最大值是:1027,降序默认值是-1。
⑤&&MINVALUE:指最小值。
⑥&&NOMINVALUE:这是默认值选项,升序默认值是1,降序默认值是-1026。
⑦&&CYCLE:表示如果升序达到最大值后,从最小值重新开始;如果是降序序列,达到最小值后,从最大值重新开始。
⑧&&NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。默认NOCYCLE。
⑨&&CACHE:使用CACHE选项时,该序列会根据序列规则预生成一组序列号。保留在内存中,当使用下一个序列号时,可以更快的响应。当内存中的序列号用完时,系统再生成一组新的序列号,并保存在缓存中,这样可以提高生成序列号的效率。Oracle默认会生产20个序列号。
⑩&&NOCACHE:不预先在内存中生成序列号。
案例2:创建一个从1开始,默认最大值,每次增长1的序列,要求NOCYCLE,缓存中有30个预先分配好的序列号。
代码演示:生成序列号
SQL& CREATE SEQUENCE MYSEQ
& 2& MINVALUE 1
& 3& START WITH 1
& 4& NOMAXVALUE
& 5& INCREMENT BY 1
& 6& NOCYCLE
& 7& CACHE 30
Sequence created
序列创建之后,可以通过序列对象的CURRVAL和NEXTVAL两个“伪列”分别访问该序列的当前值和下一个值。
代码演示:序列使用
SQL& SELECT MYSEQ.NEXTVAL FROM DUAL;
----------
SQL& SELECT MYSEQ.NEXTVAL FROM DUAL;
----------
SQL& SELECT MYSEQ.CURRVAL FROM DUAL;
----------
&&&&&&&&&使用ALTER SEQUENCE可以修改序列,在修改序列时有如下限制:
1.&&&&&&&不能修改序列的初始值。
2.&&&&&&&最小值不能大于当前值。
3.&&&&&&&最大值不能小于当前值。
使用DROP SEQUENCE命令可以删除一个序列对象。
代码演示:序列修改和删除
SQL& ALTER SEQUENCE MYSEQ
& 2& MAXVALUE 10000
& 3& MINVALUE -300
SEQUENCE ALTERED
SQL& DROP SEQUENCE MYSEQ;
SEQUENCE DROPPED
视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT…FROM即可。
视图具有以下优点:
1.&&&&&&&可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表。
2.&&&&&&&可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。
3.&&&&&&&限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定的安全性。
4.&&&&&&&从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
语法结构:创建视图
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
SELECT查询
[WITH READ ONLY CONSTRAINT]
语法解析:
1.&&&&&&&OR REPLACE:如果视图已经存在,则替换旧视图。
2.&&&&&&&FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
3.&&&&&&&NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
4.&&&&&&&WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH
READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
案例3:基于EMP表和DEPT表创建视图
代码演示:视图
SQL& CREATE OR REPLACE VIEW EMPDETAIL
& 3& SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME
& 4& FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO
& 5& WITH READ ONLY
VIEW CREATED
SQL& SELECT * FROM EMPDETAIL;& ①
17-12月-80
20-2月 -81
22-2月 -81
02-4月 -81
28-9月 -81
01-5月 -81
09-6月 -81
ACCOUNTING
19-4月 -87
17-11月-81
ACCOUNTING
08-9月 -81
23-5月 -87
03-12月-81
03-12月-81
23-1月 -82
ACCOUNTING
14 ROWS SELECTED
代码解析:
①&&&对视图可以像表一样进行查询。该视图中隐藏了员工的工资。
删除视图可以使用“DROP VIEW&视图名称”,删除视图不会影响基表的数据。
当我们在某本书中查找特定的章节内容时,可以先从书的目录着手,找到该章节所在的页码,然后快速的定位到该页。这种做法的前提是页面编号是有序的。如果页码无序,就只能从第一页开始,一页页的查找了。
数据库中索引(Index)的概念与目录的概念非常类似。如果某列出现在查询的条件中,而该列的数据是无序的,查询时只能从第一行开始一行一行的匹配。创建索引就是对某些特定列中的数据排序,生成独立的索引表。在某列上创建索引后,如果该列出现在查询条件中,Oracle会自动的引用该索引,先从索引表中查询出符合条件记录的ROWID,由于ROWID是记录的物理地址,因此可以根据ROWID快速的定位到具体的记录,表中的数据非常多时,引用索引带来的查询效率非常可观。
?&&如果表中的某些字段经常被查询并作为查询的条件出现时,就应该考虑为该列创建索引。
?&&当从很多行的表中查询少数行时,也要考虑创建索引。有一条基本的准则是:当任何单个查询要检索的行少于或者等于整个表行数的10%时,索引就非常有用。
Oracle数据库会为表的主键和包含唯一约束的列自动创建索引。索引可以提高查询的效率,但是在数据增删改时需要更新索引,因此索引对增删改时会有负面影响。
语法结构:创建索引
CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])
语法解析:
1.&&&&&&&UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引。
2.&&&&&&&index_name:指定索引名。
3.&&&&&&&tabl_name:指定要为哪个表创建索引。
4.&&&&&&&column_name:指定要对哪个列创建索引。我们也可以对多列创建索引;这种索引称为组合索引。
案例4:为EMP表的ENAME列创建创建唯一索引,为EMP表的工资列创建普通索引,把JOB列先变为小写再创建索引。
代码演示:创建索引
SQL& CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME); &①
Index created
SQL& CREATE INDEX IDX_SAL ON EMP(SAL); &②
Index created
SQL& CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));& ③
Index created
代码解析:
①&&为SCOTT.EMP表的ENAME列创建唯一索引。
②&&为SCOTT.EMP表的SAL列创建索引。
③&&在查询中可能经常使用job的小写作为条件的表达式,因此创建索引时,可以先对JOB列中的所有值转换为小写后创建索引,而这时需要使用lower函数,这种索引称为基于函数的索引。
在select语句查询时,Oracle系统会自动为查询条件上的列应用索引。索引就是对某一列进行排序,因此在索引列上,重复值越少,索引的效果越明显。
Oracle可以为一些列值重复非常多且值有限的列(比如性别列)上创建位图索引。关于Oracle更多的索引类型(比如反向键索引等),请参考Oracle官方文档。
在数据库系统中,存储空间是较为重要的资源,合理利用空间,不但能节省空间,还可以提高系统的效率和工作性能。Oracle可以存放海量数据,所有数据都在数据文件中存储。而数据文件大小受操作系统限制,并且过大的数据文件对数据的存取性能影响非常大。同时Oracle是跨平台的数据库,Oracle数据可以轻松的在不同平台上移植,那么如何才能提供统一存取格式的大容量呢?Oracle采用表空间来解决。
表空间只是一个逻辑概念,若干操作系统文件(文件可以不是很大)可以组成一个表空间。表空间统一管理空间中的数据文件,一个数据文件只能属于一个表空间。一个数据库空间由若干个表空间组成。如图所示:
图1& 数据空间、表空间和数据文件
&&&&&&&& Oracle中所有的数据(包括系统数据),全部保存在表空间中,常见的表空间有:
?&&系统表空间:存放系统数据,系统表空间在数据库创建时创建。表空间名称为SYSTEM。存放数据字典和视图以及数据库结构等重要系统数据信息,在运行时如果SYSTEM空间不足,对数据库影响会比较大,虽然在系统运行过程中可以通过命令扩充空间,但还是会影响数据库的性能,因此有必要在创建数据库时适当的把数据文件设置大一些。
?&&TMEP表空间:临时表空间,安装数据库时创建,可以在运行时通过命令增大临时表空间。临时表空间的重要作用是数据排序。比如当用户执行了诸如Order by等命令后,服务器需要对所选取数据进行排序,如果数据很大,内存的排序区可能装不下太,就需要把一些中间的排序结果写在硬盘的临时表空间中。
?&&用户表自定义空间:用户可以通过CREATE TABLESPACE命令创建表空间。
创建表空间需要考虑数据库对分区(Extent,一个Oracle分区是数据库文件中一段连续的空间,Oracle分区是Oracle管理中最小的单位)的管理,比如当一个表创建后先申请一个分区,在Insert执行过程中,如果分区数据已满,需要重新申请另外的分区。如果一个数据库中的分区大小不一,创建表空间时需要考虑一系列问题。因此在Oracle8i之后,创建表空间都推荐使用“本地管理表空间”,这种表空间中的分区是一个固定大小的值,创建表空间的语法是:
语法结构:创建表空间
CREATE TABLESPACE 空间名称
DATAFILE '文件名1' SIZE 数字M
[,'文件名2' SIZE 数字….]
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 数字M
语法解析:
1.&&&&&&&文件名包括完整路径和文件名,每个数据文件定义了文件的初始大小,初始大小一般以“M”为单位。一个表空间中可以有多个数据文件。
2.&&&&&&&EXTENT MANAGEMENT LOCAL指明表空间类型是:本地管理表空间。本地管理表空间要求Oracle中的数据分区(Extent)大小统一。
3.&&&&&&&UNIFORM SIZE:指定每个分区的统一大小。
案例5:创建一个表空间,包含两个数据文件大小分别是10MB,5MB,要求extent的大小统一为1M。
代码演示:创建表空间
SQL& CREATE TABLESPACE MYSPACE
& 2& DATAFILE 'D:/A.ORA' SIZE 10M,
& 3&&&&&&&&&&&& 'D:/B.ORA' SIZE 5M
& 4& EXTENT MANAGEMENT LOCAL
& 5& UNIFORM SIZE 1M
Tablespace created
必须是管理员用户才能创建表空间,当表空间的空间不足时可以使用ALTER TABLESPACE命令向表空间中追加数据文件扩充表空间。
代码演示:扩充表空间
SQL& ALTER TABLESPACE MYSPACE
& 2& ADD DATAFILE 'D:/C.ORA' SIZE 10M
Tablespace altered
&&&&&&&&&表空间可以在不使用时删除,使用DROP TABLESPACE命令。
&&&&&&&&&数据库的所有数据全部在某一表空间中存放,在创建用户时,可以为用户指定某一表空间,那么该用户下的所有数据库对象(比如表)默认都存储在该空间中。
代码演示:为某一用户指定默认表空间
SQL& CREATE USER ACONG IDENTIFIED BY ACONG
& 2&& DEFAULT TABLESPACE MYSPACE
User created
&&&&&&&&&在创建表时,表中数据存放在用户的默认表空间中,也可以通过tablespace子句为表指定表中数据存放在其他表空间中。
代码演示:为表指定表空间
SQL& CREATE TABLE SCORES
& 3&&&&&&&&& ID NUMBER ,
& 4&&&&&&&&& TERM VARCHAR2(2),
& 5& && &&&&STUID VARCHAR2(7) NOT NULL,
& 6& && &&&&EXAMNO VARCHAR2(7) NOT NULL,
& 7& && &&&&WRITTENSCORE NUMBER(4,1) NOT NULL,
& 8& && &&&&LABSCORE NUMBER(4,1) NOT NULL
&10& TABLESPACE MYSPACE
Table created
&&&&&&&&&创建索引时也可以为索引指定表空间。
代码演示:为索引指定表空间
SQL& CREATE INDEX UQ_ID ON SCORES(ID)
& 2& TABLESPACE MYSPACE;
Index created
&&&&&&&&&表和索引一旦创建,表空间无法修改。
?&&Oracle数据库对象都是使用CREATE命令创建的。
?&&同义词就是数据库对象的一个别名。同义词的类型有公有同义词和私有同义词。只有管理员可以创建

我要回帖

更多关于 备付钱包要怎样填资料才能通过审核 的文章

 

随机推荐