-- 共享锁:其他用户只能查询,不可修改 lock table t_studentuser in share mod;
SQL
集合查询
并集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
select e1.*,'经理为King' from employees e1 join employees e2 on e1.manager_id=e2.employee_id where e2.last_name='King' unionall select employees.*,'高工资' from employees where salary>10000 unionall select employees.*,'部门为1700' from employees where department_id in ( select department_id from departments where location_id=1700 );
视图
1 2 3 4 5 6 7 8 9 10 11 12
-- 创建视图 createview v_90 as select*from employees where department_id=90;
-- 查询视图 select*from v_90;
-- 插入视图 insertinto v_90 values(...);
动态 SQL
使用execute immediate语句来执行位于字符串中的SQL语句
使用动态SQL创建用户需要sys权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
createor replace procedure p_createstudentuser as cursor cur_userid is select userid from system.t_studentuser;
v_userid system.t_studentuser.userid%type; begin open cur_userid; fetch cur_userid into v_userid; while (cur_userid%found) loop execute immediate 'create user '||v_userid' identified by abc'; execute immediate 'grant connect,resource,create view to '||v_userid; fetch cur_userid into v_userid; end loop; close cur_userid; end;
-- nvl(commission_pct,0)若commission_pct属性为空则设为0 -- 若commission_pct属性的值为空则设为0再+0.1 update employee set commission_pct=nvl(commission_pct,0)+0.1
使用虚拟表dual来进行查询
1 2 3
-- 查询当前系统时间 -- 注意:sysdate不是dual的一个属性,而是获取当前系统时间的函数 select sysdate from dual;
以指定格式获取当前日期
1 2 3
select to_char(sysdate,'yyyy-mm-dd') from dual; select to_char(sysdate,'yyyy"年"mm"月"dd"日"') from dual; select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
日期计算
1 2 3 4 5 6 7 8
-- 在获取30天后的日期 select sysdate+30from dual;
-- 计算相差天数 select trunc(sysdate-to_date('2014-09-07', 'yyyy-mm-dd')) 入学天数 from dual;
-- 计算相差月份数 select trunc(months_between(sysdate-to_date('2014-09-07', 'yyyy-mm-dd'))) 入学月份 from dual;
绑定变量
1 2 3 4 5
select*from employees where manager_id=&经理编号;
select*from employees where first_name like'%&名称%';
显示指定条数的数据
在查询结果后系统会自动增加一个rownum行号
1 2 3 4 5 6 7 8 9 10
select* from(select*from employees) where rownum<10;
select* from( select*from employees orderby salary desc ) where rownum<10;
null处理函数nvl2(被判断的属性,若不为空的值,若为空的值)
null处理函数coalesece()
1 2 3 4 5
-- 以此从参数里面找非空的作为值 select* coalesece(ifmanager,ifbase,iftemp) jobid, coalesece(msal,bsal,tsal) sal from test;
函数decode()
decode(temp,’1’,’经理’,’2’,’业务员’,’3’,’临时工’,’其他’)
若temp的值为1则整个值为经理
如何将Excel表数据导入Oracle数据库
步骤:
将excel另存为由制表符分割的txt
创建一个控制文件(input.ctl),如下:
导入
导入文件地址
以追加模式(append或insert,replace替换)导入表t_studentuser
字段分割符为’09’即制表符
表的属性
1 2 3 4 5
load data infile 'd:\student.txt' append into table t_studentuser fields terminated by X'09' (userid,manager,emp01,emp02,emp03)