1. 程式人生 > >Oracle (01)Oracle資料庫的安裝步驟.搭建上課所用的資料庫環境.table (二維表).查看錶結構.資料庫中常用的資料型別

Oracle (01)Oracle資料庫的安裝步驟.搭建上課所用的資料庫環境.table (二維表).查看錶結構.資料庫中常用的資料型別

Oracle 01

目錄
Oracle資料庫的安裝步驟
搭建上課所用的資料庫環境
table (二維表) *****
查看錶結構 *****
資料庫中常用的資料型別 *****
SQL語句 *****
where子句 *****
對於null值 如何進行判斷 *****
模糊查詢 ***

儲存資料

學員管理系統:

記憶體: 存取的速度很快   資料較容易丟失   貴

檔案:    便宜 ,  可以永久儲存!   儲存速度 特別慢


**資料庫:**  

        它不屬於記憶體和檔案之外的儲存方式, 它只是資料儲存時,  記憶體與檔案結合使用的一種解決方案 !

主流資料庫

Oracle: 企業級 大型資料庫 甲骨文公司

oracle9i    oracle10g   oracle11g   oracle12c

mysql: 小型資料庫 開源免費

db2 : IBM資料庫

SqlServer: 微軟資料庫

Oracle資料庫的安裝步驟

建議: 沒事就多裝兩遍 ~

目前騰訊電腦管家 與 360 會禁止oracle伺服器的開機自啟動!

前置條件
1. 下載安裝包
2. 解壓到任意目錄
3. 關閉防火牆和防毒軟體

安裝步驟:

1.  開啟解壓後的資料夾, 點選setup.exe
2.  繼續點選下一步 
3.  選擇軟體安裝的目錄
4.  輸入資料庫口令(密碼) 
5.  下一步 , 開始安裝 !

如果在後續的流程中出現了錯誤 , 請解除安裝重灌 !

解除安裝步驟:

1.  開啟控制面板 或 其他的軟體管理工具 

2.  選擇程式, 尋找到oracle database11g

3.  將其解除安裝

驗證資料庫是否安裝成功

  1. 通過執行(win+r)輸入cmd命令 , 開啟dos命令視窗

  2. 輸入sqlplus 資料庫賬號/資料庫密碼:
    sqlplus system/123456

  3. 如果出現了sql>頁面 , 表示安裝且登入成功 .

搭建上課所用的資料庫環境

  1. 因為oracle在安裝時, 會自動根據當前系統的編碼格式 設定為中文編碼

    修改為 支援我們上課指令碼的 英文環境
    新增系統環境變數

    變數名:NLS_LANG
    變數值:american_america.AL32UTF8
    

    執行完畢 第三步後, 可以將第一步的環境變數刪除掉, 更改回中文環境了!

    變數名:temp_NLS_LANG
    變數值:american_america.AL32UTF8
    
  2. 匯入指令碼

    在sql>
    輸入@路徑/指令碼名稱

    例如: SQL> @C:\Users\j\Desktop\課件\oracle\script\summit2_drop.sql

  3. 檢視指令碼是否匯入成功

    在sql>輸入: desc s_emp;

    能出現如下結構: 表示環境搭建完畢!

        Name                                      Null?    Type
         ID                                        NOT NULL NUMBER(7)
         LAST_NAME                                 NOT NULL VARCHAR2(25)
         FIRST_NAME                                         VARCHAR2(25)
         USERID                                             VARCHAR2(8)
         START_DATE                                         DATE
         COMMENTS                                           VARCHAR2(255)
         MANAGER_ID                                         NUMBER(7)
         TITLE                                              VARCHAR2(25)
         DEPT_ID                                            NUMBER(7)
         SALARY                                             NUMBER(11,2)
         COMMISSION_PCT                                     NUMBER(4,2)

使用windows指令碼 快速進入sql>頁面

我們每一次 進入資料庫, 都需要開啟dos視窗, 在輸入sqlplus命令. 很麻煩

在windows這個系統中, 是支援bat指令碼執行的 , 編寫一個指令碼, 來快速的進入dos命令列, 並自動輸入sqlplus指令

編寫步驟:

  1. 新建檔案 : xxx.bat
  2. 輸入內容 : sqlplus system/123456
  3. 儲存關閉, 雙擊開啟

**RDB ***

關係型資料庫

**RDBMS ***

關係型資料庫管理系統 , 使用二維表進行資料的儲存 !

DBA

資料庫管理員

**table (二維表) *******

由行和列組成的表格, 我們稱其為二維表

擁有以下五個元素:

  1. 表頭: 描述了欄位名稱
  2. 一行: 一行表示一條資料
  3. 一列: 表示一條資料中的一部分
  4. 欄位名: 描述在此表格中的當前列的資料的 含義
  5. 欄位值: 描述的是當前列 的值 !

如何通過dos命令列訪問資料庫:

  1. 訪問本機資料庫

    dos命令列下輸入: sqlplus 帳號/密碼

  2. 訪問其他計算機的資料庫(本機需支援sqlplus命令)
    dos命令列下輸入: sqlplus 帳號/密碼@ip地址;

    也可以下載軟體來連線 , 也可以自己編寫軟體來連線

常用的資料庫命令:

清除螢幕:

host cls

有時列顯示過寬 ,調整:

col 列名 for a長度;

不可設定數字列的寬度 ,  並且設定只針對當前dos顯示的效果有效 , 不會影響資料

**查看錶結構 *******

desc 表名;

例如: desc s_emp;

員工表: s_emp

員工表表結構: 熟悉掌握, 因為後期大多的課程, 是基於這個表格的 !

Name(列欄位名稱)            Null?(列資料可以為空?)    Type(列資料的型別)
 ----------------------------------------- -------- -----------------------

 ID(員工編號)                NOT NULL                   NUMBER(7)   |number表示資料型別,(7):表示儲存的位數長度
 LAST_NAME(姓)              NOT NULL                   VARCHAR2(25)
 FIRST_NAME(名)                                        VARCHAR2(25)
 USERID(使用者編號)                                       VARCHAR2(8)
 START_DATE(入職日期)                                   DATE
 COMMENTS(備註)                                         VARCHAR2(255)
 MANAGER_ID(他領導的員工編號)                             NUMBER(7)
 TITLE(職位)                                            VARCHAR2(25)
 DEPT_ID(部門編號)                                      NUMBER(7)
 SALARY(月薪)                                           NUMBER(11,2)|number表示資料型別,(11):表示儲存的位數長度 2表示的小數點後的位數
 COMMISSION_PCT(獎金)                                  NUMBER(4,2)

not null 表示不可為空 , null ? 下不出現任何的字元, 則表示允許為空

**資料庫中常用的資料型別 *******

  1. number: 數字型別, 類似Java中的double

  2. varchar2: 變長字串型別

    varchar2 與 char(定長字串) 型別的區別:

    varchar2在宣告長度後, 如果儲存不滿, 則自動縮小長度 ! 
    char宣告長度後, 如果儲存不滿, 會使用空格補足!
    
  3. date: 日期型別

**SQL語句 *******

結構化查詢語言 大多數的資料庫 , 操作上基本上都一致 !

**SQL語句的五種分類: *******

DQL(Data query language): 資料查詢語句 (SELECT)

DML(data manipulation language):資料操作語句

DDL(data define language):資料定義語句    

TCL(transaction control language):事務控制語句

DCL(data control language):資料控制語句

DQL->Select語句

SELECT語句負責 從資料庫中查詢資料

From子句

  1. 如何查詢單個列的值 ***
    格式:select 列名 from 表名;

    案例:查詢員工表格中的員工編號:
    語句:select id from s_emp;

  2. 如何查詢多個列的值 ***
    與查詢單個列的方式基本相同, 多個列之間使用英文逗號隔開 !
    格式:select 列名1,列名2…列名n from 表名;

    案例:查詢員工表格中的員工編號以及對應的月薪:
    語句:select id,salary from s_emp;

    練習:查詢員工表格中的員工編號(id),姓(last_name),名(first_name),月薪(salary):
    語句:select id,last_name,first_name,salary from s_emp;

    設定列顯示的長度:

    col 列名 for a長度; //不能設定數字列
    例如: col last_name for a20;
    例如: col first_name for a20;

  3. 如何查詢一個表中的所有列:*

    • 表示所有(all) , 與查詢單列的方式基本一致, 把列名改為*號即可

    格式:select * from 表名;

    案例:查詢員工表格中的所有員工資訊
    語句:select * from s_emp;

查詢時額外的操作

在查詢資料時, 可以對結果進行運算 , 例如算數運算 ,字串拼接, 直接在列名處進行運算即可!

  1. 算數運算 + - * / 熟悉

    • 案例:計算員工的年薪 (salary16)
      語句:select id,salary
      16 from s_emp;

    • 練習:計算員工的年薪salary16加獎金commission_pct
      語句:select id,salary
      16+salary16commission_pct/100 from s_emp;

**- null值的運算 *****

資料庫中 所有的型別的預設值為 null 

oracle中null值經過運算後, 結果永遠為null

使用nvl函式運算null值:

格式: nvl(引數1,引數2)

關於資料庫中null值的處理, 一定要儘早進行 !

作用: 用來處理null , 如果引數1為null,則返回引數2, 如果引數1不為null則返回引數1.

例如: nvl(commission_pct,0) : 如果員工有提成, 則返回提成 , 如果沒有提成則返回0

-   練習:計算員工的年薪salary*16加獎金commission_pct
    語句:select id,salary*16+salary*16*nvl(commission_pct,0)/100 from s_emp;

-   練習:計算員工的日薪, 按照一月21個工作日計算
    語句:select id,salary/21 from s_emp;

-   練習:計算員工的時薪, 按照一個月21天算, 一天8個小時計算
    語句:select id,salary/21/8 from s_emp;

**列的別名 ****

有時我們在對錶格中資料進行查詢時, 資料的列名出現了變化, 我們需要 一個更見名知意的列名來表示資料 , 可以給資料新增一個別名來顯示!

格式:select 列名1 別名1,列名2 別名2… 列名n 別名n from 表名;

案例:
查詢年薪: select id,last_name,salary*16 y_sal from s_emp;

  • 特殊的別名:
    有時我們在別名中 可能會存在一些特殊字元, 例如空格 !

    那麼這時編寫的語句 會出現錯誤: 因為如下的語法, 就像是在給年薪新增兩個別名
    select salary*16 y sal from s_emp;

    如果要解決這個錯誤, 應讓資料庫清晰的認識到 ,y sal 是一個別名, 那麼通過雙引號將其引住即可!
    此解決方案 又叫別名的原樣顯示:
    之前的 別名無論是否大寫, 在顯示時都展示為大寫, 通過雙引號引住的別名, 會原樣顯示(大小寫敏感)

    例如:select id,last_name,salary*16 “y sal” from s_emp;

**SQL中的字串 ****

  • Oracle中關於大小寫的規則:

    在sql中, 只有字串是大小寫敏感的 !

String text = “你好”;
syso(text); 你好

Java中:
定義形式: 使用雙引號引住: “你好”
表現形式: 表現形式中 引號是不存在的: 你好

Oracle中:
定義形式: 使用英文單引號引住: ‘你好’
表現形式與Java一致:你好

  1. 字串的拼接

    在oracle中 字串拼接符: ||

練習: 查詢員工表格(s_emp)中的員工姓 , n a m e ; s e l e c t l a s t n a m e 名 ,並給這個欄位起別名為name; select last_name||' ’||first_name name from s_emp;

  1. 如何在字串中拼接一個單引號
    字串單引號在oracle中編寫方式為: ‘’’’

    練習: 查詢員工表格中的姓’名:
    語句: select last_name||’’’’||first_name name from s_emp;

資料的排重顯示 熟悉

排重關鍵字: distinct , 在查詢時編寫到欄位的前面加空格即可 !

  • 單欄位排重
    在查詢時, 如果指定排重的單個欄位產生了重複, 則忽略掉此行資料!

    • 查詢員工的薪資
      select salary from s_emp;

    • 查詢員工的薪資, 並對薪資進行排重顯示
      select distinct salary from s_emp;

  • 多欄位排重
    在查詢時, 如果指定的多個欄位出現了重複, 則忽略掉此行資料

    • 查詢員工的薪資 與 領導編號, 並對這兩個資料進行排重操作 !
      select distinct salary,manager_id from s_emp;

錯誤

未選定行: 表示查詢不到資料!

**where子句 *******

對查詢進行條件的新增, 對產生的結果集進行過濾 , 匹配條件的將被查詢到, 不匹配的將不會出現在結果集中!

常用的比較運算子: = != > < >= <=

字串在比較相等時, 一樣使用等號 !

格式: select 列名 from 表名 where 查詢條件;

案例:查詢員工的資訊(id,last_name,salary), 要求id等於10 
語句:select id,last_name,salary from s_emp where id=10;


練習:查詢員工的資訊(id,last_name,salary),要求 id大於10;
語句:select id,last_name,salary from s_emp where id>10;

練習:查詢員工的資訊(id,last_name,salary),要求 領導編號(manager_id)為1;
語句:select id,last_name,salary,manager_id from s_emp where manager_id=1;

練習:查詢員工的資訊(id,last_name,salary),要求月薪在1300以下
select id,last_name,salary from s_emp where salary<1300;

特殊的條件:

極限條件: 永真條件 , 永假條件

永真條件: 
select * from s_emp where 1=1;

永假條件:
select * from s_emp where 1!=1;

對於字串進行比較時, 需要注意的地方:

1.  在oracle資料庫中 字串需要使用單引號 引住 !
2.  在oracle中 字串是大小寫敏感的, 也就是比較時區分大小寫

案例:查詢員工的資訊(id,last_name,salary), 條件: last_name等於Chang
語句:select id,last_name,salary from s_emp where last_name='Chang';

練習: 查詢員工的日薪(salary/21),一個月按21天算, 條件為 last_name為Dancs
語句: select salary/21 from s_emp where last_name='Dancs';

特殊的運算子(關鍵字) (熟練)

between: 表示一個閉區間 (包含開始和結尾)

使用方式:  ... where 欄位 between 初始範圍 and 最大範圍;

案例: 查詢員工的資訊(id,last_name,salary) , 條件為: 工資在800到1000以內的員工
語句: select id,last_name,salary from s_emp where salary between 800 and 1000;

練習:查詢員工的資訊, 要求薪資在 1000-1450之間
語句:select id,last_name,salary from s_emp where salary between 1000 and 1450;

in: 表示從某個取值列表中匹配 !

使用方式: ... where 欄位 in(取值1,取值2,取值3...取值n);

案例: 查詢領導編號(manager_id)為1或2或3的員工的資訊(id,last_name,salary)!
語句: select id,last_name,salary,manager_id from s_emp where manager_id in(1,2,3);

練習:查詢員工的資訊, 要求id為1或2或3或4或5的員工
語句:select id,last_name,salary,manager_id from s_emp where id in(1,2,3,4,5);

**對於null值 如何進行判斷 *******

通過查詢領導編號, 來觀察問題:

1.  查詢所有的領導編號等於1的使用者
    select id from s_emp where manager_id=1;

2.  查詢所有的領導編號不等於1的使用者
    select id from s_emp where manager_id!=1;

上面的兩個案例 ,只查詢到24的結果, 少了id為1的員工 . 我們發現 id為1的員工是沒有領導編號的,也就是說領導編號為null;

上面學習的判斷邏輯符號 , 無法應用在null值上 !

對於null值的判斷, 需要使用 is null 來判斷
格式: … where 欄位 is null;

案例: 查詢領導編號為null的員工:
語句: select id from s_emp where manager_id is null;

練習: 查詢員工表格中 , 沒有獎金(commission_pct)的員工
語句: select id from s_emp where commission_pct is null;

**模糊查詢 *****

  1. 董飛充氣版娃娃

  2. 高帆版模擬會旋轉版

  3. 董飛/高帆 娃娃變臉版

  4. 曉陽養成版

關鍵字: like

使用方式: … where 欄位名 like ‘模糊格式文字’;

文字中可以存在兩種特殊含義的符號(萬用字元):

  1. _ :表示一個任意的文字字元

  2. % :表示0-n個任意的文字字元

  3. 查詢以曉陽開頭的文字:

    … where 欄位名 like ‘曉陽%’;

  4. 查詢包含娃娃的文字
    … where 欄位名 like ‘%娃娃%’;

  5. 查詢倒數第三個字 為 旋 的文字
    … where 欄位名 like ‘%旋__’;

  6. 查詢第二個字元為飛的文字
    … where 欄位名 like ‘_飛%’;

練習:

-   查詢s_emp表格中 last_name中包含a的員工的資訊(id,last_name,salary) , 
    select id,last_name,salary from s_emp where last_name like '%a%';

-   查詢s_emp表格中 last_name中開頭為N的員工的資訊(id,last_name,salary) , 
    select id,last_name,salary from s_emp where last_name like 'N%';

-   查詢s_emp表格中 last_name中第二個字元為o的員工的資訊(id,last_name,salary) , 
    select id,last_name,salary from s_emp where last_name like '_o%';

-   查詢s_emp表格中 last_name中倒數第二個字元為e的員工的資訊(id,last_name,salary) , 
    select id,last_name,salary from s_emp where last_name like '%e_';

疑問:

如果要模糊查詢的文字中包含_怎麼辦?  (瞭解)

例如:  

查詢user_tables表格中 table_name 中以S_開頭的資料 !

select table_name from user_tables where table_name like 'S_%';

使用轉義字元 , escape

select table_name from user_tables where table_name like 'S\_%' escape '\';

邏輯條件連線符

用於連線多個條件

與: and *****

案例:查詢員工的id為6 , 並且 領導編號為2的員工的 資訊 (id,last_name.salary)
語句:select id,last_name,salary from s_emp where id=6 and manager_id=2;


練習:查詢員工的id為3 , 且 工資(salary)為1400的員工的資訊(id,last_name.salary)
select id,last_name,salary from s_emp where id=3 and salary=1400;

或: or *****

練習: 查詢員工的薪資為1400 或者 1450的員工的資訊(id,last_name.salary)
select salary,id,last_name from s_emp where salary=1400 or salary=1450;

非: not *

閉區間的not使用, 得到不屬於閉區間的內容: 
格式: ...where 欄位名稱 not between 最小範圍 and 最大範圍;

    案例: 獲取員工的資訊(id,last_name,salary) ,條件為 薪資不再1000-1300之間的員工

    語句: select id,last_name,salary from s_emp where salary not between 1000 and 1300;

in的使用: 從結果集中忽略 列表中的值 !
格式:where 欄位名稱 not in(值1,值2...值n);

    案例: 獲取員工薪資 不是1400和1450的員工資訊(id,last_name,salary)
    語句: select id,last_name,salary from s_emp where salary not in(1400,1450);

is null的not使用: *** 

格式:where 欄位名稱 is not null   : 取出不為null的資料航      

    案例:獲取員工的資訊, 條件為manager_id不為null!
    語句:select id,last_name,salary from s_emp where manager_id is not null;

**條件的優先順序: ***

練習: 獲取員工的資訊(id,last_name.salary) 條件為: 員工工資小於1000 且部門編號為31或42
語句: select id,last_name,salary from s_emp where salary<1000 and (dept_id=31 or dept_id=42);