初級Oracle和SQL學習者的學習筆記。韓順平-玩轉oracle。

我本身就是一個oracle和sql的初學者,前段時間看了韓順平老師的oracle視頻教程,以爲很深刻淺出,收穫了不少。同時本身也作了很多筆記,如今想將紙質筆記以本身的話總結出來。俗話說得好:教學老是相得益彰,在總結的過程當中想必會加深本身的印象,可以鞏固本身的學習過程。sql

 

 

oracle 用戶部分:數據庫

建立用戶:create user user_name identified by user_password;session

此時用戶並無鏈接數據庫的權限。須要給其賦予鏈接權限oracle

賦予權限:權限分爲對象權限和系統權限。ide

grant [select|updat|all] on table_name to user_name;--對象權限函數

                grant connect to user_name with admin option; --系統權限工具

with admin option 表示這個user能夠將此權限繼續下發 學習

收回權限: revoke  Quanxian on table_name from user_name;spa

鏈接數據庫:conn user_name/user_password;日誌

profile文件,能夠限制某些用戶的行爲,如登陸嘗試次數,密碼輸入錯誤次數等。

建立profile 文件: create profile profile_name limit failed_login_attempts m password_lock time n;

應用給某用戶:alter user user_name profile profile_name;

 

在初次創建oracle數據庫實例的時候,默認建立了幾個用戶,可是隻有幾個用戶沒有上鎖,給某個用戶解鎖的步驟以下:

首先要以sysdba的用戶登陸oracle數據庫,須要打開sqlplus這個oracle安裝自帶的工具

cmd or terminal 下: sqlplus / as sysdba;

解鎖用戶:alter user user_name account unlock;

更改用戶密碼: alter user user_name identified by  password;

 

這裏,幾個經常使用的用戶的系統默認密碼總結以下: 

scott:tiger

system:manager

sys:change_on_install

sysdba 不須要密碼登陸。

幾個用戶的權限具體如何等我總結到後面再補上,韓順平老師這裏講的有點分散。

 

繼續用戶管理。

 

設置口令歷史:修改密碼時不能使用之前使用的密碼

password_reuse_time n;--n 天后才能重用密碼 

按期修改密碼:

create profile profile_name limit password_life_time m pasword_grace_time n;

m天修改一次密碼,寬限期n天。  

 

sql語句中的幾種數據類型:

char(n) :定長字符串,最長2000,查詢速度快

varchar2(n):變長字符串,最長4000,節省空間

clob(character large object) :字符型大對象,最大4G

number(m,n):m位有效數,其中n位小數

number(m) :m位整數

date:日期類型 年月日時分秒

timestamp:更精確

blob:圖片類型,二進制數據 可存放圖片,聲音,最大4G(韓老師當時用的是9i,我用了個64位的12c版本,估計能支持最大8G的吧。。本身猜的)

 

顯示錶結構:desc table_name;

增長字段:alter table table_name add (colum_name,colum_type);\

修改字段: alter table table_name modify (colum_name,colum_type);

刪除字段:alter table table_name  drop colum colum_name;

刪除表:drop table table_name;

date格式'日-月-年'

insert into table_name values(每一個字段的值,若是有非數字的字段值,須要用單引號對''括起來)

alter session set nls_date_format 'yyyy-mm-dd';

【注意】這個改的效果是臨時生效的。 

插入空值NULL(該字段容許爲空才行)

查詢空值:select xxx from xxx where colum_name is [NULL|NOT NULL]; 

更改表內容:update table_name set colum_name='xxx' where yyy;

刪除數據:delete from table_name;--刪除數據,表的結構還在,可恢復,刪除速度略慢
truncate table table_name;刪除表中全部的數據,表結構還在,可是因爲不寫日誌,沒法找回刪除記錄,好處是刪除速度快。  

恢復數據:

save point point_name;--建立恢復點

delete from table_name;

rollback to point_name;--恢復

刪除表結構和數據:drop table table_name;--刪除表的結構和數據

commit提交事物,提交後保存點會失效,要注意。 

 

打開顯示操做時間開關:set timming on;

 

nvl函數處理NULL值的狀況:nvl(字段名,值),若是字段自己值爲NULL,則改變其新值爲逗號後面的那個,若是不是NULL,不作任何事。 


where 語句後面的like關鍵字用於查找並匹配符合條件的字段:

%表示零到多個字符

下劃線_ 表示任意單個字

 

in關鍵字表示從一個範圍內選取

 

order by語句默認升序(ASC),若是想降序排列,能夠這樣:

select *** from table_name where xxx order by colum_name desc; 

別名排序 select sss as xx from xxx之類的

 

數據分組函數:max,min,avg,sum,count

 

子查詢:嵌入在其餘sql語句中的select語句,也叫作嵌套查詢。

 

分組查詢:

 

group by | having

 

group by 用於對查詢結果的分組統計 having用於限制分組顯示的結果 

select xxx,yyy from table_name where zzz group by xxx having (yyy的一些限制條件); 

 

注意:分組查詢的字段必須在查詢的字段中出現,否則查詢失敗。 

分組函數只能出如今選擇列表,having,order by子句中

若是select語句中同時包含group by,having,order by那麼順序是group by-having-order by

在選擇列表中若是有列,表達式和分組函數,那麼這些列和表達式必須有一個出如今group by子句中,否則出錯。 

 

多表查詢:以oracle自帶的emp表和dept表結構爲例

SQL> select * from emp;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980/12/17    1288.41               20
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.16    300.00     30
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00    400.00     30
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00    200.00     30
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
12 rows selected

 

SQL> select * from dept;
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

 

能夠看到兩個表共同的字段爲deptno;

 

所以在查詢中能夠以這個爲鏈接橋樑

 

好比我要查詢分別位於兩個表的ename,和loc,能夠以下寫。

 

SQL> select a.deptno,a.loc,b.deptno,b.ename from dept a,emp b where a.deptno=b.deptno;
DEPTNO LOC           DEPTNO ENAME
------ ------------- ------ ----------
    10 NEW YORK          10 KING
    10 NEW YORK          10 CLARK
    10 NEW YORK          10 MILLER
    20 DALLAS            20 FORD
    20 DALLAS            20 SMITH
    20 DALLAS            20 JONES
    30 CHICAGO           30 JAMES
    30 CHICAGO           30 TURNER
    30 CHICAGO           30 MARTIN
    30 CHICAGO           30 WARD
    30 CHICAGO           30 ALLEN
    30 CHICAGO           30 BLAKE
12 rows selected

 

在查詢過程當中須要將選出來的表重命名,並用點符號選出相應的字段,如上所示。

 

分頁查詢: 

採用rownum分頁

第一步:oracle自帶的rownum函數將每行查詢出來的結果編號,以下:

SQL> select a1.* ,rownum rn from (select * from emp) a1;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO         RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
 7369 SMITH      CLERK      7902 1980/12/17    1288.41               20           1
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.16    300.00     30            2
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30           3
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20                 4
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00    400.00     30          5
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00    200.00     30            6
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10                7
 7839 KING       PRESIDENT       1981/11/17    5000.00               10                   8
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30             9
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30                   10
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20                 11
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10                  12
12 rows selected

 

第二步:選取rownum<=10的列,以上次選取的結果做爲結果。

 

SQL> select * from (select a1.* ,rownum rn from (select * from emp) a1) where rownum <=10; 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO         RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
 7369 SMITH      CLERK      7902 1980/12/17    1288.41               20          1
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.16    300.00     30          2
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30          3
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20          4
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00    400.00     30          5
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00    200.00     30          6
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10          7
 7839 KING       PRESIDENT       1981/11/17    5000.00               10          8
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30          9
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30         10
10 rows selected

 

第三步,選取>=6的列,繼續以上一次選取的爲結果進行查詢。

select * from (select * from (select a1.* ,rownum rn from (select * from emp) a1) where rownum <=10) where rn>=6;


EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO         RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00    200.00     30          6
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10          7
 7839 KING       PRESIDENT       1981/11/17    5000.00               10          8
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30          9
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30         10


這樣就選取了6-10的分頁結果。

 

注意事項:全部的改動,只須要改變最裏面那層select語句便可,即改變

select  * from emp這個語句,外面兩層select 語句是爲了完成分頁功能而已。

 

合併查詢:將多個select語句的查詢結果進行相關操做,相似於集合的求交集,並集,差集之類的。

老師講的比較少,這裏就先不寫。

 

查詢結果建立表:

create table table_name(colum_name1 colum_type1,colum_name2 colum_type2...)

as select colum1,colum2,...colum_n from table_name2;


JAVA鏈接oracle數據庫:

Class.forName( "oracle.jdbc.driver.OracleDriver" ); 

Connection cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );

相關文章
相關標籤/搜索