用戶對錶或視圖最常進行的操做就是檢索數據,檢索數據能夠經過 select 語句來實現,該語句由多個子句組成,經過這些子句完成篩選、投影和鏈接等各類數據操做,最終獲得想要的結果。算法
語法:express
select { [ distinct | all ] columns | * }函數
[ into table_name ]測試
from { tables | views | other select }spa
[ where conditions]code
[ group by columns ]orm
[ having conditions ]排序
[ order by columns ]開發
只包含select 子句和 from 子句的查詢就是簡單查詢,同時也是select語句的必選項。字符串
select 子句用於選擇想要在查詢結果中顯示的列,這些列能夠用列名來表示,也可使用星號(*)來表示。查詢數據時,數據將按照select 子句後面指定的列名順序來顯示;若是使用星號,則表示查詢全部的列,這時候按照表結構的天然順序來顯示。
若是想要檢索知道數據表的全部列,在select 子句後面加星號來實現。
語法: select * from table_name;
注意:a、檢索數據表須要注意是否屬於該模式,若是是模式內部檢索數據,直接使用表名;
b、若是不在指定表所屬的模式內部檢索數據,不只要查看當前模式是否具備查詢的權限,並且還要在表名前面駕駛所屬的模式名稱
c、 form 後面能夠跟多個表名,每一個表名直接用逗號隔開便可
若是想要顯示指定的列而不是所有的列,而且被指定列的順序不受限制,指定部分列也稱爲投影操做。須要把所顯示的列緊跟在select 關鍵字後面,每一個列名用逗號隔開。
語法:select column_name1,column_name2,column_name3... from table_name;
在使用select 語句時,對於數字數據和日期數據均可以使用算數表達式,可使用算數運算法,包括加、減、乘、除和括號操做。不只能夠執行單獨數學運算,還能夠執行單獨的日期運算以及與列名關聯的運算。
語法:select salary*(1+0.1,sal from emp;
爲了方便查看查詢結果,能夠爲須要的列名指定別名。在 Oracle 系統中,可使用as 關鍵字來指定別名,也能夠什麼也不用直接指定。
語法: select empno as "員工編號",ename "員工名稱" from emp;
在默認狀況下,結果集中包含全部符合查詢條件的數據行,這樣就可能出現重複的數據。在實際應用中,重複的數據可能不會帶來太多的價值,須要去掉重複的記錄,保留惟一記錄便可。使用 distinct 便可實現。
語法: select distince job from emp;
在 select 語句中使用where 子句能夠實現對數據行的篩選操做,只有知足where 子句中的判斷條件纔會顯示在結果集中。
語法:
select columns_list from table_name where conditional_expression;
經常使用的集中篩選狀況:
能夠在 where 子句中使用比較運算符來篩選數據,這樣只有知足條件的數據行纔會被查詢到,主要由下面6中狀況:
a、A=B : 比較 A 與 B 是否相等
b、A!B 或 A <>B : 比較 A 與 B 是否不相等
c、A > B : 比較 A 是否大於 B
d、A < B :比較 A 是否小於 B
e、A >= B : 比較 A 是否大於或等於 B
f、A <= B : 比較 A 是否小於或等於 B
除了上面的6種,還有兩個特殊的「比較篩選」操做
g、A { operator }ANY (B) :表示 A 與 B 中的任何一個元素進行operator 運算符的比較,只要有一個比較值爲true,就返回數據行
h、A { operator } ALL (B):表示 A 與 B 中的全部元素都進行 operator 運算符的比較,只有與全部元素比較值都爲 true,才返回數據行
下面看一個例子:
SQL > select empno,ename,sal from emp where sal <> all (3000,950,800);
表示從emp 表中使用 all 關鍵字過濾工資(sal) 同時不等於300、950和800的數據行。
SQL 語言提供了 like、in、between 和 isnull 等關鍵字來篩選匹配的數據,下面一項項來看:
(1)Like 關鍵字
在 where 子句中使用 like 關鍵字查詢數據的方式也稱爲字符串模式匹配或字符串模糊查詢。like 關鍵字須要使用通配符在字符串內查找指定的模式,經常使用的通配符有下劃線 「_」,表明任意一個字符;百分號 「%」,表明任 意數量的字符。
EG: SQL> select name,job from emp where name like "S%" and job like "K_";
表示從emp表中查詢 名字以 「S」 開頭且任意長度的字符串,而且 job 是以 「K」 開頭長度爲 2 的字符串
注意:能夠在 like 關鍵字前面加上 not,表示否認的判斷,固然也能夠在 in ,between ,isnull 和 isNAN 等關鍵字前面加上 not 來表示否認的判斷。
(2)IN 關鍵字
當測試一個數據值是否匹配一組目標中的一個時,一般用 IN 關鍵字來指定列表搜索條件。
格式: value in (value1,value2,value3......)
EG : SQL > select name from job where name in ("Tom", "Emma","Tony");
表示從emp 表中查詢 名字在列表中的數據行 。
(3)Between 關鍵字
須要返回某一個數據值是否位於兩個給定的值之間,可使用範圍條件進行查詢。一般使用 between... and 和 not between...and 來指定範圍條件。
使用 between ....and 的條件時,指定的第一個值必須小於第二個值。其實等價於比較運算符(>= ... <=).
EG: SQL > select sal from emp where sal between 2000 and 3000;
表示從emp 表中查詢工資大於等於2000而且小於等於3000的數據行。
(4)ISNULL關鍵字
空值(NUll)從技術上來講就是位置的、不肯定的值,但空值與空字符串不一樣,空值是不存在的值,而空字符串是長度爲 0 的字符串。
空值表明的是未知的值,可是並不能用空值來互相比較,這點須要特別注意。
EG: SQL > select address from student where address is null;
表示從 student 表中查詢住址目前爲空值的數據行
使用邏輯運算符 AND、OR、NOT能夠進行邏輯篩選,能夠把多個篩選條件組合起來,這樣便於獲取更加準確的數據記錄。
AND 表示兩個表達式之間 「邏輯與」 的關係,須要知足多個兩個或者多個表達式才能成立。
OR 表示兩個表達式「邏輯或」 的關係,兩個表達式中有一個爲 true,則這個邏輯表達式的值就爲 true。
NOt 表示對錶達式執行「邏輯非」 的運算。
數據分組的目的是用來彙總數據或爲整個分組顯示單行的彙總信息,一般在查詢結果集中使用 group by 子句對記錄進行分組。
語法:
select columns_list from table_name [ where conditional_expression ] group by columns_list [ having contion_expression] ;
group by 子句能夠基於指定某一列的值講數據集合劃分爲多個分組,同一組內全部記錄在分組屬性上具備相同值,也能夠基於指定多列的值將數據集合劃分爲多個分組。
EG:SQL > select deptno,job from emp group by deptno,job order by deptno;
表示按照部門編號(deptno) 和職務(job)列進行分組。
group by子句常常和聚合函數一塊兒使用。
EG:SQL > select deptno as 部門編號,avg(sal) as 平均工資 from emp group by deptno;
表示按照部門進行分類,而後計算每個部門的平均工資。
having子句能夠進行再次篩選
EG:SQL > select deptno as 部門編號,avg(sal) as 平均工資 from emp group by deptno having avg(sal) > 200;
表示按照部門進行分組查詢,而後經過having子句直接過濾出平均工資大於200的部門信息。
查詢數據時,查詢結果將按照默認的順序排列,每每並不能知足咱們的需求。咱們可使用order by 子句對檢索的結果進行排序。
語法:
select columns_list from table_name [ where conditional_expression ] [ group by columns_list ] [ order by { order_by_expression [ ASC| DESC ] } ] [,...n]
order by 子句能夠根據查詢結果中的一個列或多個列對查詢結果進行排序,而且第一個排序項是最主要的排序依據,剩下的是次要的排序依據。
EG:SQL > select deptno,empno from emp order by deptno ,empno;
表示先按照部門編號進行升序排序,若是有相同項,按照員工編號進行升序排序。
在實際應用中查詢數據可能會涉及多個數據表,每一個表不是獨立存在的,而是若干個表之間的信息存在必定的關係,當查詢一個表的信息時,極可能須要查詢關聯數據表的信息,這就是多表關聯查詢。
在進行多表查詢時,若是多個表之間存在同名的列,則必須使用表名來限定列的引用。SQL 語言提供了設定表別名的機制,使用簡短的表別名就能夠替代原有較長的表名稱,能夠大大縮短語句的長度。
EG:SQL > select e.empno as 員工編號,e.ename as 員工名稱, d.dname as 部門 from emp e,dept d where e.deptno = d.deptno and e.job ="Manager";
表示經過部門號(deptno)來管理emp表和dept表,並查詢這兩個表中相關字段的信息。
注意:一旦在from 子句中爲表指定了列名,則必須在剩餘的子句中都使用表別名。
內鏈接是經常使用的多表關聯查詢,使用關鍵字inner join來實現,其中,inner 關鍵字能夠省略,使用 join 即表明內聯接。使用內聯接查詢多個表時,必須在 from 子句以後定義一個 on 子句,用來指定兩個表實現內聯接的「鏈接 條件」。
使用內聯接進行多表查詢時,返回的查詢結果是隻包含查詢條件和鏈接條件的行,消除了與另外一個表中任何行不匹配的行。
注意:在內聯接的查詢結果中,全部記錄行都是知足鏈接條件的。
語法:
select column_list
from table_name1 [ innter ] join table_name2
on join_condition;
EG: SQL > select e.empno as 員工編號, e.ename as 員工名稱,d.dname as 部門 from emp e inner join dept d on e.deptno = d.deptno;
表示經過 deptno 字段來鏈接emp 表和 dept表,並查詢兩個表中相關的字段。
多表之間進行外鏈接時,除了返回全部匹配的行外,還會返回一部分或所有不匹配的行,這主要取決於外鏈接的種類,主要由如下3種:
(1)、左外鏈接:關鍵字爲left Outer join 或 left join
左外聯接的結果集包括 LEFT OUTER子句中指定的左表的全部行,而不只僅是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值。
EG:select e.empon,e.ename,e.job,d.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;
表示從員工表(emp)表中查詢出來全部的記錄並查詢部門表(dept)中兩個deptno值相等的記錄,若是沒有相匹配的行,均爲空值。
(2)右外鏈接:關鍵字爲 right outer join 或 right join
右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。
EG:select e.empno,e.ename,e.job,d.deptno,d.name from emp e right join dept d on e.deptno = d.deptno;
表示從部門表(dept)中查詢出來全部的記錄,並查詢員工表(emp)表中與之deptno 對應的記錄,若是沒有匹配的行,均爲空值。
(3) 徹底外鏈接:關鍵字爲 full outer join 或 full join
完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。
EG:select e.empno,e.ename,e.job,d.deptno,d.dname from emp e full join dept d on e.deptno = d.deptno;
表示查詢兩個表中全部的deptno的記錄,若是對方的表中沒有匹配的行,置爲空值。
天然鏈接是指在查詢多個表時,Oracle 會將第一個表中的列與第二表中具備相同名稱的列進行自動鏈接。天然鏈接中,用戶不須要指定進行連續的列,這個任務由 Oracle 系統西段完成,天然鏈接使用「Natural join」關鍵字。
EG: select empno,ename,job,dname from emp natural join dept where sal > 200;
表示在emp表中查詢工資(sal)大於2000的記錄,並實現emp表與dept 表的天然鏈接。
注意:天然鏈接強制要求表之間必須具備相同的列名稱,可是在實際開發中不多用到。在使用天然鏈接時,不能爲列指定限定詞(即表名或表的別名),不然Oracle 會報錯。
在開發中,用戶可能會擁有「自引用式」的外鍵,是指表中的一個列能夠是該表主鍵的一個外鍵。
EG:
交叉鏈接實際上就是不須要任何鏈接條件的鏈接,它使用 cross join 關鍵字來實現。
語法: select colums_list from table_name1 cross join table_name2;
交叉鏈接的執行結果是一個笛卡爾積,這種查詢很是冗餘,但能夠經過where 子句來過濾出有用的記錄。
圖解:
------------------------------------------------------------------------------------------------------------------------------------------------
表A Id name 表B ID job p_id
1 張三 1 25 1
2 李四 2 36 2
3 王五 3 36 4
a.id與b.p_id存在關係
-----------------------------------------------------------------------------------------------------------------------------------------------
(1)內鏈接
SQL > select a.*,b.* from a inner join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 張三 1 25 1
2 李四 2 36 2
----------------------------------------------------------------------------------
(2)左外鏈接
SQL > select a.*,b.* from a left join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 張三 1 25 1
2 李四 2 36 2
3 王五 null null null
----------------------------------------------------------------------------------
(3)右外鏈接
SQL > select a.*,b.* from a right join b where a.id=b.p_id;
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 張三 1 25 1
2 李四 2 36 2
null null 3 36 4
----------------------------------------------------------------------------------
(4)徹底鏈接
SQL > select a.*,b.* from a full join b on a.id=b.p_id
---------------------------------------------------------------------------------
a.Id a. name b.id b.job b.p_id
1 張三 1 25 1
2 李四 2 36 2
null null 3 36 4
3 王五 null null null
----------------------------------------------------------------------------------