现在的位置: 首页 > 综合 > 正文

Oracle 笔记一 select insert update delete transaction create alter

2014年12月15日 ⁄ 综合 ⁄ 共 6553字 ⁄ 字号 评论关闭

 

 

sqlplus:

1.命令行访问:sqlplus

2.sqlplus

3.isqlplus:            http://127.0.0.1:5560/isqlplus

 

问题:

scott 账户锁定,以管理员登陆,sqlplus sys/password as sysdba

conn  sys/passwords as sysdba 

解除锁定:alter user scott account unlock,执行退出命令,

scott登陆,提示密码过期,修改,仍用tigger

 


 

 

描述:

desc emp  员工表

desc dept  部门表

desc salgrade  薪水等级

desc dual 空表  

 

查询表达式:select 2*3 from dual;

查询日期:select sysdate from dual;

 

起别名:

select ename,sal*12 annual_sal from emp;        //字段名转为大写

select ename,sal*12 "annual sal" from emp;      //双引号的字段名不变


 

空值:

任何含有空值的表达式的值都为空值


 

连接符:

 select ename||sal from emp;

 select ename||'abcdefg' from emp;

 用两个单引号代替一个单引号:select ename||'abddd''adfa' from emp;

 

distinct

select distinct deptno from emp;

select distinct deptno,job from emp;

 

select ename,sal,deptno from emp where sal>1500 and deptno<>10;

select ename,sal,deptno from emp where sal between 1000 and 1500 and deptno<>10;


 

空值处理:

select ename sal,comm from emp where comm is null;

select ename sal,comm from emp where comm is not null;

 

select ename ,sal from emp where sal in(800,1500,2000);

select ename ,sal from emp where ename in('King','abc');

 

select ename ,sal from emp where sal not in(800,1500,2000);


 

 

模糊查询:

select ename from emp where ename like '%ALL%';


转义字符/,含有%

select ename from emp where ename like '%/%%';


 

 

排序:

select  ename,sal,deptno from emp order by deptno asc,ename desc;(先按deptno正序排,内部再按ename反序排)

 

 

小结: select ename,sal*12 annual_sal from emp where ename not like '_A%' and sal >800 order by sal desc;


 

常用的SQL函数:

lower()  select lower(ename) from emp;

upper()  select upper(ename) from emp;

substr() select substring(ename,1,3) from emp;  从第一个开始截3个字符

chr()   select chr(65) from dual;   ANSII转为字符

ascii()  select ascii('A') from dual 

round()    select round(23.234,1) from dual;   四舍五入

  

to_char()    select to_char(sal,'$999,999.9999') from emp;  转换数字

            select to_char(hiredate,'yyyy-mm-dd hh:mi:ss') from emp; 转换日期

            select to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;

 

 

to_date()     select ename,hiredate from emp where hiredate > to_date('1981-2-20 12:34:56

','yyyy-mm-dd hh24:mi:ss');

 

to_number()    select sal from emp where sal > to_number('$1,250.00','$9,999.99');

 

NVL()    select ename,sal*12+NVL(comm,0) from emp;  如果comm是空值则用0代替


 

 

 

 

分组:

group by语句

select deptno,avg(sal) from emp group by deptno;

 

 select ename from emp where sal=(select max(sal) from emp);

 

出现在select列表中的字段没有出现在子函数中必须出现在group by

 

having

 select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;


对分组进行限制

 

select - where- group by -having -order by

 

SQL> select avg(sal)

  2  from emp

  3  where sal>1200

  4  group by deptno

  5  having avg(sal) > 1500

  6  order by avg(sal) desc;

 

SQL> select ename,sal from emp

  2  join (select max(sal) max_sal,deptno from emp group by deptno) t

  3  on (emp.sal=t.max_sal and emp.deptno=t.deptno);

 

子连接:SQL> select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;

 

SQL> select ename,dname from emp cross join dept;    产生一个笛卡尔成绩cross

 

 

SQL> select ename,dname from emp ,dept where emp.deptno=dept.deptno;  旧语法

SQL> select ename,dname from emp join dept on (emp.deptno=dept.deptno);  新语法

SQL> select ename ,dname from emp join dept using(deptno);     等值连接(不推荐)

 

SQL> select ename,grade from emp e join salgrade s on (e.sal between s.losal and

 s.hisal);

 

SQL> select ename,dname grade from

  2  emp e join dept d on (e.deptno=d.deptno)

  3  join salgrade s on(e.sal between s.losal and s.hisal)

  4  where ename not like '_A%';

 

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

 

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

左外连接:把左边表e1的多余数据拿出来

 

SQL> select ename,dname from emp e right join dept d on (e.deptno=d.deptno);

右外连接

 

SQL> select ename,dname from emp e full join dept d on (e.deptno=d.deptno);

全外连接

 


 

求部门中哪些人的薪水最高:

SQL> select ename,sal from emp

  2  join (select max(sal) max_sal,deptno from emp group by deptno) t

  3  on (emp.sal=t.max_sal and emp.deptno=t.deptno);


 

求部门平均薪水的等级

SQL> select deptno,avg_sal,grade from

  2  (select deptno,avg(sal) avg_sal from emp group by deptno) t

  3  join salgrade s on (t.avg_sal between s.losal and s.hisal);


 

求部门平均的薪水等级

SQL> select deptno,avg(grade) from

  2  (select deptno,ename ,grade from emp join salgrade s on (emp.sal between s.

losal and s.hisal)) t

  3  group by deptno;


 

雇员中有哪些人是经理人

SQL> select ename from emp where empno in (select mgr from emp);


 

不准用组函数,求薪水的最高值

SQL> select distinct sal from  emp where sal not in

  2  (select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal));


 

 

平均薪水最高的部门编号:

SQL>  select deptno,avg_sal from

  2  (select avg(sal) avg_sal,deptno from emp group by deptno)

  3  where avg_sal=

  4  (select max(avg_sal) from

  5  (select avg(sal) avg_sal,deptno from emp group by deptno));


 

 

 

 

 

平均薪水最高的部门名称:

SQL> select dname from dept where deptno=

  2  (select deptno from

  3  (select avg(sal) avg_sal,deptno from emp group by deptno)

  4  where avg_sal=

  5  (select max(avg_sal) from

  6  (select avg(sal) avg_sal,deptno from emp group by deptno)));


 

 

求平均薪水的等级最低的部门的部门名称

 

 

求比普通员工最高薪水还要高的经理人名称

SQL> select ename,sal from emp where empno in (select mgr from emp where mgr is

not null ) and sal > (select max(sal) from emp where empno not in (select distin

ct mgr from emp where mgr is not null));


 

求薪水最高的前五名职员:

SQL> select ename,sal from (

  2  select ename ,sal from emp order by sal desc)

  3  where rownum < 5;


 

求薪水最高的六到十名员工(重点掌握)<三层select嵌套>

SQL> select ename,sal from (

  2  select ename,sal,rownum r from (

  3  select ename,sal from emp order by sal desc)

  4  ) where r >5 and r<11;


 

将部门10薪水提升1倍,并在名字后加-

SQL> update emp2 set sal=sal*2,ename=ename || '-' where deptno=10;


 

 

 

事务控制语句: transaction

一个transaction起始于第一条DML语句

结束语commit

rollback 回退


 

DDLcreate table) DCLgrant  )自动提交transaction


 

用户正常断开连接,自动提交,非正常断开自动回滚。


 

 

 

 

约束:非空、唯一、主键、外键、Check


 

create table stu

(

id number(6) primary key,

name varchar(20) constraint stu_name_nn not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50) unique,

constraint stu_name_email_uni unique(email,name)

);


 

 

修改表结构:

alter table stu drop(addr)

alter table stu add(addr varchar(50))

alter table stu modify(addr varchar(150))

 

alter table stu drop constraint stu_class_fk  修改约束条件

 

序列:

create sequence seq;

 

select seq.nextval from dual;

 

 

 

 

Oracle  Dictionary:

desc user_tables

select table_name from user_tables;

select view_name from user_views;

select constraint_name from user_constraints;


Index:不要轻易建立索引(读得效率高,插入效率低)

create index idx_stu_email on stu(email,class); 为两个字段的组合建立索引

select index_name from user_indexes;

 

view:

视图就是子查询,表结构改之后view也要改,建立表的一部分(保护私有数据),确定有用之后建立,视图可以更新数据,很少用。

create view V$ as select id,name from stu;


抱歉!评论已关闭.