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

oracle数据库基本命令使用汇总

2020-08-01 11:43 861 查看
SQLPLUS的使用:
创建表空间:create tablespace +表名字(TEST1_TABLESPACE)+ datafile '文件名(test1.dbf)'  + size 10m ;
创建临时表空间:create temporary tablespace +表名字(TEST1_TABLESPACE)+ tempfile '文件名(test1.dbf)'  + size 10m ;
查找表:
select file_name from dba_data_files where tablespace_name ='表名(TEST1_TAABLESPACE)';
查找临时表:select file_name from dba_temp_files where tablespace_name ='表名字(TEST1_TAABLESPACE)';
创建用户:create user 用户名(Tao)identified by 密码(123456) default tablespace 表名字(TEST1_TABLESPACE) temporary tablespace 临时表名字(TEST1_TABLESPACE);
查找所有用户:select username from dba_users;
修改用户密码:alter user 用户名(Tao) identified by 密码(123456);
(如果想删除用户或者不想删除可以采用锁定用户)
锁定用户:alter user 用户名(Tao) account lock
解锁用户:alter user 用户名(Tao) account unlock
删除用户:drop user 用户名(Tao);
删除用户以及数据:drop user 用户名(Tao) cascade;
给用户授权:grant 权限(connect) to 用户(Zhuoyuting)
为角色赋予权限:grant 权限 to 角色名(角色相当于所有权限的集合)
收回权限:revoke 权限 from 角色或者用户
数据字典:数据库提供的典,用于查询数据库
dba_tablespaces:所有用户的表空间(默认表和临时表)
user_tablespaces:当前用户的表空间(默认表和临时表)
例:select tablespace_name from dba_tablespaces;
dba_users:查看所有用户的管理信息
user_users:查看当前用户的管理信息
例:select default_tablespace,temporary_tablespace from user_users where username = '用户名(TAO)';
设置用户默认或临时表空间:
alter user 用户名(TAO) default tablespace 表空间名字(TEST11_TABLESPACE) temporary tablespace 表空间名字(TEMP11_TABLESPACE)

修改表空间的状态:
设置联机或脱机状态
alter tablespace TEST11_TABLESPACE offline;
alter tablespace TEST11_TABLESPACE online;
alter tablespace TEST11_TABLESPACE read only;
alter tablespace TEST11_TABLESPACE read write;
特别说明:
如果一个表空间设置成脱机状态,表示该表空间暂时不让访问,设置成脱机状态不是删除,当我们需要使用该表空间时还可以将其设置成联机状态,正常使用
增加数据文件:
alter tablespace TEST11_TABLESPACE add datafile 'test100.dbf' size 10m;
说明:向创建好的表空间里增加数据文件
删除数据文件:
alter tablespace TEST11_TABLESPACE drop datafile 'test100.dbf';
说明:不能删除表空间中的第一个数据文件,如果需要删除的话,需要把整个表空间删除

删除表空间:
1、如果只是想单纯的删除表空间,而不删除数据文件的话可以按照如下格式:
drop tablespace TEST10_TALESPACE
2、如果在删除表空间的同时还想把数据文件也删除的话,那么需要添加如下:
including contents

SQLDeveloper工具的基本使用:
SQL含义:
结构化查询语言简称SQL
是一种特数目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统的语言

DDL:数据定义语言
DML:数据操作语言
DCL:数据控制语言
TCL:事务控制语言

常用的DDL语句:
create table:创建数据库表
create index:创建数据库表的索引
drop table:删除数据库表
drop index:删除数据库表的索引
truncate:删除表中的所有行
alter table:更改表结构,增加,修改,删除列
alter table add constraint:在已有的表上增加约束

常用的DML语句包括
INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
SELECT:选择(查询)数据
SELECT是SQL语言的基础,最为重要

常用的DCL语句
grant:将权限或角色授予用户或其他角色(授予访问权限)
revoke:从用户或数据库角色回收权限(撤销访问权限)
LOCK:对数据库的特定部分进行锁定

常用的TCL语句
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点

数据类型
. 在创建数据表时,设计数据表的结构问题,也就是涉及确定数据表中各个列的数据类型,是数值,字符,日期还是图像等其他类型
. 因为只有设计好数据表结构,系统才会在磁盘开辟相应的空间,用户此能向表中填写数据

字符类型:
CHAR:表示固定长度的字符串
列长度可以是1到2000个字节
VRCHAR2:
表示可变长度的字符串
最大长度为4000字节

声明语法:
NUMBER[(p[,s])]

. P 表示精度,S表示小数点的位数
. 可以存储整数、浮点数等数值类型
. 最高精度为38位

例:
. number(5,0) 最多可存储五位整数
. number(5,2) 最大可存储999.99的浮点数

日期类型
. 日期时间数据类型存储日期和时间值,包括年、月、日,小时、分钟、秒
. 主要的日期时间类型有:
. DATE

LOB类型
LOB:CLOB
BLOB
CLOB即Character LOB(字符LOB):它能够存储大量字符数据
BLOB即Binary LOB(二进制LOB):. 可以存储较大的二进制对象
. 如图像、视频剪辑和声音文件
主键约束
PRIMARY KEY约束用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其值不能为NULL,也不能重复,以此来保证实体的完整性。表中主键只能有一个,但可以由多个列构成。

添加主键约束:
alter table 表名字(student) add constraint sid_pk primary key(sid)

非空约束
修改表添加约束的语法格式:
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name] constraint_type (column);

而添加非空(not null)约束要使用MIDIFY语句
alter table student modify (name varchar(20) not null);

删除约束的方式

将约束无效化或激活:
DISABLE|ENALBLE CONSTRAINT constraint_name

将约束彻底删除:
DROP CONSTRAINT constraint_name

删除主键约束的格式:
DROP PRIMARY KEY

删除非空约束的格式:
ALTER TABLE table_name MODIFY column_name datatype NULL;

唯一性约束:
唯一性约束用于指定一个或者多个列的组合值具有唯一性,以防止在列中输入重复的值

唯一性约束的注意事项:
使用唯一性约束的列允许为空值
一个表中可以允许有多个唯一性约束
可以把唯一性约束定义在多个列上

修改表时添加唯一性约束
alter table student add constraint uk_cardid unique(cardid);

检查约束:
检查约束对输入列或者整个表中的值设置检查条件。以限制输入值,保证数据库数据的完整性
可以定义在表上也可定义在列上

修改表时添加检查约束
alter table student add constraint ck_sex (sex='' or sex='');

外键约束:
外键是用于建立和加强两个表数据之间的连接的一列或多列。外键约束是唯一涉及两个表关系的约束。

外键约束的注意事项:
设置外键约束主表的字段必须是主键列(或唯一列)
主从表中相应字段必须是同一数据类型。
从表中外间字段的值必须来字主表中的相应字段的值,或者为NULL值。

修改表时添加外键约束:
alter table student add constraint fk_depid foreign key(depid) references partment(depid) on delete cascade;

create table student(
sid number(12,0),
name varchar2(20) constraint nk_name not null,
sex char(2),
birth date,
address varchar2(50),
depid varchar2(10),
constraint pk_sid primary key(sid),
constraint sk_sex check(sex ='男' or sex ='女'),
constraint nk_name unique(name),
constraint dk_depid foreign key(depid) references partment(depid)
);

--删除表
--truncate table copy;
--drop table copy;

删除表
TRUNCATE TABLE 表名;
TRUNCATE TABLE操作用于删除表中的全部数据,并不是把表删除掉,这种删除方式要比DELETE方式删除数据的速度要快,也叫截断表

DROP TABLE 表明;
删除表结构

--添加列
语法结构:
ALTER TABLE 表名 ADD 新增列名 数据类型;
例如:
--alter table student add tel varchar2(11);

--修改列
语法结构:
ALTER TABLE 表名 MODIFY 列名 新数据类型;
例如:
--alter table student modify tel number(11,0);

----删除列
语法结构:
ALTER TABLE 表名 DROP COLUMN 列名;
例如:
--alter table student drop column tel;

--修改列名
ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名
例如:
--alter table student rename column sex to gender;

--修改表名
语法结构:
RENAME 表名 TO 新表名
例如:
--rename student to studentness;

----添加信息
--insert into student(sid,name,sex)values(20171202,'卓玉婷','女');
--如果不进行说明的话就默认创建表的顺序
--查询信息
--select sid,name from student;
----修改信息
--update student set name = '卓玉婷是周雪涛女人' where sid = 20171202;
--删除信息
----delete from student where sid =11111111;

事务:
事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。

事务的组成:
一条或者多条DML
一条DDL
一条DCL

DML语句需要使用COMMIT提交事务或者使用ROLLBACK回滚事务。
DDL和DCL是i自动那个提交事务的。

使用事务的原因:保证数据的安全有效

当执行事务操作(DML语句)时,Oracle会在被作用表上加表锁,以防止其他用户改变表结构;同时会在被作用行上加行锁,以防止其他事务在相应行上执行DML操作。

事务的控制命令:
提交事务(COMMIT)。
通过COMMIT语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化、结束事务、删除保存点,释放锁。
当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据

回滚事务:ROLLBACK
ROLLBACK只能对未提交的数据撤销,已经commit的数据是无法撤销的,因为commit之后已经持久化到数据库中

保存点(SAVEPOINT)
是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。
设置保存点:SAVEPOINT a;
回滚部分事务:ROLLBACK TO a;
回滚全部事务:ROLLBACK;

数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的。数据库数据字典是一组表和视图结构。

数据字典中的表是不能直接访问的,但是可以访问数据字典中的视图。

数据字典的作用:
通过数据字典,是我们了解数据库内部的信息。当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息。

Oracle中常用的数据字典:
user_*:
该视图存储了关于当前用户所拥有的对象的信息(及所有在该用户模式下的对象)

all_*:
该试图存储了当前用户能够访问的对象的信息(与user_*相比,all_*并不需要拥有该对象,只需要具有访问该对象的权限即可)

dba_*:
该试图存储了数据库中所有对象的信息(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)

排除重复行distinct:
默认情况下,当执行查询操作时,会显示所有满足条件的行,包括重复行。

例如:
--排除重复行
--select distinct deptno,job from emp;

查询日期列:
日期列:是指数据类型为日期类型的列,如DATE类型
日期列的默认显示格式为DD-MON-RR

RR:代表年,而且只取年份的后两位数字

以简体中文显示日期结果:
如果以简体中文显示日期结果,那么可以将会话的NIS_LANGUAGE参数设置为'SIMPLIFIED CHINESE';
alter sessio set nls_language = 'SIMPLIFIED_CHINESE';

以美国英语显示日期结果:
如果以美国英语显示日期结果,那么可以将会话的NIS_LANGUAGE参数设置为AMERICAN
alter session set nls_language = 'AMERICAN';

以特定格式显示日期结果:
如果希望定制日期显示格式,并按照特定方式显示日期结果,那么可以设置会话的nls_date_formate参数。

ALTER SESSION SET nls_date_formate = 'YYYY/MM/DD';

--排除重复行
--select distinct deptno,job from emp;
--select * from emp;
--设置简体中文格式
--alter sessio set nls_language = 'SIMPLIFIED_CHINESE';
--设置美式英语格式
--alter session set nls_language = 'AMERICAN';
--以特定格式显示日期结果
--alter session set nls_date_formate = 'YYYY/MM/DD';
--select * from emp;
--alter session set nls_date_formate = 'YYYY/MM/DD';

算术运算符的优先级:
乘除具有相同的优先级、加减具有相同的优先级
相同优先级的运算符从左向右执行
乘除的优先级高于加减
括号内的运算先执行

在算术运算中的空值NULL:
NULL表示未知值,它既不是空格也不是0
当算术表达式包含NULL时,其显示结果也为空(NULL)

空值与默认值:
空值:当插入数据时,如果没有为特定列提供数据,并且该列没有默认值,那么其结果为NULL
默认值:在创建表时可以使用default关键字为列设置默认值,在表中插入数据时,如果没有为该列提供数据,那么该列将使用默认值

--insert into student(sid,name) values(20010001,'张三');
--insert into student values(20010002,'王五',default,default,'北京市昌平区');

列的别名:
列的别名用于改变列的显示标题
列别名可以跟在列名的后面,也可以在二者之间加AS关键字
如果别名中包含空格或特殊的字符或者需要区分大小写,那么需要给别名加上双引号
--不使用列的别名
--select empno,ename,sal*12 from emp;
--使用列的别名
--select empno "雇员编号",ename "雇员名",sal "全年工资" from emp;
--select empno as "雇员编号",ename as "雇员名",sal as "全年工资" from emp;
----select empno as 雇员编号, ename as 雇员名, sal*12 as 全年工资 from emp;
--select empno 雇员编号, ename 雇员名, sal*12 全年工资 from emp;

连接符||:
当执行查询操作时,为了显示更有意义的结果时,有时需要将多个字符串连接起来,连接字符串可以使用“||”操作符或者concat函数。
把列与列,列与字符连接在一起。
用"||"表示。
可以用来 ’合成'  列
--连接
--select ename || '的岗位是' || job as 员工的职位信息描述 from emp;

字符串:
字符串可以时SELECT列表中的字符,数字,日期。
日期和字符只能在单引号中出现 。
每当返回一行时,字符串被输出一次。

where子句中使用数字值:
当在where子句中使用数字值时,即可用直接引用数字值,也可以用单引号引住数字值
当where子句中使用日期值时,必须给日期值加上单引号。
另外,日期值必须符合日期语言和显示格式。

----select * from emp where job = 'MANAGER';
--SELECT * FROM  emp where hiredate = '02-4月-81';
----select * from emp where sal = 3000;
----select * from emp where sal >= 3000;
--select * from emp where sal<> 1000;
<>是不等于

范围查询 BETWEEN...AND:
BETWEEN...AND用于指定特定范围的条件
两值之间包含边界
BETWEEN 较小值 AND 较大值
例如:
select empno,ename,sal from emp where sal between 1500 and 3000;
等价于:
select empno,ename,sal from emp where sal >= 1500 and sal <= 3000;

范围查询 IN
IN执行列表匹配的操作
列或表达式结果匹配列表中的任意一个值
IN(值1,[值2,...值n])

模糊查询LIKE
用LIKE执行模糊查询
当执行模糊查询时,需要使用通配符%和_
通配符%:用于表示0个或多个字符
通配符_:用于表示单个字符

模糊查询中特殊符号的处理
刚才我们用了通配符%和_执行模糊查询,如果字符值本身就包含——和%字符,并且开发人员希望使用这两个字符执行模糊查询,那么必须使用escape选项和转义符实现

回避特殊符号的方法:使用转义符。例如:将[%]转为【、%】\{_]转为[\],然后再加上[escape '\']即可

判断空值 IS NULL
IS NULL操作符用于检测列或表达式的结果是否为NULL,如果为NUJLL,则返回true,否则返回false
判断列或表达式的结果是否为空可以用is null或is not null,但是不能用=NULL或<>null来判断

--between and
--select empno,ename,sal from emp where sal between 1500 and 3000;
----in
--select empno,ename,job from emp where job in ('SALESMAN','MANAGER','CLERK');
----范围查询 BETWEEN...AND
--select empno,ename,sal from emp where sal between 1500 and 3000;
--select empno,ename,sal from emp where sal>=1500 and sal<=3000;
--范围查询IN
--select empno,ename,job from emp where job in('SALESMAN','MANAGER','CLERK');
--select empno,ename,job from emp where job = 'SALESMAN' or job = 'MANAGER' or job = 'CLERK';
--模糊查询LIKE
--select * from emp where ename like 'J%';
--select * from emp where ename like '_AR%';
----模糊查询中特殊符号的处理
--select * from emp where ename like 'G\_%' escape '\';
----判断空值
----select empno,ename,sal,comm from emp where comm is null;
--select empno,ename,sal,comm from emp where comm is not null;

排序数据ORDER BY子句:
ASC升序,DESC降序

注意:当select语句包含多个子句(where,group by,having,order by)时,order by必须是最后一条语句。

--排序
--升序
--select * from emp order by comm asc;
----降序
--select * from emp order by comm desc;
--组合升降
--select * from emp order by comm desc , sal asc;

使用列别名排序:
select empno,ename,sal *12 年收入 from emp order by 年收入 desc;

大小写控制函数
UPPER(char):该函数用于将字符串转换为大写格式
LOWER(cahr):该函数用于将字符串转换为小写格式
INITCAP(char):该函数用于将字符串中的每个单词的首字母大写,其他字母小写

concat(str1,str2):该函数用于字符串的连接,str1和str2用于指定被连接字符串

LENGTH(char):该函数用于返回字符串的长度,字符串中的后缀空格业绩做字符串的长度

INSTR(char1,char2[,n[,m]]):该函数用于取得子串中的位置,cha1用于指定源字符串,char2用于指定子串,n用于制定起始搜索位置(默认值:1),m用于指定子串的第m次出现的次数(默认值:1)

LPAD(char1,n,char2):该函数用于在字符串的左端填充字符,cha1用于指定源字符串,char2用于指定被填充的字符,n用于指定被填充的字符,n用于指定填充后的char1的总长度

RPAD(char1,n,char2):该函数用于在字符串的有段填充字符,char1用于指定源字符串,char2用于指定被填充的字符,n用于指定被填充的字符,n用于指定填充后的char1的总长度

ROUND
ROUND(d,[,fmt]):该函数用于返回日期时间的四舍五入的结果
d用于指定日期的时间值,fmt用于指定四舍五入的方式,
如果设置fmt为YEAR,则7月1日为分界线,如果设置fmt为MONTH,则16日为分界线

----范围查询 BETWEEN...AND
--select empno,ename,sal from emp where sal between 1500 and 3000;
--select empno,ename,sal from emp where sal>=1500 and sal<=3000;
--范围查询IN
--select empno,ename,job from emp where job in('SALESMAN','MANAGER','CLERK');
--select empno,ename,job from emp where job = 'SALESMAN' or job = 'MANAGER' or job = 'CLERK';
--模糊查询LIKE
--select * from emp where ename like 'J%';
--select * from emp where ename like '_AR%';
----模糊查询中特殊符号的处理
--select * from emp where ename like 'G\_%' escape '\';
----判断空值
----select empno,ename,sal,comm from emp where comm is null;
--select empno,ename,sal,comm from emp where comm is not null;
--select * from emp;
--排序
--升序
--select * from emp order by comm asc;
----降序
--select * from emp order by comm desc;
--组合升降
--select * from emp order by comm desc , sal asc;

--upper
select * from emp where job = upper('salesman');

--lower
select * from emp where lower(job) = 'clerk';

--initcap
select empno,initcap(ename) from emp;

--concat
select ename || ':' || sal from emp;
select concat(concat(ename,':'),sal) from emp;

--substr
select * from emp where substr(job,0,4) = 'SALE';

--length
select * from emp where length(ename) = 6;

--instr
--dual 虚拟的表
select instr('hello oracle','oracle') from dual;
select instr('hello oracle','oracle',1,1) from dual;

--lpad
select lpad(job,9,'$') from emp;

--rpad
select rpad(job,9,'$') from emp;

--replace//第一个参数为字符串,第二个参数为想转换的字符,第三个为像转换成的字符
select replace('hello oracle','oracle','hello') from dual;

--四舍五入round
--求员工的日工资
select round(sal/30,2) from emp;

--截断函数 trunc
select trunc(sal/30,2) from emp;

--求余数 Mod
--求员工为偶数的员工信息
select * from emp where mod(empno,2) =0;

--sysdate//今天日期
select sysdate 昨天, sysdate 今天, sysdate 明天 from dual;

--months_between
--员工入职日期到今天有几个月
select trunc(months_between(sysdate,hiredate)/12) from emp;

--add_months
--员工工作一年后的日期(单位是月)
select ename,add_months(hiredate,30*12) from emp;

--next_day
--特定日期的下一个工作日
select next_day(sysdate,'星期一') from dual;

--last_day
--特定日期月份的最后一天
select sysdate,last_day(sysdate) from dual;
select empno,ename,last_day(hiredate) from emp;

--round
select empno,ename,hiredate,round(hiredate,'YEAR'),round(hiredate,'MONTH') from emp;

--to char
--转为字符
select to_char(hiredate,'YYYY-MM-DD') from emp;
select to_char(hiredate,'YYYY"年"MM"月"DD"日"') from emp;
select to_char(sal,'L0000000000.00') from emp;

--to date
--转为日期
select ename,hiredate from emp where hiredate>to_date('1981-12-31','YYYY-MM-DD');

--to number
--转为数字
select ename,sal from emp where sal>to_number('2000','L9999');

--nvl
--如果为空则为0,如果不为空,就是comm
select ename,sal,comm,sal+nvl(comm,0) from emp;

--nvl2
--如果为空则为sal,不为空则为comm+sal
select ename,sal,sal,comm,nvl2(comm,comm+sal,sal) from emp;

--coalesce
select ename,sal,comm,comm,coalesce(sal+comm,sal) from emp;

select to_char(next_day(add_months(hiredate,3),'星期一'),'YYYY-MM-DD')  from emp;

select to_char(round(sal/30,2),'L9,999.99') from emp;3

--分组
--平均值
select avg(sal) from emp;

--最大值
select max(sal) from emp;

--最小值
select min(sal) from emp;

--全部员工
select count(deptno) from emp;

--行转列
select wm_concat(ename) from emp;

--求员工的平均工资
select sum(sal)/nvl(count(*),0) as "工资1" ,sum(sal)/count(sal) as 工资2 ,avg(sal) as 工资3 from emp;

--查询员工的编号和平均工资
--在SELECT列表中所有未包含在组函数中的列都应包含在GROUP BY子句中
select deptno,avg(sal) from emp group by deptno;

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

--查询员工的编号和工资大于2000的
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000 order by deptno desc;

--笛卡尔集
select empno,ename,员工表.deptno,部门表.deptno,dname from 部门表,员工表;

--区分重复的列名

--使用表明前缀在多个表中区分相同的列
select empno,ename,job,dname from emp,dept where emp.deptno = dept.deptno;

--使用表明前缀可以提高执行效率
select emp.empno,emp.ename,emp.job,dept.dname from emp,dept;

--使用表的别名,可以简化连接查询并提高查询性能
select e.empno,e.ename,e.job,d.dname from emp e,dept d where e.deptno = d.deptno;

--在连接查询中,当有多个连接条件时,使用AND指定其他条件
select e.empno,ename,e.job,d.dname from emp e, dept d where e.deptno = d.deptno and e.deptno = 10;

select * from salgrade;

select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between losal and hisal;

--按部门统计员工的人数,要求显示:部门号,部门名称,人数
select d.deptno,d.dname,count(e.empno) from dept d, emp e where d.deptno = e.deptno group by d.deptno, d.dname;

--外连接的语法
select d.deptno,d.dname,count(e.empno) from dept d, emp e where d.deptno = e.deptno(+) group by d.deptno, d.dname;

--自连接:将同一张表看成是多张表
select e.ename,m.ename from emp e, emp m where e.mgr = m.empno;

--cross join交叉连接
select count(*) from dept;
select count(*) from emp;
select d.dname,e.ename,d.deptno,e.deptno from dept d cross join emp e;--(count(*) from dept) * (count(*) from dept)

--nature join
--将表中具有相同名称的列自动进行记录匹配
--管理员工名、工资以及所在部门名称
select e.ename,e.sal,d.dname from dept d natural join emp e;

--内连接
--返回两个表中相匹配的数据(只返回满足条件的数据)
--等值连接、费等值连接,自然连接都属于内连接

--用USING子句建立相等连接
select e.ename,e.sal,d.dname from dept d join emp e using(deptno);

--用ON子句建立相等连接
select e.ename,e.sal,d.dname from dept d join emp e on e.deptno = d.deptno;

--内连接
select e.ename,e.sal,d.dname from dept d join emp e using(deptno);

select e.ename,e.sal,d.dname from dept d join emp e on e.deptno = d.deptno;

--左外连接
select e.ename,e.sal,d.dname from dept d left join emp e on d.deptno = e.deptno;

--右外连接
select e.ename,e.sal,d.dname from dept d right join emp e on d.deptno = e.deptno;

--全部连接
select e.ename,e.sal,d.dname from dept d full join emp e on d.deptno = e.deptno;

--union
--并集
--默认以第一列进行升序排序
select deptno,ename from emp
union
select deptno,dname from dept;

--union all
--与并集很像,重复元素不排除
select deptno,ename from emp
union all
select deptno,dname from dept;

--intersect
--交集
--默认以第一列进行升序排序
select deptno,ename from emp
intersect
select deptno,dname from dept;

--minus
--用于取得两个结界集的差集
select deptno,ename from emp
minus
select deptno,dname from dept;

--控制结果排序
/*当使用集合操作符UNNION、INTERSECT
和MINUS时,默认情况下会自动基于第一列
进行升序排序;而当使用集合操作符UNION ALL时,
不会进行排序,为了空值结果的排序顺序,可以使用OPDER BY子句*/

select deptno,ename from emp
union all
select deptno,dname from dept
order by 1;

--查询出每个部门的编号,名称,位置,部门人数
select deptno,dname,loc, (select count(empno) from emp where emp.deptno = dept.deptno) cnt from dept;

--查询员工信息表,按部门编号进行分组,要求显示员工的部门编号,平均工资,查询条件是平均工资大于30号部门的最高工资
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>(select max(sal)
from emp
where deptno = 30);

--子查询
select *
from emp
where job = (select job
from emp
where ename='SMITH');

--查询出每个部门的编号,名称,位置,部门人数
select deptno,dname,loc,(select count(empno) from emp where emp.deptno = dept.deptno) cnt from dept;

--在hanving子句中使用子查询
--查询员工信息表,按部门编号进行分组,要求显示员工的部门编号,平均工资,查询条件是平均工资大于30号部门的最高工资
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>(select max(sal)
from emp
where deptno = 30);

--查询并显示高于部门平均工资的雇员信息
select ename,job,sal
from emp,(select deptno,avg(sal) avgsal from emp group by deptno) dept
where emp.deptno = dept.deptno and sal>avgsal;

--显示职位和7521的职位相同并且工资大于7934这个员工的员工信息
select *
from emp
where job = (select job from emp where empno = 7521)
and sal>(select sal from emp where empno = 7934);

--子查询的执行顺序
--一般先执行子查询,再执行主查询,但相关查询例外
select empno,ename,sal
from emp
where sal < (select avg(sal) from emp);
--
--当子查询需要引用主查询的列表时,Oracle会执行相关子查询
--相关子查询是先执行主查询,在执行子查询
select ename,sal,deptno
from emp e
where sal>(select avg(sal) from emp where deptno = e.deptno);

--查询部门名称是accounting的员工信息
select *
from emp
where deptno = (select deptno from dept where dname = 'ACCOUNYING');

--多表查询的处理
select e.*
from emp e,dept d
where e.deptno = d.deptno and d.dname = 'ACCOUNT';

--单行子查询
--显示与JAME同部门的所有其他的员工姓名、工资、部门号
select ename,sal,deptno
from emp
where deptno = (select deptno from emp where ename = 'JAMES')
and ename <> 'JAMES';

--查询大于等于公司平均工资的员工的姓名、职位、工资
select ename,job,sal
from emp
where saL >= (select avg(sal) from emp);

--查询部门名称不是'SAVES'的员工
select *
from emp
where deptno <> (select deptno from dept where dname = 'SAVES');

--in
--查询工作地点在NEW YORK和CHINA的部门所对应的员工信息
select *
from emp
where deptno in
(select deptno from dept where loc = 'NEW YORK' or loc = 'CHINA');

--all
--查询高于30号部门所有员工工资的员工名、工资和部门号
select ename,sal,deptno
from emp
where sal>all(select sal from emp where deptno = 30);

--上面相同要求(单行子查询)
select ename,sal,deptno
from emp
where sal>(select max(sal) from emp where deptno = 30);

--查询高于10号部门任意一个员工工资的员工名、工资和部门号
--any
select ename,sal,deptno
from emp
where sal > any(select sal from emp where deptno = 10);

--上面相同要求(单行子查询)
select ename,sal,deptno
from emp
where sal > (select min(sal) from emp where deptno = 10);

--select deptno,avg(sal) avgsal from emp group by deptno order by deptno
--select deptno,avg(sal) avgsal from emp group by deptno

--group by 不可以作为子查询
--在TOP-N分析问题中,需对子查询排序
select rownum,empno,ename,sal
from (select * from emp order by sal desc)
where rownum<=5;

--空值问题
--如果子查询有空,主查询不返回任何结果
select *
from emp
where empno not in (select mgr from emp where mgr is not null);

--创建视图
--简单视图
create view emp_view
as
select empno,ename,sal from emp;

create view emp_view1(员工号,姓名,工资)
as
select empno,ename,sal from emp;

--查询视图
select * from emp_view1;

--连接试图
--建立用于获得部门号为10的部门号、部门名称及部门信息
create view dept_emp_view
as
select d.deptno,d.dname,e.empno,e.ename,e.job
from dept d, emp e
where d.deptno = e.deptno and d.deptno = 10;

select * from dept_emp_view;

--只读视图
create view emp_view
as
select * from emp where deptno = 10
with read only;

select * from emp_view3;

--视图上的DML操作
--修改数据—update
update empnew_view set sal = sal + 100 where empno = 8888;

--删除数据—delete
delete from emppnew_view where empno = 8888;

--注意:
--针对视图的更新操作(insert、update、dalete)实际改变的是基表中的数据
--视图上的DML操作
create view empnew_view
as
select empno,ename,sal from empnew;

--select
select * from empnew_view;

--insert
insert into empnew_view(empno,ename,sal) values(8888,'LAYNA',6666);

--update
update empnew_view set sal = sal + 100 where empno = 8888;

--delete
delete from empnew_view where empno = 8888;
select * from empnew;

--check约束
create view empnew_view2
as
select * from empnew where deptno = 20
with check option constraint ck_view;

select * from empnew_view2;

--insert\undate
update empnew_view2 set deptno = 30 where empno = 7566;

--修改视图
creat or replace view empnew_view
as
select * from emp where job = 'SALESMAN';

--删除视图
drop view empnew_view;

select * from empnew_view1;

--创建复杂试图
create view job_view(job, avgsal, sumsal, maxsal, minsal)
as
select job,avg(sal),sum(sal),max(sal),min(sal) from emp group by job;

select * from job_view;

--DELETE 操作原则:
--视图中包含以下元素之一不能执行delete操作:
--    group by子句
--    分组函数
--    distinct关键字
--    rownum伪列
--
--UPDATE操作原则:
--视图中包含以下元素之一不能执行update操作:
--    group by子句
--    分组函数
--    distinct关键字
--    rownum伪列
--    使用表达式定义的例
--
--DELETE操作原则:
--视图中包含以下元素之一不能执行delete操作:
--    group by子句
--    分组函数
--    distinct关键字
--    rownum伪列
--    使用表达式定义的例
--    视图上没有包含基表的NOT NULL列

--创建序列
--increment by n 每次增长的数值(步长)
--start with n 从哪个值开始
--maxvalue n   nomaxvalue
--minvalue n   nominvalue
--cycle | nocycle 是否需要循环
--cache n | nocache 是否缓存
create sequence deptno_seq
start with 50
increment by 10
maxvalue 70
cache 3;

create table deptnew
as
select * from dept;

insert into deptnew(deptno,dname,loc)values(deptno_seq.nextval,'test_dname','test_loc');
select * from deptnew

--怎样查询序列
--sequence_name 序列名称,min_value 最小值,max_value 最大值
--increment_by 步长值
--cycle_flag 循环标记
--last_number 若果是no cache则是序列中的下一个值,如果是chche则是缓存中的最后一个序列号的下一个值

--查询序列
select sequence_name,min_value,max_value,increment_by,cycle_flag,cache_size,last_number
from user_sequences;

--执行DDL语句时,默认为commit操作
savepoint a;
savepoint b;
--删除序列
drop sequence deptno_seq;
ROLLBACK TO a;
rollback to b;
--测试
insert into deptnew(deptno,dname,loc)values(deptno_seq.nextval,'test_dname','test_loc');
rollback;
insert into deptnew(deptno,dname,loc)values(deptno_seq.nextval,'test_dname','test_loc');
select * from user_sequences;
commit;

----为什么使用索引
--索引的分类:
--    单列索引
--    复合索引
--按索引列值的唯一性
--    唯一索引
--    非唯一索引

--创建单列索引
create index id_ename on emp(ename);

--创建复合索引
create index idx_deptno_job on emp(deptno,job);

--创建唯一索引
create index idx_dname on dept(dname);

--创建非唯一索引
create index idx_job on emp(job);

--什么时候创建索引
--以下情况可以创建索引
--where子句经常引用的表列上
--为了提高多表连接的性能,应该在连接列上建立索引
--经常排序的列上创建索引,可以加快数据排序的速度

--什么时候不能创建索引
--下表列不要创建索引:
--表很小
--列不经常作为连接条件或出现在WHERE子句中
--表经常更新

--查询索引
select uic.index_name, uic.column_name, uic.column_position, ui.uniqueness
from user_indexes ui, user_ind_columns uic
where uic.index_name = ui.index_name and ui.table_name = 'EMP';

--删除索引
drop index idx_dname;

--同义词是数据库方案对象的一个别名
--    方案对象:表、索引、试图、触发器、序列、同义词、存储过程等
--    非方案对象:表空间、用户、角色等
--stu是表student_info的同义词

--创建共有同义词
create public synonym dn for scott.deptnew;

--使用同义词
select * from dn;

--创建私有同义词
create synonym en for scott.emptnew;

select * from en;

select * from scott.en;

----查看同义词
--当建立同义词时,Oracle会将同义词的信息存放到数据字典中,
--通过查询数据字典试图UESER——SYNONYMS,可以显示当前用户所有同义词的详细信息
select synonym_name,table_owner,table_name
from syn
where synonym_name = 'EN';

select synonym_name,table_owner,table_name
from all_synonyms
where synonym_name = 'DN';

--删除同义词
drop public synonym dn;

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