Oracle_一点整理

来源:互联网 发布:智多星项目造价软件 编辑:程序博客网 时间:2024/05/21 23:32
--Oracle 多用户,权限细--查看表结构-- 在command window窗口 desc tableName--或 右击表名——> descirbe--选中,按F8执行/* 注意:在增删改是必须要使用commit*/--Oracle没有数据库,是表空间--不区分大小写,以分号结束--先powerdesign建模,再自动生成sql/*select 聚合列,非聚合列 from tableName .... group by 非聚合列 ....语法:在查询字段中若同时存在聚合列和非聚合列,必须使用group by ,它的后面跟非聚合列select max(source), ename from employee group by ename*//*子查询:相关子查询:里面的查询语句要用到外面的查询结果执行顺序,先父查询(外面)再将结果给子查询调用非相关子查询:单独把里面的查询语句提出来也可以执行*//*同义词synonym (类似于servlet-mapping),一般 syn_tableNameoperation:File ——> new ——> synonym大型项目一般有几百张表,每张表都要设定一个同义词所有的代码都是操作同义词核心功能:当修改原始表名时,只需要修改同义词的结构*//*序列sequence ,在Oracle中没有自增长,就是用序列 , 一般 seq_tablNamesqlserver 是作用于哪张表的哪个字段Oracle是作用于表dual是一个虚表,它不能被删除Oracle的语法中必须要有from,所以没表的,就用from dual例: select sysdate会报错,改为 select sysdate from dual;sqlserver中 select 1 ,select getdate()select a 会报错,改为 select 'a' 或 起个别名 select 'a' b*/--nextval 生成一个新值,dual是一个虚表,currval 当前值 SELECT sql_tableName.nextval FROM dual;SELECT sql_tableName.currval FROM dual; --注意第一次使用该句会出错,因为还没有,要先运行一次nextval/*where 与 having的区别where 后面不能用聚合函数having 后面可用聚合函数关于exit....where exits (select * from tableName)exits 与 查询的字段(select *)无关,只要符合语法就行在insert语句中使用子查询在delete/update中使用子查询创建用户create user userName identified by passwordexample: create user xiao identified by xiao111*/--关于 daul , rowid(伪列,不用管,会自动生成), rownum--修改一: 虽然我锁定了该表,但 其他人可操作SELECT t.*,ROWID FROM tableName t FOR UPDATE; --注意:必须起个别名,不然会报from错误--修改二:锁定之后,别人不能操作,是独占模式,不可取SELECT * FROM tableName FOR UPDATE;--上述语句执行后,commit 和 rollback 两个图标会高亮,说明还必须手动提交(点commit)--步骤:先解锁(图标),编辑完后点一下对勾,最后点击commitTRUNCATE TABLE bonus;SELECT * FROM bonus;/* 索引也占空间,需要Oracle来维护,一般是业务经理决定哪些字段需要索引 索引是在表中建的, new ——> table  索引  idx_columnName 补充:只要是主键,默认都有索引*/--关于count()SELECT COUNT(1) FROM emp;SELECT COUNT(*) FROM emp;--上述两个效果是一样的,结果是14SELECT COUNT(comm) FROM emp;--结果是4--结论:count(columnName),里面若为字段,只会统计 非null 的记录/*select * from emp where .. group by.. having.. order by..sql的执行顺序from / where / group by / having / select / order by*//*分页SELECT * FROM  (SELECT * FROM     (SELECT e.*,ROWNUM rn FROM emp e)   WHERE rn <= 当前页*每页记录数   )WHERE rn > (当前页-1)*每页记录数*/
select rownum , e.* from emp e;select rownum rn ,e.* from emp e where rownum <5select * from( select rownum rn ,e.* from emp e where rownum <5)where rn >2
--第一步:看看 rownum ,注意必须取别名SELECT e.*,ROWNUM FROM emp e;--升级: 查询前五条记录SELECT * FROM (SELECT e.*,ROWNUM rn FROM emp e)WHERE rn <=5;--或用betweenSELECT * FROM (SELECT e.*,ROWNUM rn FROM emp e)WHERE rn BETWEEN 6 AND 10--不用between做分页,下面这个效率最好,类似于SQL Server 的topSELECT * FROM (SELECT e.*,ROWNUM rn FROM emp e)WHERE rn <= 10--再嵌套一个子查询SELECT * FROM(SELECT e.*,ROWNUM rn FROM emp e)WHERE rn > 5--拼sqlSELECT * FROM    (SELECT * FROM       (SELECT e.*,ROWNUM rn FROM emp e)      WHERE rn <= 10    )WHERE rn > 5--去重--SELECT b.* ,ROWID FROM bonus b;--SELECT b.*,ROWID FROM bonus b FOR UPDATE;--SELECT MAX(ROWID) FROM bonus b WHERE ename = 'aaa' ;DELETE FROM bonus b1 WHERE ROWID !=(SELECT MAX(ROWID) FROM bonus b2 WHERE b2.ename = b1.ename)--若有多个判断去重的条件,就往后加 WHERE b2.ename = b1.ename and b2.job = b1.job and ..-- 关于别名--SELECT empno, sal s FROM emp WHERE s > 2000;会报错,因为where 后面是不能用别名的SELECT empno, sal s FROM emp WHERE sal > 2000;--只有order by 后面才能用别名SELECT empno, sal s FROM emp ORDER BY s DESC;--动态执行5BEGIN   EXECUTE IMMEDIATE 'create user xiao identified by xiao111'END;

原创粉丝点击