声明:最近再学习Oracle,《Oracle学习笔记》由chstone根据自己的学习情况整理,如需转载,请注明原作者chstone(西兰卡普)以及原始出处http://www.hack286.com/。谢谢大家的支持!如果发现文中错误或者有疑问,请和作者chstone交流,欢迎指教,共同学习。联系方式QQ:19122116 e_mail:[email protected]学习笔记之一
2007年1月9日1.1 Oracle公司发展历史
SDL(Software Development Laboratory,软件开发实验室)是Oracle公司曾经使用过的一个名字。
用户名Scott是开发者Bruce Scott的名字,口令Tiger则是他的猫。
1977年,Larry Ellison、Bob Miner和Ed Oates建立了SDL。
Oracle的含义是“神喻”,预言或者作出这种预言的人。
1978年,Oracle 1.0使用汇编语言,这个版本从未发行。这一年,公司的名字由Software Development Laboratory改成Relational Software Inc.(RSI)。
1980年,Relational Software公司正是改名为Oracle Systems Corporation(后来变为Oracle Corporation)。
Oracle 3采用C语言编写。
Read Consistency读一致性。
1985年,Oracle进入金融应用行业。
CASE(Computer-assisted software engineering计算机辅助软件设计)。
Oracle 8i采用Java编写。1.2 目前提供的产品
Oracle Corporation提供信息管理用的软件。其中包括:数据库管理、应用开发、商务智能以及基于Internet的商务应用。
作为一套产品,Oracle可以分为5个领域:
1、Oracle9i数据库。
2、Oracle9i Application Server。
3、Internet Development Suite。
4、Date Warehousing和Business Development。
5、Oracle E-Business Suite。1.3 术语
DBMS代表数据库管理系统。可以把它当成数据库文件的文件管理器。现在最常用的数据库管理系统是RDBMS。RDBMS代表关系数据库管理系统。
TAR(Technical Assistance Request)技术援助需求。1.4 在Oracle服务器端配置监听器
手动配置服务器端监听器:监听器配置包括监听协议、地址以及其他相关信息的参数。监听器配置存储在一个名称为listener.ora的配置文件中,该文件位于ORACLE_HOME\network\admin目录下。(ORACLE_HOME为Oracle软件的安装目录,后同。)
Listener.ora配置文件中的内容如下(可以使用EditPlus等文档编辑工具打开):
# LISTENER.ORA Network Configuration File: e:\oracle\ora92\network\admin\listener.ora
# Generated by Oracle configuration tools.LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
)SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLXXXtProc)
(ORACLE_HOME = e:\oracle\ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = chstone)
(ORACLE_HOME = e:\oracle\ora92)
(SID_NAME = chstone)
)
)
我们主要修改的是“LISTENER”中的“ADDRESS”这一项,其中“PROTOCOL”是协议类型,一般都为TCP。“HOST”是主机地址,如果本机配置,可以使用127.0.0.1,但如果在局域网中或者远程终端连结,就需要配置本机的IP地址了,如上就配置了两个IP,本机的127.0.0.1和局域网中的192.168.5.1。“PORT”是使用端口号,默认为1521。
2007年1月9日1.1 Oracle公司发展历史
SDL(Software Development Laboratory,软件开发实验室)是Oracle公司曾经使用过的一个名字。
用户名Scott是开发者Bruce Scott的名字,口令Tiger则是他的猫。
1977年,Larry Ellison、Bob Miner和Ed Oates建立了SDL。
Oracle的含义是“神喻”,预言或者作出这种预言的人。
1978年,Oracle 1.0使用汇编语言,这个版本从未发行。这一年,公司的名字由Software Development Laboratory改成Relational Software Inc.(RSI)。
1980年,Relational Software公司正是改名为Oracle Systems Corporation(后来变为Oracle Corporation)。
Oracle 3采用C语言编写。
Read Consistency读一致性。
1985年,Oracle进入金融应用行业。
CASE(Computer-assisted software engineering计算机辅助软件设计)。
Oracle 8i采用Java编写。1.2 目前提供的产品
Oracle Corporation提供信息管理用的软件。其中包括:数据库管理、应用开发、商务智能以及基于Internet的商务应用。
作为一套产品,Oracle可以分为5个领域:
1、Oracle9i数据库。
2、Oracle9i Application Server。
3、Internet Development Suite。
4、Date Warehousing和Business Development。
5、Oracle E-Business Suite。1.3 术语
DBMS代表数据库管理系统。可以把它当成数据库文件的文件管理器。现在最常用的数据库管理系统是RDBMS。RDBMS代表关系数据库管理系统。
TAR(Technical Assistance Request)技术援助需求。1.4 在Oracle服务器端配置监听器
手动配置服务器端监听器:监听器配置包括监听协议、地址以及其他相关信息的参数。监听器配置存储在一个名称为listener.ora的配置文件中,该文件位于ORACLE_HOME\network\admin目录下。(ORACLE_HOME为Oracle软件的安装目录,后同。)
Listener.ora配置文件中的内容如下(可以使用EditPlus等文档编辑工具打开):
# LISTENER.ORA Network Configuration File: e:\oracle\ora92\network\admin\listener.ora
# Generated by Oracle configuration tools.LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
)SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLXXXtProc)
(ORACLE_HOME = e:\oracle\ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = chstone)
(ORACLE_HOME = e:\oracle\ora92)
(SID_NAME = chstone)
)
)
我们主要修改的是“LISTENER”中的“ADDRESS”这一项,其中“PROTOCOL”是协议类型,一般都为TCP。“HOST”是主机地址,如果本机配置,可以使用127.0.0.1,但如果在局域网中或者远程终端连结,就需要配置本机的IP地址了,如上就配置了两个IP,本机的127.0.0.1和局域网中的192.168.5.1。“PORT”是使用端口号,默认为1521。
解决方案 »
- 如何查询一个表的主键、外键、索引等信息?
- plsql 8.0如何在windows server 2008下连64bit 的Oracle 11g client
- 求助:spool中文乱码问题
- 9i与8i导出数据的问题
- 急!Oracle OLAP 技术难题和询问 (入者给分)
- 在SQLServer中可以执行的多表关联更新复杂语句(update from where),在Oracle中执行不了,请问怎么写?急,谢谢!
- 用SYS_GUID做为默认值,不可以么?
- 菜鸟求助:如何在ORACLE中使用变量?(在线等)
- 如何判断两个时间差小于5分钟的记录,并将他们合并只取时间较早的记录???
- 我安装的oracle8i无法启动了,我想升级成orale9i!会影响以前存在的数据
- 查询数据为空的问题
- 求助关于用触发器实现在ORACLE数据库中删除某张表中的满足条件的记录
客户端服务名与远程或本地的监听器建立连接,客户用它向服务器端发出连接请求。
安装Oracle时,用户必须指定一个全局数据库名称,即一个SID名称。Oracle用指定的SID名称在服务器端自动创建一个服务名。在客户端创建服务名时,需要指定网络协议、与协议相关的信息和数据库的SID名称。对于最常用的TCP/IP协议来说,需要指定服务器主机名或IP地址、监听器端口和数据库SID。这些配置信息都存储在tnsnames.ora文件中,该文件同listener.ora保存位置相同,都位于ORACLE_HOME\network\admin目录下。另外也可以使用开始—程序—Oracle-OraHome92—Configuration and Migration Tools—Net Configuration Assistant的向导界面进行配置。这里主要看手动配置过程。
Tnsname.ora文件中主要需要配置的文件如下:
TESTSERVICE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = chstone)
)
)
我们一项项来看,首先是“TESTSERVICE”,这就是在客户端配置的服务名,名字可以任意取,但是一定要记住,前面不可以有空格。“(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.1)(PORT = 1521))”这一段中,“PROTOCOL”代表协议类型,此处为TCP;“HOST”是服务器端的IP地址或者主机名;“PROT”是端口号。下面的“SERVICE_NAME”代表服务器端的服务名。因为我安装的时候指定的SID名称为“chstone”,所以在这里Oracle用指定的SID名称在服务器端自动创建一个默认服务名“chstone”。当在使用SQL*Plus登陆连接服务器端时,主机字符串中就填刚才配置好的客户端Net服务名“TESTSERVICE”,如果是将本机作为服务器,则主机字符串可以不填。1.6 使用SQL*Plus查询工具连接Oracle数据库
在连接数据库服务器之前,先要在Windows的控制面板――管理工具――服务中开启两个和Oracle有关的服务,即:OracleOraHome92TNSListener(监听器服务)和OracleServiceCHSTONE(实例服务),如果本机作服务器,并且不接受远程客户端登陆的话,可以只开后面一个实例服务就行了。
建立连接:开始—程序—Oracle-OraHome92—Application Development—SQL Plus,出现登录对话框,输入用户名和口令,主机字符串就是前面配置的Net服务名,如果为空,表示连接本机上默认数据库。
使用开始—运行建立连接的方法:
直接输入“sqlplus”进入状态下的SQL*Plus,输入“sqlplusw”进入Windos状态下的SQL*Plus;可直接在后面输入用户名密码登陆进去,例如“sqlplusw scott/tiger”;如果要登陆远程服务器,则在后面加上主机字符串,主机字符串前面加@与密码分隔,例如:要登陆远程服务器,用我们上面配置的Net服务名,就是:“sqlplusw scott/tiger@testservice”。
$符号用来在SQL*Plus下执行dos命令,比如启动和关闭服务:
$ net start OracleServiceCHSTONE(启动服务)
$ net stop OracleServiceCHSTONE(关闭服务)1.7 SQL*Plus中一些常用的命令及使用技巧
SQL> show user;显示当前用户(在SQL*Plus工具中专用的,更好的方式是使用SQL> select user from dual;语句进行查看当前用户,其中dual表是每个SQL*Plus用户都可以使用的Oracle表,这里真正重要的是要知道它只含有一行数据。);
SQL> set pagelize 20;设置每页显示行数为20;
SQL> set linesize 100;设置每行显示的字符数为100;(如果嫌每次设置麻烦,可以将这两条语句保存在C:\oracle\ora92\sqlplus\admin\glogin.sql中,每次启动是Oracle会自动运行glogin.sql文件,相当于初始化)
SQL> show all;查看当前的环境设置;
SQL> spool file_name;将显示的内容输出到指定文件,例如spool c:\spool.txt;
SQL> spool off;关闭spool输出,只有关闭spool输出,才会在输出文件中看到输出的内容;
SQL> /;重新运行上一次命令;
SQL> set timing on/off;显示、关闭每个sql语句花费的执行时间;
SQL> select * from tab;查看当前用户下所有表;
SQL> start file_name;或SQL> @ file_name;执行一个SQL脚本文件,我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理;
SQL> desc table_name;显示表的结构;
SQL*Plus中的快速复制和粘贴技巧(摘自www.cnoug.org):
1) 鼠标移至想要复制内容的开始
2) 用右手食指按下鼠标左键
3) 向想要复制内容的另一角拖动鼠标,与Word中选取内容的方法一样
4) 内容选取完毕后(所选内容全部反显),鼠标左键按住不动,用右手中指按鼠标右键
5) 这时,所选内容会自动复制到SQL*Plus环境的最后一行1.8超级用户密码忘记的处理方式
1、在开始运行中输入sqlplusw /nolog登陆,即不启动服务登陆。
2、利用$ net start OracleServiceCHSTONE和$ net start OracleOraHome92TNSListener启动两个服务。
3、以超级用户身份连接数据库 SQL> connect / as sysdba;
4、修改system的密码:SQL> alter user system identified by “password”。
2007年1月12日2.1 创建新用户并授权
SQL>Create user username
Identified by “password”
Default tablespace users
Temporary tablespace temp
Account lock;
以上语句的意思是创建一个名为“username”的用户,密码为“password”,默认表空间为“users”,临时表空间为“temp”,“Account lock”意思在创建用户时锁定用户。并且当用户被锁定时不能重复锁定。
Grant命令用于为用户分配权限或角色:
SQL>Grant connect to username; 允许用户连接数据库并在数据库中创建表或其他对象;
SQL>Grant resource to username;允许用户使用数据库中的空间;
SQL>Grant create sequence to username;允许用户创建序列。
SQL>Grant select on emp to username;用户scott允许用户username查看emp表中的记录;
SQL>Grant update on emp to username;用户scott允许用户username更新emp表中的记录;
SQL>Grant all on emp to username;用户scott授予用户username对emp表的各种权限。
SQL>Revoke select,update on emp from username;收回用户username在emp表中的查看、更新权限;
SQL>Alter user username identified by “password”;修改用户口令;
SQL>Alter user username account unlock;为用户解锁;
SQL>Drop user username cascade;删除用户,当用户拥有模式对象时必须使用cascade选项删除模式对象。2.2 SQL常用的命令分类及例子
数据定义语言:create(创建)、alter(更改)和drop(删除)命令。
数据操纵语言:insert(插入)、select(选择)、delete(删除)和update(更新)命令。
事务控制语言:commit(提交)、savepoint(保存点)和rollback(回滚)命令。
数据控制语言:grant(授予)和revoke(回收)。
数据定义语言举例:
SQL> create tablespace mySpa datafile ‘c:\mySpa.dbf’ size 100M;创建大小为100M、名为mySpa的表空间,文件位于C盘根目录下;
SQL> create table myTab(no number(4),name varchar2(20));创建一个名为myTab的表,包含两列no和name;
SQL> alter table myTab modify (name varchar2(25));修改myTab中的name列,使此列能容纳25个字符;
SQL> alter table myTab add (tel_no varchar2(20));给表myTab增加一列tel_no;
SQL> alter table myTab drop column tel_no;删除表myTab的tel_no列;
SQL> drop table myTab;删除表myTab;
SQL> truncate table myTab;删除表myTab中的所有行(截断表)。不可以回滚。
数据操纵语言举例:
SQL> insert into myTab values(‘001’,’John’);向表myTab中插入一行数据;
SQL> select distinct sal “薪水” from emp where sal>1500 order by sal desc;选择表中sal大于1500的数据,以别名“薪水”显示并按照sal的降序进行排列输出;
SQL> create table empa as select empno,ename,job,sal from emp;从emp表中选择“empno,ename,job,sal”四列的数据建立新表empa;
SQL> create table empa as select * from emp where 1=2;使用一个假条件根据现有表emp创建一个只包含结构的空表empa;
SQL> delete from empa where sal<1500;删除表empa中sal小于1500的行;
SQL> update empa set sal=1500 where sal<1500;更新,将表empa中sal小于1500的行的sal值全部改为1500。
事务控制语言举例:
SQL> commit;用于提交并结束事务处理;
SQL> savepoint 1;保存点类似于标记,用来标记事务中可以应用回滚的点;
SQL> rollback to savepoint 1;回滚到保存点1。2.2 Oracle中的伪列
伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是不能插入、更新或删除它们的值。常用的伪列:rowid和rownum。
Rowid:数据库中的每一行都有一个行地址,Rowid伪列返回该行地址。可以使用Rowid值来定位表中的一行。通常情况下,Rowid值可以唯一地标识数据库中的一行。
Rowid伪列有以下重要用途:
1)能以最快的方式访问表中的一行;
2)能显示表的行是如何存储的。
3)可以作为表中行的唯一标识。
如:SQL> select rowid,ename from emp;
Rownum:对于一个查询返回的每一行,Rownum伪列返回一个数值代表的次序。返回的第一行的Rownum值为1,第二行的Rownum值为2,依此类推。通过使用Rownum伪列,用户可以限制查询返回的行数。
如:SQL>select * from emp where rownum<11; 从EMP表中提取10条记录。
2007年1月15日3.1 SQL*Plus中的数学函数
数学函数 示例 结果 说明
Abs(value) Abs(-70) 70 返回value的绝对值,结果恒为正
Ceil(value) Ceil(34.09) 35 返回大于或等于value的最接近的整数
Cos(value) Cos(180) 0.5984601 返回value的余弦值
Floor(value) Floor(34.09) 34 返回等于或小于value的最大的整数
Mod(value,divisor) Mod(100,6) 4 返回value除divisor的余数。如果divisor等于0,则返回value
Power(value,exponent)Power(5,2) 25 返回vaule的exponent次幂
Round(value,precision)Round(4.789,2) 4.79 结果近似到小数点右侧的precision位
Sign(value) Sign(-309.1) -1 返回一个数值,指出value是正还是负。>0返回1,<0返回-1,=0返回0
Sqrt(value) Sqrt(25) 5 返回value的平方根
Trunc(value,precision) Trunk(4.789,2) 4.78 返回舍入到指定的precision位的value值。如果precision为正,就截取到小数点右侧的这个数值处。如果指定的precision为负,就截取到小数点左侧的该数值处。如果没有指定precision,就假定为0,截取到小数点处 Trunk(456.789,-1) 450
Trunk(456.789,-2) 400
3.2 SQL*Plus中的字符串函数
字符串函数 示例 显示结果 返回值
Length(value) Length(‘massachusetts’) 13 Length函数返回value的长度。Value可以是字符串、数字或者表达式
Lower(string) Lower(‘BOSTON’) boston Lower函数把给定的字符串string中的字符变成小写
Upper(string) Upper(‘boston’) BOSTON Upper函数将string的字符改为大写
Lpad(string,
Length
[,padding]) Lpad(‘Total:’,10,’*’) ****Total: Lpad函数在string左侧填充padding指定的字符串,直到string达到了给定的length长度。如果未指定padding,相应的空间使用默认值
Rpad(string,
length[,padding]) Rpad(‘Total:’,10,’*’) Total:**** 作用和Lpad相同,只是在右侧填充
Ltrim(string
[,trimming_value]) Ltrim(‘mississippi’,’mis’) ppi Ltrim函数从左侧修剪string。它从字符串左侧删除trimming_value中出现的任何字符,直到出现trimming_value中没有的字符为止。如果没有指定trimming_value,就使用默认空间
Rtrim(string
[,trimming_value]) Rtrim(‘mississippi’,’ip’) mississ 和ltrim功能相同,只是从右侧修剪。这对于通过删除不想要的空间以清理数据时很有用
Initcap(string) Initcap(‘mr Corey’) Mr Corey Initcap 函数将每个字符串的首字母大写
Instr(string,value
[,start[,occurrence]]) Instr(‘mississippi’,’is’,1,2) 5 Instr函数返回value在string中的位置。如果指定start位置,instr就从那开始。如果指定了occurance,instr返回value出现occurance次的位置。注意:日期和数字可以代替字符串
Replace(string,if,then) Replace(‘dogcatdogcat’,’dog’,’cat’) catcatcatcat Replace函数在string中查if,并用then替换
Soundex(string) Shoudex(‘mike’) M200 该函数语法与其他的字符串函数不同,它用来查找与string发音相似的单词。返回结果的首字母要与string的首字母相同
Substr(string,start[,count]) Substr(‘candlestick’,7) stick Substr函数从string中提取从start指定的位置开始的count个字符。如果未指定count,从start开始的所有字符都要被提取
Add_months(date,number) add_months函数返回给指定的日期加上指定的月数后的日期值。例:select sysdate as today,add_months(sysdate,1) as next_nonth,add_month
(sysdate,-1) as last_month from dual;
Last_day(date) last_day函数返回指定日期所在月的最后一天。例:select last_day(sysdate) as last_day from dual;
Months_between(date1,date2) month_between函数返回date1减去date2得到的月数。通常,date1是将来的日期。所得结果通常是个小数。例:select months_between
(’01-5月-2007’,sysdate) from dual;
New_time(current_date,current_zone,future_zone) next_time函数根据current_date和current_zone,返回在future_zone中的日期。current_zone和future_zone是代表时区的三个字母简写。其中一些常用的值如下:
AST/ADT Atlantic标准/白昼时间
BST/BDT Bering标准/白昼时间
CST/CDT Central标准/白昼时间
EST/EDT Eastern标准/白昼时间
GMT 格林威治标准时间
MST/MDT Mountain标准/白昼时间
NST Newfoundland标准时间
PST/PDT Pacific标准/白昼时间
YST/YDT Yukon标准/白昼时间
HST/HDT Alaska-Hawaii标准/白昼时间
Next_day(date,’day’) next_day函数给出date后的day所在的日期,day是全拼出来的星期名称。例:select next_day(sysdate,’星期二’) from dual;
Round(date,’format’) round函数把date四舍五入到由format指定的格式。例:select round(sysdate,’month’) from dual;
To_char(date,’format’) to_char函数接收date,并把它以给定的format形式作为字符类型的日期返回。多数情况下,用于把日期和字符段连接起来。例:select to_char
(sysdate,’YYYY”年”fmMM”月”fmDD”日”’) from dual;
To_date(string,’format’) to_day函数将char或varchar2数据类型转换为日期数据类型,格式模型format指定字符的形式。例:select to_date(‘2005-12-06’,’yyyy-mm-dd’) from dual;
Trunk(date,’format’) trunc函数将指定日期截断为格式模型format指定的单位的日期,与round函数不同的是它只舍不入。例:select trunc(sysdate,’month’) from dual;
SQL*Plus中有一个decode语句,它可以用来在SQL*Plus中实现if-then-else逻辑。其语法为:decode(colum_name,comparison1,action1,comparison2,action2,…else action);
Decode语句把colum_name的内容与每一个comparison进行比较,如果结果相等,decode执行action动作。如果没有任何一项与comparison匹配,程序就执行else action动作。我们可以看一些例子:Select ename,job,decode(job,’ANALYST’,’分析员’,’CLERK’,’办事员’,’MANAGER’,’经理’,’PRESIDENT’,’主管’,’销售员’) as “工作” from emp;
我们可以利用decode语句来进行表中的行列互换或者统计,例如在emp表中统计各部门的工作人员工作类别,可以按照下面的步骤来做(为了便于理解,我们将步骤进行分解):
1、select deptno,ename,job from emp;选择表中部门、姓名、工作三项;
2、select deptno,ename,job,decode(job,’ANALYST’,1) as ANALYST from emp; 选择表中部门、姓名、工作三项,同时将ANALYST用数字1标识;
3、select deptno,ename,job,decode(job,’ANALYST’,1) as ANALYST,
decode(job,’CLERK’,1) as CLERK,
decode(job,’MANAGER’,1) as MANAGER,
decode(job,’PRESIDENT’,1) as PRESIDENT,
decode(job,’SALESMAN’,1) as SALESMAN
from emp order by deptno;重复步骤2的工作,将各种职业用数值1标识出来,并按照部门号进行排序。
4、select deptno, sum(decode(job,’ANALYST’,1,0)) as ANALYST,
sum(decode(job,’CLERK’,1,0)) as CLERK,
sum(decode(job,’MANAGER’,1,0)) as MANAGER,
sum(decode(job,’PRESIDENT’,1,0)) as PRESIDENT,
sum(decode(job,’SALESMAN’,1,0)) as SALESMAN
from emp group by deptno;
最后一步,按照部门进行分组,并求每一组中相同工作种类的和,这样就统计出了每个部门各个不同工种的人员各有多少了。
下面再看一个关于学生成绩统计的例子。
我们先建一个表,并插入数据:
Create table stuInfo(
stuno number(8),
curno number(4),
score number(5,2)); 表名stuInfo,包含3列:学生编号stuno,课程编号curno,分数score。然后我们随机插入一些数据。
insert into stuInfo values (9801,1001,84);
insert into stuInfo values (9801,1002,97);
insert into stuInfo values (9801,1003,72);
insert into stuInfo values (9802,1001,65);
insert into stuInfo values (9802,1002,87);
insert into stuInfo values (9802,1003,64);
insert into stuInfo values (9803,1001,98);
insert into stuInfo values (9803,1003,83);
insert into stuInfo values (9804,1002,72);
insert into stuInfo values (9804,1003,65);
insert into stuInfo values (9805,1001,88);
insert into stuInfo values (9805,1003,90);
insert into stuInfo values (9806,1002,70);
insert into stuInfo values (9807,1003,62);
下面进行替换:
select stuno,curno,
decode(curno,1001,score) as 语文,
decode(curno,1002,score) as 数学,
decode(curno,1003,score) as 英语
from stuInfo;
然后分组统计:
select stuno,
sum(decode(curno,1001,score)) as 语文,
sum(decode(curno,1002,score)) as 数学,
sum(decode(curno,1003,score)) as 英语
from stuInfo group by stuno;