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