您的位置:首页 > 数据库 > Oracle

Oracle学习个人笔记

2015-07-11 21:35 561 查看
--以sys@ORCL AS SYSDBA登录进行赋权

SQL> grant connect,resource,dba to scott;

---查看该用户的所有表名字、表注释、字段名、字段注释、是否为空、字段类型

select distinct TABLE_COLUMN.*,

                TABLE_NALLABLE.DATA_TYPE,

                TABLE_NALLABLE.NULLABLE

  from (select distinct utc.table_name  table_name,

                        utc.comments    table_comments,

                        ucc.column_name column_name,

                        ucc.comments    column_comments

          from user_tab_comments utc, user_col_comments ucc

         where utc.table_name = ucc.table_name

           and utc.table_name not like '%_B'

           and utc.table_name not like '%_Z'

           and utc.table_name not like '%1%') TABLE_COLUMN,

       (select distinct table_name, column_name, nullable, DATA_TYPE

          from user_tab_cols

         where table_name not like '%_B'

           and table_name not like '%_Z'

           and table_name not like '%1%') TABLE_NALLABLE

 where TABLE_COLUMN.column_name = TABLE_NALLABLE.column_name

   and TABLE_COLUMN.TABLE_NAME = TABLE_NALLABLE.table_name

      --and TABLE_COLUMN.column_comments  like  '%学%' ---字段注释

   and TABLE_COLUMN.table_comments like '%学生表%'; ---表注释

----下面的语句用来查询哪些对象被锁

select object_name,machine,s.sid,s.serial#

from v$locked_object l,dba_objects o ,v$session s

where l.object_id = o.object_id and l.session_id=s.sid;

alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)

create table wsg_menu

(

       wsg_menu_id varchar2(64) default rawtohex(sys_guid()),---创建表时给字

段默认值

       m_name varchar2(100) not null,                  ---创建表时给字段添加

不可为空的限制

       m_level char(1) not null,

       m_parent char(1) not null,

       m_link varchar2(1000),                          --可为空

       constraint pk_wsg_menu_id primary key(wsg_menu_id) ---创建表设置表的主



);

---删除表

drop table wsg_menu;

---添加表字段

alter table tablename add (add_column datatype [default value][null/not 

null],….);

---修改表字段

alter table tablename modify (column datatype [default value][null/not null],

….);

---删除表字段

alter table tablename drop (column);

----修改表名

ALTER TABLE tablename RENAME TO tablename2; 

----修改表列名

ALTER TABLE tablename RENAME COLUMN column_name1 TO column_name2;

--修改字段类型  

ALTER TABLE tablename MODIFY column_name NUMBER(20);

------备份表

----完全Copy那张表的数据到另一张表当中去

create table table_name_curdate_bak as select * from table_name;  

    

alter table wsg_menu add constraint pk_wsg_menum_id primary key(wsg_menu_id); 

--给表添加主键

/**给表加上注释*/

comment on table wsg_menu is 'wsg的菜单表';

/**给表字段加上注释*/

comment on column wsg_menu.wsg_menu_id is'主键';

comment on column wsg_menu.m_name is'菜单名称';

comment on column wsg_menu.m_level is'菜单级别';

comment on column wsg_menu.wsg_menu_id is'菜单链接地址';

-------------------------------------------------

/**

1. 树结构的描述

树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关

系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人

的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点

的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。

在SELECT命令中使用CONNECT BY 和蔼START WITH 子句可以查询表中的树型结构关系。

其命令格式如下:

SELECT 。。。

CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}

[START WITH];

其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树

型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点

间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树

结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许

使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节

点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

START WITH: 不但可以指定一个根节点,还可以指定多个根节点。

2. 关于PRIOR

运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。

PRIOR被置于CONNECT BY子句中等号的前面时,则强制从叶节点到根节点的顺序检索,即

由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:

CONNECT BY PRIOR EMPNO=MGR

PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从根节点到叶节点的顺序

检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:

CONNECT BY EMPNO=PRIOR MGR

在这种方式中也应指定一个开始的节点。

3. 定义查找起始节点

在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,

以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。

4.使用LEVEL

在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置

不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪

个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。

5.节点和分支的裁剪

在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用

WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代

节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

6.排序显示

象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示

顺序,而不必按照遍历树结构的顺序。

**/

---查找一个节点的所有直属子节点(所有后代)递归算法

select *

  from wsg_menu m

 start with m.wsg_menu_id = 'first_menu_one'

connect by m.m_parent = prior m.wsg_menu_id;

---查找一个节点的直属父节点(父亲)。 如果查找的是节点的直属父节点,也是不用

到树型查询的。

--c-->child, p->parent

select c.wsg_menu_id, c.m_name, p.wsg_menu_id parent_id, p.m_name 

parent_title

from wsg_menu c, wsg_menu p

where c.m_parent=p.wsg_menu_id and c.wsg_menu_id='three_menu_one';

---查找一个节点的所有直属父节点(祖宗)

select * from wsg_menu m start with m.wsg_menu_id='three_menu_one' 

connect by prior m.m_parent=m.wsg_menu_id;

---------------------将字符串转换成数字

select 30-to_number('25') numberStr from dual

-----多表关联时候join on与where里进行的一些小区别

/*建议使用join on

因为写where如果忘记写关联条件 就成笛卡尔积了

join on 是个好的习惯能避免这种不必要的错误出现*/

----------------------自然连接

/*自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连

接起来,并返回所有符合条件按的结果。*/

Select emp.ename,dept.dname From emp natural join dept;

/*这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,emp中的deptno

和dept中的deptno做了连接。

也就是实际上相当于*/

Select emp.ename,dept.dname

From emp join dept on emp.deptno = dept.deptno;

Select emp.empno,emp.ename,emp.job,emp.deptno,dept.dname 

--From emp natural join dept; 这个会报错

from emp,dept where emp.deptno = dept.deptno; --这个不会报错

/*

1.如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为

自然连接的条件。

2.如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误



3.由于oracle中可以进行这种非常简单的natural join,我们在设计表时,应该尽量在

不同表中具有相同含义的字段使用相同的名字和数据类型*/

-----------------------等值连接即内连接

---旧语法:

select  ename ,dname from emp ,dept where emp.deptno = dept . deptno;

--新语法:

------------------自然连接  把一张表当两张表用

select  e1.ename ,e2.ename from emp e1 join emp e2 on (
d05f
e1.mgr = e2.empno ) ; 

select ename,dname from emp join dept on (emp.deptno=dept.deptno);

---等值连接的简洁写法:

select ename ,dname from emp join dept using (deptno);

---外连接:

--左外连接

select  e1.ename ,e2.ename from emp e1 left  join emp e2 on (e1.mgr = 

e2.empno ) ;

select e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno(+);

--右外连接:

select  e1.ename ,e2.ename from emp e1 right  join emp e2 on (e1.mgr = 

e2.empno ) ;

select  e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr(+) = e2.empno;

/*笛卡尔积笛卡尔积对两个关系R和S进行操作,产生的关系中元组个数为两个关系中元

组个数之积。等值联接则是在笛卡尔积的结果上再进行选择操作,挑选关系第i个分量与

第(r+j)个分量值相等的元组;自然连接则是在等值联接(以公共属性值相等为条件)的基

础上再行投影操作,去掉S中的公共属性列,当两个关系没有公共属性时,自然连接就转

化成笛卡尔积 内连接分:等值连接 不等值连接 自然连接 外连接分:左外连接 右外连

接 交叉连接: cross join 笛卡尔积*/

PL/SQL导出表结构

一、tools->export user objects是导出表结构

二、可以用tools->export tables

    用中间的sql inserts页面,选中create tables选项,where clause 里写入 where 

    rownum<1。

    如果表包含有CLOB类型字段的话,sql是无法导出的。这时候可以改用PL/SQL的pde  

    格式进行导出。

导出数据:

一、在select * from table_name;页面点击“导出查询结果”就可以导出当前的表

二、tools->export tables

三、选中表右单击,点击导出“导出数据”

使用语句备份 某张表的全部数据

create table wsg_menu_bak_bak as select * from wsg_menu;

---同一个数据库的情况下

-----全部字段全部插入

insert into WSG_MENU_bak select * from WSG_MENU w where 

w.m_parent='first_menu_three';

----选择相应字段插入情况

insert into WSG_MENU_bak(wsg_menu_bak_id ,m_Level,m_Parent) select 

e.wsg_menu_id,

e.m_level,e.m_parent from wsg_menu e where e.m_parent='first_menu_three';

-----有两张表,表结构是一样的,只是属于不同的数据库

1、先建立一个database link,将两个库连接起来

create database link mylink connect to user_name identified by password using 

'test01'

2、用insert into将test01表a的数据写入test表a

insert into a select * from a@mylink

SELECT l.session_id sid,

       s.serial#,

       l.locked_mode,

       l.oracle_username,

       s.user#,

       l.os_user_name,

       s.machine,

       s.terminal,

       a.sql_text,

       

       a.action,

       s.BLOCKING_SESSION

  FROM v$sqlarea a, v$session s, v$locked_object l

 WHERE l.session_id = s.sid

   AND s.prev_sql_addr = a.address

 ORDER BY sid, s.serial#;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: