ORACLE基礎知識

前言:本博客花費作者大量時間,轉載請聲明,原文章出自:http://yuemu.blog.51cto.com


一.oracle常用命令

1 show user;

查看登陸用戶


2.conn[ect]

 conn system/密碼@orcl conn sys/密碼@orcl as sysdba(sysoper)

切換用戶


3.disc[onnect]

斷開連接。


4.passw[ord]   用戶

以高級用戶重置低級用戶密碼


5.exit

退出數據庫



 

二.文件操作命令

1.start

調用外部的腳本

在C盤存放了 select * from dept; 的語句,並保存爲dept.sql。

sql>start  d:\dept.sql


2.edit

說明:該命令可以編輯指定的腳本。

sql>edit   d:\dept.sql

在打開sql腳本文件裏去編輯sql腳本.


3.spool

說明:該命令可以將sqlplus屏幕上的內容輸入到特定的文件裏

 sql>spool d:\dept.sql sql>select *from dept; sql>spool  off

注意:當spool off 後,方把所有輸入寫入到外部dept.sql裏


4.&

解釋:可以替代變量,變量的值有交互時由用戶輸入
sql>select* from dept  DNAME='&DNAME';


sql>根據提示輸入相應的值




三.用戶管理

sys   system(管理員)

scott(普通用戶)


1.創建用戶(sys    system 用戶)

格式:create  user   name  identified  by  passwd


sql>create  user  edu  identified  by  system

注意:創建的edu並不能通過conn立刻登陸,需要進行下面一步


2.賦予用戶相應的權限

grant  create session  to edu

sql>conn edu/password

則可以登錄


綜合場景

創建一個用戶ware,然給後他分配權限,可以讓ware登陸數據庫,創建表,可以操作自己創建的表。

回收角色。最後刪除用戶

1.使用system創建ware用戶,密碼設置爲system

create user  ware  identified system;


2.要想讓ware登陸數據庫,需要給其connect,resource權限;

 grant connect  to  ware; grant resource  to  ware;


3.使用ware用戶登錄.

conn  ware/system


4.ware創建一張表.

create  table  users(id    number)insert   into  users   values (1);select * from  users;


5.刪除ware用戶

drop  user  ware [cascade]


注意:當ware擁有自己的數據對象時,加上選項cascade,一併把該用戶擁有數據對象刪除


權限賦予

案例,創建WARE用戶,讓其能夠查看SCOTT用戶的emp表,


1.使用system創建ware用戶,密碼設置爲system

create   user  ware  identified   system;


2.要想讓ware登陸數據庫,需要給其connect,resoure權限。

grant  connect  to  waregrant  resource  to  ware


3.使用scott用戶登錄系統

sql>conn  scott/passwordsql>grant  select  on  emp  to  ware;


sql>conn  system/passwordsql>grant   select on scott.emp  to ware


4.使用ware登陸

sql>conn  ware/systemsql>select* from scott.emp


用戶profile口令管理(限制用戶惡意登陸)

1.可以把profile想象成一個數據對象(文件,規則)

語法格式:sql>create   profile   規則名  limit  failed_login_attempts 3  password_lock_time  2;


案例:

允許某用戶,最多嘗試登陸3次,如果3次未登錄成功,則鎖定該用戶,鎖定用戶不能登陸系統。

sql>conn  system/passwordsql>create   profile  user1  limit  failed_login_attempts  3  password_lock_time  2;sql>alter  user  scott  profile  user1;sql>conn  scott/xxx@rocl(連續輸錯3次密碼賬號鎖定)


解鎖:

sql>alter  user  scott  account  unlock;


用戶profile口令管理(限制密碼的使用期限)

語法:

sql>create  profile  規則名  limit  password_life_time  10  password_grace_time  2


案例:

對一個賬號的密碼做出限制,最多使用10天,寬限期爲2天,到時候密碼必須更改。

sql>create  profile  user2  limit  password_life_time  10  password_grace_time  2;sql>alter  user  scott  profile  user2;


此時修改oracle服務器的時間,往後延遲10天與12天,13天查看使用scott登陸的提示信息。

sql>conn  scott/system@orcl;(10天出現還有2天必須改密碼) sql>conn  scott/system@orcl;(10天之後提示改密碼)


刪除profile

drop  profile  規則名 [cascade];




四.oracle 數據類型

三大類:文本,數值,時間

1.char(size)

存放定長的字符串,最大存放2000個字符。例如char(32),存放32個字符(超出不行,不夠32位,用空格補齊)

sql>create table stu01(name char(32)); sql>insert  into  stu01  values('qidong'); sql>select * from stu01; sql>select  name,dump(name)  from  stu01;


2.varchar2(size)

解釋:變長,最大可以存放4000個字符。

舉例:

sql>create table stu02(name varchar2(16));sql>insert   into   stu02    values('leo');sql>select  * from stu02;sql>select  name,dump(name)  from  stu02;


總結:比如存放了‘leo’的3個字符,實際存放在數據庫中,就佔用了3個字符,其餘的字符就被回收了。

說明:char好處是查詢與檢索速度較快


3.nchar(size)  nvarchar2(size)

說明:n代表的意思編碼格式爲unicode編碼,無論中文或英文都以一個字符來存放數據,

舉例:

比如“a”,佔用是一個字符。

比如“祁”,佔用一個字符。

而char與varchar2裏,則不是。

“a”佔用一個字符。“祁”佔用兩個字符。

原因:

nchar一個空間用兩個字符,而char一個空間就是一個字節。

案例:

sql>create  table  soft_oracle(name  nchar(2));sql>insert  into   soft_oracle  values(‘ab’);

結果正確


sql>insert  into   soft_oracle  values(‘abc’);

結果錯誤


sql>insert  into   soft_oracle  values(‘數據’);

結果正確


4.clob(size)變長

說明:字符型的大對象,最大8TB,

應用場景:如果varchar2不夠用了,使用clob


5.blob(size)變長

說明:二進制數據,可以存放圖片/聲音等, 8tb

但是,實際過程中很少把圖片與聲音放在數據庫裏面


6.number (p,s) 變長

1.number 可以存放整數,可以存放小數。

2.number(p,s)

說明:

p表示有效位,s表示小數位,範圍p[1,38]   s[-84,127]


案例1:

number(5,2)

sql>create  table  test1 (price  number(5,2));sql>insert  into test1  values (-999.99);

結果:-999.99


sql>insert  into test1  values (575.34);

結果:575.34


sql>insert  into test1  values (575.345);

結果:575.35


sql>insert  into test1  values (1000);

結果失敗,超過範圍,1000整數位超過3 位


案例2:

number(5)==number(5,0)

表示的範圍:-99999~99999


案例3:

123.89  number

結果:123.89


案例4:

123.89  number(3)

結果:124


案例5:

123.89  number(6,2)

結果123.89


案例6:

123.89  number(6,1)

結果:123.9


案例7:

123.89  number(4,2)

結果:報錯,長度超出了有效長度(4)


案例8:

123.89 number(6,-2)

結果:100


總結:

1.實際過程中如果項目明確要求了精確到多少位,number類型裏面應該寫明有效位和小數位,當不明確的時候直接爲number,不標明有效位和小數位

2.number 是變長。

3.p爲有效位(從左邊第一個非0的數值開始)s位小數位。


7.date日期類型

說明:oracle  dd-mm-yy

案例:

sql>create  table  test1(birth   date);sql>insert   into  test('2011-11-11')

結果是錯誤

sql>insert  into test1 (01-1月-14');

結果正確


案例:銀行裏建的開卡信息

字段

字段類型

ID

number

name

varchar2(64)

sex

char(2)

birth

date

money

number(10,2)


修改表中字段

Alter

格式:

alter  table  tablename

add      (字段名  字段類型)------------------------------------------- 添加字段


alter  table   tablename

modify   (字段名   字段類型) --------------------------------------修改字段


alter  table   tablename

drop  column  字段名       ---------------------------------------------刪除字段




五.sql基礎語法


insert

注意事項

1.插入的數據應與字段的數據類型相同。

insert  into 表名 (字段名1,字段名2)  values(數據1,數據2)

sql>insert  into  test1(id)  values(10);


正確

sql>insert  into  test1(id)   values('abc');


錯誤

2.數據的大小應該在列的規定範圍之內

 sql>create  table tset2(name  varchar2(2)); sql>insert   into  test2(name)   values('aabb');


錯誤

3.在values中列出數據位置必須與字段列的數據類型排列相對應

4.字符和日期數據包含''中。

5.插入空值,不指定或null.


update

格式:

update    表名    set   列名=值   where   條件


案例1:

update語法可以用新值更新原有表中的各列:

sql>update  stu  set  sex='女'  where id=1;


update語句中,set子句指示要修改哪些列和賦予哪些值

給所有用戶的錢都增長1.2倍

 sql>update  stu  set  money=money*1.2  sql>update   stu  set  money=money*1.2  where 1=1


當更新所有的行的時候,where可以省略(where1=1代表所有行都滿足條件)


delete

基礎語法:

delete  from  表名  where  條件


注意事項:

1.如果不使用where子句時,將表中所有數據全部刪除。

2. 如果要刪除某列的值,delete是不可以做到

3.刪除整個表的drop  表名。

4.使用delete的時候,一定考慮表之間的參照完整性。


案例:

刪除某一行記錄

sql>delete  from  stu  where  name='aaa';


5.truncate  table  表名;

sql> truncate  table   stu;


注意:1.一旦使用了truncate 表中的數據不可恢復。

2.當確定表中的數據沒用時,truncate刪除效率更快


rollback

回滾的使用

sql>savepoint  回滾點名字sql>delete  from  stu;sql>select  * from  stu;


無結果

sql>rollback    to    回滾點名字sql>select   *  from    stu;


發現刪除的數據又回來了。




六.select語句

基本語法:

select  [distinct] *(或字段名)  from  表名  where;

1.select  指定查詢哪些列;

2.distinct  去掉重複行;


舉例:

1.查看錶結構

sql>desc  表名;


2.查詢所有列

sql>select  *  from  emp;


3查詢指定列

sql>select   ename,sal    from  emp;


4.取消重複行(所有列數據都一樣)

sql>select   distinct    deptno,job   from  emp;


算術表達式

1.使用算術表達式

案例:顯示每個員工的年工資

sql>select  ename,sal*12  from  emp;


2.給列起別名

sql>select  ename as"姓名", sal*12  as"年薪"  from  emp;sql>select  ename "姓名", sal*12  "年薪"  from  emp;sql>select  ename 姓名, sal*12  年薪  from  emp;


3如何處理null值

案例:員工1年能掙多少錢

sql>select   ename,sal*12+comm*12  from  emp;


結果異常,有員工工資爲空。

sql>select   ename,sal*12+nvl(comm,0)*12  from  emp;


nvl 函數:nvl(comm,0)  如果comm爲空null則返回0,否則返回自身


4.如果鏈接字符串(||)

sql>select  ename    ||'的薪水是'||  (sal*12+nvl(comm,0)*12)  from   emp;




七.where子句

如何顯示工資高於3000的員工,

sql>select  * from  emp  where  sal>3000;


如何查找1982.1.1後入職的員工

sql>select  * from  emp  where to_char(hiredate,'yyyy-mm-dd')>'1982/1/1';


如何查找1981年後入職的員工

sql>select  *  from  emp  where  to_char(hiredate,'yyyy')>'1981';


如何顯示工資在2000至2500之間。

sql>select  *  from  emp  where  sal>=2000  and sal<=2500;


sql>select  *  from  emp  where  sal  between  2000  and 2500;


like(模糊查詢)

%表示任意0到多個字符,_表示的是任意單個字符

1.如何顯示首字母爲s的員工的姓名和工資

sql>select  ename,sal  from  emp  where  ename  like 's%'


2.如何顯示第3個字符爲大寫o的員工信息

sql>select  ename,sal   from  emp  where   ename  like  '___O%'


in

1.如何顯示empno 7369,7499,7521的僱員信息

sql>select * from emp  where  empno=7369  or empno=7499 or empno=7521;


sql>select  *  from emp where empno  in (7369,7499,7521);


使用is null 的操作符

1.如何顯示沒有上級的僱員信息

sql>select  *  from  emp  where  mgr  is  null;


使用邏輯操作符號

1.查詢工資高於500或爲manager的僱員,同時滿足他們的首字母爲大寫J;

sql>select * from  emp  where (sal>500  or  job='manager')  and (ename like  'J%');


Order  by  (排序)

1.如何按照工資的從低到高的順序顯示僱員的信息

sql>select  *   from  emp  order  by  sal[asc];


2.按照部門號升序而僱員入職時間爲降序排列

sql>select *  from emp order  by  deptno,hiredate  desc;


使用列的別名

1.

sql>select  ename,sal*13  as"年薪" from  emp  order  by "年薪";


2.

select  ename,sal*13+nvl(comm,0)*13 as "年薪"  from  emp;



八.複雜查詢

複雜查詢:複雜查詢就是要顯示多張表的數據;

max\min\avg\sum\count 聚合函數


1.如何顯示所有員工的最高工資和最低工資

 sql>select max(sal)  from  emp; sql>select  min(sal)  from  emp;


2.查詢該公司最大年工資的人

sql>select  max(sal*13+nvl(comm,0)*13)  "年薪"  from  emp;


返回值爲65000

注意:如果結果裏面有2人年薪達到65000,max只返回一個,這個是隨機的

3.顯示所有員工的平均工資和工資總和

select  avg(sal),sum(sal)  from emp;


AVG如果列表值有空,不能統計過來

sql>select  avg(comm)  from  emp;

注意:avg只統計了4個人,實際共14個人


用 

select  sum(comm)/count(*)  from  emp; 或select   avg(nvl(comm,0)) from emp;


統計多少人有獎金,並算出獎金平均值

sql>select count(comm)  from  emp;


注意:count統計的是非空的值


其他深度要求

請顯示工資最高的員工的姓名,工作崗位

思路:

1.先查詢工資最高的工資是多少

select max(sal) from emp;


2.在查詢等於max(sal)

select  ename,job  from emp where  sal=(  select   max(sal)   from emp;);


3.請顯示工資高於平均工資的員工信息

sql>select ename,job,sal from emp where sal>(select  avg(sal)  from emp);


group  by  和 having 子句

group  by :用於對查詢的結果進行分組統計

having:和where 差不多,在group by 中使用。


如何顯示每個部門的平均工資和最高工資

1.先分組(使用group by)

group  by depnto


2,在分組結果上進行篩選。

sql>select  depnto,avg(sal),max(sal)  from emp  group by depnto;


顯示每個部門的每種崗位的平均工資和最低工資

sql>select  deptno,avg(sal),max(sal)  from  emp  group  by  deptno,job;


①.顯示部門平均工資低於2000的部門號和它的平均工資;

思路:確定子查詢

1.查詢各個部門平均工資;

2.在1的執行結果裏,挑選出低於2000的

sql>select  deptno,avg(sal)  from  emp group  by  deptno having   avg(sal)<2000;




九.多表查詢

需求:實際過程中經常使用多表聯合查詢

1.顯示僱員的名字,工資及所在部門的名字。

sql>select emp.ename,emp.sal,dept.deptno from emp,dept where  emp.deptno=dept.deptno;


注意:當使用多表聯合查詢時,如果不帶任何條件(where)會出現笛卡爾積

規定:多表查詢的條件(where)是至少不能少於表的個數-1


2.如何顯示部門號爲10的部門名稱,員工名和工資

sql>select emp.ename,emp.sal,dept.dname  from  emp,dept   where  emp.deptno=dept.deptno  and  dept.deptno=10;


3.顯示各個員工的名字,工資,及工資的級別

sql>select  ename,sal,grade  from  emp,salgrade    where   emp.sal  between losal  and  hisal;


4.擴展

顯示僱員名稱,僱員的工資及 所在部門的名字,並按部門排序

select  ename,sal,dept.name  from  dept,emp   where  dept.deptno=emp.deptno  order by  dept.dname;


自身連接

顯示員工的上級姓名

比如:顯示'SMITH'的上級

sql>select ename  from emp  empno=( select mgr  from emp  where  ename='SMITH');


擴展要求:

顯示各個員工的姓名和他的上級領導的名字

sql>select  a.ename,b.ename   from   emp  a,emp  b  where  a.mgr=b.empno;


以上結果,發現沒有king(因爲king沒有上級)如果讓king出現,使用左連接或右連接。




十.子查詢

定義:子查詢是指嵌入在其它sql語句中的select語句,嵌套查詢:

單行子查詢:

是指只返回一行數據的子查詢語句

如何顯示與SMITH同一部門 的員工

1.先查詢SMITH在哪個部門

sql>select deptno from emp where ename='SMITH'


2.在查詢該部門的所有員工

sql>select * from emp where  deptno=(sql>select deptno from emp where ename='SMITH');


如果不顯示SMITH

sql>select * from emp where  deptno=(sql>select deptno from emp where ename='SMITH')  and  ename!='SMITH';


多行子查詢

是指返回多行數據的子查詢:

如何查詢和部門號爲10員工所參加的工作崗位相同工作崗位的僱員的名字,崗位,工資,部門號。

1.查詢出10號部門有哪些工作崗位

sql>select  job  from emp  where  deptno=10;


2.顯示和10號部門從事崗位的僱員信息

sql>select *  from emp where job in (sql>select  job  from emp  where  deptno=10);


ALL

如何顯示工資比30號部門最高工資高的員工信息

1.查詢30號部門工資最高

sql>select max(sal)  from  emp  where  deptno=30;


2.查詢比30號最高工資還高僱員的信息

select  *  from emp  where  sal>(sql>select max(sal)  from  emp  where  deptno=30);


select * from emp  where sal > all(select   sal from emp  where deptno=30);


ANY

如何顯示工資比30號部門最低工資低

的員工信息

select * from emp where sal >any(select sal frpm  emp  where deptno=30)


多列子查詢

如何查詢與SMITH的部門和崗位完全相同的所有僱員信息。

1.查詢SMITH所在部門和所從事的工作崗位

sql>select job,deptno  from emp where  ename='SMITH'


2.查詢與SMITH同部門,同崗位的員工信息

sql>select * from emp where  job =(select  job from emp  where  ename='SMITH')  and deptno=(select  deptno  from  emp  where ename='SMITH');


推薦使用方式

select * from emp where(job,deptno)=(select job,deptno  from emp where  ename='SMITH');


單行子查詢是返回單列,單數據,多行子查詢是返回單列多行數(都針對單列而言);而多列子查詢則是查詢返回多個數據的子查詢語句


FROM

在from子句中使用子查詢

如何顯示高於自己所在部門平均工資的員工信息

1.查詢各個部門的平均工資

sql>select  deptno,avg(sal)  from emp group  by deptno;


2.把1產生的結果當成一個臨時表對待,再進行加工

sql>select * from emp,(select  deptno,avg(sal)  avgsal from emp group  by deptno) T1 where T1.deptno=emp.deptno  and  emp.sal>T1.avgsal;


查詢各個部門工資最高的員工信息

sql>select  * from  emp T1,(select deptno,max(sal) maxsal  from emp group  by deptno)  T2  where  T1.deptno=T2.deptno  and  T1.sal=T2.maxsal;


顯示每個部門的信息和人員數量

1.先統計一下各個部門有多少人

select  deptno,count(*)  from emp group by deptno;


2.把1當成臨時表(從這個臨時表可以獲取每個部門多少人)然後結合dept表,完成查詢。

select  * from dept  t1,(select  deptno,count(*)  from emp group by deptno)  t2  where  t1.deptno=t2.deptno;


總結:FROM子句中使用子查詢時,該子查詢會被作爲一個臨時表來對待。必須給予查詢指定別名




十一.分頁查詢

重點:分頁查詢是必須掌握的一個要點

select * from emp;


如果想要第4行至第6行的內容?


選擇小於6行的數據

select  empno,ename,rownum  from  emp where  rownum<=6;


顯示4到6行數據

select * from (select rownum n,empno,ename,hiredate from emp where rownum<=6) t1 wheret1.n>=4


總結:


第1次篩選:rownum<=6  當成臨時表

第2次篩選; rownum>=4


一.請按入職時間的先後進行排序,查詢7到10行的數據

select * from (select rownum n,empno,ename,hiredate from emp where rownum<=10) t1 wheret1.n>=7 order by hiredate




十二.內鏈接與外連接

內鏈接

內鏈接實際上就是利用where子句對兩張表形成的笛卡兒積進行篩選

內鏈接:是最常用的一種連接方式

案例:顯示員工的信息和部門名字


方法1:

select emp,empno emp.ename,dept.dname  from emp,dept  where  emp.deptno=dept.deptno;


方法2:s

elect emp,empno emp.ename,dept.dname  from emp inner join dept  onemp.deptno=dept.deptno;

格式:select  列名   from  表1  inner  join  表2

on  條件


外連接

外連接:左外連,右外鏈,完全連接

1.左外連接:如果左側的表完全顯示,就是左外連接

2.右外連接:如果右側的表完全顯示,就是右外連接

3.完全連接:如果表完全顯示,就是完全連接


左連接

案例:顯示所有人成績,如果沒有成績,也要顯示該人的姓名和id ,該同學成績爲空

方法1:

select  stu.id,stu.name,exam.grade  from  stu left  join  exam onstu.id=exam.id


方法2:

select stu.id,stu.name,exam.grade  from  stu,exam  where  stu.id=exam.id(+);


右連接

案例:顯示所有成績,如果沒有名字匹配,則顯示空

方法1:select  stu.id,stu.name,exam.grade  from  sturight  joinexam onstu.id=exam.id 

方法2: select  stu.id,stu.name,exam.grade  from  stu, exam  where  stu.id(+)=exam.id;


完全連接

案例:顯示所有成績,所有人

select  stu.id,stu.name,exam.grade  from  stu full  joinexam onstu.id=exam.id


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