Oarcle資料庫學習總結大全(1)
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 11月 11月 11月 1 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最核心的作用就是:完成分頁查詢。