SQL語句學(xué)習(xí)
(高手就不要笑話了^_^)。
好了,其他的不說現(xiàn)在就開始:
select 子句主要決定了從表中取出的列名,列數(shù)以及列的顯示順序等信息,"*"表示查詢所有的列,有關(guān)select的用法應(yīng)該結(jié)合其它子句的用法。
1.from 子句:
①from子句用于指定被查詢的表,試圖或快照。
②如果指定多個實體,用逗號講它們分割。為了查詢方便,特別是進(jìn)行自連接查詢時,可以給表起別名。(這里我要說很多剛開始使用sql的朋友開始的時候總覺得這個很簡單,沒有什么可學(xué)的,可是到后來在做一些復(fù)雜的sql的時候總是想不起來這一點導(dǎo)致其實不難的sql語句無從下手)。
③如果被查詢的實體不在當(dāng)前的模式中,則必須用模式名來限定該對象。
select *from admin.emp
④若查詢遠(yuǎn)程數(shù)據(jù)庫中的實體,必須使用數(shù)據(jù)庫鏈路,如果查詢分區(qū)表中某個分區(qū)的數(shù)據(jù),則必須使用關(guān)鍵字Partition來指定分區(qū)名。
select *from emp@cbf107
select *from emp partition(A_hiredate)
2.where 子句
where 子句用于限定處理的行數(shù),選擇滿足條件的行,where 子句中的任何邏輯條件都使用比較運(yùn)算符,滿足where子句中邏輯條件的數(shù)據(jù)被返回或者被處理,在where子句中可以使用列名或表達(dá)式。
select ename from emp where deptno=10
①如果列類型為字符型,where ename='smith';(單引號內(nèi)字符串大小寫有區(qū)別)
②列類型為數(shù)字型deptno=20;
③如果列值取其他列值,可用如下形式表示
where emp.depno=dept.deptno
④in 與 not in 擇列的值與值列表中某一個值相符的相關(guān)行信息(如果進(jìn)行"或操作")
查詢表EMP中有那些雇員和分析員
select name,job from emp where job in ('clerk','analyst');
查詢表EMP中有那些人不是雇員和分析員
select name,job from emp where job not in ('clerk','analyst');
有那些雇員的工資在/不在2000~3000之間
select ename,job,sal from emp where sal between 2000 and 3000;
select ename,job,sal from emp where sal not between 2000 and 3000
select ename,oeptno from emp where ename like 's%';
"%" 匹配0個或n個長度的字符串,而"_"僅匹配一個字符。假如查詢條件中本身含有"_"或"%",為了與模式匹配符"_"和"%"區(qū)分,必須在like運(yùn)算符中加ESCAPE"%子句.
查詢雇員名以A_開始的行
select *from emp where ename like 'a\_%' ESCAPE '\';
is null 和 is not null
空值(null)不等同于0,0是一個數(shù)字,而空值表示未知的,不存在的或不可用的數(shù)據(jù).它不能像0那樣進(jìn)行算術(shù)運(yùn)算,null用于查詢列值為空值或非空的信息。
在Oracle的RDBMS中,null(空值)不占空間,判斷某一列值是否為空,不能用"="或"!="運(yùn)算符號,而要用is null或is not null。
選擇沒有獎金的雇員信息
select ename,job from emp where comm is null
3.order by
在關(guān)系型模式中,行是沒有順序可言的。order by 子句確定的行信息顯示時的先后順序,當(dāng)按多列進(jìn)行排序時,首先由第一個列名確定順序,其次由第二個列名確定順序。
先按工資的降序排列,在工資相同的情況下,按姓名的字母順序排列
select
ename employee,
sal salary
from
emp
where
deptno=30
order by
sal desc employee;
假如在select子句中使用distinct關(guān)鍵字,在order by 子句中只能使用select 子句中列出來的列名,不能使用列的別名。
在查詢語句中不僅可以使用列名或列的別名進(jìn)行排序,也可以使用在select 子句中列的位置進(jìn)行排序。(select 子句中有一個很長的表達(dá)式,并且要用此表達(dá)式的結(jié)果進(jìn)行排序時用列的位置是很有用的)。對于涉及集合操作:union,minus的查詢,不能使用列名,在這種情況下,必須提供列的位置。
select
'name:'||ename "employee",
sal "salary",
from
emp
where
deptno=30
order by
2,1;
4.group by
在select 語句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個組的匯總信息,另外,可以使用having子句限制返回的結(jié)果集。group by 子句可以將查詢結(jié)果分組,并返回行的匯總信息Oracle 按照group by 子句中指定的表達(dá)式的值分組查詢結(jié)果。
在帶有g(shù)roup by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數(shù)
select max(sal),job emp group by job;
(注意max(sal),job的job并非一定要出現(xiàn),但有意義)
查詢語句的select 和group by ,having 子句是聚組函數(shù)唯一出現(xiàn)的地方,在where 子句中不能使用聚組函數(shù)。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
當(dāng)在gropu by 子句中使用having 子句時,查詢結(jié)果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用于設(shè)置限定條件
where 子句的作用是在對查詢結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個分組標(biāo)準(zhǔn)進(jìn)行分組。
查詢每個部門的每種職位的雇員數(shù)
select deptno,job,count(*) from emp group by deptno,job;
5.多表連接
笛卡爾連接就是指從多張表中取數(shù)據(jù)時,在where子句中沒有指定多張表的公共關(guān)系(即一張表中取出每條記錄與另一張表中的每條記錄作連接)。假如第一張表中有M條記錄,而第二張表中用N條記錄,結(jié)果是M*N條記錄。要盡量避免產(chǎn)生笛卡爾連接。所以一般有N張表連接,至少有N-1個連接條件。
select
D.dname,D.Loc,E.ename,e.sal
from
delpt D,emp E
where
D.deptno=E.deptno;
一但定義了表的別名,在本條select語句中就不能用表名去限制列名,應(yīng)該用表的別名去限制別名。
哪些雇員的工資屬于第三級別?
select
empno,ename,sal
from
emp,salgrade
where
grade=3
and
sal between losal and hisal;
找出emp表中的每一雇員屬于哪一等級。
select
empno,ename,sal,grade
from
emp,sal,grade
where
emp.sal between lowsal and hisal.
5.外連接與內(nèi)連接
有時候,即使在連接的表中沒有相應(yīng)的行,用戶可能想從一張表中看數(shù)據(jù),Oracle提供了外連接實現(xiàn)該功能。
內(nèi)連接是指連接查詢只顯示完全滿足連接條件的記錄,即等值連接,外連接的查詢結(jié)果是內(nèi)連接查詢結(jié)果的擴(kuò)展。外連接不僅返回滿足連接條件的所有記錄而且也返回了一個表中那些在另一個表中沒有匹配行的記錄。外連接的操作符是“+”?!?”號放在連接條件中信息不完全的那一邊(即沒有相應(yīng)行的那一邊)。運(yùn)算符“+”影響NULL行的建立。建一行或多行NULL來匹配連接的表中信息完全的行。
外連接運(yùn)算符“+”只能出現(xiàn)在where子句中表達(dá)式的一邊。
假如在多張表之間有多個連接條件,外連接運(yùn)算符不能使用or,in邏輯運(yùn)算符與其它條件組合。
假如emp表中deptno=10的ename為空值,dept表中deptno=20的loc為空值:
1.
select
ename,dept.deptno,loc
from
emp,dept
where
emp.depno(+)=dept.deptno;
如果在dept.deptno中有的數(shù)值在emp.deptno中沒有值,則在做外連接時,
結(jié)果中ename會產(chǎn)生一個空值。(emp.deptno=10)
2.
select
ename,dept.deptno,loc
from
emp,dept
where
emp.depno=dept.deptno(+);
如果在emp.deptno中有的數(shù)值在dept.deptno中沒有值,則在做外連接時,
結(jié)果中l(wèi)oc會產(chǎn)生一個空值。。(dept.deptno=20)
5.自連接
自連接是指同一張表的不同行間的連接。該連接不受其他表的影響。用自連接可以比較同一張表中不同行的某一列的值。因為自連接查詢僅涉及到某一張表與其自身的連接。所以在from子句中該表名出現(xiàn)兩次,分別用兩個不同的別名表示,兩個別名當(dāng)作兩張不同的表進(jìn)行處理,與其它的表連接一樣,別名之間也使用一個或多個相關(guān)的列連接。為了區(qū)分同一張表的不同行的列,在名前永別名加以限制。
select
worker.ename,
manager.ename manager
from
emp worker,
emp manager
where
work.mgr=manager.empno;
7.集合運(yùn)算
基合運(yùn)算符可以用于從多張表中選擇數(shù)據(jù)。
①UNION運(yùn)算
用于求兩個結(jié)果集合的并集(兩個結(jié)果集合的所有記錄),并自動去掉重復(fù)行。
select ename,sal from account where sal>2000
union
select ename,sal from research where sal>2000
union
select ename,sal from sales where sal>2000;
注:ename,sal 是必須一致的。
②UNION ALL運(yùn)算
用于求兩個結(jié)果集合的并集(兩個結(jié)果集中的所有記錄)源碼天空,并且不去掉重復(fù)行。
select ename,sal from account where sal>2000
union
select ename,sal from research where sal>2000
union
select ename,sal from sales where sal>2000;
③INTERSECT運(yùn)算
intersect運(yùn)算返回查詢結(jié)果中相同的部分。
各部門中有哪些相同的職位?
select Job from account
intersect
select Job from research
intersect
select Job from sales;
④MINUS運(yùn)算
minus返回兩個結(jié)果集的差集。(在第一個結(jié)果集中存在的,而在第二個結(jié)果集中不存在的行。)
有那些職位是財務(wù)部中有,而在銷售部門中沒有?
select Job from account
minus
select Job from sales;
相關(guān)文章
經(jīng)常使用的JDBC連接數(shù)據(jù)庫方式
在我們開發(fā)中,幾乎脫離不了連接數(shù)據(jù)庫。并且無論是使用框架還是硬編碼連接數(shù)據(jù)庫,都避免不了寫驅(qū)動類以及連接url。為了方便我們的開發(fā),我們收藏常用的jdbc連接數(shù)據(jù)庫方式。2013-04-04IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法
這篇文章主要介紹了IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Navicat Premium15安裝及破解教程詳解親測有效(附破解失敗解決方案)
這篇文章主要介紹了Navicat Premium15安裝及破解教程詳解親測有效,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11一款高顏值且免費(fèi)的 SQL 開發(fā)工具之Beekeeper Studio詳解
今天給大家推薦一款適用于Windows,Linux和Mac的跨平臺免費(fèi)的開源SQL編輯器和數(shù)據(jù)庫管理應(yīng)用程序 —— beekeeper-studio。對Beekeeper Studio 安裝使用教程感興趣的朋友一起看看吧2021-09-09