Oracle中的SQL語言


4.1  了解SQL語言(結構化查詢語言)的特點
SQL語言結構簡潔,功能強大,它是一種在關系型數據庫中定義和操縱數據的標准語言,有以下幾個特點:

1.集合性  允許一條SQL語句的結果作為另一條SQL語句的輸入/條件

2.統一性  為許多任務提供了統一的命令,方便用戶學習和使用,主要體現在:

查詢數據

在表中插入,修改,刪除記錄

建立,修改和刪除數據庫的對象(表,視圖,索引)

控制對數據和數據對象的讀寫

保證數據庫一致性和完整性

3.易於移植性

4.2  SQL語言的分類
1.數據定義語言DDL(Data Ddefinition Language)

用於建立,修改,刪除數據庫對象。Create,alter,drop

2. 數據查詢語言DQL(Data Query Language)

用於檢索數據庫中的數據,主要是select語句

3. 數據操縱語言DML(Data Manipulation Language)

主要包括insert,update,delete三條語句

4. 數據控制語言DCL(Data Control Language)

用於執行權限授予和權限收回操作。Grant,revoke

5. 事務控制語言

用於維護數據的一致性。

Commit:用於提交對數據庫的更改

Rollback:用於取消對數據庫的更改

Savepoint:設置保存點

4.3  用戶模式
在Oracle數據庫中,為了方便管理用戶所創建的數據庫對象(表,索引,視圖等),引入了模式概念,這樣某個用戶所創建的數據庫對象就都屬於用戶模式。

模式:是一個數據庫對象的集合。模式為一個數據庫用戶所有,並且具有與該用戶相同的名稱,比如SYSTEM模式,SCOTT模式等。在一個模式內部不可以直接訪問其他其他模式的數據庫對象,即使在有訪問權限的情況下,也要指定模式名稱才可以訪問其他模式的數據庫對象。

SYS     123456

SYSTEM  manager

SCOTT   tiger

模式對象:是由用戶創建的邏輯結構,用於存儲或引用數據,比如(表,索引,視圖等)

模式擁有模式對象,模式對象被模式所擁有,兩者之間是擁有與被擁有的關系。

4.4  實例模式SCOTT
SCOTT   tiger

Oracle提供SCOTT模式的目的,就是為了給用戶提供一些實例表和數據來展示Oracle數據庫的一些特性。SCOTT模式擁有的模式對象都是數據表(EMP,DEPT,SALGRADE,BOUNS)

連接scott用戶,密碼是tiger

SQL> conn scott/tiger

SQL> select *from tab;

4.5  檢索數據
    用戶對表或視圖的操作就是檢索數據,使用select語句實現(上下順序不能顛倒)

Select {[distinct] 列名...}   (distinct去重)

[into 表名]               (into到查詢列重新聲明一個新的表)

From 表名                

[where 選擇條件]           

[group by 列名]

[having 選擇條件]            

[order by 列名]             (order by排序)

4.6  簡單查詢
Select  *  from

1. 檢索所有的列

例:查詢dept表中的所有數據

Select  *  from  dept;

例:查詢表dept和salgrade

Select  *  from  dept,salgrade;

 

 

2.檢索指定的列

Select 列名1,列名2...  from表名

例:在scott模式下,檢索emp表中指定列(job,ename,empno)

Select job,ename,empno from emp;

 

補充:ROWID 行標識符(Oracle數據庫自動為其匹配),是Oracle數據庫內部使用的隱藏  列

例:檢索emp表指定列job和ename,還包括rowid為列

 

3.帶有表達式的select子句,算術運算符:+ - * /  ()

例:檢索emp表的sal列,把其值調整為原來的1.1倍

Select sal*(1+1.1), sal form emp;

 

4.為列指定別名 兩種:as關鍵字;直接指定列名

例:檢索emp表中的指定列(empno,ename,job),並使用as關鍵字為這些列指定 中文別名(員工編號,員工名稱,職務)

Select empno as ”員工編號”,ename as “員工名稱”,job as “職務” from emp;

 

指定別名查詢:SELECT empno 編號,ename 姓名,job工作FROM emp;

連接符:||  (字符串的拼接作用)注意用英文單引號’

要求查詢出雇員的編號,姓名,工作,按照以下格式顯示:

編號是:7369的雇員,姓名是:SMITH,工作是:CLERK

 

 

4.7  篩選查詢
在select語句中,where子句位於from子句之后,其語法格式如下:

Select c列名

From 表名

Where 選擇條件

4.8  條件查詢:where關鍵詞
格式:select 列名| * from 表名where選擇條件

例:查詢工資高於1200的有哪些?

Select * from emp where sal>1200;

 

All:只有與所有的元素比較值都為ture,才返回數據行    (in)

例:使用all關鍵字過濾工資(sal)同時不等於3000,950,800的員工記錄

Select empno,sal,ename from emp

Where sal != all(3000,950,800);

 

注意:在進行比較篩選的時候,字符串和日期值必須使用單引號標識。

判斷字段中是否存在內容:

1)內容為空:is null

例:查詢每月可以得到獎金的雇員信息

 

2)內容不為空:is not null

例:查詢沒有獎金的雇員

 

注:A. 如果查詢出現多個條件,在where語句之后,條件與條件之間用and連接。

例:要求查詢出,基本工資大於1500,同時可以領取獎金的雇員信息。

 

A. 滿足其中一個條件,使用關鍵字or來進行連接

例:查詢出基本工資大於1500,或者可以領取獎金的雇員信息。

Select * from emp where sal>1500 or comm is not null;

 

Not關鍵字:取反,把真的條件變成假,假的變為真

例:查詢出基本工資不大於1500,或者不可以領取獎金的雇員信息

Select * from emp where not (sal>1500  and  comm  is not  null);

Select * from emp where sal<=1500 or comm is null;

 

例:查詢基本工資大於1500,但是小於3000的全部雇員信息

Select * from emp where sal>1500 and sal<3000

 

指定范圍查詢的過濾語句:between...and...(閉區間)

格式:select 列名|* from 表名where列名between最小值and最大值

例:查詢工資在1500和3000之間的員工信息情況

Select * from emp where sal between 1500 and 3000;

Oracle對大小寫是非常敏感的:

例:查詢姓名是SMITH的雇員信息

Select * from emp where ename=‘SMITH’;

 

注:除了1上述語法外,還有in操作符不僅可以用在數字上,還可以用在字符串信息上。

例:要求查詢出姓名是SMITH,ALLEN,KING的雇員信息

 

其實,如果指定了查詢范圍,在SQL語法當中,通過in關鍵字來完成。

1)查詢的內容在此范圍中,格式:字段  in(值1,值2...)

例:要求查詢出雇員編號是7369,7499,7521的雇員的具體信息

Select * from emp where empno in (7369,7499,7521)

 

2)查詢的內容不在此范圍中,格式:字段  not  in(值1,值2...)

例:要求查詢出雇員編號是7369,7499,7521的雇員的具體信息

Select * from emp where empno  not  in (7369,7499,7521)

 

4.9  LIKE匹配符:也叫做模糊查找功能(模糊查詢)
即:輸入一個指定的關鍵字,把復合的內容全部查詢出來

%:可以匹配任意長度的內容

_:可以匹配一個長度的內容

例:查詢出所有雇員姓名中第二個字母包括“M”的雇員信息

 

Like還可以方便進行日期的查找功能

例:查詢出生在1981年的雇員信息

Select * from emp where hiredate like ‘%81%’;

 

練習:在emp表中,使用like關鍵字匹配出以字母’S’開頭的任意長度的員工信息。

 

擴展:在like前面也可以加上not,表示否定的判斷

 

4.10  排序查詢
使用order by子句排序:—ASC:升序   —DESC:降序

Order by子句在select語句的結尾

例1:要求按照工資由低到高排序(默認升序)

 

 

例2:檢索emp表中所有的數據,並按照部門編號,員工編號來排序。

Select deptno,empno,ename

from emp

Order by deptno,empno;

 

4.11  分組查詢
select 列名 from表名group by列名

例1:在emp表中,通過分組的方式計算每個部門的平均工資

Select deptno as 部門編號,avg(sal) as平均工資

from emp

group by deptno;

 

例2:在emp表中,先通過分組方式計算出每個部門(部門編號 列)的平均工資,然后通過having過濾掉平均工資大於2000的記錄信息

Select deptno as 部門編號,avg(sal) as平均工資

from emp

group by deptno having avg(sal)<=2000;

 

 

4.12  多表關聯查詢
在實際的應用當中會涉及多個數據表來進行查詢,每個表的信息不是獨立存在的,而是若干個表之間的信息存在一定的關系。

1. 表別名

在多表關聯查詢時,如果多個表之間存在同名的列,則必須使用表名來限制列的引用。

例:在scott模式下,通過deptno列來關聯emp和dept表,並檢索這兩個表中相關字段的信息。

Select e.empno as 員工編號,e.ename as員工名稱,d.dname as部門

From emp  e,dept  d

Where e,deptno=d.deptno

 

 

2. 內連接 inner join on (只有匹配到的信息才能查詢出來)

例:通過deptno字段來內連接emp表和dept表,並檢索兩個表中相關字段

Select emp.ename,job,dept.dname

From emp inner join dept

On emp.deptno=dept.deptno;

 

3. 外連接

左外連接:left outer join

 

右外連接:right outer join

 

完全連接:full outer join

例:完全實現emp和dept表的外部連接

 

4. 自然連接:在檢索多個表的時候,Oracle會將第一個表中的列與第二個表中的具有相同名稱的列進行自動連接,在自然連接中,用戶不需要明確指定進行連接的列,這個 任務由Oracle系統自動完成,自然連接用“natural  join”關鍵字

例:在emp表中檢索工資大於2000的記錄,並實現emp與dept的自然連接

Select empno,ename,job,dname

From emp natural join dept

Where sal>2000;

 

5. 交叉連接:不需要任何連接條件的連接,它使用 cross join關鍵字來實現,格式:

Select 列名 from表1cross join 表2

執行結果為一個笛卡爾積(兩個集合中的所有元素均匹配一遍),這種查詢結果是非常冗余(多)的

例:通過交叉連接dept和emp表,計算出查詢結果的行數

Select count(*) from dept cross join emp;

 

4.13  Oracle常用的系統函數
1. 字符串函數(處理字符串的函數)

1)ASCII(c)函數和CHR(i)函數

ASCII(c)函數用於返回一個字符的ASCII碼,其中c表示一個字符;

CHR(i)函數用於返回給出ASCII碼值所對應的字符,i表示一個ASCII碼值

例:分別求得字符’Z’,’H’,’D’和空格的ASCII值

Select ascii(‘Z’) Z,ascii(‘H’) H,ascii(‘D’),ascii(‘ ’) k from dual;

Select CHR(78) from dual;

 

其中:dual(萬能表)表示Oracle系統內部提供的一個用於實現臨時數據計算的特殊表,它只有一個列DUMMY,類型VARCHAR2(1)

2)CONCAT(s1,S2)函數

該函數將字符串s2連接到s1后面,如果s1位null,則返回s2;如果s2為null,則返回s1,都為null,結果返回null

例:使用concat函數連接hello和world兩個字符串

Select concat(‘hello’,’world’) form dual;

 

3) INITCAP()函數將單詞第一個字母大寫

select INITCAP(‘hello’) from dual;

 

例:將雇員表中的雇員姓名變為開頭字母大寫

Select INITCAP(ename) from emp;(該列除首字母外,后面的字母默認為小寫)

 

4)instr(s1,s2,i,j)函數

用於返回字符s2在字符串s1中第j次出現的位置,搜索從字符串s1的第i個字符開始。當沒有發現要查找的字符時,返回0。如果i為負數,搜索從右到左進行,但是函數返回的位置還是按從左到右來計算。S1和s2均為字符串,i和j為正整數。

例:在字符串‘Oracle 11g’中,從第三個字符開始查詢字符串‘1’第二次出現的位置

Select instr(‘oracle 11g’,’1’,3,2) abc from dual;

 

5)length(s)函數:返回字符串的長度

例:通過使用length函數返回雇員名稱長度大於5的雇員信息以及所在的部門

Select e.empno, e.ename, d.dname

From emp e inner join dept d

On e.deptno=d.deptno

Where length(e.ename)>5;

 

6)LOWER(S)函數和UPPER(S)函數(大小寫的轉化)

lower()函數將一個字符串變為小寫字母(轉小寫)

Select lower(‘HELLO WORLD’) from dual;

upper()函數將一個字符串變為大寫字母(轉大寫)

Select upper(‘hello world’) from dual;

 

7)Replace(s1,s2,s3)函數

該函數使用s3字符串替換出現s1字符串所有s2的字符串,並返回新的字符串

Select replace(‘bad luck bad girl’,’bad’,’good’) from dual;

 

8)substr(s,i,[j])函數

表示從字符串s的第i個位置開始截取長度為j的子字符串

例:從‘MessageBox’中第8個位置截取長度為3的子字符串(其中若第三個參數不寫,默認情況下截取從第i個字符開始一直到 截取完該字符串)

 select substr('MessageBox',8,3) from dual;

 

2. 數字類函數(用於執行各種數據的計算)

 1)ABS(n):返回n的絕對值

select ABS(-8) from dual;

 

2)ROUND(n1,n2)函數:返回四舍五入小數點n2位的n1值

例:返回π的兩位小數值  select round(3.141592653,2) from dual;

 

對emp表中的sal列進行除以20,並四舍五入的保留結果小數點后兩位的數字

 

3)power(n1,n2)函數:返回n1的n2次方,其中n1和n2都為整數

例:計算2的3次方         select power(2,3) from dual;

 

3. 日期和時間類函數

 1)sysdate表示當前日期

 select sysdate as 系統日期 from dual;

 

2)add_months(d,i):在指定日期d上指定月數i,求出之后的日期

例:在當前的日期下加上6個月,並顯示值

 select add_months(sysdate,6) from dual;

 

4. 聚合類函數

 AVG(列名):求平均值           SUM(列名):求和

MAX(列名):求最大值           MIN(列名):求最小值

COUNT(列名):求查詢結果中的記錄數  (行數)

例:使用count()函數計算員工總數,用avg()計算工資

 select count(empno), round(avg(sal),2) from emp;

 

4.14  子查詢的用法
子查詢是在SQL語句中包含另一條select語句,也稱為內查詢

例:在emp表中查詢部門名稱(dname)為‘RESEARCH’的員工的信息

 select *

from emp

where deptno=(select deptno

from dept

where dname='RESEARCH');

 

在使用子查詢的時候應注意:

 1)子查詢必須用()括起來 2)子查詢中不能包括order by子句

3)子查詢允許嵌套多個,不能超過255個

在Oracle 11g中,子查詢分為:單行子查詢、多行子查詢、關聯子查詢3種。

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

例:在emp表中查詢既不是最高工資,也不是最低工資的信息

 select * from emp  where sal>(select min(sal) from emp)and sal<(select max(sal) from emp);

 

4.16  多行子查詢
多行子查詢是指返回多行數據的子查詢語句,當在where子句中使用多行子查詢,必須使用多行運算符(in,all,any)

1.使用in運算符:只要匹配一個結果成功,就會返回檢索記錄

例:查詢不是銷售部門(sales)的員工信息

select *from empwhere deptno in(select deptnofrom deptwhere dname<>'sales');

 

查詢薪水大於SMITH的員工信息

select *

 from emp

where sal>(select salfrom empwhere ename='SMITH');

 

查詢薪水大於平均薪資的員工信息

select *from emp where sal>(select avg(sal) from emp);

 

2.使用any運算符

any運算符必須和單行比較運算符結合使用,並返回行只要匹配子查詢的任何一個結果即可。

例在emp表中,查詢工資大於部門編號為10的任意一個員工的工資即可的其他部門的員工信息

select * from emp

where sal>any(select sal from emp where deptno=10)

and deptno<>10;

 

3.使用all運算符:只有與所有的元素比較值都為ture,才返回數據行    


例:使用all關鍵字過濾工資(sal)同時不等於3000,950,800的員工記錄

Select empno,sal,ename from emp

Where sal != all(3000,950,800);

 

注意:在進行比較篩選的時候,字符串和日期值必須使用單引號標識。

4.17  關聯子查詢

 內查詢的執行需要借助於外查詢,而外查詢的執行又離不開內查詢的執行,這時,內查詢和外查詢是相互關聯的,這種查 
詢被稱為關聯子查詢


 例:檢索工資大於同職位的平均工資的員工信息
 select empno,ename,sal 
 from emp f 
 where sal >(select avg(sal) from emp where job=f.job) 
 order by job;

例:要求查詢出比7654工資高的全部雇員信息
 select *from emp
where sal>(select sal from emp where empno=7654);


4.18   操作數據庫

 

1.插入數據(insert)

insert into 表名(列名...)  values(值...)

例:在dept表中,使用insert語句添加一條記錄

insert into dept(deptno,dname,loc) values(23,'qianfeng','beijing');

 

2.批量插入數據

select查詢語句insert into 表名(列名)  select查詢語句

 insert into emp_tempselect * from emp;

如下:創建emp2,將emp中的數據插入emp

 

3.更新數據

 格式:update 表名 set 列=值 where 條件

例:把emp表中職務是銷售員(SALESMAN)的工資上調20%

 update emp set sal=sal*1.2 ehere job='SALESMAN';

和insert語句一樣,update語句也可以與select語句結合使用。

例:把emp表中工資小於2000的雇員工資調整為管理者(MANAGER)的平均工資。

 update emp set sal=(select avg(sal)) from emp where job='MANAGER'

where sal<2000;

4.19  刪除數據

格式:delete from 表名 [where 條件]

例:刪除姓名是“SMITH”個人信息

 delete from emp where ename='SMITH';

 

*使用delete語句刪除數據時,Oracle系統會產生回滾記錄,所以這種操作可以使用ROLLBACK語句來撤銷 

4.20  事務處理
事務是由一系列語句構成的邏輯工作單元。通常都是為了完成一定業務邏輯而將一條或者多條語句‘封裝’起來,使他們與其他語句之間出現一個邏輯上的邊界,並形成相對獨立的工作單元。

事務的四個屬性:

 1)原子性:事務是一個整體的工作單元,事務對數據庫所做的操作要么全部執行,要么全部取消。如果某條語句執行失敗,則所有語句全部回滾。(rollback)

 

 此時若此前的事務處理未進行提交(commit),將全部回滾。

2)一致性:事務完成的時候,必須使所有的數據保持一致狀態。

3)隔離性:由事務所做的修改必須與其他事務所做的修改隔離。

4)持久性:當事務提交后,對數據庫所操作的修改就會永久保存下來。

4.21  操作事務
以下情況,Oracle認為一個事務結束:

 1)commit語句提交事務

2)執行rollback語句撤銷事務

3)執行一條數據定義(DDL)和控制(DCL)語句,比如create,alter,drop等,如果該語句執行成功,

那么Oracle會自動執行commit命令,否則自動執行rollback命令。

4)正常的斷開數據庫的連接,正常的退出SQL*PLUS環境,Oracle會自動執行commit命令,否則自動執行rollback命令

注:Oracle結束一個事務歸根結底要么執行commit語句,要么執行rollback語句。

4.22  commit和rollback
 1)提交事務(commit):把對數據庫進行的全部操作持久性的保存在數據庫中

 例:向bonus表中插入一條數據,然后用commit語句進行提交

insert into bonus

values('zhangsan','manager',1200,200);

commit;

 

 2)回滾事務(rollback):撤銷對數據庫進行的全部操作

4.23 數據表
 數據表是Oracle數據庫的主要數據存儲容器,表中的數據被組織成行和列。

 數據表的邏輯結構:表是最常見的一種組織數據的方式,一張表一般都具有多個列(字段)。每個字段都極有特定的屬性。包括字段名,數據類型,字段長度,約束,默認值等。

 Oracle除了提供的數值類型,字符類型,日期時間類型之外,還有以下最常見的幾種:

1)字符類型

  char:用於存儲固定長度的字符串。范圍是1-2000字節

  varchar2:用於存儲變長, 而非固定長度的字符串。

2)數值類型

 number:用於存儲整數或浮點數

3)日期時間類型

 date:可以存儲日期和時間組合數據。最常見的獲取日期的方法是通過sysdate函數,可以獲取當前系統的日期值。

 to_date函數將數值或字符串轉換成date類型。

4)rowid數據類型

 也被稱為‘偽列類型’,用於在Oracle內部存儲表中記錄每條記錄的物理地址,在Oracle內部通過rowid來定位所需記錄的。

4.24 創建數據表
創建表使用create table語句

例:創建一個學生信息表student,包括學號,姓名,性別,年齡,系別編號,班級編號,建檔日期

 create table student

(

sno number(10) not null,

name varchar2(10),

sex varchar2(5),

age number,

departno varchar2(6) not null,

classno varchar2(6) not null,

regdate date

);

 

當使用create table ...as select ...語句創建表時,Oracle將通過student表中復制列來建立表。在創建表后,Oracle就會使用select語句中返回的行來填充新表。

例:使用create table...as select...語句創建student表的一個副本

create table student2

as select *

from student;

 

select * from tab;查看當前用戶下的所有表

 

4.25 維護數據表
1. alter
1)添加或者刪除字段 alter table 表名 add (列名,數據類型)
 例:給student表添加一個province(省份)新字段

 alter table student add(province varchar2(4));

 例:刪除province字段  alter table student drop column province;

 例:同時刪除sex,age字段  alter table student drop(sex,age);

 

 

 注:刪除多個列時不加column

2)修改字段
 格式:alter table 表名 modify lieming 要修改的屬性

 例:把student表中 departno字段長度修改為10

  alter table student modify departno varchar2(10);

 

3)重命名
①修改表名:alter table 原表名稱 rename to新表名稱

例:更改student表名為s1 alter table student rename to s1;

 

②修改列名:alter 表名 rename column 原列名 to 新列名;

 例:更改表student中name為sname alter table s1 rename column name to sname;

 

2. drop
1)刪除表 drop table 表名[cascade constraints];
注:如果該表存在約束,關聯的視圖等,則必須使用“cascade constraints”這個可選的子句才能刪除。
例:刪除student2表      drop table student2;

2)當用戶需要還原該表時,可以使用flashback table語句來進行還原。
flashback table student2 to before drop;

 


章末總結
1.了解SQL語言的特點(集合性、統一性、可移植性)

2.理解用戶模式和模式對象(模式中擁有模式對象,模式對象被用戶所擁有)(scott)

3.掌握檢索數據的方法


  [where 選擇條件]           

  [group by 列名]

  [having 選擇條件]            

  [order by 列名]             (order by排序)

  表連接 自然連接 交叉連接

4.Oracle常用系統函數

5.掌握子查詢的用法(in    any(單行比較運算符)    all)

6.掌握操作數據庫的3種方法(insert  update  delete)
---------------------
作者:貓發出喵的聲音
來源:CSDN
原文:https://blog.csdn.net/weixin_41096399/article/details/79104902
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM