Oracle數據查詢與高級查詢(內連接、外連接、交叉連接)

基本查詢

查詢語句是使用最頻繁的數據庫訪問語句,

select語句查詢執行步驟

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

###爲列設置別名
默認情況下,在顯示數據時,各列的標題就是列的名稱,在select語句中可以定義列的別名,這樣在顯示數據時,列的標題就是這個別名,在整個SQL語句中都可以使用這個別名。使用別名的select語句格式

select 列1 [as] 別名 1 ,列2 [as] 別名 2 ...

利用distinct獲得唯一性記錄

有時需要提高檢索效率,不需要查詢重複的數據,重複數據是指在select語句中涉及所有列值完全相同的行。在Oracle中提供了關鍵字distiinct來實現查詢獲得唯一性的記錄。

select distinct 列名1,... from 表名

使用distinct關鍵字後,就能夠從返回的結果集彙總刪除重複的行,使返回的結果更簡潔。

返回查詢的部分結果

在Oracle中提供了關鍵字rownum,讓用戶指定返回一定數量的數據。當查詢到的數據量非常大,且沒有必要對所有的數據進行瀏覽時,使用rownum關鍵字查詢可以大大減少查詢花費的時間。
查詢結果是320條,現在用rownum關鍵字查詢前10條記錄

select customer_id as 顧客編號,cust_first_name 顧客姓名 from customersnew
select customer_id as 顧客編號,cust_first_name 顧客姓名 where rownum < 11;

簡單條件查詢

在前面所列舉的查詢中,由於沒限制條件,所以查詢結果包含表中的所有行。如果只查詢到自己希望得到的,那麼可以通過where子句指定條件。where子句的作用是通過指定條件,使得select語句僅僅查詢符合條件的行。

where子句

where子句指定的條件是一個關係表達式,如果關係表達式的結果爲真,則條件成立,否則條件不成立。關係表達式用於比較兩個表達式的大小,或者進行模糊匹配,或者將一個表達式的值與一個集合中的元素進行匹配。

select 列名1,列名2,... where 條件

在查詢中使用比較表達式

比較表達式可以是常量、變量和列表達式的任意組合,在where子句中可以使用的比較運算符包括:=、!=、>、>=、<、<=。表達式的使用比較簡單。

select customer_id,cust_first_name,city,credit_limit from customersnew where credit_limit >= 500000;
select customer_id,cust_first_name,account-mgr-id from customersnew where account_mgr_id != 149;

使用簡單邏輯表達式

** 1.and運算符

select customer_id,credit_limit from customersnew where city='Bangalore' and credit_limit >= 500000;

** 2.or運算符**

select customer_id,credit_limit from customersnew where city='Bangalore' or credit_limit >= 500000;

3.not運算符

select customer_id,credit_limit from customersnew where not account_mgr_id = 149;

指定數據範圍

1、使用between查詢

select customer_id,credit_limit from customersnew where credit_limit between 20000 and 250000;
select customer_id,credit_limit from customersnew where credit_limit not between 20000 and 250000;

2、使用in查詢

select customer_id,credit_limit from customersnew where customer_id in(101,102,103);

有關null值判斷

select customer_id,credit_limit from customersnew where credit_limit not nls language='us' or nls_language is null;

like進行模糊查詢

select 列名1,列名2,,,,from 表名 where 表達式 like 條件;

order by子句

數據顯示的順序是不可預知的,如果需要檢索到的結果集進行排序,此時就要藉助order by子句。order by子句對查詢到的數據按照指定列的大小排序。如果指定了多個排序列,則首先按照第一個排序列排序。如果這個列的值相同,則再按第二個排序列繼續排序。排序方式包括asc和desc,分別表示升序和降序排序。二者可選其一,默認的排序方式是升序排序。如果定義了多個排序列,可分爲每個排序列單獨指定排序方式。

select * from 表名 order by 列名(desc)
select customer_id,cust_first_name from customersnew order by customer_id;

group by子句

有時需要對查詢數據進行分組統計,在Oracle中提供了group by子句來實現其功能。group by語句經常和聚集分組函數一起使用,常用的分組函數如下:
COUNT MIN MAX SUM AVG

select 組名1,組名2,... from 表名 group by 組名;

having子句

select 組名1,組名2,...from 表名  group by 組名 having 組限制條件;
select sales_rep_id,sum(order_total) from orders group by sales_rep_id having sum(order_total)>150000;

**having子句必須使用分組函數,可以是select 語句中已經出現的分組函數,也可以是沒有出現的函數,雖然having子句和where子句都是用來設置條件的,但是where子句設置的條件是在查詢時起作用的,它決定查詢是什麼樣的數據,如果要進行統計,這樣的條件在統計之前就已經起作用了。而having子句設置的條件只有在進行統計後才起作用,它決定了對於統計產生的數據,那些需要顯示給用戶。
在數據庫查詢中,Oracle先執行group by子句,然後才進行排序操作,分組是將數據表的所有記錄以某列或者某些列爲標準劃分爲一組。

高級查詢

實際的數據庫操作中,往往需要同時從來自兩個或兩個以上的表中查詢相關數據,連接就是滿足這些需求的技術。主要介紹子查詢、聯合語句、單表關聯語句以及多表查詢的相關使用

連接簡介

很多情況下,需要查詢的數據往往涉及多個表,這是需要對多個表進行連接查詢。通過連接,可以根據各個表之間的邏輯關係從兩個或多個表中檢索數據。如,既要查詢訂單信息,又要查詢訂單所在城市的信息,這就涉及orders和customersnew兩個表。

連接的定義

多表連接實際上就是實現如何使用一個表中的數據來選擇另一個表中的行,而連接則主要通過以下方法定義兩個表在查詢中的概念了關係。
指定每個表中要用於連接的列,典型的連接條件是在一個表中指定外鍵,在另一個表中指定與其關聯的鍵。
**指定比較各列的值要使用邏輯運算符(=、<>)
在select語句中實現多表連接並不是一個物理存在的實體。換句話說,他在數據表中並不在,他只是由數據庫系統在需要時創建的,只在查詢、檢索數據期間有效。

連接的類型

連接體現在where子句中指定的條件上,在條件中指定兩個表通過哪些列進行連接。一般進行連接查詢的兩個表是通過主鍵和外鍵進行關聯的,所以最簡單的條件是一個表的鍵與另一個表的主鍵相等。在SQL中,表的連接類型主要有以下幾種:
內連接:內連接是一種常用的多表查詢,其中inner可以省略,只使用join關鍵字表示內連接。使用內連接查詢多個表時,在from子句中需要定義一個on子句。內部連接包括同等連接和自然連接。
外連接:使用內連接時,只有在兩個表中匹配的行才能在結果集中出現,外連接可以只限制一個表,而對另一個表不加限制。外連接分爲左外連接、右外連接和全外連接。因爲內連接沒有左右之分,所以又稱左連接和右連接。左連接是對連接條件中左邊的表不加限制;右連接對右邊的表不加限制;全外連接對兩個表都不加限制,兩個表中的行都會出現在結果集中。
交叉連接:即沒有where子句的交叉連接時涉及的表的笛卡爾積。

簡單的多表查詢

表的連接實現最簡單的方法就是在select語句的from子句中,羅列要連接的表即可。進一步實現複雜的多表連接,則需要在from子句中使用join(inner join、outer join、cross join等)關鍵詞
** 1.如何實現多表查詢**
若要實現多表查詢,可以在from子句中通過join關鍵字連接需要查詢的表。簡單的多表查詢則可以不使用join關鍵字,而直接列出所要連接的表,利用逗號把from子句後的表名隔開。

select product_id,product_information.category_id,category_name from product_information,categories;

2、指定連接條件
直接使用from子句連接表時,返回的是兩個表的記錄的笛卡爾積,這種實際應用中意義不大。通常需要連接的兩個表的記錄的笛卡爾積,在實際應用中,通常需要連接兩個表的記錄滿足一定的關係。

select product_id,product_information.category_id,category_name from product_information,categories where product_information,categories where product_information.category_id = categories.category_id;

3、使用別名作爲表名的簡寫

select product_id,p.category_id,catogory_name from product_information p,categories ca where p.categories_id = ca.category_id;

4、自連接
在查詢信息時,有時需要將表與其自身進行連接,即自連接,這時需要爲表定義別名。

select c1.customer_id,c1.cust_first_name,c1.credit_limit
from customersnew c1,customersnew c2
where c2.customer_id = 839 and c1.credit_limit > c2.credit_limit 
order by c1.credit.limit;

在查詢中需要連接的表是customersnew,但分別去了不同的別名,這樣就可以在where子句中只用c2查詢編號爲839的顧客信息。使用子查詢的方式也可以實現該示例。

表的連接查詢

爲了在關係型數據庫中實現多表之間的聯繫,我們引入了連接查詢,連接用於指定多數據源(表、視圖)之間如何組合,以形成最終的數據源。前面介紹的表的連接是通過from子句列出要連接的表,結合使用where子句列出連接條件來實現。

自然連接

自然連接是將兩個數據源中具有相同名稱的列進行連接。在自然連接中,用戶不需要指定進行連接的列,系統會自動完成這一任務。連接後,相同的列只保留一個。
自然連接是一種比較特殊的等值連接,可以指定查詢結果包含那些列,但不能人爲指定那些列被匹配。自然連接有一個限制條件,即連接的各表之間必須具有相同名稱的列,並且不能爲該列指定限定詞。

select * from 表1 natural join 表2;

自然連接實際上自動指定了搜尋條件。這裏包含兩方面內容,首先,自然連接列必須同名,另外,所有的同名列都將作爲搜尋條件。自然連接與笛卡爾積的區別在於,無論何時,笛卡爾積都將獲得兩個數據表中所有記錄的兩兩組合。當兩個數據表中存在同名列時,Oracle同名列作爲搜尋條件,但是當兩個表不存在同名列時,Oracle不會添加任何搜尋條件,其效果相當於笛卡爾積。例如,表countries與表categories不存在同名列,這兩個表進行自然連接獲得的結果集與笛卡爾積相同。

select p.product-id,category_id,ca.category_name 
from product_information p 
natural join categories ca;
select * from countries natural join categories;

countries表中包含25行記錄,而表categories表中包含22行記錄,這兩個表笛卡爾積的結果是550條。

內連接

內連接也稱爲簡單連接,他會把兩個或多個表進行連接,最後只能查詢匹配的記錄,不匹配的記錄無法查詢出來。

select 語句 from 表1 inner join 表2 on 連接條件
select ord.order_id,cu.city,cu.phone_number
from orders ord inner join customersnew cu 
on ord.customer_id = cu.customer_id;

另外,內連接運算inner join中的inner關鍵字可以省略,語句如下:

select p.product-id,ca.category_id,ca.category_name
from product-information p 
join categories ca
on p.category_id = ca.category_id;

默認情況下,Oracle的連接爲內連接,在這裏,我們使用join來代替inner join可以實現相同的效果,而且寫法更簡潔。

外連接

外連接分爲左外連接,右外連接,全外連接。使用左外連接查詢時,返回的結果不僅僅是符合連接條件的行記錄,還包含了左邊表中的全部記錄,右外連接與左外連接相反。全外連接返回匹配成功的所有記錄,還包括了左、右表中未匹配成功的記錄。
1、左外連接
左外連接又稱爲左向外連接,如果左表的某行記錄表中沒有匹配項,則返回結果中,右表的所有選擇列表均爲空,左外連接使用語法

select 語句 from 表1 left join 表2 on 連接條件

2、右外連接
右外連接又稱爲右向外連接,與左外連接相反,將右邊表中所有數據與左表進行匹配,返回的結果顯示出了匹配成功的記錄

select 語句 from 表1 right join 表2 on 連接條件
select p.product_id,category_id,ca.category_name
from product_information p
right join categories ca

其中,right join將表product_information與表categories進行關聯,基礎表未運算符右側的categories
3、全外連接
返回所有匹配成功的記錄,並返回左表未匹配成功的記錄,也返回遊標未匹配成功的記錄。

select 語句 from 表1 full join 表2 on 連接條件
select p.product_id,category_id,ca.category_name from product_information p full join categories ca

全外連接是一個左連接和右連接的組合,如果連個數據源使用了全外連接,那麼將首先進行一次左連接,然後進行一次右連接,最後刪除其中的重複記錄,即得到完全連接。
在Oracle中,提供了外連接的加你了寫法,即在where條件中將附屬數據源的列使用(+)進行標識,從而省略left join/right join 以及on關鍵字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章