資料庫(Oracle)
?
? 開發組成 :前端 后端 資料庫
?
? 資料庫分類
? 關系型資料庫(把復雜的資料結構歸結為簡單的二元關系即二維表格形式,對資料的操作幾乎全部建立在一個或多個
? 關系表格上,通過對這些關聯的表格分類、合并、連接、或選取來實作資料庫的管理,
?
? 傳統實體:Oracle 、Mysql 、Microsoft SQL Server…
?
? 非關系型資料庫(NoSQL泛指非關系型資料庫): 傳統關系型資料庫在應付web2.0網站,特別是超大規模和高并發SNS型別
? 的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的資料庫由于其本身特點得到迅速發展
? ,Nosql資料庫在特定的場景下可以發揮出難以想象的高效率和高性能,它是作為對傳統關系型資料庫的一個有效的補充
?
? 分類:(1)鍵值(key-value)存盤資料庫 Redis
? (2)列存盤(Column-oriented)資料庫
? (3)面向檔案資料庫 MongoDB CouchDB
? (4)圖形資料庫 Neo4j InforGird
? (5)時序資料庫InfluxDB Prometheus OpenTSDB(底層基于HBase)
··· 資料庫發展階段
人工管理階段
檔案系統階段
資料庫系統階段
?
資料庫的主要特點有:
1. 實作資料共享
資料共享包含所有用戶可同時存取資料庫中的資料,也包括用戶可以用各種方式通過介面使用數
據庫,并提供資料共享,
2. 減少資料的冗余度
同檔案系統相比,由于資料庫實作了資料共享,從而避免了用戶各自建立應用檔案,減少了大量
重復資料,減少了資料冗余,維護了資料的一致性,
3. 資料的獨立性
資料的獨立性包括資料庫中資料庫的邏輯結構和應用程式相互獨立,也包括資料物理結構的變化
不影響資料的邏輯結構,
4. 資料實作集中控制
檔案管理方式中,資料處于一種分散的狀態,不同的用戶或同一用戶在不同處理中其檔案之間毫
無關系,利用資料庫可對資料進行集中控制和管理,并通過資料模型表示各種資料的組織以及數
據間的聯系,
5. 資料一致性和可維護性,以確保資料的安全性和可靠性
安全性控制:以防止資料丟失、錯誤更新和越權使用;
完整性控制:保證資料的正確性、有效性和相容性;
并發控制:使在同一時間周期內,允許對資料實作多路存取,又能防止用戶之間的不正常
互動作用;
故障的發現和恢復:由資料庫管理系統提供一套方法,可及時發現故障和修復故障;
6. 故障恢復
由資料庫管理系統提供一套方法,可及時發現故障和修復故障,從而防止資料被破壞,資料庫系
統能盡快恢復資料庫系統運行時出現的故障,可能是物理上或是邏輯上的錯誤,比如對系統的誤
操作造成的資料錯誤等,
3.資料庫物件
資料庫物件是資料庫的組成部分,常常用 CREATE 命令進行創建,可以使用 ALTER 命令修改,用 DROP執行洗掉操作,常見的資料庫物件有:
用戶(user)
表(table)
視圖(view)
索引(index)
觸發器(trigger)
存盤程序(procedure)
同義詞(synonym)
序列(sequence)
在學習的程序中,所接觸到的內容,都與這些oralce資料庫物件有關系
4.sql
SQL(Structured Query Language),結構化查詢語言,是專門操作關系型資料庫的一種語言
第一代編程語言,機器語言,是面向機器的,通過二進制代碼對其計算機操作
第二代編程語言, 匯編語言,使用指令對應的符號,來代替二進制代碼
第三代編程語言,高級開發語言 ,例如C、C++ Java等,語言更加簡單,操作更方便
第四代編程語言,只告訴計算機需要做什么,不需要告訴計算機怎么做,更加接近自然語言
例如:select name from tbl_student;
這時候只是告訴計算機,我們需要查看表中的name欄位的值,但是沒說該怎么做
sql陳述句的分類:
DQL (Data Query Language),資料查詢語言
用于檢索資料庫中的資料,主要是 SELECT 陳述句
DML (Data Manipulation Language),資料操縱語言
用于改變資料庫中的資料,主要是 INSERT , UPDATE , DELETE 陳述句
DDL(Data Define Langage),資料定義語言
用來建立、修改、洗掉資料庫物件,主要是 CREATE 、 ALTER 、 DROP 、 TRUNCATE 陳述句
TCL (Transaction Control Language),事務控制語言
用于維護資料的一致性,主要是 COMMIT , ROLLBACK , SAVEPOINT 陳述句
DCL(Data Control Language),資料控制功能
用于執行權限授予和權限識訓操作,主要是 GRANT , REVOKE 陳述句
注意,DML陳述句需要事務的支持(產生事務),DDL陳述句會自動提交事務
sql、sqlplus、pl/sql的區別:
sql,結構化的查詢陳述句,操作關系型資料庫的語言
sqlplus,oracle資料庫軟體自帶工具,可以接收用戶輸入的sql陳述句,然后將sql執行結果顯示出來
pl/sql,程式化的sql陳述句,在sql陳述句的基礎上加入一定的邏輯操作,如 if for 等
不同的關系型資料庫中,sql陳述句的基本語法都是相同的,但是在特殊的情況下,也會有稍許差異
select
1 基礎
select陳述句,可以通過列名,把一行行的資料給查詢出來,語法為:
select [distinct] *{col_name1,col_name2,..} from tb_name;
注意1,語法中出現的中括號[],表示該部分可有可無
注意2,*號表示所有列
注意3,col_name1,col_name2代表列名,如果有多個可以逗號分開
例如,查看所有員工的id,名字(last_name)和薪資(salary)
select id,last_name,salary
from s_emp;
運算
例如,查看每個員工的員工id,名字和年薪
select id,last_name,salary*12
from s_emp;
注意,select陳述句永遠不會對原始資料進行修改;
例如,查看每個員工的員工id,名字和月薪漲100以后的年薪
select id,last_name,(salary+100)*12
from s_emp;
別名
語法:
select old_column [as] new_column_name from tb_name;
注意,中括號里面的as是可選的
例如,查看員工的員工id,名字和年薪,年薪列名為annual
select id,last_name,salary*12 as annual
from s_emp;
或者
select id,last_name,salary*12 annual
from s_emp;
拼接
? 語法:
select col_name||'spe_char'||col_name from tb_name
例如,查看員工的員工id,全名
select id,first_name||last_name
from s_emp;
例如,查看員工的員工id,全名和職位名稱,全名和職位名稱合并成一列顯示,且格式為:姓名,職位
名稱
select id,first_name||' '||last_name||','||title as name
from s_emp;
nvl
使用nvl函式可以將null進行替換
語法:
select nvl(col_name,change_value) from tb_name;
例如,查看所有員工的員工id,名字和提成,如果提成為空,顯示成0
select id,last_name,nvl(commission_pct,0) commission_pct
from s_emp;
distinct
該關鍵字可以將重復資料去除,
語法:
select distinct col_name,col_name...
from tb_name;
例如,下面sql的語法錯誤!
select id,distinct title
from s_emp;
如果 distinct 關鍵詞后面如果出現多列,表示多列聯合去重,即多列的值都相同的時候才會認為是重
復的記錄,
//test表中的資料為:
id id2
1 2
1 3
2 4
3 4
3 4
select distinct id,id2
from test;
//查詢結果為:
id id2
1 2
1 3
2 4
3 4
例如,查看所有員工的職位名稱和部門id,同職位同部門的只顯示一次
select distinct dept_id,title
from s_emp;
format
使用 format 可以將查詢結果顯示的寬度進行調整,
例如
select id,last_name
from s_emp;
運行結果為:
ID LAST_NAME
---------- --------------------------------------------------
1 Velasquez
2 Ngao
3 Nagayama
4 Quick-To-See
5 Ropeburn
6 Urguhart
7 Menchu
使用 format 調整last_name列所占的寬度,其實就是“-”的個數
例如
//表示last_name列的下方有15個“-”
column last_name format a15
//或者簡寫為
col last_name for a15; select id,last_name
from s_emp;
運行結果:
ID LAST_NAME
---------- ---------------
1 Velasquez
2 Ngao
3 Nagayama
4 Quick-To-See
5 Ropeburn
6 Urguhart
7 Menchu ......
可以清除設定的格式:
clear column //或者 clear co
注意,format只能設定字符型別的欄位列
sqlplus
使用 sqlplus 登錄之后,可以使用buff(快取)來存盤/執行/修改上一條運行的sql陳述句 ,
buff中只能存盤一條sql陳述句,但是這條sql陳述句可能有很多行
每次放入新的sql陳述句,會把之前的覆寫掉
每次執行sql陳述句,都會把這個sql陳述句放到buff里面
sqlplus 相關的命令:
l 查看快取中的sql陳述句
a 在[定位]的那一行后面追加新的內容
i 在[定位]的那一行下面插入新的一行
c 替換[定位]的那一行中的某些字串 ,格式為:c/老的字串/新的字串
del 洗掉[定位]的那一行內容
n 后面加內容可以重寫這一行
$ 后面跟一個終端命令,例如$cls清屏,linux中使用!
/ 執行快取sql命令
注意,使用 l 命令查看buff中的sql后,可以直接輸入行數,然后回車,這就是定位到了這一行
如果要清空buff中的sql:
clear buffer
其他的一些命令:
save test.sql //buff中的sql陳述句保存在test.sql檔案中
get test.sql //把test.sql中的內容在加載到buff中,但是沒有運行
start test.sql //把test.sql中的內容在加載到buff中并且執行
@test.sql //把test.sql中的內容在加載到buff中并且執行
edit file_name //使用系統默認編輯器去編輯檔案
spool 命令:可以記錄操作的程序
spool file_name //將接下來的sql陳述句以及sql的運行結果保存到檔案中
sql1 result1 sql2 result2 ... spool off //關閉spool功能
排序
查詢資料的時候進行排序,就是根據某個欄位的值,按照升序或者降序的情況將記錄顯示出來
語法:
select col_name,...
from tb_name order by col_name [asc|desc]
注意1,order by陳述句,只對查詢記錄顯示調整,并不改變查詢結果,所以執行權最低,最后執行
注意2,排序的默認值是asc:表示升序,desc:表示降序
注意3,如果有多個列排序,后面的列排序的前提是前面的列排好序以后有重復(相同)的值,
例如,
//假設test表中有以下資料
id id2
1 2
2 3
3 4
4 1
4 2
select id,id2
from test
order by id asc,id2 desc;
//查詢結果:
id id2
1 2
2 3
3 4
4 2
4 1
注意,先升序排第一列,如果第一列有重復的值,再降序排第二列,以此類推
注意,上面的asc可以省去不寫,因為是默認值
例如,查看員工的id,名字和薪資,按照薪資的降序排序顯示,工資相同就按名字升序排
select id,last_name,salary
from s_emp
order by salary desc,last_name;
條件查詢
語法:
select col_name,...
from tb_name
where col_name 比較操作運算式
注意1,限制查詢條件,使用where子句
注意2,條件可以多個,使用邏輯運算子或者小括號進行條件的邏輯整合
注意3,where子句的優先級別最高
注意4,比較操作運算式由運算子和值組成
邏輯比較運算子= > < >= <= !=
不等于運算子,以下三個都表示不等于的意思,經常用的是 !=
!= <> ^=
例如,查看員工工資小于1000的員工id和名字
select id,last_name,salary
from s_emp
where salary < 1000;
between and 運算子,表示在倆個值之間
例如,查看員工工資在700 到 1500之間的員工id和名字
select id,last_name,salary
from s_emp
where salary between 700 and 1500;
in() ,表示值在一個指定的串列中
例如,查看員工號1,3,5,7,9員工的工資
select id,last_name,salary
from s_emp
where id in (1,3,5,7,9);
like ,模糊查詢,在值不精確的時候使用
% ,通配0到多個字符
_ ,通配一個字符,并且是一定要有一個字符
\ ,轉義字符,需要使用 escape 關鍵字指定,轉義字符只能轉義后面的一個字符
例如,查看員工名字以C字母開頭的員工的id,工資
select id,last_name,salary
from s_emp
where last_name like 'C%';
注意,資料庫中的字串,需要使用單引號括起來
例如,查看員工名字長度不小于5,且第四個字母為n字母的員工id和工資
select id,last_name,salary
from s_emp where last_name like '___n_%';
例如,查看員工名字中包換一個_的員工id和工資
select id,last_name,salary
from s_emp where last_name like '%\_%' escape '\';
is null ,判斷值為null的時候使用,null值的判斷不能使用等號
例如,查看員工提成為為空的員工的id和名字
select id,last_name,commission_pct
from s_emp
where commission_pct is null;
注意,類似的,還有 is not null
and 、 or ,邏輯運算子,當條件有多個的時候可以使用
注意,and比or的優先級要高
例如,查看員工部門id為41且職位名稱為Stock Clerk(存庫管理員)的員工id和名字
select id,last_name,dept_id,title
from s_emp
where dept_id = 41 and title = 'Stock Clerk';
例如,查看員工部門為41 或者 44號部門,且工資大于1000的員工id和名字
select id,last_name,dept_id,title
from s_emp
where salary > 1000 and (dept_id = 41 ordept_id = 44 );
例如,查看員工部門為41且工資大于1000,或者44號部門的員工id和名字
select id,last_name,dept_id,title
from s_emp
where salary > 1000 and dept_id = 41 ordept_id = 44;
注意,以上倆個sql陳述句,執行的結果是不一樣的,它們的區別就是第一個sql在條件中多了個小括
號
查詢s_emp表中最大工資數,并且顯示出這個最大工資的員工的名字
select max(s1.salary),s2.last_name
from s_emp s1,s_emp s2
group by s2.salary,s2.last_name
having max(s1.salary) =s2.salary;
第一步,查出最大工資數
select max(salary)
from s_emp;
第二步,加上last_name的顯示
select last_name,max(salary)
from s_emp;
第三步,select后面出現組函式,沒有被組函式修飾的列放到group by后面,
select last_name,max(salary)
from s_emp
group by last_name;
注意,這時候會發現查詢結果并不是想要結果,因為這是按名字分組,每個人的名字都不同,那
么就是每一個人就是一個小組,其實表里有倆個人的名字都叫Patel,所以本來25條資料,這時候
會查出24條
第四步,修改為多表查詢(起別名),從s1表中查詢出最大的工資數是多少,然后再和s2表連接起來,選
出s2表中這個最大工資數的員工名字
select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
where s2.salary = max(s1.salary)
group by s2.last_name;
注意,這時候會報錯,因為where后面不能出現組函式
第五步,where后面不能出現組函式,所以改為having
select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
group by s2.last_name,s2.salary
having s2.salary = max(s1.salary);
//運行結果: LAST_NAME MAX(S1.SALARY)
--------------------- --------------
Velasquez 2500
例如,查詢s_emp表每個部門的最大工資數,并且顯示出這個最大工資的員工的名字,以及該部門的名
字、該部門所屬區域,并且使用部門編號進行排序
select
max(s1.salary),s2.last_name,s2.dept_id,sr.name,sd.name
from
s_emp s1,s_emp s2,s_dept sd,s_region sr
where
s1.dept_id =s2.dept_id
and
s1.dept_id=sd.id
and
sd.region_id = sr.id
group by
s2.dept_id,s2.last_name,s2.salary,sr.name,sd.name
having
max(s1.salary) =s2.salary
order by
s2.dept_id;
oracle(2)函式、多表查詢、結果集、偽列
常用函式分類(三類)
1.單行函式
- 字符函式
- 日期函式
- 數字函式
2.轉換函式
3.聚合函式
常用函式用法
單行函式,也可以稱為單值函式,每操作一行資料(某個欄位值),都會回傳一個結果
例如,查詢id小于5的員工資訊(id、last_name、salary)
select id,last_name,salary
from s_emp
where id<5;
//運行結果:ID LAST_NAME SALARY
---------- --------------- ----------
1 Velasquez 2500
2 Ngao 1450
3 Nagayama 1400
4 Quick-To-See 1450
例如,使用單行函式,將上面的結果中每一個last_name轉換為大寫
select id,upper(last_name) as last_name,salary
from s_emp
where id<5;
//運行結果:
ID LAST_NAME SALARY
---------- --------------- ----------
1 VELASQUEZ 2500
2 NGAO 1450
3 NAGAYAMA 1400
4 QUICK-TO-SEE 1450
可以看到,單行函式,對每一行中的last_name欄位值都進行了操作,并回傳了轉換結果
- 字符函式 (常用)
- ASCII(X) 回傳字符X的ASCII碼
- CONCAT(X,Y) 連接字串X和Y
- INSTR(X,STR[,START][,N) 從X中查找str,可以指定從start開始,也可以指定從n開始
- LENGTH(X) 回傳X的長度
- LOWER(X) X轉換成小寫
- UPPER(X) X轉換成大寫
- INITCAP(X) X首字母轉換為大寫,其他字母小寫
- LTRIM(X[,TRIM_STR]) 把X的左邊截去trim_str字串,預設截去空格
- RTRIM(X[,TRIM_STR]) 把X的右邊截去trim_str字串,預設截去空格
- TRIM([TRIM_STR FROM]X) 把X的兩邊截去trim_str字串,預設截去空格
- REPLACE(X,old,new) 在X中查找old,并替換成new
- SUBSTR(X,start[,length]) 回傳X的字串,從start處開始,截取length個字符,預設length,默認到結尾
例子:INSTR(X,STR[,START][,N) ,從X中查找str,可以指定從start開始,也可以指定從n開始
select instr('Hello World','o') as result
from dual;
//運行結果:
RESULT
----------
5
select instr('Hello World','o',6) as result
from dual;
//從前往后查找,從下標為6開始
//運行結果:
RESULT
----------
8
select instr('Hello World','o',-1) as result
from dual;
//從后往前查找,從最后一個開始
//運行結果:
RESULT
----------
8
-
數字函式(專門運算元字的函式,常用)
- INITCAP(X) X首字母轉換為大寫,其他字母小寫
- LTRIM(X[,TRIM_STR]) 把X的左邊截去trim_str字串,預設截去空格
- RTRIM(X[,TRIM_STR]) 把X的右邊截去trim_str字串,預設截去空格
- TRIM([TRIM_STR FROM]X) 把X的兩邊截去trim_str字串,預設截去空格
- REPLACE(X,old,new) 在X中查找old,并替換成new
- SUBSTR(X,start[,length]) 回傳X的字串,從start處開始,截取length個字符,預設length,默認到結尾
例子:INSTR(X,STR[,START][,N) ,從X中查找str,可以指定從start開始,也可以指定從n開始
select instr('Hello World','o') as result
from dual;
//運行結果:
RESULT
----------
5
select instr('Hello World','o',6) as result
from dual;
//從前往后查找,從下標為6開始
//運行結果:
RESULT
----------
8
select instr('Hello World','o',-1) as result
from dual;
//從后往前查找,從最后一個開始
//運行結果:
RESULT
----------
8
- 數字函式(專門運算元字的函式,常用)

日期函式
-
sysdate ,是Oracle中用來表示當前時間的關鍵字,并且可以使用它來參與時間運算,
例如,
//顯示當前時間 select sysdate from dual;例如,
//顯示時間:明天的這個時候 select sysdate + 1 from dual; //顯示時間:昨天的這個時候 select sysdate - 1 from dual; //顯示時間:1小時之后的這個日期 select sysdate + 1/24 from dual;注意, sysdate 參與時間的加減操作的時候,單位是天
特別注意,oracle中不同的會話環境中,日期資料默認的格式也不同
中文
SQL> alter session set nls_language='simplified chinese';
會話已更改,
SQL> select sysdate
from dual;
SYSDATE
--------------
02-9月 -20
SQL>
注意,觀察中文環境的會話中的默認日期格式的特點,
英文
SQL> alter session set nls_language=english;
Session altered.
SQL> select sysdate
from dual;
SYSDATE
------------
02-SEP-20
SQL>
**常見的日期函式**

months_between
例如,30天之后和現在相差多少個月
select months_between(sysdate+30,sysdate) as result
from dual;
//運行結果:
RESULT
----------
1
add_months
例如,指定日期,往后推2個月
alter session set nls_language='simplified chinese';
select add_months('01-10月-2020',2) as result
from dual;
//運行結果:
RESULT
--------------
01-12月-20
alter session set nls_language=english;
select add_months('01-OCT-2020',2) as result
from dual;
//運行結果:
RESULT
------------
01-DEC-20
注意,這個數字也可以是負數,表示之前多少月
2.轉換函式
轉換函式,可以將一個型別的資料,轉換為另一種型別的資料,
轉換函式主要有三種:
- TO_CHAR ,把一個數字或日期資料轉換為字符

select to_char(salary,’$999,999.00’) as result
from s_emp;
//運行結果:
RESULT
$2,500.00
$1,450.00
$1,400.00
$1,450.00
$1,550.00
…
select to_char(salary,‘L999,999.00’) as result
from s_emp;
//運行結果:
RESULT
¥2,500.00
¥1,450.00
¥1,400.00
¥1,450.00
¥1,550.00
…
select to_char(-10,‘999PR’) as result
from dual;
//運行結果:
RESULT
<10>
日期轉為字符的常用格式:

例如
select to_char(sysdate,'yyyy mm MONTH mon MON D DD DDD DAY DY')
from dual;
select to_char(sysdate,'dd-mm-yy')
from dual;
select to_char(sysdate,'yy-mm-dd')
from dual;
select to_char(sysdate,'yy-mm-dd hh24:mi:ss')
from dual;
select to_char(sysdate,'yy-mm-dd hh:mi:ss AM')
from dual;
2.TO_NUMBER ,把字符轉換為數字
例如,
select to_number('1000') //不能寫abc這種字符,不能轉換為數字,會報錯
from dual;
-
TO_DATE ,把字符轉換為日期
select to_date('10-12-2022','dd-mm-yyyy') as result from dual; alter session set nls_language='simplified chinese'; select to_date('25-5月-22','dd-month-yy') as result from dual;
聚合函式,也可以稱為多行函式、分組函式、組函式,它可以操作多行資料,并回傳一個結果,一般會
結合著group分組來使用,當然也可以單獨使用,那么默認全部資料就是一個小組,
例如,查詢id小于5的所有員工的平均工資
select avg(salary)
from s_emp
where id<5;
//運行結果:
AVG(SALARY)
\-----------
1700
例如,查詢每個部分的員工人數、以及該部門的平均工資,并且按照平均工資的降序排序
select dept_id,count(*),avg(salary) as avgSalary
from s_emp
group by dept_id
order by avgSalary desc;
//運行結果:
DEPT_ID COUNT(*) AVGSALARY
---------- ---------- ----------
50 2 2025
33 1 1515
32 1 1490
10 1 1450
35 1 1450
31 2 1400
41 4 1247.5
34 2 1160
45 3 1089
42 3 1081.66667
44 2 1050
DEPT_ID COUNT(1) AVGSALARY
---------- ---------- ----------
43 3 900
2.6 函式嵌套
以上介紹的常用函式,在資料型別正確的情況下,是可以嵌套使用的,
例如,先把’hello’和’world’連接起來,再轉換為全部字母大寫,然后再從第4個字符開始,連著截取4個字符
select substr(upper(concat('hello','world')),4,4) as result
from dual;
注意,函式f1的回傳型別,必須是函式f2的引數型別,那么它們之間才可以嵌套
啞表
Oracle中,有一張特殊的表:dual
dual被稱之為啞表,它是一個單行單列的虛擬表,是Oracle內部自動創建的,這個表只有1列:DUMMY,
資料型別為VERCHAR2(1),dual表中只有一個資料’X’,Oracle有內部邏輯保證dual表中永遠只有一條數
據,
在實際使用中,Dual表主要用來選擇系統變數或求一個運算式的值,因為要使用dual來構造完成的查詢
語法
例如,查詢運算式1+1的結果
select 1+1
from dual;
//運行結果:
1+1
----------
2
注意,按照sql陳述句的要求,沒有表就沒法查詢,而運算式1+1,不屬于任何表,那么就有了啞表
dual的概念了
3 多表查詢
多表查詢,又稱表聯合查詢,即一條sql陳述句涉及到的表有多張,表中的資料通過特定的連接,進行聯合顯示
3.1 笛卡爾積
在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y
例如,假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b,
2)},
在資料庫中,如果直接查詢倆張表,那么其查詢結果就會產生笛卡爾積,
例如,
select count(*)
from s_emp;
select count(*)
from s_dept;
select count(*)
from s_emp,s_dept;
注意,s_emp表中25條資料,s_dept表中12條資料,查詢倆張表,資料倆倆組合,會得到300條資料
其實,s_emp表中的每一條資料,和s_dept表中的每一條資料進行倆倆組合,這里面大多數的資料是沒
有意義的,為了這種避免笛卡爾積的產生,在多表查詢的時候,可以使用連接查詢來解決這個問題,
? 連接查詢又可以大致分為:
-
等值連接
利用一張表中某列的值,和另一張表中某列的值相等的關系,把倆張表連接起來,滿足條件的資料才會組合
例如,查詢員工的名字、部門編號、部門名字
select last_name,dept_id,s_dept.id,name from s_emp,s_dept where s_emp.dept_id=s_dept.id; -
不等值連接
-
外連接
左外連接
右外連接
全連接
-
自連接
嵌套查詢
查詢工資 大于Simth的
select salary,last_name
from s_emp
where salary>(
select salary
from s_emp
where last_name='Smith'
);
例如,查詢平均工資比 41號部門的平均工資 高 的部門中員工的資訊
第一步,查詢41號部門的平均工資
select avg(salary)
from s_emp
where dept_id=41;
//運行結果: AVG(SALARY)
-----------
1247.5
第二步,查詢平均工資比1247.5高的部門編號
select dept_id
from s_emp
group by dept_id
having avg(salary)>1247.5;
//運行結果: DEPT_ID
----------
313235503310 已選擇6行,
第三步,查詢平均工資比1247.5高的部門中員工資訊
select last_name,salary,dept_id
from s_emp
where dept_id in(10,31,32,33,35,50);
第四步,把in條件后的資料進行替換
select last_name,salary,dept_id
from s_emp
where dept_id in(
select dept_id
from s_emp
group by dept_id
having avg(salary)>1247.5
);
第五步,把1247.5進行替換
select last_name,salary,dept_id
from s_emp
where dept_id in(
select dept_id
from s_emp
group by dept_id
having avg(salary)>(
select avg(salary)
from s_emp
where dept_id=41 )
);
分頁查詢
偽列
select t.id,t.last_name,t.dept_id
from (
select rownum rn,id,last_name,dept_id
from s_emp
where rownum<=10
) t
where t.rn>=6;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/304039.html
標籤:區塊鏈
上一篇:Oracle放大招:MySQL 即將支持 Hash Join
下一篇:論動態 Dp
