主頁 > 區塊鏈 > 關系型資料庫與非關系型資料庫的分類以及oracle資料庫語法總結

關系型資料庫與非關系型資料庫的分類以及oracle資料庫語法總結

2021-09-29 12:07:24 區塊鏈

資料庫(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.轉換函式

轉換函式,可以將一個型別的資料,轉換為另一種型別的資料

轉換函式主要有三種:

  1. 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;
  1. 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表中的每一條資料進行倆倆組合,這里面大多數的資料是沒

有意義的,為了這種避免笛卡爾積的產生,在多表查詢的時候,可以使用連接查詢來解決這個問題,

? 連接查詢又可以大致分為:

  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. 外連接

    左外連接

    右外連接

    全連接

  4. 自連接

嵌套查詢

查詢工資 大于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

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more