1. 程式人生 > >oracle資料庫基本語法整理

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 格式化輸出