Oracle超全SQL,细节狂魔( 二 )

 5.表的查询 5.1 简单查询命令SQL> clear–清屏SQL> desc dba_users–查询表结构 SQL> set timing on–打开显示操作的时间 SQL> select count()from student;–统计行数 SQL> select sal12 “总工资” from imp;–取别名及使用算数表达式 SQL> select sal*12+nvl(comm,0)12 “平均工资” from imp;–空值处理用nvl函数 SQL> select distinct deptno,job from imp;–取消重复行 SQL> select ename “姓名”, sal12 as sum from imp;–使用列的别名SQL> select ename ||‘is a’||job from imp;–如何连接字符串(||) 5.2 where子句 1、如何查找1982.1.1日后入职的员工SQL> select * from imp where hiredate>‘1-1月-1982’; 2、如何显示工资在2000到2500的员工的情况SQL> select * from imp where sal>=2000 and sal<=2500; 3、如何显示empno为7369,7499,7876的员工的情况(IN的使用).SQL>select * from imp where empno in(7369,7499,7876);5.3 like操作符1、如何显示首字符为S的员工姓名和工资SQL>select * from imp where ename like’S%’; 2、如何显示第三个字符为大写O的员工姓名和工资SQL>select * from imp where ename like’__O%’;5.4 逻辑操作符号
查询工资高于500或者是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J?SQL> select * from imp where (sal >500 or job = ‘manager’)and ename like ‘J%’;5.5 order by字句
1、如何按照工资的从低到高的顺序显示雇员的信息?SQL> select * from imp order by sal;2、按照部门号升序而雇员的工资降序排列SQL> select * from imp order by deptno, sal desc; 6、表的复杂查询1、数据分组显示所有员工中最高工资和最低工资?.SQL> select max(sal),min(sal) from imp;最高工资那个人是谁?SQL> select ename from imp where sal=(select max(sal) from imp);显示工资高于平均工资的员工信息SQL> select * from imp where sal > (select avg(sal) from imp);显示每个部门的平均工资和最高工资?SQL> select avg(sal), max(sal), deptno from imp group by deptno;–分组查询的话,分组的字段一定要出现在查询的列表里面,否则会报错显示平均工资低于2000的部门号和它的平均工资?SQL> select avg(sal), deptno from imp group by deptnohaving avg(sal) < 2000; 2、多表查询显示雇员名,雇员工资及所在部门的名字SQL> select e.ename, e.sal, d.dname from imp e, dept dwhere e.deptno = d.deptno;显示各个员工的姓名,工资及工资的级别?SQL> select e.ename, e.sal, s.gradefrom imp e, salgrade s where e.sal between s.losal and s.hisal;显示雇员名,雇员工资及所在部门的名字,并按部门排序?SQL> select e.ename, e.sal, d.dname from imp e, dept dwhere e.deptno = d.deptno order by e.deptno; 3、合并查询1)union该操作符用于取得两个结果集的并集 。当使用该操作符时,会自动去掉结果集中重复行 。SQL> select ename, sal, job from imp where sal >2500unionselect ename, sal, job from imp where job = ‘MANAGER’;2)union all该操作符与union相似,但是它不会取消重复行,而且不会排序 。SQL> select ename, sal, job from imp where sal >2500UNION ALLselect ename, sal, job from imp where job = ‘MANAGER’;3)intersect使用该操作符用于取得两个结果集的交集 。SQL> select ename, sal, job from imp where sal >2500Intersectselect ename, sal, job from imp where job = ‘MANAGER’;4)minus使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据 。SQL> select ename, sal, job from imp where sal >2500Minusselect ename, sal, job from imp where job = ‘MANAGER’;7.数据库管理
1、 导出表1.1、导出自己的表exp userid=Scott/targer@wddorcl tables=(imp) file=f:wdd.dmp;1.2、导出其他方案的表(DBA权限,如system就可以)exp userid=system/cfmaster@wddorcl tables=(scott.emp) file=f:wdd1.dmp;1.3、导出表的结构exp userid=Scott/targer@wddorcl tables=(imp) file=f:wpp.dmp rows=n;1.4、使用直接导出方式(速度快,数据量大时可以考虑)exp userid=Scott/targer@wddorcl tables=(imp) file=f:wpp.dmp direct=y;2、 导出方案(方案中的所有对象,表、索引、约束等)2.1、导出自己的方案exp userid=Scott/targer@wddorcl owner=Scott file=f:wpp1.dmp;2.2、导出其他方案(DBA权限,如system就可以)exp userid=system/cfmaster@wddorcl owner=(system,scott) file=f:wpp2.dmp;3、 导出数据库(导出数据库中的对象及数据,需要DBA权限,如system就可以)exp userid=system/cfmaster@wddorcl full=y inctype=complete file=f:wdd.dmp;4、 导入表4.1、导入自己的表imp userid=Scott/targer@wddorcl tables=(imp) file=f:wdd.dmp;4.2、导入表到其他用户(DBA权限,如system就可以)imp userid=system/cfmaster@wddorcl tables=(imp) file=f:wdd.dmp touser=Scott;4.3、导入表的结构(只导入表的结构,而不导入数据)imp userid=Scott/targer@wddorcl tables=(imp) file=f:wpp.dmp rows=n;4.4、导入数据(如果对象已经存在,可以只导入表的数据)imp userid=Scott/targer@wddorcl tables=(imp) file=f:wdd.dmp ignore=y;5、 导入方案(方案中的所有对象,表、索引、约束等)5.1、导入自己的方案imp userid=Scott/targer file=f:wpp1.dmp;5.2、导入其他方案(DBA权限,如system就可以)imp userid=system/cfmaster file=f:wpp1.dmp formuser=system touser=Scott;6、 导入数据库(导入数据库中的对象及数据,需要DBA权限,如system就可以)imp userid=system/cfmaster full=y file=f:wpp2.dmp;7、 管理表空间和数据文件7.1、建立数据表空间SQL>create tablespace data01 datafile 'f:data01.dbf' size 20m uniform size 128k;7.2、使用数据表空间SQL>create table mypart(deptno number(2),dname varchar2(14),loc varchar2(13)) tablespace data01;7.3、改变表空间的状态1) 使表空间脱机SQL>alter tablespace 表空间名 offine;2)使表空间连机SQL>alter tablespace 表空间名 onine;3)只读表空间SQL>alter tablespace 表空间名 read only;4)可读写表空间SQL>alter tablespace data01 read write;实例:1) 知道表空间名,显示该表空间包括的所有表SQL>select table_name from all_tables where tablespace_name='表空间名';2) 知道表名,查看该表属于哪个表空间SQL>select * from all_tables where table_name='表名';7.4、 删除表空间SQL>drop tablespace 表空间including contents and datafiles;(彻底删除);7.5、 扩展表空间1) 增加数据文件SQL>alter tablespace data01 add datafile'f:data02.dbf'size 30m;2) 增加数据文件的大小SQL>alter database datafile 'f:data01.dbf' resize 50m;(大小不能超过500m)3) 设置文件的自动增长SQL>alter database datafile 'f:data01.dbf'autoextend on next 10m maxsize 500m;7.6、 移动数据文件1) 确定数据文件所在的表空间SQL>select tablespace_name from dba_data_files where file_name='F:DATA02.DBF';2) 使表空间脱机(确保数据文件的一致性,把表空间转变为Offline状态)SQL>alter tablespace data01 offline;3) 使用命令移动数据文件到指定的目标位置(或者剪切)SQL>host move f:data02.dbf e:data02.dbf;4) 执行alter tablespace命令SQL>alter tablespace data01 rename datafile 'f:data02.dbf'to'e:data02.dbf';5) 使得表空间联机SQL>alter tablespace data01 online;补充:1) 查询表空间使用情况SQL>SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",F.TOTAL_BYTES "空闲空间(M)",F.MAX_BYTES "最大块(M)"FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY 1;2) 查询表空间的总容量SQL>select tablespace_name, sum(bytes) / 1024 / 1024 as MBfrom dba_data_filesgroup by tablespace_name;3)显示表空间所包含的数据文件SQL>select file_name,bytes from dba_data_fileswhere tablespace_name='表空间名';


推荐阅读