Oracle(入門一)____Oracle

來源:互聯網
上載者:User

一)oracle概述

(1)瞭解一些關於資料庫的概念
資料:在資料庫領域看來,資料是儲存的基本單位,包含文本,圖片,視頻,音頻
資料庫:就是資料倉儲,儲存資料的地方,特指電腦裝置中的硬碟,以二進位壓縮文本的形式存放
該檔案不能直接操作,必須由各資料庫公司提供的工具方可操作,該檔案的格式是每個資料庫公司內部
定義的,不是統一規則
資料庫物件:在Oracle中,例如:表,視圖,索引,函數,過程,觸發器。。。
關係型資料庫:簡單的說,以行列結構的形式,將資料庫中的資訊表示出來的對象,即二維表
常見流行的關係型資料庫:Oracle&MySQL/Oracle–>DB2/IBM—>SQLServer/Microsoft–>。。。

(2)瞭解oracle11g背景

(3)oracle資料庫伺服器由二部份組成
(A)執行個體:理解為對象,看不見的
(B)資料庫:理解為類,看得見的,E:\app\Administrator\oradata\orcl*.DBF

(4)oracle伺服器與orcl資料庫的關係
一個oracle資料庫伺服器中包括多個資料庫,例如:orcl,orm,oa,bbs,tax,erp等等
在E:\oracleDB\oradata\目錄下,有多少個檔案夾,就有多少個資料庫,例如:orcl檔案夾=orcl資料庫
我們向資料庫中儲存的所有資料庫,最終都會存放在對應庫的*.DBF檔案中,以二進位壓縮形式存放
在oracle伺服器中建立資料庫:參見《在oracle伺服器中建立資料庫.JPG》
注意:我們在安裝oracle時,已經建立好了一個資料庫,預設名叫orcl,除非你當時改了資料庫名字

(5)sqlplus和sqldeveloper,orcl執行個體,orcl資料庫之間的關係
sqlplus是oracle11g內建的一個用戶端黑屏介面工具,該工具可以串連到某個資料庫的執行個體上,從而操作資料庫
sqldeveloper是oracle11g內建的一個用戶端彩屏介面工具,該工具可以串連到某個資料庫的執行個體上,從而操作資料庫
如果你覺得這二款用戶端工具不喜歡,可以上網下載第三方的用戶端工具

(6)理解失敗轉移和Server Load Balancer概念【今天最後再看】
失敗轉移:一個群集中的某個oracle伺服器壞掉,應該讓該台oracle伺服器上的使用者轉移到其它的幾台oracle伺服器上
這個過程對使用者來說,無需知道
Server Load Balancer:多個使用者來並發訪問時,叢集內的oracle伺服器共同承擔使用者並發訪問的壓力,但不一定是平均分配
上述二個概念,不光出現在資料庫領域,也能出現在WEB伺服器領域

(7)以sys超級使用者名稱,dba角色,即超級管理員身份解鎖scott方案/使用者,並為scott設定一個密碼為tiger
解鎖使用者:alter user scott/hr account unlock;
設定密碼:alter user scott/hr identified by tiger/lion;
普通使用者scott
密碼tiger

(8)使用用戶端sqlplus工具進入與退出orcl資料庫
——以超級管管理員角色進入
c:/>sqlplus / as sysdba
sql>exit
——以普通使用者進入
c:/>sqlplus scott/tiger
sql>exit
聲明:我們以普通使用者的身份進入

二)JavaEE工程師,oracleSQL和oracle的關係

(1)第四代語言:SQL【結構化查詢語言 (SQL),面向關係的】
第一代:機器語言
第二代:彙編
第三代:C/C++/C#/Java/VB/…
第四代:SQL
將來。。。

(2)SQL92/【99】標準的四大分類
(A)DML(資料操縱語言):select,insert,update,delete
(B)DDL(資料定義語言 (Data Definition Language)):create table,alter table,drop table,truncate table 。。。
(C)DCL(資料控制語言):grant 許可權 to scott,revoke 許可權 from scott 。。。
(D)TCL(事務控制語言):commit,rollback,rollback to savepoint 。。。

(3)oracleSQL與SQL92/99的關係
SQL92/99標準,訪問任何關係型資料庫的標準
oracleSQL語言,只訪問Oracle資料庫伺服器的專用語言

(4)Java技術和oracleSQL的關係
JDBC–>使用OracleSQL文法–>Oracle伺服器—>orcl資料庫–>表–>記錄
Hibernate–>使用OracleSQL文法–>Oracle伺服器
MyBatis–>使用OracleSQL文法–>Oracle伺服器

(5)聲明:我們這四天時間,主要以在工作中【JavaEE工程師】角度,操作資料庫【常用】功能

--以下代碼是對emp表進行顯示做設定col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;   col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;set pagesize 20;col tname for a20;set pagesize 80;--建立新表new_emp,複製emp表中的結構和資料到new_emp表中    create table copy_emp as select * from emp;create table copy_copy_emp as select * from emp;

啟動如下二個服務:【OracleServiceORCL(設定為手動啟動)和OracleOraDb11g_home1TNSListener(設定為自動啟動連接埠1521)】
類似於MySQL中的:use 資料庫名,即use orcl;
即啟動當前資料庫名:orcl

使用password命令,為scott使用者名稱修改新密碼,以字母開頭,但提倡使用tiger
password
舊口令:tiger
新口令:abc123
再次輸入新口令:abc123

退出sqlplus工具
exit

查詢目前使用者是誰
show user;

查詢scott使用者下的所有對象,使用tab表,tab表每個使用者都有
select * from tab;

設定顯示的列寬(字元型varchar2、日期型date),10個寬度位,a表示字元型,大小寫均可
column ename format a12;
column hiredate format a10;

設定顯示的列寬(數值型number),9表示數字型,一個9表示一個數字位,四個9表示四個數字位,只能用9
column empno format 9999;
column mgr format 9999;
column sal format 9999;
column comm format 9999;
column deptno format 9999;

設定一頁顯示80個條記錄的高度
set pagesize 80;

使用/杠,執行最近一次的SQL語句
/

清屏,屬於SQL*PLUS工具中的命令
host cls;

查詢emp表的結構
desc emp;

查詢emp表的所有內容,號表示萬用字元,表示該表中的所有欄位,但號不能和具體欄位一起使用
select * from emp;

select empno,ename,sal,deptno from emp;

查詢emp表的員工編號,姓名,工資,部門號,列名,大小寫不敏感,但提倡大寫
select empno “編號”,ename “姓名”,sal “工資”,deptNO “部門號” FROM Emp;

查詢emp表的不重複的工作
select distinct job from emp;

查詢員工的編號,姓名,月薪,年薪(月薪*12)
select empno,ename,sal,sal*12 “年薪” from emp;

查詢員工的編號,姓名,入職時間,月薪,年薪,年度營收(年薪+獎金)
select empno “編號”,ename”姓名”,hiredate “入職時間”,sal “月薪”,sal*12 “年薪”,sal*12+comm “年度營收” from emp;
如果結果為null,在sqlplus用戶端工具中,是不顯示null這個值的

解決null的問題,使用NVL()函數,NVL(a,b):如果a是NULL,用b替代;如果a是非NULL,就不用b替代,直接返回a的值\
select NVL(null,10) from emp;結果有14行記錄
select NVL(null,10) from dual;結果有1行記錄
select empno “編號”,ename”姓名”,hiredate “入職時間”,sal “月薪”,sal*12 “年薪”,sal*12+NVL(comm,0) “年度營收”
from emp;
注意:null與具體數字運算時,結果為null

使用列別名,查詢員工的編號,姓名,月薪,年薪,年度營收(年薪+獎金),AS大小寫都可且可以省略AS,別名用雙引號
select empno AS “編號”,ename as “姓名”,sal “月薪”
from emp;

select empno AS 編號,ename as 姓名,sal 月薪
from emp;
區別
select empno AS “編號”,ename as 姓名,sal “月 薪”
from emp;
不加雙引號的別名不能有空格;加了雙引號的別名可以有空格
要加只能加雙引號,不能加單引號,因為在oracle中單引號表示字串類型或者是日期類型
列名不能使用單引號,因為oracle認為單引號是字串型或日期型

使用dual啞表或者偽表,使用字串串連符號||,輸出”hello world”,在oracle中from是必須寫的
select ‘hello’ || ’ world’ “結果” from dual;

使用sysdate,顯示系統目前時間,在預設情況下,oracle只顯示日期,而不顯示時間,格式:26-4月-15
select sysdate from dual;

使用字串串連符號||,顯示如下格式資訊:*的薪水是*美元
select ename || ‘的薪水是’ || sal || ‘美元’
from emp;

使用spool命令,儲存SQL語句到硬碟檔案e:/oracle-day01.sql,並建立sql檔案
spool e:/oracle-day01.sql;

使用spool off命令,儲存SQL語句到硬碟檔案e:/oracle-day01.sql,並建立sql檔案,結束語句
spool off;

使用@命令,將硬碟檔案e:/crm.sql,讀到orcl執行個體中,並執行檔案中的sql語句
@ e:/crm.sql;

使用–符號,設定單行注釋
–select * from emp;

使用/* */符號,設定多行注釋
/*
select
*
from
emp;
*/

SQL語句的特點
1)是SQL92/99的ANSI官方標準,只要按照該標準來寫,在任何的關係型資料庫中都可以直接執行
2)SQL語句的關健字不能簡寫,例如:select,where,from
3)大小寫不敏感,提倡大寫
4)能夠對錶資料進行增刪改查操作
5)必須以分號結束
6)通常稱做語句

SQLPLUS命令的特點
1)是oracle內建的一款工具,在該工具中執行的命令叫SQLPLUS命令
2)SQLPLUS工具的命令中的關健字可以簡寫,也可以不簡寫,例如:col ename for a10;
3)大小寫不敏感,提倡大寫
4)不能夠對錶資料進行增刪改查操作,只能完成顯示格式控制,例如:設定顯示列寬,清屏,記錄執行結果
5)可以不用分號結束,也可以用分號結束,個人提倡不管SQL或SQLPLUS,都以分號結束
6)通常稱做命令,是SQLPLUS工具中的命令
注意:SQLPLUS命令是SQLPLUS工具中特有的語句

單引號出現的地方如下:
1)字串型,例如:’hello’ || ’ world’
2)日期型,例如’25-4月-15’

雙引號出現的地方如下:
1)列別名,例如:sal*12 “年 薪”,或 sal*12 年薪,個人提倡用”“雙引號作列別名

————————————————————————————-where

查詢emp表中20號部門的員工資訊
select * from emp where deptno = 20;

查詢姓名是SMITH的員工,字串使用”,內容大小寫敏感
select * from emp where ename = ‘SMITH’;
總結:你所學過的技術中,哪些是大小寫敏感,哪些是大小寫不敏感

查詢1980年12月17日入職的員工,注意oracle預設日期格式(DD-MON-RR表示2位的年份)
select * from emp where hiredate = ‘17-12月-80’;

查詢工資大於1500的員工
select * from emp where sal > 1500;

查詢工資不等於1500的員工【!=或<>】
select * from emp where sal <> 1500;

查詢薪水在1300到1600之間的員工,包括1300和1600
select * from emp where (sal>=1300) and (sal<=1600);

select * from emp where sal between 1300 and 1600;

查詢薪水不在1300到1600之間的員工,不包括1300和1600
select * from emp where sal NOT between 1300 and 1600;

查詢入職時間在”1981-2月-20”到”1982-1月-23”之間的員工
select * from emp where hiredate between ‘20-2月-81’ and ‘23-1月-82’;
注意:
1)對於數值型,小數值在前,大數值在後
2)對於日期型,年長值在前,年小值在後

查詢20號或30號部門的員工,例如:根據ID號,選中的員工,大量刪除
select * from emp where (deptno=20) or (deptno=30);

select * from emp where deptno in (30,20);

查詢不是20號或30號部門的員工
select * from emp where deptno NOT in (30,20);

查詢姓名以大寫字母S開頭的員工,使用%表示0個,1個或多個字元
select * from emp where ename like ‘S’;
等價
select * from emp where ename = ‘S’;
select * from emp where ename like ‘S%’;

注意:
凡是精確查詢用=符號
凡是不精確查詢用like符號,我們通常叫模糊查詢

查詢姓名以大寫字母N結束的員工
select * from emp where ename like ‘%N’;

查詢姓名第一個字母是T,最後一個字母是R的員工
select * from emp where ename like ‘T%R’;

查詢姓名是4個字元的員工,且第二個字元是I,使用_只能表示1個字元,不能表示0個或多個字元
select * from emp where ename like ‘I_‘;

插入一條姓名為’T_IM’的員工,薪水1200
insert into emp(empno,ename) values(1111,’T_IM’);

查詢員工姓名中含有’_’的員工,使用\轉義符,讓其後的字元迴歸本來意思【like ‘%_%’ escape ‘\’】
select * from emp where ename like ‘%_%’ escape ‘\’;

插入一個姓名叫’的員工
insert into emp(empno,ename) values(2222,””);

插入一個姓名叫”的員工
insert into emp(empno,ename) values(2222,”””);

查詢所有員工資訊,使用%或%%
select * from emp;
select * from emp where ename like ‘%’;
select * from emp where ename like ‘%_%’;

查詢傭金為null的員工
select * from emp where comm is null;
注意:null不能參數=運算
null能參數number/date/varchar2類型運算

查詢傭金為非null的員工
select * from emp where comm is not null;

查詢無傭金且工資大於1500的員工
select *
from emp
where (comm is null) and (sal>1500);

查詢工資是1500或3000或5000的員工
select *
from emp
where sal in (4000,10000,1500,3,300,3000,5000);

查詢職位是”MANAGER”或職位不是”ANALYST”的員工(方式一,使用!=或<>)
select *
from emp
where (job=’MANAGER’) or (job<>’ANALYST’);

查詢職位是”MANAGER”或職位不是”ANALYST”的員工(方式二,使用not)
select *
from emp
where (job=’MANAGER’) or (not(job=’ANALYST’));

————————————————————————————-order by

查詢員工資訊(編號,姓名,月薪,年薪),按月薪升序排序,預設升序,如果月薪相同,按oracle內建的校正規則排序
select empno,ename,sal,sal*12
from emp
order by sal asc;

查詢員工資訊(編號,姓名,月薪,年薪),按月薪降序排序
select empno,ename,sal,sal*12
from emp
order by sal desc;

查詢員工資訊,按入職日期降序排序,使用列名
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by hiredate desc;

order by後面可以跟列名、別名、運算式、列號(從1開始,在select子句中的列號)
列名:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by hiredate desc;

別名:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by “年薪” desc;

運算式:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by sal*12 desc;

列號,從1開始:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by 5 desc;

查詢員工資訊,按傭金升序或降序排列,null值看成最大值
select * from emp order by comm desc;

查詢員工資訊,對有傭金的員工,按傭金降序排列,當order by 和 where 同時出現時,order by 在最後
select *
from emp
where comm is not null
order by comm desc;

查詢員工資訊,按工資降序排列,相同工資的員工再按入職時間降序排列
select *
from emp
order by sal desc,hiredate desc;

select *
from emp
order by sal desc,hiredate asc;
注意:只有當sal相同的情況下,hiredate排序才有作用

查詢20號部門,且工資大於1500,按入職時間降序排列
select *
from emp
where (deptno=20) and (sal>1500)
order by hiredate desc;

select * from emp where deptno in (10,20,30,50,’a’);

————————————————————————————-單行函數

單行函數:只有一個參數輸入,只有一個結果輸出
多行函數或分組函數:可有多個參數輸入,只有一個結果輸出

測試lower/upper/initcap函數,使用dual啞表
select lower(‘www.BAIdu.COM’) from dual;
select upper(‘www.BAIdu.COM’) from dual;
select initcap(‘www.BAIdu.COM’) from dual;

測試concat/substr函數,從1開始,表示字元,不論中英文
select concat(‘hello’,’你好’) from dual;正確
select concat(‘hello’,’你好’,’世界’) from dual;錯誤
select ‘hello’ || ‘你好’ || ‘世界’ from dual;正確
select concat(‘hello’,concat(‘你好’,’世界’)) from dual;正確
select substr(‘hello你好’,5,3) from dual;
5表示從第幾個字元開始算,第一個字元為1,中英文統一處理
3表示連續取幾個字元

測試length/lengthb函數,編碼方式為UTF8/GBK(趙君),一個中文佔3/2個位元組長度,一個英文一個位元組
select length(‘hello你好’) from dual;
select lengthb(‘hello你好’) from dual;

測試instr/lpad/rpad函數,從左向右找第一次出現的位置,從1開始
select instr(‘helloworld’,’o’) from dual;
注意:找不到返回0
大小寫敏感
select LPAD(‘hello’,10,’#’) from dual;
select RPAD(‘hello’,10,’#’) from dual;

測試trim/replace函數
select trim(’ ’ from ’ he ll ‘) from dual;
select replace(‘hello’,’l’,’L’) from dual;

測試round/trunc/mod函數作用於數值型
select round(3.1415,3) from dual;
select trunc(3.1415,3) from dual;
select mod(10,3) from dual;

當前日期:sysdate = 26-4月-15

測試round作用於日期型(month)
select round(sysdate,’month’) from dual;

測試round作用於日期型(year)
select round(sysdate,’year’) from dual;

測試trunc作用於日期型(month)
select trunc(sysdate,’month’) from dual;

測試trunc作用於日期型(year)
select trunc(sysdate,’year’) from dual;

顯示昨天,今天,明天的日期,日期類型 +- 數值 = 日期類型
select sysdate-1 “昨天”,sysdate “今天”,sysdate+1 “明天” from dual;

以年和月形式顯示員工近似工齡,日期-日期=數值,假設:一年以365天計算,一月以30天計算
select ename “姓名”,round(sysdate-hiredate,0)/365 “天數” from emp;

使用months_between函數,精確計算到年底還有多少個月
select months_between(‘31-12月-15’,sysdate) from dual;

使用months_between函數,以精確月形式顯示員工工齡
select ename “姓名”,months_between(sysdate,hiredate) “精確月工齡” from emp;

測試add_months函數,下個月今天是多少號
select add_months(sysdate,1) from dual;

測試add_months函數,上個月今天是多少號
select add_months(sysdate,-1) from dual;

測試next_day函數,從今天開始算,下一個星期三是多少號【中文平台】
select next_day(sysdate,’星期三’) from dual;

測試next_day函數,從今天開始算,下下一個星期三是多少號【中文平台】
select next_day(next_day(sysdate,’星期三’),’星期三’) from dual;

測試next_day函數,從今天開始算,下一個星期三的下一個星期日是多少號【中文平台】
select next_day(next_day(sysdate,’星期三’),’星期日’) from dual;

測試last_day函數,本月最後一天是多少號
select last_day(sysdate) from dual;

測試last_day函數,本月倒數第二天是多少號
select last_day(sysdate)-1 from dual;

測試last_day函數,下一個月最後一天是多少號
select last_day(add_months(sysdate,1)) from dual;

測試last_day函數,上一個月最後一天是多少號
select last_day(add_months(sysdate,-1)) from dual;

注意:
1)日期-日期=天數
2)日期+-天數=日期

————————————————————————————-三大類型轉換

oracle中三大類型與隱式資料類型轉換
(1)varchar2變長/char定長–>number,例如:’123’->123
(2)varchar2/char–>date,例如:’25-4月-15’->’25-4月-15’
(3)number—->varchar2/char,例如:123->’123’
(4)date——>varchar2/char,例如:’25-4月-15’->’25-4月-15’

oracle如何隱式轉換:
1)=號二邊的類型是否相同
2)如果=號二邊的類型不同,嘗試的去做轉換
3)在轉換時,要確保合法合理,否則轉換會失敗,例如:12月不會有32天,一年中不會有13月

查詢1980年12月17日入職的員工(方式一:日期隱示式轉換)
select * from emp where hiredate = ‘17-12月-80’;

使用to_char(日期,’格”常量”式’)函數將日期轉成字串,顯示如下格式:2015 年 04 月 25 日 星期六
select to_char(sysdate,’yyyy” 年 “mm” 月 “dd” 日 “day’) from dual;

使用to_char(日期,’格式’)函數將日期轉成字串,顯示如格式:2015-04-25今天是星期六 15:15:15
select to_char(sysdate,’yyyy-mm-dd”今天是”day hh24:mi:ss’) from dual;

select to_char(sysdate,’yyyy-mm-dd”今天是”day HH12:MI:SS AM’) from dual;

使用to_char(數值,’格式’)函數將數值轉成字串,顯示如下格式: 1,234selecttochar(1234,′ 1,234 select to_char(1234,’9,999’) from dual;

使用to_char(數值,’格式’)函數將數值轉成字串,顯示如下格式:¥1,234select to_char(1234,’$9,999’) from dual;
select to_char(1234,’L9,999’) from dual;

使用to_date(‘字串’,’格式’)函數,查詢1980年12月17日入職的員工(方式二:日期顯式轉換)
select * from emp where hiredate = to_date(‘1980年12月17日’,’yyyy”年”mm”月”dd”日”’);

select * from emp where hiredate = to_date(‘1980#12#17’,’yyyy”#”mm”#”dd’);

select * from emp where hiredate = to_date(‘1980-12-17’,’yyyy-mm-dd’);

使用to_number(‘字串’)函數將字串‘123’轉成數字123
select to_number(‘123’) from dual;

注意:
select ‘123’ + 123 from dual;246
select ‘123’ || 123 from dual;123123

使用NVL(a,b)通用函數,統計員工年度營收,NVL()作用於任何類型,即(number/varchar2/date)
通用函數:參數類型可以是number或varchar2或date類型

使用NVL2(a,b,c)通用函數,如果a不為NULL,取b值,否則取c值,統計員工年度營收

使用NULLIF(a,b)通用函數,在類型一致的情況下,如果a與b相同,返回NULL,否則返回a,比較10和10.0是否相同

使用SQL99標準通用文法中的case運算式,將職位是分析員的,工資+1000;職位是經理的,工資+800;職位是其它的,工資+400
case 欄位
when 條件 then 運算式1
when 條件 then 運算式2
else 運算式n
end

使用oracle專用文法中的decode()函數,職位是分析員的,工資+1000;職位是經理的,工資+800;職位是其它的,工資+400
decode(欄位,條件1,運算式1,條件2,運算式2,…運算式n)

單引號出現的地方如下:
1)字串,例如:’hello’
2)日期型,例如:’17-12月-80’
3)to_char/to_date(日期,’YYYY-MM-DD HH24:MI:SS’)

雙引號出現的地方如下:
1)列別名,例如:select ename “姓 名” from emp
2)to_char/to_date(日期,’YYYY”年”MM”月”DD”日” HH24:MI:SS’)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.