oracle_sql_admin

夏侯航
2023-12-01

用exp命令导出表结构,不导出表数据。只需在命令行里加一个参数rows=n即可。表示不导出表数据。

exp username/pwd@sid file=d:/data/bak.dmp owner=(user)rows=n 

数据库安装好后会默认提供两个用户:

    sys和system,sys是超级管理员,权限最大,具有create database权限;密码是manager;
    system是管理员,权限也很大,没有create database权限,密码是change_on_install;
    一般操作用system用户;

用户登录命令:conn 用户名/密码@网络服务名 [as sysdba/sysoper]

修改密码其他用户的密码,需要sys或system用户,否则直接passw;

修改日期默认格式,才好插入如下格式日期‘yyyy-MM-dd’;修改命令:alter session set nls_date_format=‘yyyy-mm-dd’;

否则,插入日期数据这样做:insert into student values('A001', '张三', '男', '01-5月-05', 10)

修改两个字段

update student set sal=sal/2, classId=3 where sex='男'

对于多表查询,笛卡尔集规定:条件个数不能少于表的个数-1;

sql从左向右执行,把条件筛选出的数据量大的条件放在左边,可以提高查询效率;

单行子查询用"=“,多行字查询用"in”;

多列字查询,如题:查询与smith部门和岗位都相同的所有雇员?

select * from emp where (deptno, job)=(select deptno, job from emp where ename='smith')

如何显示高于自己部门平均工资的员工的信息?

逻辑清晰
1.查询出各个部门的平均工资和部门号
select deptno, avg(sal) mysal from emp group by deptno;
2.把上面的查询看做是一张子表
select a2.ename, a2.sal, a2.deptno, a1.mysal 
    from emp a2, (select deptno, avg(sal) mysal from emp group by deptno) a1 
    where a2.deptno=a1.deptno and a2.sal>a1.mysal

设置只读事务(不能查询到设置只读事务后发生的操作,如在统计的情况下)

set transaction read only;

函数

字符函数:以首字母大写的方式显示所有员工的姓名
1. 完成首字母大写
select upper(substr(ename, 1, 1)) from emp;
2. 完成后面字母小写
select lower(substr(ename, 2, length(ename)-1)) from emp;
3. 合并
select upper(substr(ename, 1, 1))||lower(substr(ename, 2, length(ename)-1)) from emp;
数学函数
日期函数,oracle默认的日期格式是 dd-mon-yy, 即12-7月-78
sysdate :返回系统时间;
add_months(d, n);
last_day(d), 返回指定日期所在月份的最后一天;
找出各月倒数第三天受雇的所有员工?
select hiredate, ename from emp where last_day(hiredate)-2=hiredate
yy:两位数字的年份,如2014-->14;
yyyy:四位数字的年份,如2014;
mm:两位数字的月份,8月-->08
dd:2位数字的天数,30号-->30
hh24:8点-->20
hh12:8点-->08
mi\ss-->显示分钟、秒
系统函数
查看当前用的数据库实例名
select sys_context('USERENV', 'db_name') from dual;

导入导出

    1.导出自己的表:
    exp userid=username/pwd@sid tables=(emp, dept) file=d:/data/bak.dmp 若只想导出表的结构,后面加上" rows=n"; 若表的数据量大时,只想导出表的结构,后面只加上“ direct=y”就行;这时需要数据库的字符集和客户端的字符集完全一致,否则会报错;
    2.导出其它方案的表,需要dba的权限或是exp_full_database的权限,比如system就可以导出scott的表:
    exp userid=system/manager@myorcl table=(scott.emp) file=d:\e2.dmp
    3.导出自己的方案:(包括该用户下所有的表、索引、约束...)和数据
    exp scott/tiger@myorcl owner=scott file=d:\scott.dmp
    4.导出多个方案,需要dba的权限或是exp_full_database的权限,比如导出system和scott的所有对象:
    exp system/manager@myorcl owner=(system, scott) file=d:\system.dmp
    5.导出数据库,需要dba的权限或是exp_full_database的权限
    exp userid=system/manager@myorcl full=y inctype=complete file=d:\system.dmp
    6.导入自己的表
    imp userid=scott/tiger@myorcl tables=(emp) file=d:\xx.dmp
    7.导入表到其它用户,需要dba的权限或是exp_full_database的权限 
    imp userid=system/manager@myorcl tables=(emp) file=d:\xx.dmp touser=scott
    8.导入表的结构
    imp userid=scott/tiger@myorcl tables=(emp) file=d:\xx.dmp rows=n
    9.导入数据
    imp userid=scott/tiger@myorcl tables=(emp) file=d:\xx.dmp ignore=y
    10.导入自己的方案
    imp userid=scott/tiger file=d:\xxx.dmp
    11.导入其它方案 ,要求用户具有dba权限
    imp userid=system/manager file=d:\xxx.dmp fromuser=system touser=scott
    12.导入数据库,导入所有对象,包括实例
    imp userid=system/manager full=y file=d:\xxx.dmp

dict字典表,记录数据库系统的信息;

韩顺平玩转oracle视频教程笔记.doc

德邦——办公系统开发
16.-- 当前报告人及上级递增到总裁
select distinct(m.empcode)
  from OM_EMPLOYEE e,
       om_organization o,
       om_employee m
 where o.appsyscode = 'DIP'
   and o.orgclose = '0'
   and o.orgid = e.orgid
   and e.empstatus = 'on'
   and o.managerid=m.empcode
 start with e.empcode = '078415'
connect by prior o.parentorgid = o.orgid;
17.开发OA找回密码遇到的问题及解决方案总结:
1. 查找员工及直接上级领导的邮箱及相关信息
当员工和直接上级领导是同一机构和不同机构查询的方式是不同的,所以首先要查询员工和直接上级领导是不是同一机构:
SELECT
e.empcode empcode, o.managerid mngempcode
FROM om_organization o, om_employee e
WHERE o.orgid =e.orgid AND e.empcode = #value#
查询结果如果empcode和mngempcode不同时(非部门负责人情况),则查询SQL语句如下:
SELECTe.empcode empcode, e.empname, o.managerid mngempcode,
m.empnamemng empname, e.oemail myemail, m.oemail mngemail
FROM om_organization o, om_employee e, om_employee m
WHERE o.orgid = e.orgid AND m.empcode =o.managerid AND e.empcode = #value#
当查询员工的领导的直接上级领导时,这时empcode和mngempcode是相同的(部门负责人情况),这时就不能用上面的方式来查了,查询方式如下:
SELECT e.empcode empcode, e.empname, e.oemail myemail,
e2.empcodemng empcode, e2.empname mngempname, e2.oemail mngemail
FROM om_organization o, om_organization o2,om_employee e, om_employee e2
WHERE o.orgid =e.orgid AND o.parentorgid = o2.orgid AND e2.empcode = o2.managerid AND e.empcode = #value#
2.查找员工及直接上级领导
    --  如果是部门负责人
    SELECT CASE WHEN E.EMPCODE = O.MANAGERID THEN
        (SELECT E2.EMPCODE MNGEMPCODE
            FROM OM_ORGANIZATION O,
                 OM_ORGANIZATION O2,
                 OM_EMPLOYEE E,
                 OM_EMPLOYEE E2
            WHERE O.ORGID = E.ORGID
                AND O.PARENTORGID = O2.ORGID
                AND E2.EMPCODE = O2.MANAGERID
                AND E.EMPCODE = '150970')
        ELSE
    --  如果不是部门负责人
        (SELECT O.MANAGERID MNGEMPCODE
            FROM OM_ORGANIZATION O, OM_EMPLOYEE E, OM_EMPLOYEE M
            WHERE O.ORGID = E.ORGID
                AND M.EMPCODE = O.MANAGERID
                AND E.EMPCODE = '150970')
        END ENAME
       FROM OM_ORGANIZATION O, OM_EMPLOYEE E
        WHERE O.ORGID = E.ORGID
          AND E.EMPCODE = '150970'
3.a.如果两列数据重复的话,可以通过count方法,找出计算条数大于1的,那么表示此条数据重复:
select distinct(*) from products having count(*)>1;
b.备注:实际上两列重复的话,都是针对某个字段比较有意。
select created_by,updated_by, count(1) from business_apply group by created_by,updated_by having count(1)>1;
c.以上语句就是查询出名字重复的所有用户,并计算重复的次数
select name,count(*) from usertable group by name having count(*)>1;
用一条insert语句来插入多行数据
MySQL数据库:
INSERT INTO STUDENT (SNAME, SSEX, SAGE, SDEPT) SELECT '武耀旭','男',24,'CS' UNION SELECT '张志鹏','男',24,'CS' UNION SELECT '朱文辉','男',24,'CS'  
INSERT DELAYED INTO `newsort` (`sort_id`, `sort_name`, `sort_bz`) VALUES  
(1, 'aas', 'sdsdfsdfsf'),  
(2, 'ffff', 'gggg'),  
(4, '生活类', '要懂得生活才好!'),  
(5, '股票行情', ''),  
(6, '政治类新闻', ''),  
(7, 'IT行业新闻', ''),  
(8, '宗教类新闻', '');  
Oracle数据库:
-----------------------两种插入方式  
INSERT INTO sc(SID,cid,g) VALUES (2011001,001,90);  
INSERT INTO sc(SID,cid,g) VALUES (2011002,001,91);  
INSERT INTO sc(SID,cid,g) VALUES (2011003,001,92);  
INSERT INTO sc(SID,cid,g) VALUES (2011004,002,93);  
INSERT INTO sc(SID,cid,g) VALUES (2011005,002,94);  
INSERT INTO sc(SID,cid,g) VALUES (2011006,002,95);  
INSERT INTO sc(SID,cid,g) VALUES (2011007,003,96);  
INSERT INTO sc(SID,cid,g) VALUES (2011008,003,97);  
INSERT INTO sc(SID,cid,g) VALUES (2011009,004,98);  
INSERT INTO sc(SID,cid,g) VALUES (2011010,004,99);  
INSERT INTO sc(SID,cid,g)  
SELECT 2011001,001,90 FROM dual UNION ALL   
SELECT 2011002,001,91 FROM dual UNION ALL   
SELECT 2011003,001,92 FROM dual UNION ALL   
SELECT 2011004,002,93 FROM dual UNION ALL   
SELECT 2011005,002,94 FROM dual UNION ALL   
SELECT 2011006,002,95 FROM dual UNION ALL   
SELECT 2011007,003,96 FROM dual UNION ALL   
SELECT 2011008,003,97 FROM dual UNION ALL   
SELECT 2011009,004,98 FROM dual UNION ALL   
SELECT 2011010,004,99 FROM dual   
 类似资料:

相关阅读

相关文章

相关问答