1. 程式人生 > 實用技巧 >Oarcle資料庫學習總結大全(1)

Oarcle資料庫學習總結大全(1)

此文轉載自:https://blog.csdn.net/weixin_44893836/article/details/109956132#commentBox

1.資料庫

1.登陸資料庫

使用windows+r健,然後輸入cmd,進入命令框,連線使用者,sqlplus+使用者名稱/密碼

把會話環境改成中文模式:

alter session set nls_language='simplified chinese';

把會話環境改成英文模式:

alter session set nls_language=english;

然後匯入資料表: @表名.sql.

sql語句的分類:

1.DQL:主要是查詢語句語言———主要是select語句

2.DML:資料操縱語言———改變資料庫中的是資料,

主要是insert,update,delete語句

3.DDL:資料定義語言———主要是建立修改刪除資料庫中的物件,

主要是create,alter,drop,truncate語句

4.TCL:事物控制語句,用來維護事物的一致性,

主要是commit,rollback,savapoint語句

5.DCL:資料控制功能

用來執行許可權授予和許可權收回操作,

主要是grant,revoke語句


1.單行函式

select語句基礎

舉幾個例子:

1.檢視s_dept中所有的記錄

select *
from s_dept;

2.檢視s_dept中的指定欄位

select id,name,salary
from s_dept;

2.運算:

1.檢視每個員工的id,年薪和名字,(但是不會對原始資料做修改)

select
id,last_name,salary*12 from s_emp;

2.檢視每個員工的員工id,名字和月薪漲100以後的年薪

select id,last_name,(salary+100)*12
from s_emp;

3.起別名

1.檢視員工的員工id,名字和年薪,年薪列名為annual

select id,last_name,salary*12 [as] annual
from s_emp;

或者是

select id,last_name,salary*12 annual
from s_emp;

4.拼接語法

1.檢視員工的員工id,全名

select id,firat_name||last_name
from
s_emp;

2.檢視員工的員工id,全名和職位名稱,全名和職位名稱合併成一列顯示,且格式為:姓名,職位名稱

select id,first_name||' '||last_name||','||title tiltename
from s_emp;

5.nvl:使用nvl函式可以對null進行替換

例:檢視所有員工的員工id,名字和提成,如果提成為空,顯示成0

select id,last_name,nvl(commission_pct,0) commission_pct
from s_emp;

6.distinct:該可以將重複資料去除,

如果後面出現多列,就是代表多列去重,就是多列的值都相同才會認為是重複的資料。

select distinct dept_id,title
from s_emp;

7.fommat:可以將查詢的結果顯示的寬度進行調整

例如:將id設定成寬度為15的_的個數。

col  id  for a15

2.sqlplus相關的命令:

常用的命令:

l 檢視快取中的sql語句
a 在[定位]的那一行後面追加新的內容
i 在[定位]的那一行下面插入新的一行
c 替換[定位]的那一行中的某些字串 ,格式為:c/老的字串/新的字串
del 刪除[定位]的那一行內容
n 後面加內容可以重寫這一行
$ 後面跟一個終端命令,例如$cls清屏,linux中使用!
/ 執行快取sql命令

特殊的spool命令:可以記錄操作的過程


3.排序:

例:檢視員工的id,名字和薪資,按照薪資的降序排序顯示,工資相同就按名字升序排序

select  id,last_name,salary
from s_emp
order by salary desc, last_name [asc];

4.條件查詢:

格式:

select 列名…
from 表名…
where 操作的列名 比較操作表示式

例:檢視員工工資小於1000的員工id和名字

select  id,last_name,salary
from s_emp
where salary <1000;

常用操作符:

1.between and

檢視員工工資在700到1500之間的

select id,last_name,salary
from s_emp
where salary between 700 and 1500;

2.in():表示值在一個指定的列表中

例:檢視員工id=1,3,5,9的員工工資

select id,salary
from s_emp
where id in(1,3,5,9);

3.like:模糊查詢,表示在值不精確的時候用

%:代表0-多個字元

_:代表一個字元

:轉義字元 ,需要escape關鍵字,後面加的字元代表本來的意思

例:

檢視員工名字以C字母開頭的員工的id,工資

select id,last_name,salary
from s_emp
where last_name like 'C%';

檢視員工名字包含c字母開頭的員工的id,工資

select id,last_name,salary
from s_emp
where last_name like '%c%';

檢視員工名字長度不小於5,且第四個字母為n字母的員工id和工資

select last_name,salary
from s_emp
where last_name like '_ _ _ _ n _%';

檢視員工名字中包換一個_的員工id和工資

select id,last_name
from s_emp
where last_name like '%\_%' escape '\';

代表\後面的字元要恢復原本的意思(恢復_的意思)

4.is null ,判斷值為null的時候使用,null的值不能使用=

檢視員工提成為空的名字和id

select  id,last_name
from s_emp
where commission_pct is null;

檢視員工提成—不為空的名字和id

select  id,last_name
from s_emp
where commission_pct is  not null;

and/or,當條件需要的時候多次使用

檢視員工部門id為41且職位名稱為Stock Clerk(存庫管理員)的員工id和名字

select dept_id,title,last_name
from s_emp
where dept_id=41
and
title ='Stock Cleck';

檢視員工部門為41 或者 44號部門,且工資大於1000的員工id和名字

select dept_id,salary,last_name
from s_emp
where (dept_id =41 or dept_id=44)
and
salary>1000;

以上就是單行函式用到的


2.聚合函式

多行函式,可以結合組函式,group ,分組函式。

查詢id小於5的所有員工的平均工資

select avg(salary)
from s_emp
where id<5;

使用單行函式,將上面的結果中每一個last_name轉換為大寫

select id,upper(last_name),salary
from s_emp
where id<5;

查詢每個部分的員工人數、以及該部門的平均工資,並且按照平均工資的降序排序

select dept_id,avg(salary) avs,count(*)
from s_emp
group by dept_id
order by avs desc;

1.啞表

Dual表主要用來選擇系統變數或求一個表示式的值,因為要使用dual來構造完成的查詢語法1.單行函式

也可以稱為單值函式,每操作一行資料(某個欄位值),都會返回一個結果。


1.字元函式:

ASCII(X) ,返回字元X的ASCII碼

select ascii('a') from dual;//a的asc碼

CONCAT(X,Y) ,連線字串X和Y

select concat('hello','world') 
from dual;

INSTR(X,STR[,START][,N) ,從X中查詢str,可以指定從start開始,也可以指定從n開始

select instr('hello world','o',2)
//從前往後查詢這個字串中第二個位置開始
from dual;
select inste('hello world ','o',-1)
//從後往前面查詢,從最後一個查詢

查詢id小於5的員工資訊(id、last_name、salary)

select id ,last-name,salary
from s_emp
where id<5;

LENGTH(X) , 返回X的長度

select length('hello world')
from dual;

LOWER(X) ,X轉換成小寫

select lower('HELLO THE WORLD')
from dual;//hello the world

UPPER(X) ,X轉換成大寫

select upper('hello')
from dual;//HELLO 

INITCAP(X) ,X首字母轉換為大寫,其他字母小寫

select initcap('bbbbb ccccc')
from dual;//Bbbbb Ccccc

LTRIM(X[,TRIM_STR]) ,把X的左邊截去trim_str字串,預設截去空格

select ltrim('==hello==','=')  from dual;
//hello==

RTRIM(X[,TRIM_STR]) ,把X的右邊截去trim_str字串,預設截去空格

select rtrim('==hello==','=')  from dual;
//==hello

TRIM([TRIM_STR FROM]X) ,把X的兩邊截去trim_str字串,預設截去空格

select trim('=' FROM '==hello==') 
from dual;//hello

REPLACE(X,old,new) ,在X中查詢old,並替換成new

select replace('hello tt world','tt','theeee')
from dual;//hello theeee world

SUBSTR(X,start[,length]) ,返回X的字串,從start處開始,擷取length個字元,預設length,預設到結尾

select substr('abcdefg',2,4)
from dual;//bcde

2.數字函式

常用的數字函式:

ROUND(X[,Y]) ,X在第Y位四捨五入,Y代表要保留到哪一位

//保留到小數點後面倆位
select round(45.953,2)
from dual;//45.95
//保留到個位(小數點後面零位)
select round(45.923,0)
from dual;//46
//如果是保留到10位就是-1,百位就是-2,依次類推

TRUNC(X[,Y]) ,X在第Y位截斷

//擷取到小數點的後面倆位
select trunc(45.929,2)
from dual;
//45.92

MOD(X,Y) ,X除以Y的餘數

select mod(10,3) 
from dual;
//(10除以3取餘)

3.日期函式

sysdate,表示的是當前的時間

sysdate 參與時間的加減操作的時候,單位是天

select sysdate from dual;//顯示的是當前的時間
select sysdate+1 from dual;//顯示的是明天的這個時候

常見的日期函式:

months_between:倆個日期之間相差幾個月

例:

30天之後和現在相差多少個月

select months_between(sysdate+30,sysdate)
from  dual;

add_months:現在的日期/指定的日期往後推2個月

select add_months(sysdate,2) from dual;
select add_months('01-11月-2020',2) from dual;

next_day:離當前時間最近的下一個星期5是哪一個天

select next_day(sysdate ,'星期五')
from dual;

last_day:當前日期所在月份的最後一天(月底)

select  last_day(sysdate)
from dual;

round:

把當前日期四捨五入到月(如果日期超過16號,那麼進一個月)

select round(sysdate,'month')
from dual;

把當前日期四捨五入到年

select round(sysdate,'year')
from dual;

trunc 對日期進行擷取,和round類似,但是隻捨棄不進位(不管當前日期到沒到16號,都捨去當前月份)

select trunc (sysdate,'month')
from dual;

2.轉換函式

1.to_char:把一個數字或者是日期轉換成字元(varchar2)

例:

select to_char(salary,$999,999,00)
from s_emp;
------
$2,500.00
$1,450.00

日期轉為字元的常用格式:

內容意義
rrrr四位數的年份
yyyy四位數的年份
yy倆位數的年份
rr倆位數的年份
mm兩位數的月份(數字)
D一週的星期幾
DD一個月的第幾天
DDD一年的第幾天
year英文的月份
month英文全稱的月份
mon英文簡寫的月份
ddsp英文的第幾天(一個月的)
ddspth英文序列數的第幾天(一個月的)
day全英文的星期
dy簡寫的英文的星期
hh小時
mi分鐘
ss
例:
select to_char(sysdate,'yyyy mm MONTH mon MON D DD DDD DAY DY')
from dual;
------結果-------
2020 11 1111111 22 327 星期日 星期日
select to_char(sysdate,'yy/mm/dd')
from dual;

2.to_number:把varchar2型別轉換成數字

select to_numbe('1100')
from s_emp;

3.to_date:把varchar2轉換成日期

select to_date('10-12月-2020','dd/mm/yyyy')
from dual;

3.多表查詢:

1.笛卡爾積

舉例:s_emp表中25條資料,s_dept表中12條資料,查詢倆張表,資料倆倆組合,會得到300條資料

2.連線查詢:(為了避免笛卡爾積的產生)

1.等值查詢:

例如:

查詢員工的名字、部門編號、部門名字

select last_name,dept_id,s_dept.id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;

2.不等值連線:在倆個表中拿資料型別相同的去比較

3.外連線(左外,右外,全連線)

1.左外連線:把左邊的表當成基礎表,左表在右表中查詢的資料,不管有沒有都要顯示出來。

例:查詢所有員工,以及對應的部門名字,沒有部門名字的也要顯示出來。

select id,last_name,dept_id
from s_emp left outer join s_dept
on s_emp.dept_id=s_dept.id;

簡寫:

select last_name,id,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_emp.id(+);
//意思就是想把左邊的表多出來的資料也顯示查詢出來,那麼就在右邊加上一個加號。

2.右外連線:要把右邊的表的資料都要查詢出來

例:查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來

select last_name,dept_id,name
from s_emp right [outer]  join s_dept
on s_emp.dept_id =s_dept.id;

簡寫:

select last_name,dept_id,name
from s_emp,s_dept
on s_emp.dept_id(+)=s_dept.id;

3.全連線

查詢所有員工 以及對應的部門的名字,沒有任何員工的部門也要顯示出來,沒有部門的員工也要顯示出來

select dept_id,id,last_name,name
from s_emp full join s_dept
on s+emp.dept_id=s_dept.id;
// dept_id,id,last_name,name這四項內容只要有一項就都必須顯示出來

4.自連線:自己和自己連線

查詢每個員工的名字以及員工對應的管理者的名字

select s1.last_name,s2.last_name manger
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;

4.操作結果集

1.union:取倆個結果集的並集

2.union all :;把倆個結果集合在一起顯示(可重複)

3.minus:第一個結果去除第二個結果中和他相同的部分

4.intersect:求倆個結果集的交集

5.偽列:rownum

只要資料庫中才會有rownum,就像表中的列一樣,但是在表中真實的不存在

偽列在資料庫中只能用來查詢,並不能像真實的列一樣隨意操作(加減運算)

偽列可以根據查詢結果的條數,自動生成,並且一定是從1開始連續不斷的數字
偽列rownum的本質就是給查詢的一行行結果標上行號

偽列只能等於1,如果等於其他值查不到任何結果;只能大於0,不能大於其他結果。否則查不到。還可以小於任何數。

例:

select last_name
from s_emp
where rownum<7;

在實際的使用中,Oracle資料庫中偽列rownum最核心的作用就是:完成分頁查詢。