oracle数据库基本语法整理

•	create user 用户名 identified by  密码  创建用户
•	drop user 用户名  删除用户名    删除用户时如果已经创建表必须指定cascade
•	grant   connect  to    用户名    增加权限
•	--增加注释
comment on table t_student is '学员基本信息表';
comment on column t_student.sex is '性别';
comment on column t_student.birthday is '出生日期';
•	/*修改表结构
1)、修改数据类型、非空约束、增加主键、默认值等等
2)、修改列的名字
*/
alter table t_student
modify name null;
•	alter table t_student
modify sex varchar2(12);
•	alter table t_student
modify sex default null;
•	alter table t_student
modify sex varchar2(12) default null;
•	alter table t_student
modify id number constraint pk_t_student_id primary key;
•	alter table t_student
rename column sex to ssex;
•	--修改表名
ALTER TABLE old_table_name RENAME TO new_table_name;
/*新增列*/
alter table t_student
add classid number not null;
•	/*删除列*/
alter table t_student
drop column classid;
•	--删除表结构
drop table t_student;
•	Oracle分析函数的语法与作用:
rank ( )             over ( [query_partition_clause]order_by_clause )
dense_rank ( ) over ([query_partition_clause] order_by_clause )
rownumber ( )  over ( [query_partition_clause]order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,其中partition by 为分组字段,order by 指定排序字段
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用
•	
 select * from (

select deptno,sal,ename, dense_rank( ) over(order by sal desc) pm from emp)

where pm<=11查询工资前11名人的信息(考虑第11和12人的工资相等的情况)

13、-----rank(),dense_rank()与row_number():求排序
rank()值相同时排名相同,其后排名跳跃不连续
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
select * from (
 select deptno,sal,ename, rank()over(order by sal desc) pm from emp)
 where pm<=11

dense_rank()值相同时排名相同,其后排名连续不跳跃
DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
select * from (
 select deptno,sal,ename, dense_rank()over(order by sal desc) pm from emp)
 where pm<=11

row_number()值相同时排名不相等,其后排名连续不跳跃
ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
select * from (
 select deptno,sal,ename, row_number()over(order by sal desc) pm from emp)
 where pm<=11
14、-lag()与lead():求之前或之后的第N行 
lag和lead函数可以在一次查询中取出同一字段的前n行的数据和后n行的值。这种操作可以使用对相同表的表连接来实现,不过使用lag和lead有更高的效率。
lag/lead(arg1,arg2,arg3)
第一个参数是列名,
第二个参数是偏移的offset,
第三个参数是超出记录窗口时的默认值。
举例如下:
SQL> select *  from kkk;                                          
                                                                  
        ID NAME                                                   
---------- --------------------                                   
         1 1name                                                  
         2 2name                                                  
         3 3name                                                  
         4 4name                                                  
         5 5name                                                  
SQL> select id,name,lag(name,1,0) over(order by id) from kkk; 
                                                                  
        ID NAME                 LAG(NAME,1,0)OVER(ORDERBYID)      
---------- -------------------- ----------------------------      
         1 1name                0                                 
         2 2name                1name                             
         3 3name                2name                             
         4 4name                3name                             
         5 5name                4name

SQL> select id,name,lead(name,1,0) over(order by id) from kkk;
                                                                  
        ID NAME                 LEAD(NAME,1,0)OVER(ORDERBYID)     
---------- -------------------- -----------------------------     
         1 1name                2name                             
         2 2name                3name                             
         3 3name                4name                             
         4 4name                5name                             
         5 5name                0

SQL> select id,name,lead(name,2,0) over(order by id) from kkk;                                                                                                               
        ID NAME                 LEAD(NAME,2,0)OVER(ORDERBYID)     
---------- -------------------- -----------------------------     
         1 1name                3name                             
         2 2name                4name                             
         3 3name                5name                             
         4 4name                0                                 
         5 5name                0  
SQL> select id,name,lead(name,1,'linjiqin') over(order by id) from kkk;                                  
                                                                                  
        ID NAME                 LEAD(NAME,1,'ALSDFJLASDJFSAF')                    
---------- -------------------- ------------------------------                    
         1 1name                2name                                             
         2 2name                3name                                             
         3 3name                4name                                             
         4 4name                5name                                             
         5 5name                linjiqin  







1、(神谕、甲骨文公司)提供的一款关系型数据库管理系统 使用表格作为存储数据的基本单元
2、在命令行取消设置折痕  set  linesize  数字    
3、在命令行设置每页显示数据长度   set pagesize 数字
4、命令行中的编辑操作  
ed 文件名,回车,点击是,
然后在记事本里输入查询语句比如:select * from emp
保存退出,最后在命令行输入 @文件名
点击回车,就会执行记事本里面的语句
5、查询不在当前用户下的表必须在表的前面加上用户名,在数据库中用户名也叫模式名称
6、连接操作:
  切换用户
connect 用户名/密码 as sysdba
查看当前用户
show user
7、使用'||'可以连接查询结果
  select '编号是:' || empno || '的姓名是:'|| ename  员工信息  from emp
8、数据库不在本机切换用户的方式
  coun /connect 用户名/密码    服务名 as sysdba
9、查看数据字典包含的字段
desc dba_users
10、查询数据字典包含的用户
 select username from dba_users
11、由于数据库用户有些事预制的,所以状态是锁定的,查看oracle用户的状态:
select username,account_status from dba_users;
12、对于状态是锁定的用户,启用用户的语句
  alter user 用户名 account unlock
13、管理员数据字典
  dba_tablespaces, dba_users
14、普通用户数据字典
  user_tablespaces,user_users
15、设置默认或临时的表空间
   alter user 用户名
default/temporary
tablespace 表空间名
16、创建表空间语法
 create temporary | tablespace tablespace_name(表空间名) tempfile | datafile  数据文件名file.dbf size 大小
17、查看默认/临时表空间
select default_tablespace,temporary _tablespace from dba_user where  username='system'(管理员的)
select default_tablespace,temporary _tablespace from user_user where  username='cotts'(普通用户的)
18、default_tablespace默认表空间
temporary _tablespace临时表空间
19、查询表空间
  select tablespace_name from dba_tablespaces
select tablespace_name from user_tablespaces(普通用户)
20、创建永久表空间
create tablespace test1_tablespace datafile 'test1file.dbf' size 10M
21、创建临时表空间
create temporary tablespace temptest1_tablespace tempfile 'tempfile.dbf' size 10M
22、查询永久表空间包含的字段
desc dba_data_files
23、查询临时表空间包含的字段
desc dba_temp_files
24、设置联机或脱机状态
  alter tablespace tablespace_name(表空间名) online /offline
25、查看表空间的状态
  select status  from dba_tablespaces where  tablespace_name='TEST1_TABLESPACE'
26、设置只读或可读写的状态
  alter tablespace  tablespace_name(表空间名) read only / read write    read write默认
27、往表空间增加数据文件
  create  tablespace tablespace_name(表空间名) add datafile  数据文件名file.dbf size 大小
28、删除表空间的数据文件
  create  tablespace tablespace_name(表空间名) drop datafile  数据文件名_file.dbf
29、删除表空间   (保留数据)
 drop tablespace  tablespace_name(表空间名)   
30、删除表空间   (不保留数据)
drop tablespace  tablespace_name(表空间名)   including contents
31、查询一个用户下的所有表
 select * from tab
32、windows调用本机操作系统的命令           host dir
33、复制一个文件           host copy 原文件名  新文件名
34、表空间      
 表空间是存储数据库对象的容器,表和表空间之间的关系就相当于文件和文件夹一样,每次创建数据库的时候,系统默认的创建一个system系统表空间一个数据库可以有一个system表空间,也可以包含若干个
35、常用的字符类型   char、varchar、varchar2
   Varchar2(n):oracle自行定义的类型,兼容性特别,在企业中一般都是用varchar2
   char(n)      用于标识固定长度的字符串,n表示该字符串最大的保存字符个数。当实际保存数据小于n,在右边使用空格补齐
Varchar(n):可变字符串,n表示该字符串中最大保存字符的个数,当实际保存数据的个数小于n的时候,则会按照实际长度进行保存
36、number:可以用来存储整数和小数
   Number(参数):表示最大参数位数的数字
Number(参数1,参数2):参数1代表有效数字的最大位数,参数2代表小数的位数,    整数的最大位数(参数1-参数2)。
37、SQL语句:结构化查询语言,是专门为操作数据库而建立所做的命令集,功能齐全的数据库语言,通过SQL完成对数据库的任何操作,每一种数据库都不太一样,都可以使用同一个Sql语句对数据库进行基本操作,掌握SQL语言就可以操作任何的数据库,学习的重点
38、DDL数据库定义语句,用来创建,修改删除表
create  、   drop   、  alter
DML数据操作语句,用来操作表的数据。插入。修改,删除
insert、update、5 delete
DCL(TCL)事务控制语句,用来管理数据库的事务
commit、 rollback
DQL数据查询语句,用来查询所需要的数据(重点)
Select
39、创建表的格式
    create    table   表名(
列名1  数据类型  primary key,
列名2   数据类型,
列名n   数据类型
);
40、查看表结构
   desc  表名
41、修改格式
  update 表名  set 列名1=该列新值,列名2=该列新值……
Where  条件;
注意;where前面没有逗号
根据where条件修改表中的数据,没有where条件,可以修改表中所有的数据
42、删除语句
  delete   from   表名    where  条件
   根据where条件删除表中对应数据,没有where条件删除表中所有数据
43、向表中所有的列插入数据
  insert into 表名 values(列值1,列值2…...)
插入的字符串类型必须单引号
44、查询表中所有数据
select  *  from  表名

修改表名的方法:alter table old_table_name rename to new_table_name
45、向指定的列插入数据表名()中列名必须跟values中列值一一对应。没有插入值默认为空
insert into 表名(列名1,列名2…..) values(列值1,列值2….)
插入的字符串必须单引号
46、truncate 删除表中数据
     truncate   table  表名
   直接删除表中所有的数据。而且使用truncate删除的数据,永远都不能还原。但是删除速度是最快
47、删除表
   drop   table   表名
48、去掉重复的列值           distinct
    select distinct id,name,sal from number3;去重3个字段  distinct必须放在开头
49、查询某些列的所有数据
   select    列名1,列名2,列名3…………...from 表名

查询指定行数的数据
SELECT <字段列表> from <table_name> WHERE ROWNUM<行数;
示例:
select * from emp where rownum<=10;--查询前10行记录
复制表
CREATE TABLE <table_name> as <SELECT 语句>
(需注意的是复制表不能复制表的约束);
示例:
create table test as select * from emp;
如果只复制表的结构不复制表的数据则:
create table test as select * from emp where 1=2;
50、删除表中字段(批量删除)   alter table 表名 drop(字段1,字段2,..)也可以单个删除
删除表中的字段(单个删除)   alter table 表名 drop column 字段名
51、oracle下修改字段长度的语法
alter table 表名 modify  字段名 类型(长度);
52、修改字段名语法
  alter table 表名 rename column 原字段名 to 新字段名
53、向表中添加新字段
  alter table 表名 add (字段1 类型 [NOT NULL],字段2 类型 [NOT NULL],....)
54、给表起别名
在多表的连接查询中,建议每一张都起一个别名,通过别名指向对应的表中的列,避免出现多个表之间列名一致
select 别名.列名1,别名2.列名2,别名3.列名3......
from 表名 别名
55、使用as给列起别名
select  列名1 as 别名1,列名2 as 别名2.....from 表名
56、使用空格给列起别名
  select 列名1 别名1,列名2  别名2....
from  表名
57、排序  
  对查询返回的结果,根据某一个列或者某几个列进行升序或者降序
  格式1:
select  列名/*  from 表名
where  条件
order by  列名 desc/asc

格式2:  
select  列名 /*  from  表名
where 条件
order  by  列名1  asc/desc,列名2  asc/desc
desc降序  asc升序、默认值
排序永远是最后被执行的
58、可以使用别名进行排序
select 列名1 别名1,列名2 别名2  from 表名
where 条件
  order by 别名  desc/asc
59、带条件的查询
  select    列名/*   from   表名
where条件
60、可以使用序号进行排序
   select ename,empno,sal 
from emp
order by 3 desc
用的是sal排序
61、关系运算符:>,>=,<,<=,=(等于),!=(不等于)或者<>(不等于)
  判断该列列值是否为null为null:  is  null   不为null: is  not  null
62、模糊查询:  like是,包含的意思
%:指代0个或多个字符
 _:指代任意一个字符
not like  不包含,不是的 意思   
63、nvl函数  专门处理空值的问题
64、使用‘+’连接数字和null返回的结果也为null
65、nvl(数字/列名,数值);如果该列的列值为null,返回数值;如果该列的列值不为null,则返回该列的列值                    nvl(列名,0)
66、nvl2(数字/列,返回结果一 (不为null显示),返回结果二(为null显示))
67、nullif(表达式一,表达式二)
   判断表达式是否相等,如果相等返回null,不相等返回表达式一
68、select  case 列/数值 then 表达式1 then 显示结果1
                       then 表达式2 then  显示结果2
…
else 表达式n
end  别名
from 表名
如果数值/列等于表达式1则显示结果1 如果等于表达式2则显示结果2,如果都不等于。则执行表达式n
69、select  decode(列/表达式,值1,输出结果1,值2,输出结果2….默认值)  别名
from 表名
如果表达式/列的值等于值1,输出结果1,如果等于值2,输出结果2,如果两者都不满足输出默认值 所有条件都要判断否则显示为null
70、select coalesce(表达式1,表达式 2,表达式3….表达式n)
coalesce主要对null进行操作,如果表达式1为null,显示表达式2的内容,如果表达式2为null,显示表达式3的内容,如果执行到最后还是null,那么最终结果就显示null
71、逻辑运算符: and 与   ,or或    ,not非
72、between 初值  and  终值   求出初值到终值之间满足条件的列值
73、where 列名 in(列值1,列值2,列值3...)
在什么范围
74、where 列名 not in (列值1,列值2...)
不在什么范围
75、any
  where 列名 =any(列值1,列值2,列值3...)
与in相同(然而<>any不等价于not in
                                                                                                                                                                                                                                                           
  where 列名  >any(列值1,列值2,列值3...)
比子查询结果中最小的要大(包含了>=any) 
76、some和any用法相同  
where 列名  <any(列值1,列值2,列值3...)
比子查询结果中最大的要小(包含列<=any)   
77、<>any返回的是表中的全部数据
<all比子查询中最小的还要小(包含了<=all)
78、all
   <>all等价于not in(但是=all并不等价于in)
   >all比子查询中值最大的还要大(还包含了>=all)   
79、空数据判断exists
SQL提供的判断子查询是否有数据返回,如果有数据返回,exists结构则返回true,否则返回false
select * from emp
where exists(select * from emp where empno=9999)没有结果返回
          
select * from emp
where exists(select * from emp )       

80、not exists
 select * from emp
where  not exists(select * from emp where empno=9999)                

select * from emp
where not exists(select * from emp )没有结果返回          
81、聚合函数(分组函数)                 
 count()数据总数  sum()求和   max()   最大值  min()最小值   avg()平均值
count(*/列名):*,求出该表中总的数据的条数; 列名,查询该列不为null的列值的个数
sum(列名):求出该列所有列值的累加之和
max(列名);求出该列的最大值
min(列名):求出该列的最小值
avg(列名):求出该列的平均值
median(列):求出中间值
variance(列):返回方差
stddev(列):返回标准差
82、多字段分组
   格式:
select  分组字段1,分组字段2,列名/聚合函数  from   表名
where 条件
group   by  分组字段1,分组字段2...
order  by  列名/聚合函数/别名   asc/desc                            

select d.dname,d.loc,d.deptno, nvl(count(e.empno),0),nvl(max(e.sal),0) 最高工资,nvl(min(e.sal),0) 最低工资,nvl(round(avg(e.sal),2),0) 平均工资
  from emp e,dept d
  where d.deptno=e.deptno(+)
  group by d.dname,d.loc,d.deptno    
83、字符处理函数
  lower(字符串/列名);把字符串/列值中所有的大写字母改成小写字母        
  dual:虚拟表,专门用来进行测试的表                            
upper(列名/字符串):把列值/字符串中所有的小写字母改成大写字母     
length(列名/字符串):统计当前列值/字符串中字符的个数
select  ename,job,lower(ename),lower(job)    from emp
select upper('ximenchunxue') from dual
select ename,length(ename) from emp
84、给出一个整数并返回与之对应的字符串      CHR(数字)
返回与指定字符对应的十进制数字          ASCII('字符')
首字母大写函数                          INITCAP(列/字符串)
85、在左或右填充指定长度的字符串 
LPAD('列/字符串',总长度,'填充字符')
RPAD('列/字符串',总长度,'填充字符')
还可以组合使用    
86、查找函数
instr(列/字符串,查找的字符串,开始位置,出现位置)               
87、替换函数
   replace(列名/字符串,指定字符,新的字符串)
   select  replace('ename','e','-') from dual           
88、substr(参数1,参数2,参数3):截取字符串
   参数1:列名/字符串,指定要截取的列或者字符串
参数2;如果为正数表示从正数的标号开始截取,起始是1,比如参数2(5),从第五个字母开始截取。反之如果为负数表示从倒数第几个字符开始截取,比如参数2(-3),表示从倒数第三个字符开始截取。
参数3:表示要截取字符的个数 
没有参数3表示截取所有     
89、求出emp表中ename的最后3个字符(两种方法)                 
   第一种方法
select substr('ename',-3,3) from emp                 

第二种方法
select substr('ename',length('ename')-2,3) from emp

90、TRIM(列名/字符串):删除列删除列值/字符串两端的空格
   select trim('   liu      ying      ') from emp
91、去掉左或右的空格
    LTRIM('字符串')
RTRIM('字符串')
92、连接(串联)字符串:
使用|| 连接多个字符串    
93、concat(字符串1,字符串2):
串联字符串     
94、to_char();把其他类型的数据转换为字符类型     
95、数值处理函数
    sqrt(数值);求出平方根
    mod(参数1,参数2):求出余数
    floor(数值);向下取整截断  (变小)
ceil(数值):向上取整    (变大)
power(底数,指数):求出乘方
abs(数值):求出绝对值
round(数值,位数):四舍五入函数 
如果位数为正数,保留几位小数,如果位数为0,则只保留正数,如果位数为负数,则表示小数点前第几位进行四舍五入。如果不指定位数则从小数点后面四舍五入    
sign(数值):标记性函数,如果数值是正数,返回值是1,如果数值是0,返回值是0,如果数值是负数,返回值是-1 
96、trunc:截取函数
  trunc(数值,参数):如果参数为正数,表示保留几位小数,如果参数为0,表示舍弃所有的小数,如果参数为负数,表示对小数点前第几位舍弃。如果不指定参数,表示从小数点后面全部舍弃。 
97、  having 子句
      跟group by 结合使用,对分组以后的数据进行再次过滤
    格式1:
select 列名/聚合函数 from 表名
where  条件  ;对表中所有数据进行过滤
group by 列名
having  子句;对分组后的数据进行过滤
order by 列名/别名/聚合函数  asc /desc
98、也可以和多字段分组结合
  格式2:
select 字段1,字段2...,列名/聚合函数 from 表名
where  条件  ;对表中所有数据进行过滤
group by 字段1,字段2...
having  子句;对分组后的数据进行过滤
order by 列名/别名/聚合函数  asc /desc

列出至少有一个员工的部门编号,名称,并统计这些部门的平均工资,最高工资,最低工资
select d.dname,d.deptno,round(avg(e.sal),2), max(e.sal),min(e.sal)
  from dept d ,emp e
  where d.deptno=e.deptno(+)
  group by d.dname,d.deptno
  having count(e.empno)>1

分析:首先执行where条件,对表中所有的数据进行过滤,然后执行group by,根据某一组对余下的数据进行分组,之后使用having子句对分组后的数据再次进行过滤。最后使用order by 进行排序
   having子句中经常跟聚合函数结合使用

99、案例:显示非销售人员的工作名称以及从事同一工作的员工的月工资总和,并且要满足从事同一工作的员工的月工资总和大于5000,输出结果按月工资总和升序排列
  select  distinst job ,sum(sal)  月工资总和 from emp
where job<>'clerk'
group by job
having sum(sal)>5000
order by 月工资总和

100、from子句中子查询
要求查出每个部门编号,名称,地址,部门人数,平均工资
select d.deptno,d.dname,temp.count,temp.avg
from dept d,(select deptno dno,count(sal) count,round(avg(sal),2) avg 
from emp
group by deptno) temp
where d.deptno=temp.dno(+)

思想:把聚合函数和列值分开查询先查询聚合函数,对查询的结果起别名,最后查询列值,temp表可以看成一个临时表,temp是临时表的别名
案例、查询出所有在销售部门sales的员工的编号,姓名,职位,奖金,基本工资,入职日期,部门最高工资,部门最低工资
  select e.empno,e.ename,e.sal,e.comm,e.job,e.hiredate,
temp.max,temp.min
from emp e,(select deptno dno,max(sal) max,min(sal) min from emp group by deptno) temp
where e.deptno=(select deptno from dept where dname ='SALES')
and e.deptno=temp.dno


思想:把聚合函数和列值分开查询先查询聚合函数,对查询的结果起别名,最后查询列值,temp表可以看成一个临时表,temp是临时表的别名
案例、查询出所有薪资高于公司平均薪资的员工编号,姓名,职位,入职日期,所在部门名称,地址,、上级领导姓名公司的工资等级,部门人数,平均工资,平均服务年限
    select e.empno,e.ename,e.hiredate,d.dname,d.loc,m.ename,s.grade,temp.count,temp.avg,temp.avgyear
from emp e,dept d,salgrade s,emp m,(select deptno dno ,count(empno) count, round(avg(sal),2) avg,
round(avg(months_between(sysdate,hiredate)/12),2) avgyear from emp group by deptno) temp
where e.sal > (select avg(sal) from emp)
and e.deptno=d.deptno and e.sal between s.losal and s.hisal
and e.deptno=temp.dno and e.mgr=m.empno(+)

101、select子句查询和from子句查询:
from子句是把聚合函数放到from中 
select 子句是把聚合函数放到select语句里面

102、with子句
   使用with子句将emp表中的数据定义为临时表
   with e as(select * from emp) select * from e;
103、查询中每个部门的编号,名称,地址,人数,平均工资
 with e as(select deptno dno,count(empno) count, round(avg(sal),2) avg
from emp
group by deptno)
select d.deptno,d.dname,d.loc,e.count,e.avg
from e,dept d
where d.deptno=e.dno(+)
104、每个部门工资最高的员工编号,姓名,职位,入职日期,工资,部门编号,部门名称,按照部门编号升序
   with x as(select deptno dno,max(sal) max from emp group by deptno)
select e.empno,e.ename,e.job,e.hiredate,e.sal,d.dname,d.deptno
from x,emp e,dept d
where e.deptno=x.dno
and x.max=e.sal
and d.deptno=x.dno
order by d.deptno
105、约束
  设计表的时候,提前添加一些限制(条件),只有满足这些条件的数据可以插入到表中,这些限制(条件)就是约束,只能满足这些约束的数据可以真正保存到表中
  1.主键约束
2.唯一约束
3.检查约束
4.默认值约束
5.外键约束
6.非空约束
106、主键约束
被主键约束修饰的列,该列的列值必须非空而且唯一,通过主键约束来避免表的数据出现冗余(重复的数据)
1.一个表中只能有一个主键(约束)
2.使用主键修饰一个列或者多个列的组合值,修饰多个列的组合值,称为联合主键或者复合主键
106、创建表的时候指定主键名字
   create table worker2( 
   id number(4) constraint pk_w2_id  primary key,
name varchar2(50)
)
107、创建表的时候设置联合主键
  create table worker3(
id number(4),
name varchar2(50),
age number(3),
address varchar2(50),
constraint pk_w3_id_name
                primary key(id,name)
)

108、修改表的时候设置主键约束
alter table  表名
add constraint 约束名
primary key(列名1,列名2...)

109、删除主键
只能用来删除主键
格式:
alter table 表名 drop primary key

可以删除大部分约束
格式:
alter table 表名 drop constraint 约束名
110、唯一约束
用来指定一个列或者多个列的组合值具有唯一性,防止在该列中输入重复的列值,一张表中可以有多个唯一约束
1.使用唯一约束修饰的列,该列的列值可以为空值
2.不能使用唯一约束修饰主键所在的列。
111、修改表的时候设置唯一约束
格式:
alter table 表名 
add constraint 约束名
unique(列名1,列名2,列名3...)


112、主键约束和唯一约束的区别
    1.一张表中只有一个主键约束,但是可以有多个唯一约束
2.主键约束修饰的列,该列的列值必须不能为null,而被唯一约束修饰的列,该列列值可以为null
113、删除唯一约束
  alter table 表名
drop constraint 约束名

114、检查约束
用于限定某列的值必须要满足什么条件,只有满足特定条件的数据才可以插入进去,避免用户输入一些非法的数据
1、创建表的时候设置检查约束
create table worker10(
id number(4) primary key,
name varchar2(50) unique,
sex char(2) check(sex in('男','女')),
age number(3),
email varchar2(50)
)

2、修改表的时候指定检查约束
格式:
alter table 表名
add constraint 约束名 check(约束名)

115、删除检查约束
格式:
alter table 表名
drop  constraint    约束名

116、默认值约束
系统默认为列设置的数值,如果在执行insert语句中,该列没有插入列值,使用默认值作为该列的列值,而且每一个列只能设置一个默认值。

117、创建表时候设置默认值约束
create table worker14(
id number(4) primary key,
name varchar2(50),
age number(3) default 20,
salary number(7,2) default 5000
)

118、修改表时候设置默认值
alter table 表名
modify 列名 数据类型
default 默认值

119、删除默认值:
--使用modify 把默认值设置为null

alter table 表名
modify 列名 数据类型
default null

120、非空约束
   该列的列值不能为空(null)

121、创建表的时候设置非空约束

create table worker15(
id number(4) primary key,
name varchar2(50) not null unique,
age number(3),
address varchar2(50)
)

122、修改表的时候设置非空约束
使用modify,可以设置多个列的非空约束
alter table 表名
modify(列名1 not null)
modify(列名2 not null)
....
modify(列名n not null)

123、删除非空约束
使用modify,可以删除多个列的非空约束
alter table  表名
modify(列名1 null)
modify(列名2  null)
……
modify(列名n  null)

124、外键约束
用于维护两张表之间的关联关系,被外键约束所修饰的列该列的列值必须跟与之关联另外一张表中,主键所在的列的列值对应
子表:外键所在的表,称为子表
父表/主表:没有外键的表,称为父表。
当执行插入操作的时候,要先往主表中插入数据,然后在往子表中插入数据
外键的作用就是维护两张表之间的关联的关系,外键所修饰的列值,必须参照与之关联的主表中主键所在的列的列值

125、序列
序列是oracle中的一个数据库对象,通过序列可以生成自动增长的数字,经常使用序列生成的数字作为主键所在列的列值
创建序列的格式
create   sequence  序列名
126、nextval:第一次使用nextval返回是默认值(如果不设置默认值,默认情况返回是1),之后每次调用nextval都生成一个自增的数字
  select id_seq1.nextval from dual

  currval:获得序列当前的值
select id_seq3.currval from dual
127、序列的初始值
start with 初值
第一次使用nextval的时候,返回的就是初值
增长的步长(每次使用nextval,生成数据的增量,默认步长是1       increment by 增量

序列最大值 :   maxvalue 最大值
序列最小值:   minvalue 最小值

create sequence id_seq4
start with 100
increment by 10
minvalue 1
maxvalue 100000000

128、索引
索引是建立在表中列上的数据库对象,用于提高数据查询的速度,而且索引一旦被创建以后就会被oracle系统指定进行维护,在查询语句中不需要指定使用的是哪一个索引
create table worker12(
id number(4) primary key,
name varchar2(50) unique
)

1)一种提高查询效率的机制,提高索引可以最大化提高查询的速度
2)主键所修饰的列,系统会默认添加一个索引。
3)使用唯一约束修饰的列,系统会默认添加一个索引

129、索引的创建
格式
create  index  索引名名称
on  表名(列名)

删除索引
drop  index索引名称

130、索引的优点和缺点
     优点:提高查询速度
     缺点:
1.索引会占用磁盘空间
2.索引会提高查询数据的速度,但是减缓了对数据的修改(insert ,update,delete)速度

131、事物
把对表的一系列操作封装到一个事务中,要么一起成功,要么一起失败
commit:提交事物,执行commit把之前对表中所有的操作,真实发生修改,在数据库底层真正修改数据。
rollback:回退(回滚)之前所有未提交(commit)的操作。撤销之前没有提交修改的操作(insert。update,delete)

132、关联查询
所需要查询的数据来源于多张表,通过关联查询,在同一条SQL语句查询多张表的信息
格式
select  别名1.*/列名,别名2.*/列名...
from 表1 别名1,表2 别名2
where 关联条件

笛卡尔积:在关联查询中,如果没有加入关联条件,两张表中数据会进行任意的组合,这种现象称为笛卡尔积。笛卡尔积是数学中的一个概念在关联查询中,必须要避免出现笛卡尔积。
关联条件:必须先查看两张表之间的关联关系,然后在编写关联条件

133、内连接;只查询两张表中有关系的数据,不查询没有关联关系的数据。之前写的所有的关联查询都属于内连接
1.等值连接:关联条件中是以=进行连接,称为等值连接。
2.非等值连接:关联条件不是以=连接,称为非等值连接
自连接:把一张表看成两张表,自己跟自己进行连接

另外一种内连接(很少见)
格式
select 别名1.*/列名,别名2.*/列名
from 表名1 别名1 inner join 表名2 别名2
on 关联条件
where 条件

134、使用Oracle的专用语法实现外连接
外连接:既要查询两张表中有关联关系的数据,还要查询没有关联关系的数据。
在Oracle中可以在关联条件中加入(+)来实现外连接操作

oracle外连接专用语法只能应用oracle数据库,不能应用于其它的数据库
oracle外连接是在对方的关联条件后面加上(+)

135、标准SQL外连接查询(重点):使用标准SQL语句 实现外连接查询操作,可以匹配任意的数据库
左外连接查询:以左表为主,查询左表中所有的数据,以及与之关联的右表中的数据
格式:
select 别名1.*/列名,别名2.*/列名
from 左表 别名1  left(outer)join 右表 别名2
on 关联条件
where 条件

右外连接查询:以右表为主,查询右表中所有的数据,以及与之有关联的左表中的数据
格式:
select 别名1.*/列名,别名2.*/别名
from 左表 别名1 right(outer) join 右表 别名2
on 关联条件
where 条件

全外连接:连接与之关联的所有表中所有的数据
格式:
select 别名1.*/列名,别名2.*/列名
from 表1 别名1    full (outer) join 表2 别名2
on 关联条件
where 条件

136、交叉连接cross join
格式:
select 别名1.*/列名,别名2.*/列名
from 表1 别名1    cross join 表2 别名2
where 条件

交叉连接作用于两个关系上,并且第一个关系的每个元组与第二个关系的所有元组进行连接这样的操作形式与笛卡尔积是完全相同的

137、自然连接  natural join
运算作用于两个关系最终会通过两个关系产生一个关系作为结果,自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对
格式:
select 别名1.*/列名,别名2.*/列名
from 表1 别名1    natural join 表2 别名2
where 条件

select * from emp natural join dept
自然连接自动匹配关联数据消除笛卡尔积是内连接的方式

138、Using子句
格式:
select 别名1.*/列名,别名2.*/列名
from 表1 别名1   join 表2 Using(关联列名称)
where 条件

select *  from  emp join dept using(deptno) 
using不使用关联字段也可以消除笛卡尔积

139、on子句
在SQL:1999语法中由用户手工设置关联条件
格式:
select 别名1.*/列名,别名2.*/列名
from 表1 别名1     join 表2 on(关联条件)
where 条件

select * from emp  e join salgrade s  on(e.sal between s.losal and s.hisal)

140、日期函数
主要用于处理date类型的数据
常见的日期格式
年月日;yyy-mm-dd
(y:年份    m:月份  d:几号)
年月日时分秒;yyy-mm-dd  hh24:mi:ss
hh24: 24小时制,小时
mi: 分钟
s:  秒钟

系统默认的日期格式
dd-mon月-yy
eg:11-11月-11   2011-11-11  

sysdate:指代当前的系统时间
select sysdate from dual


修改日期时间格式
先输入alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
然后输入select sysdate from dual;

141、to_char()函数:把date类型的数据转换为char类型数据进行显示
   to_char(date数据,'日期格式')
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mm:ss') from dual

142、
to_char()函数中主要转变数字:
9   显示  一位数字
,   显示    千位符
.       显示  小数点
0       显示  前导0
L   根据语言环境,自动选择货币
$   显示      美元符号

select to_char(9568436.635,'000,000,000,000.000000') from dual

select  to_char(9568436.635,'L999,999,999.999')  显示货币,
to_char(9568436.635,'$999,999,999.999')  显示美元
from dual;

143、months_between(d1,d2):两个日期d1和d2之间间隔了多少个月
select empno,enmae,job,sal,hiredate,
months_between(sysdate,hiredate)
from  emp

add_moths(d1,数字):d1之后数字个月
案例3个月后的今天
select sysdate,add_months(sysdate,3) from dual
数字为负数表示之前
144、下一个指定日期
next_day(日期,星期数)

求出指定日期当月的最后一天
last_day(日期)

145、时间日期分割,或计算给定两个日期的间隔
extract(格式from数据)
select
   extract(year from systimestamp)years ,
  extract(month from systimestamp)months ,
  extract(day from systimestamp)days,
  extract(hour from systimestamp)hours ,
  extract(minute from systimestamp)minutes,
   extract(second from systimestamp)seconds
  from dual;

146、将字符串转变为时间戳  to__timestamp()
select to_timestamp('2015-12-10  12:25:30','yyyy-mm-dd hh24:mi:ss')
from dual

147、将制定数据类型转变为数字型            to_number(列/字符串)
select to_number('10')*to_number('21')
from  dual;

148、to_date()函数:把char类型数据转换为date类型的数据,经常用于跟insert语句结合使用
to_date('日期格式字符串','日期格式')

149、使用默认的日期格式插入数据
insert into emp(empno,ename,hiredate) values(6911,'孙权','21-12月-16')

150、视图
1)视图是一张虚拟表,通过视图查看一张或者多张表中的数据。
2) 视图中不存储任何物理数据,视图是查看数据的窗口。所以删除一个视图,对表中的数据没有任何影响。
3) 视图中的数据都是来源于表,是在视图被使用的动态生成的。
通过视图可以集中,简化,定义数据的显示,用户可以通过视图来访问表中的数据,而不需要直接查询表。

151、创建视图的格式
create view 视图名as 查询语句

案例:查询emp表中所有的数据,查询结果作为视图emp_view1
create view emp_view1 as select * from emp

152、修改视图的格式
create or replace view 视图名称 as 查询语句

例:查询emp表中工资高于1000所有员工的编号,姓名,职位,工资,查询结果修改视图emp_view1
create or replace view emp_view1 as  select empno,ename,job,sal from emp
where sal > 1000

153、通过视图修改(insert ,update,delete)表中数据
create view dept_view3 as select * from dept
154、通过视图插入语句
insert into dept_view3 values(70,'财务','杭州')
155、通过视图修改语句
 update dept_view3 set loc = '苏州'
where dname = '测试'

通过视图删除语句
delete from dept_view3 
where deptno in(50,60,70)

156、只读视图:只能通过该类视图查看表中的数据,不能通过视图修改表中的数据
格式:
create view 视图名称 as
查询语句
with read only

157、删除视图
格式:drop view 视图名称

drop view emp_view1

158、根据旧表创建新表
create table 新表 as select * from 旧表

159、oracle数据库默认端口号:1521
MySQL默认端口号:3306
SQL Server默认端口号:1433
Https默认 端口:443
HTTP默认端口:80
FTP默认端口:21
SOCKS代理协议服务器常用端口号:1080
Telnet(远程登录)协议代理服务器常用端口:23
TOMCAT默认的端口号:8080
ORACLE EMCTL默认的端口号:1158
   MS SQL*SERVER数据库monitor:1434
QQ默认的端口号:1080
Oracle XDB FTP服务,默认的端口号:2100
Oracle XDB( XML 数据库),默认的端口号:8080
WebLogic,默认的端口号:7001
Webshpere应用程序,默认的端口号:9080
JBOSS,默认的端口号:8080
webshpere管理工具,默认的端口号:9090
DB2  默认端口号为:5000
PostgreSQL默认端口号为:5432
200 - 请求成功
    301 - 资源(网页等)被永久转移到其它URL
    404 - 请求的资源(网页等)不存在
    500 - 内部服务器错误

select e.empno 员工编号,e.ename 员工姓名,
to_char(e.hiredate,'yyyy-mm-dd') 入职日期,e.job 工作,m.ename 领导姓名,
e.sal 月工资,(e.sal+ nvl(e.comm,0))*12 年薪,s.grade 工资等级,d.deptno  部门编号,
d.loc 地址,d.dname 部门名称 
from emp e,dept d,salgrade s,emp m
where d.deptno=e.deptno and e.mgr=m.empno 
and e.sal between s.losal and s.hisal and 
e.sal between 1500 and 3500 
and to_char(e.hiredate,'yyyy')= '1981'
order by 年薪 desc, 工作 desc

160、集合运算
   集合运算时一种二目运算符,包括交,差,并,笛卡尔积

union all(并集)
返回若干个查询结果全部内容,重复的元组也会显示
select * from dept
union all
select * from dept where deptno=10;
结果为5条数据(有1条重复)

union(并集)
返回若干个查询结果全部内容,重复的元组不会显示
select * from dept
union
select * from dept where deptno=10;
结果4条数据


intersect(交集)
返回若干个查询结果相同中的部分
select * from dept
intersect
select * from dept where deptno=10;
结果为1条数据

minus(差集)
返回若干个查询结果中不同的部分
select * from dept
minus
select * from dept where deptno=10
结果为3条数据


161、分析函数
函数名称([参数])over(
partition by  子句  字段,..
Order by 子句 字段,…[asc | desc] [nulls first | nulls last]
windowing子句);

函数名称: 类似于count(),sun()等
over子句: 为分析函数指明一个查询结果集,此语句 在select中使用
partition by  子句: 将一个简单的结果分为N组(或者分区),而后按照不同的组对数据进行统计
order by子句: 明确指明数据在每个组中的排列顺序,分析函数的结果与顺序无关
nulls first | nulls last:  表示返回数据行中包含null值出现在排列序列的前还是尾
windowing子句(代名词): 给出在定义变化固定的数据窗口方法,分析函数将对此数据进行操作


1、desc v$controlfile
查看控制文件

select file#,status,name from v$controlfile;
查看控制文件状态路径

2、desc v$datafile
查看数据文件

 select file#,status,name from v$datafile;
查看数据文件状态路径

3、desc v$logfile
查看日志文件

 select member from v$logfile;
查看日志文件状态路径

4、设置命令行不输出字符不退出

set sqlblanklines on

5、select * from emp where empno=#定义变量输出

6、list(简写l)查看缓冲区的命令,然后输出对应的行号会执行对应的语句

7、change(简写C)  C/n/m  表示用m替换n      /执行缓冲区的文

8、删除缓冲区的文件  del 2删除第二行         del 5 8第五行到第八行

9、追加缓冲区文件  a  语句

10、save 地址    保存语句

11、获取文件的内容  get 地址


12、引用记事本编辑缓冲取  edit

13、col 字段 heading "编号"   对字段设置标签

14、intersect返回共有的字段值
    select * from emp
     insersect
      select * from dept


15、insert into emp(id,name) select id,name from d;

     把查到的数据插入到emp表中


16、col dname format a10 格式化输出

  

猜你喜欢

转载自www.cnblogs.com/hopelv/p/10003623.html