oracle數據庫服務器01

【以下操作,必須以超級管理員身份登錄,才能修改】
 
oracle安裝後,會默認生成很多個用戶







以超級管理員身份登錄,請注意,其中的空格符:
【 sys是一個超級管理員,有最大的權限,dba是角色名,/槓二邊是用戶名和密碼,以dba角色名進入,無需用戶名和密碼 】
sqlplus / as sysdba
例如:C:\Documents and Settings\Administrator>sqlplus / as sysdba



解鎖普通用戶:
alter user 用戶名 account unlock;
例如:SQL> alter user scott account unlock;



修改普通用戶密碼,密碼以英文字母開頭
alter user 用戶名 identified by 新密碼【密碼以字母開頭】;

例如:SQL> alter user scott identified by tiger;


一)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)理解失敗轉移和負載平衡概念【今天最後再看】
    失敗轉移:一個羣集中的某個oracle服務器壞掉,應該讓該臺oracle服務器上的用戶轉移到其它的幾臺oracle服務器上
                  這個過程對用戶來說,無需知道
    負載平衡:多個用戶來併發訪問時,集羣內的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【結構化查詢語言,面向關係的】
    第一代:機器語言
    第二代:彙編        
    第三代:C/C++/C#/Java/VB/...
    第四代:SQL
        將來。。。

   (2)SQL92/【99】標準的四大分類
       (A)DML(數據操縱語言):select,insert,update,delete  
       (B)DDL(數據定義語言):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


-------------------------------------------------------------------------------------select


使用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;
*/
總結:你學過的所有技術中,關於註釋的符號
html:
css:
js:
xml:
jsp:
mysql:
oracle:
java:

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,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')


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章