1.登陆
|
Oracle安装会自动的生成sys用户和system用户 (1)、sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install (2)、system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是manager (3)、一般讲,对数据库维护,使用system用户登录就可以拉 注意:也就是说sys和system这两个用户最大的区别是在于有没有create database的权限。 |
||
|
sys用户以sqlplus /as sysdba方式登录时,采用的是操作系统验证的方式,所以用户名、密码输入与不输入是一样的 |
||
|
查询当前登录用户: |
显示当前用户: |
|
|
切换用户 |
conn 用户名/密码@网络服务名 [as sysdba/sysoper] 特权用户连接是需要带上 disc/disconn/disconnect该命令用来断开与当前数据库的连接 |
|
|
解锁用户 |
SQL> Alter user acc01 account lock; // 加锁 SQL> Alter user acc01 account unlock; // 解锁 |
|
|
创建用户 |
create user username identified by password |
|
|
用户权限授权、角色管理 |
权限分类: 1.系统权限:DBA( 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构)、RESOURCE(只可以创建实体,不可以创建数据库结构)、CONNECT(只可以登录Oracle,不可以创建实体,不可以创建数据库结构) =====系统权限补充========= Oracle提供了100多种系统权限,常用的有: create session 连接数据库 显示所有系统权限:可以查询数据字典视图system_privilege_map select * from system_privilege_map order by name; ========================== 2.实体权限(对象权限):用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限,比如smith用户要访问scott.emp表(scott:方案 ,emp:表) select, update, insert, alter, index, delete, reference(引用),execute(执行),all //all包括所有权限 显示用户或者角色所具有的对象权限: 可以查询数据字典视图dba_tab_privs SQL> select distinct privilege from dba_tab_privs; dba_tab_privs where grantee = 'BLAKE'; ------------------------------------------------------------------------------------------------------ 角色管理: 1.创建角色 验证的方式:create role 角色名 not identified; 不验证的方式:create role 角色名 identified by 密码; 2.角色赋予权限: 方法1:(1.登录权限2.使用表空间权限3-6:增删改查权限) 方法2:使用数据库本身的角色 注意:系统权限的unlimited tablespace和对象权限的with grant option选项是不能授予角色的。 普通开发者拥有connect角色(create session登录)、resource角色(create cluster聚簇 procedure过程 sequence序列 table表 trigger触发器 type 类型 及删改查功能 不包含创建视图权限)就可以了。 3.授予角色给用户(要有grant any role 权限) grant role1 to user1; 4.删除角色(要有drop any role权限) SQL> drop role 角色名; 5.显示角色信息 显示所有角色:select * from dba_roles; 显示角色具有的系统权限:select * from role_sys_privs; 显示角色具有的对象权限:select distinct privilege from dba_tab_privs; 显示用户具有的角色及默认角色:select granted_role, default_role from dba_role_privs where grantee = ‘用户名’; --------------------------------------------------------------------------------------------------- 3.查看 查看用户角色 select * from user_role_privs; 使用dba_role_privs不行是为什么呢(sys用户可以用,是因为user开头的返回当前用户对应方案的所有表,dba开头的显示所有方案拥有的数据库表但是用户必须是dba角色,如7.1数据字典所述)? 查看当前用户的权限 select * from session_privs; ------------------------------------------------------------------------------------------------------ 4.权限传递与回收 1、with admin option用于系统权限授权,with grant option用于对象授权。 2、with admin option:,此用户可把此系统权限授予其他用户或角色,但收回这个用户的系统权限时,这个用户已经授予其他用户或角色的此系统权限不会因传播无效(不可以级联回收),如授予A系统权限create session with admin option,然后A又把create session权限授予B,但管理员收回A的create session权限时,B依然拥有create session的权限,但管理员可以显式收回B create session的权限,即直接revoke create session from B.
with grant option:被授予的用户也可把此对象权限授予其他用户或角色,不同的是但管理员收回用with grant option授权的用户对象权限时,权限会因传播而失效(级联回收),如grant select on table with grant option to A,A用户把此权限授予B,但管理员收回A的权限时,B的权限也会失效,但管理员不可以直接收回B的SELECT ON TABLE 权限。
|
|
|
用户其他命令 |
1.修改用户密码 passw 或 (password 用户名) 或 alter user 用户名 identified by 新密码 2.删除用户 drop user 用户名 [cascade 参数用户将用户跟表一同删除] 2.显示当前用户名 show user 3.断开数据库链接 exit 4.清空屏幕 clear screen |
|
|
Plsql连接数据库 |
D:\software\oracle\app\oracle\product\11.2.0\server\network\ADMIN中tnsnames.ora文件中配置链接地址,再由plsql登录窗口进行访问 |
|
|
profile |
用户口令管理 |
|
2.数据类型
|
数据类型 |
||
|
字符串类型的数据可依编码方式分成数据库字符集(CHAR/VARCHAR2/CLOB/LONG)和国际字符集(NCHAR/NVARCHAR2/NCLOB)两种。 |
||
|
字符串类型 |
CHAR |
定长,默认长为1,最多存储2000字节信息, 例:CHAR(12 BYTE) CHAR(12 CHAR) byte:字节数据类型,有符号型,占一个字节 -128~127 char:字符数据类型,无符号型,占两个字节0~65535,一个unicode字符,可表示中文字符 |
|
VARCHAR2 |
变长字符串,不使用空格填充,最多存储4000字节信息 |
|
|
NCHAR |
包含unicode格式数据的定长字符串,最多存储2000字节 |
|
|
NVARCHAR2 |
包含unicode格式数据的变长字符串,最多存储4000字节 |
|
|
数字类型 |
NUMBER(P,S) |
P:有效数字位数,最多不超过38个字 S:小数的位数 |
|
INTEGER |
等同于NUMBER(38,0) 整数,若有小数会被四舍五入 |
|
|
浮点数 |
BINARY_FLOAT:32位 单精度 BINARY_DOUBLE:64位 双精度 |
|
|
FLOAT(N) |
N指示位的精度 |
|
|
日期类型 |
DATE |
占7个字节 存储:世纪、年、月、日期、小时、分钟和秒 |
|
TIMESTAMP |
占7或12字节 可以包含小数秒 |
|
|
TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE INTERVAL YEAR TO MOTH INTERVAL DAY TO SECOND |
||
|
LOB类型: 存储大型化和非结构化数据如文本、图像、视频等 |
CLOB |
单字节和多字节数据 |
|
NCLOB |
存储unicode类型数据 |
|
|
BLOB |
存储非结构化的二进制数据大对象,一般是图像、声音、视频等文件 |
|
|
BFILE |
二进制文件,存储在数据库外的系统文件,只读的 |
|
|
RAW&LONG RAW |
LONG |
可以存储多达2G的字符数据,建议使用CLOB代替LONG. 一个表中只有一列可以为LONG型,该列不能定义为主键或唯一约束,不能建立索引,不能出现在where子句。。。 |
|
LONG RAW |
能存储2GB 的原始二进制数据(不用进行字符集转换的数据) |
|
|
RAW |
用于存储二进制或字符类型数据,变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。这种类型最多可以存储2,000字节的信息 |
|
|
ROWID&UROWID |
唯一物理记录 |
|
3.表
|
创建表 |
create table student ( xh number(4), --学号 xm varchar2(20), --姓名 sex char(2), --性别 birthday date, --出生日期 sal number(7,2) --奖学金 ); 用查询结果创建新表: CREATE TABLE mytable (id, name, sal, job, deptno) as SELECT empno, ename, sal, job, deptno FROM emp; |
|
修改表 |
--添加一个字段 sql>alter table student add (classid number(2)); --修改一个字段的长度 sql>alter table student modify (xm varchar2(30)); --修改字段的类型或是名字(不能有数据) 不建议做 sql>alter table student modify (xm char(30)); --删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应该是加在后面) sql>alter table student drop column sal; --修改表的名字 很少有这种需求 sql>rename student to stu; |
|
删除表 |
sql>drop table student; |
|
添加数据 |
--所有字段都插入数据 insert into student values ('a001', '张三', '男', '01-5 月-05', 10); --oracle中默认的日期格式‘dd-mon-yy’ yy 2位的年 ‘09-6 月-99’ --修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表) alter session set nls_date_format ='yyyy-mm-dd'; --修改后,可以用我们熟悉的格式添加日期类型: insert into student values ('a002', 'mike', '男', '1905-05-06', 10); --插入部分字段 insert into student(xh, xm, sex) values ('a003', 'john', '女'); --插入空值 insert into student(xh, xm, sex, birthday) values ('a004', 'martin', '男', null); |
|
修改数据 |
update student set sex = '男', birthday = '1984-04-01' where xh = 'a001'; |
|
删除数据 |
delete from student; --删除所有记录,表结构还在,写日志,可以恢复的,速度慢。 --delete的数据可以恢复。 savepoint a; --创建保存点 delete from student; rollback to a; --恢复到保存点 一个有经验的dba,在确保完成无误的情况下要定期创建还原点。 drop table student; --删除表的结构和数据; delete from student where xh = 'a001'; --删除一条记录; truncate table student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。 |
4.表查询
数据库在执行sql是从左到右扫描的,如果有括号的话,括号里面的先被优先执行。
|
查看表结构 |
desc tablename; |
|
查询列 |
查询所有列:select * from tablename; 查询指定列:select ename, sal, job, deptno from emp; 取消重复行查询列:select distinct deptno, job from emp; |
|
set timing on/off |
打开显示操作时间的开关,在底部显示操作时间。 |
|
表复制 |
insert into table2(field1,field2,...) select value1,value2,... from table1 |
|
添加主键约束 |
alter table tablename add constraint tablename primary key (colname); |
|
统计 |
select count (*) from tablename; |
|
nvl函数 |
nvl(str, replace_with); 功能:如果str为null,则返回replace_with的值,否则返回str的值。 注意事项:str和replace_with必须为同一数据类型,除非显示的使用to_char函数。 注意:处理null值用nvl函数处理 |
|
别名 |
select ename "姓名", sal*12 as "年收入" from emp; 给表取别名的时候,不能加as;但是给列取别名,是可以加as的. |
|
连接字符串 |
select ename || ' is a ' || job from emp; |
|
like |
%:表示0到多个字符 _:表示任意单个字符 |
|
Is null操作符 |
select * from emp where mgr is null; 不能写为=""; |
|
order by排序 |
默认asc select * from emp order by deptno, sal desc;部门号升序而雇员的工资降序 |
|
聚合函数用法 max min avg sum count |
问题:如何显示所有员工中最高工资和最低工资? select max(sal),min(sal) from emp e; 最高工资那个人是谁? 错误写法:select ename, sal from emp where sal=max(sal); 正确写法:select ename, sal from emp where sal=(select max(sal) from emp); 注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ora-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数....... 但是select min(sal), max(sal) from emp;这句是可以执行的。因为min和max都是分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的 |
|
group by 子句 having 子句 |
group by 用于对查询的结果分组统计, having 子句用于限制分组显示结果。 例:显示平均工资低于2000的部门号和它的平均工资? select avg(sal), max(sal), deptno from emp group by deptno having avg(sal)< 2000; 注意:1.这里暗藏了一点,如果你要分组查询的话,分组的字段一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了 2.分组函数不能出现在where中 3.如果在select语句中同时包含有group by, having, order by 那么它们的顺序是group by, having, order by |
|
合并查询 |
Union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。 Union all: 该操作符与union相似,但是它不会取消重复行,而且不会排序。 Intersect: 使用该操作符用于取得两个结果集的交集。 Minus: 使用该操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。 |
|
rownum&rowid伪列 |
rowid: 数据库中行的全局唯一地址。 rownum: 是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集); rownum是从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。 因此,rownum直接使用(<、<=、!=)是可以的,如果要使用 (>,>=,=,between...and)就要用嵌套语句,把rownum先生成,再进行查询。(如分页示例3) select *from (selet rownum as rn,t1.* from a where ...) where rn >10 |
|
分页 |
1.根据rowid来分 2.根据分析函数来分 3.rownum来分 |
|
事物 |
由一组相关的dml(数据操作语言、增删改没有查询)语句组成,语句要么全部成功,要么全部失败。? 几个重要操作:设置保存点 savepoint a 取消部分事务 rollback to a 取消全部事务 rollback 注意:事物回滚(事物取消)必须是在没有commit之前使用的(exit也算commit)。 --------------------------------- 只读事务:设置只读事务后,尽管其他回话可能会提交新的事物,但是只读事务不会取得新的数据变化,从而保证特定时间点的数据信息。 |
5.函数
|
字符函数 |
lower(char):将字符串转化为小写的格式。 upper(char):将字符串转化为大写的格式。 length(char):返回字符串的长度。 substr(char, m, n):截取字符串的子串,从m(从1开始)位置开始,取n个字符 replace(char1, search_str, replace_str) : 用replace_str代替char1中的search_str 例: instr(C1,C2,I,J) : 判断某字符或字符串是否存在,存在返回出现的位置的索引,否则返回小于1; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 第J次出现的位置,默认为1 |
|
数学函数 |
数学函数包括cos,cosh,exp,ln, log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round等。 最常用的: round(n,[m]) 该函数用于执行四舍五入,m为小数点后的位数。 trunc(n,[m]) 该函数用于截取数字,m为小数点后的位数。 mod(m,n)取余函数。 floor(n) 返回小于或是等于n的最大整数。 ceil(n) 返回大于或是等于n的最小整数。 例: abs(n) 返回数字n的绝对值。 |
|
日期函数 |
(1)sysdate 返回系统时间 |
|
转换函数 |
to_char():把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串 yy:两位数字的年份 2004-->04 ------------------------------------------------ to_date()函数:将字符串转换成date类型的数据。 |
|
sys_context()系统函数 |
1)terminal:当前会话客户所对应的终端的标示符,如计算机名 例: 注意:USERENV是固定的,不能改的,db_name可以换成其它 |
6.表的备份与恢复
逻辑备份与恢复是指用工具export import将数据对象的结构和数据导出、导入的过程。
物理备份可以在数据库开启跟关闭的状态下进行,逻辑备份只能在数据库开启的状态下进行。
|
备份(导出) |
导出可分为导出表、导出方案、导出数据库三种方式。 导出使用exp命令,选项有: userid:用户名,口令,连接字符串 tables:表 owner:方案 full=y:用于指定执行导出操作的数据库 inctype:导出操作的增量类型 rows:是否要导出表中的数据 file:导出文件名 注意:特别说明-->在导入和导出的时候,要到oracle目录的bin目录下。 1)导出表 exp userid=scott/[email protected] tables=(emp) file=d:\emp.dmp --导出单个表 exp userid=...... tables=(emp,dept) file=d:\emp.dmp 导出多个表 例: C:\Users\jiqinlin>cd D:\dev\oracle\product\10.2.0\db_1\bin D:\dev\oracle\product\10.2.0\db_1\bin>exp userid=scott/[email protected] tables=(emp) file=d:\emp.dmp 2)导出其他方案的表 需要dba的权限或是exp_full_database的权限 userid=system/[email protected] tables=(scott.emp,scott.dept) 3)导出表结构 exp userid=...... tables=(emp) file=...... rows=n 4)直接导出方式(需要数据库的字符集要与客户端字符集完全一致) exp userid=... tables=... file=... direct=y 2)导出方案:导出方案中的所有对象(表,索引,约束...)和数据 导出自己的方案:exp userid=scott... owner=scott file=d:\scott.dmp 导出他人方案:需要dba的权限或是exp_full_database的权限 exp userid=system... owner=(system,scott) file=d:\system.dmp 3)导出数据库:需要dba的权限或是exp_full_database的权限 exp userid=system/[email protected] full=y inctype=complete file=d:\all.dmp |
|
恢复(导入) |
导入要使用的文件必须是export所导出的文件。 导入也分为导入表,导入方案,导入数据库三种方式。 imp常用的选项有 userid:用于指定执行导入操作的用户名,口令,连接字符串 tables:用于指定执行导入操作的表 formuser:用于指定源用户 touser:用于指定目标用户 file 用于指定导入文件名 full=y:用于指定执行导入整个文件 inctype:用于指定执行导入操作的增量类型 rows:指定是否要导入表行(数据) ignore:如果表存在,则只导入数据 1)导入表 1. 导入自己的表 imp userid=scott/[email protected] tables=(emp) file=d:\xx.dmp 2. 导入表到其它用户 要求该用户具有dba的权限,或是imp_full_database imp userid=system/[email protected] tables=(emp) file=d:\xx.dmp touser=scott 2)导入方案 1.导入自身的方案--无tables选项 imp userid=scott/[email protected] file=d:\xxx.dmp 2.导入其它方案 要求该用户具有dba的权限和imp_full_database imp userid=system/[email protected] file=d:\xxx.dmp fromuser=system touser=scott 3)导入数据库(相当于数据库迁移) 在默认情况下,当导入数据库时,会导入所有对象结构和数据,案例如下: imp userid=system/[email protected] full=y file=d:\xxx.dmp |
7.数据字典
|
数据字典 |
1)、数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为sys用户。用户只能执行查询操作(select语句),而其维护和修改是由系统自动完成的。 2)、数据字典包括数据字典基表和数据字典视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表。数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括user_xxx,all_xxx,dba_xxx三种类型。 user_tables: 当前用户所拥有的表,它只返回用户所对应方案的所有表 比如:select table_name from user_tables;
all_tables: 当前用户可以访问的表,它不仅会返回当前用户方案的所有表,还会返回当前用户可以访问的其它方案的表 比如:select table_name from all_tables;
dba_tables: 它会显示所有方案拥有的数据库表。但是要求用户必须是dba角色或是有select any table 系统权限。 例如:当用system用户查询数据字典视图dba_tables时,会返回system,sys,scott...方案所对应的数据库表。 |
|
用户、权限、角色 |
dba_users:显示所有数据库用户的详细信息 select * from dba_users; dba_sys_privs:显示用户所具有的系统权限 select * from dba_sys_privs; dba_tab_privs:显示用户具有的对象权限 select * from dba_tab_privs; dba_col_privs:显示用户具有的列权限 select * from dba_col_privs; dba_role_privs:显示用户所具有的角色 select * from dba_role_privs; 问题1:如何查询一个角色包括的权限? a.一个角色包含的系统权限 select * from dba_sys_privs where grantee='角色名' 另外也可以这样查看: select * from role_sys_privs where role='角色名' b.一个角色包含的对象权限 select * from dba_tab_privs where grantee='角色名' 问题2:oracle究竟有多少种角色? SQL> select * from dba_roles; 问题3:如何查看某个用户,具有什么样的角色? select * from dba_role_privs where grantee='用户名' 显示当前用户可以访问的所有数据字典视图。 select * from dict where comments like '%grant%'; 显示当前数据库的全称 select * from global_name; |
|
动态性能视图 |
不常用 略 |
8.表空间
|
显示表空间 |
1)、查询所有表空间 select tablespace_name from dba_tablespaces; 2)、知道表空间名,显示该表空间包括的所有表 |
|
建立表空间 |
1)、建立数据表空间 'D:\dev\oracle\product\10.2.0\dada01.dbf' size 20m uniform size 128k; 2)、使用数据表空间
例:建立表空间并给用户指定默认表空间,查询当前用户的表空间 |
|
改变空间表状态 |
当建立表空间时,表空间处于联机的(online)状态,是可以访问的和读写的,但是在进行系统维护或是数据维护时,可能需要改变表空间的状态。一般情况下,由特权用户或是dba来操作。 |
|
删除表空间 |
一般情况下,由特权用户或是dba来操作,如果是其它用户操作,那么要求用户具有drop tablespace 系统权限。 |
|
扩展表空间 |
1. 增加数据文件 'D:\dev\oracle\product\10.2.0\dada02.dbf' size 1m; 'D:\dev\oracle\product\10.2.0\dada01.dbf' resize 4m; 'D:\dev\oracle\product\10.2.0\dada01.dbf' autoextend on next 10m maxsize 500m; |
|
移动数据文件 |
1. 确定数据文件所在的表空间 file_name=upper('D:\dev\oracle\product\10.2.0\dada01.dbf'); c:\dada01.dbf; 4. 执行alter tablespace 命令 'D:\dev\oracle\product\10.2.0\dada01.dbf' to 'c:\sp01.dbf';
|
9.oracle约束
|
约束 |
一、维护数据的完整性 二、约束 三、商店售货系统表设计案例一 SQL> create table goods( 四、商店售货系统表设计案例二 五、表级定义、列级定义 create table department4( 2)、表级定义 create table employee2(
|
10.索引
|
创建索引 |
1.单列索引 语法:create index 索引名 on 表名(列名); 2.复合索引 create index emp_idx1 on emp(ename, job); 同一张表上可以有多个索引,但要求列的组合不同 |
|
使用原则以及缺点 |
使用原则: 1)、在大表上建立索引才有意义 索引的缺点: 1)、建立索引,系统要占用大约为表1.2倍的硬盘和内存空间来保存索引。 不恰当的索引在进行插入、修改和删除操作时比没有索引花费更多的时间。 |
|
显示索引信息 |
数据字典视图: dba_indexs :显示数据库所有的索引信息 user_indexs :显示当前用户的索引信息 user_ind_columns :显示索引对应列的信息 显示索引信息: select index_name, index_type from user_indexes where table_name = '表名'; 显示索引列信息: select table_name, column_name from user_ind_columns where index_name ='IND_ENAME'; |
11.触发器
|
|
|
12.pl/sql
|
|
SET serveroutput ON; DECLARE V_SAL EMP.SAL%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = &NO; IF V_SAL < 3000 THEN UPDATE EMP SET COMM = SAL * 0.1 WHERE ENAME = V_ENAME; dbms_output.put_line('1111'); ELSE NULL; dbms_output.put_line('2222');--不会被执行??????????? END IF; END;
|
13.问题解决
|
问题: 解决: 1)测试窗口 (serveroutput命令是sqlplus命令,在pl/sql中只能在conmmand窗口使用) 执行: 显示: 2)command窗口 3)存储过程procedure 定义: 执行:
|
|
|
查询示例:
|
查询相同记录下日期最大的一条: |
select edu.PERSON_ID,edu.EDUCATION_INFO_ID, edu.GRADUATE_DATE,edu.GRADUATE_SCHOOL from TBL_HRM_EDUCATION_INFO edu where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id) order by edu.PERSON_ID ----------------------- 查询人员表,其中人员学历信息由学历信息表查询,并且同一人的学历信息取时间最往后的一条: select p.PERSON_ID, p.UNIT_ID, p.POST_ID, p.GRADES_ID, p.EDUCATION_ID, p.DEGREE_ID, p.GRADUATE_SCHOOL, 。。。。。。 p.SUBMIT_STATUS, (select edu.GRADUATE_SCHOOL from TBL_HRM_EDUCATION_INFO edu where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id) and p.PERSON_ID=edu.PERSON_ID) as GRADUATE_SCHOOL ,需要加别名,否则eclpse里面列名一长串无法识别 (select edu.GRADUATE_DATE from TBL_HRM_EDUCATION_INFO edu where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id) and p.PERSON_ID=edu.PERSON_ID) as GRADUATE_DATE from TBL_HRM_PERSON p where p.unit_id='137' |
|
|
|
|
|
|
|
|
|
|
|
|