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. 將其解除安裝
驗證資料庫是否安裝成功
-
通過執行(win+r)輸入cmd命令 , 開啟dos命令視窗
-
輸入sqlplus 資料庫賬號/資料庫密碼:
sqlplus system/123456 -
如果出現了sql>頁面 , 表示安裝且登入成功 .
搭建上課所用的資料庫環境
-
因為oracle在安裝時, 會自動根據當前系統的編碼格式 設定為中文編碼
修改為 支援我們上課指令碼的 英文環境
新增系統環境變數變數名:NLS_LANG 變數值:american_america.AL32UTF8
執行完畢 第三步後, 可以將第一步的環境變數刪除掉, 更改回中文環境了!
變數名:temp_NLS_LANG 變數值:american_america.AL32UTF8
-
匯入指令碼
在sql>
輸入@路徑/指令碼名稱例如: SQL> @C:\Users\j\Desktop\課件\oracle\script\summit2_drop.sql
-
檢視指令碼是否匯入成功
在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指令
編寫步驟:
- 新建檔案 : xxx.bat
- 輸入內容 : sqlplus system/123456
- 儲存關閉, 雙擊開啟
**RDB ***
關係型資料庫
**RDBMS ***
關係型資料庫管理系統 , 使用二維表進行資料的儲存 !
DBA
資料庫管理員
**table (二維表) *******
由行和列組成的表格, 我們稱其為二維表
擁有以下五個元素:
- 表頭: 描述了欄位名稱
- 一行: 一行表示一條資料
- 一列: 表示一條資料中的一部分
- 欄位名: 描述在此表格中的當前列的資料的 含義
- 欄位值: 描述的是當前列 的值 !
如何通過dos命令列訪問資料庫:
-
訪問本機資料庫
dos命令列下輸入: sqlplus 帳號/密碼
-
訪問其他計算機的資料庫(本機需支援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 ? 下不出現任何的字元, 則表示允許為空
**資料庫中常用的資料型別 *******
-
number: 數字型別, 類似Java中的double
-
varchar2: 變長字串型別
varchar2 與 char(定長字串) 型別的區別:
varchar2在宣告長度後, 如果儲存不滿, 則自動縮小長度 ! char宣告長度後, 如果儲存不滿, 會使用空格補足!
-
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子句
-
如何查詢單個列的值 ***
格式:select 列名 from 表名;案例:查詢員工表格中的員工編號:
語句:select id from s_emp; -
如何查詢多個列的值 ***
與查詢單個列的方式基本相同, 多個列之間使用英文逗號隔開 !
格式: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; -
如何查詢一個表中的所有列:*
- 表示所有(all) , 與查詢單列的方式基本一致, 把列名改為*號即可
格式:select * from 表名;
案例:查詢員工表格中的所有員工資訊
語句:select * from s_emp;
查詢時額外的操作
在查詢資料時, 可以對結果進行運算 , 例如算數運算 ,字串拼接, 直接在列名處進行運算即可!
-
算數運算 + - * / 熟悉
-
案例:計算員工的年薪 (salary16)
語句:select id,salary16 from s_emp; -
練習:計算員工的年薪salary16加獎金commission_pct
語句:select id,salary16+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一致:你好
-
字串的拼接
在oracle中 字串拼接符: ||
練習: 查詢員工表格(s_emp)中的員工姓 ’||first_name name from s_emp;
-
如何在字串中拼接一個單引號
字串單引號在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;
**模糊查詢 *****
-
董飛充氣版娃娃
-
高帆版模擬會旋轉版
-
董飛/高帆 娃娃變臉版
-
曉陽養成版
關鍵字: like
使用方式: … where 欄位名 like ‘模糊格式文字’;
文字中可以存在兩種特殊含義的符號(萬用字元):
-
_ :表示一個任意的文字字元
-
% :表示0-n個任意的文字字元
-
查詢以曉陽開頭的文字:
… where 欄位名 like ‘曉陽%’;
-
查詢包含娃娃的文字
… where 欄位名 like ‘%娃娃%’; -
查詢倒數第三個字 為 旋 的文字
… where 欄位名 like ‘%旋__’; -
查詢第二個字元為飛的文字
… 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);