日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle判断数据出现交叉,Oracle!你必须要知道的Knowledge points(一)

發(fā)布時(shí)間:2025/3/8 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle判断数据出现交叉,Oracle!你必须要知道的Knowledge points(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、入門

oracle有四個(gè)用戶,分別為sys、system、sysman和scott,其中sys是oracle權(quán)限最高的用戶,類似于Linux

系統(tǒng)的root,scott是示例用戶,上課就以這個(gè)用戶里的三張員工表empno、dept、salgrade作為示例來授課。

啟動(dòng)服務(wù)

1. 快捷鍵ctrl+alt+del打開任務(wù)管理器

2. 選擇服務(wù)

3. 啟動(dòng)OracleServiceXXXX(XXXX是全局名字)和oracleXXXXXXXListener服務(wù)(選中一個(gè)按o快速找到哦)

這個(gè)非常重要(!important),沒有啟動(dòng)一切免談(記筆記.....)

驗(yàn)證數(shù)據(jù)庫是否創(chuàng)建成功

win+R+cmd打開windows命令行控制臺(tái)(小黑窗)

C:\User\PC>sqlplus /nolog

若出現(xiàn)SQL>則證明數(shù)據(jù)庫創(chuàng)建成功

登陸

語法格式:conn[ect] 用戶名/口令 [AS SYSDBA | AS SYSOPER]

注:中括號(hào)表示可以省略

登陸sys用戶

conn /as sysdba(用戶名和口令都為空)

只能以“sysdba”或者“sysoper”系統(tǒng)身份登錄 ,不能用 normal。

登陸scott用戶

剛開始scott用戶默認(rèn)被鎖定,需要登陸sys用戶之后執(zhí)行alter user scott account unlock;

并重新設(shè)置口令即可登陸,默認(rèn)口令是tiger

登陸:conn scott/tiger(password)

虛表

虛表不是真實(shí)存在的表,只有一個(gè)字段和一行記錄,當(dāng)需要查詢且不想從已存在的表中獲取數(shù)據(jù)時(shí)便可以使用虛表,更詳細(xì)的解釋你可以百度一下。

二、基礎(chǔ)

結(jié)構(gòu)查詢語言的分類

考試好像一直考,應(yīng)該蠻重要的吧。

SQL相關(guān)概念和規(guī)則

子句:關(guān)鍵字加其他語法元素,例如,select * 是一個(gè)子句,from table是一個(gè)子句。

列別名:列名 as 列別名 or 列名 列別名,需要注意的是若包含空格、需區(qū)分大寫以及含特殊字符時(shí),需加引號(hào)

關(guān)鍵字通常使用大寫,其他語法元素小寫,通常以子句為單位進(jìn)行分行。

NULL

空值是一種無效的、未被賦值的、未知的或不可用的值。任何包含空值的算術(shù)表達(dá)式運(yùn)算結(jié)果均為空值。(這一點(diǎn)需要注意)

處理空值的函數(shù)

nvl(comm,0):若comm不為空,就返回comm,否則返回0

nvl2(expr1,expr2,0):若expr1不為空,就返回expr2,否則返回0

NULLIF(expr1,expr2):數(shù)據(jù)類型需一致,相等返回null,否則返回第一個(gè)表達(dá)式

coalesce(expr1,expr2,...)返回第一個(gè)非空參數(shù),數(shù)據(jù)類型需一致

特殊運(yùn)算符

between and 判斷要比較的值是否在某個(gè)范圍內(nèi)。 eg: sal [not] between 1500 and 2000

in 判斷要比較的值是否和集合列表中的任何一個(gè)值相等。 eg: sal [not] in (1500,1600,1800)

like 判斷要比較的值是否滿足部分匹配。 eg: ename [not] like '%T_' 注:'%'代表任意多字符(>=0),下劃線代表一個(gè)任意字符

is null 判斷要比較的值是否為空值NULL 。 eg: where comm is [not] null

運(yùn)算符優(yōu)先級(jí)

()、算術(shù)運(yùn)算符(+-*/)、連接運(yùn)算符(||)、比較運(yùn)算符(<> 不等于)、特殊比較運(yùn)算符(like、in、between and、is null)、邏輯運(yùn)算符(not>and>or)

消除重復(fù)行

在select字句中使用關(guān)鍵字DISTINCT可消除重復(fù)行。

eg :select distinct deptno from emp;

原義字符串和連接運(yùn)算符

原義字符串

原義字符串是包含在SELECT列表中的一個(gè)字符、一個(gè)數(shù)字或一個(gè)日期。

日期和字符字面值必須用單引號(hào)引起來。

每個(gè)原義字符串都會(huì)在每個(gè)數(shù)據(jù)行輸出中出現(xiàn)。

連接操作符

用于連接列與列、列和字符

形式上是以兩個(gè)豎杠||

用于創(chuàng)建字符表達(dá)式的結(jié)果列

顯示表結(jié)構(gòu)

打開plsqldev(紅色油桶),打開Command Window,或者在windows控制臺(tái)上操作也行。

SQL>desc tablename;

SQL六個(gè)常用的執(zhí)行語句

select*

from table

where condition

group by column

having condition

order by column [asc|desc] asc升序,desc是降序

執(zhí)行順序:from > where > group by > having > select > order by

三、函數(shù)

單行函數(shù)

1. 單行函數(shù)返回一個(gè)結(jié)果

2. 支持嵌套

3. 單行函數(shù)可以放在select、where、order by子句中

4. 單行函數(shù)對(duì)單行數(shù)據(jù)操作

字符函數(shù)(大小寫轉(zhuǎn)換函數(shù)和字符處理函數(shù))

* lower(列名|表達(dá)式):將大寫或大小寫混合的字符轉(zhuǎn)換成小寫

* upper(列名|表達(dá)式) :將小寫或大小寫混合的字符轉(zhuǎn)換成大寫

* initcap(列名|表達(dá)式) :將每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換成大寫,其余的字母都轉(zhuǎn)換成小寫(這個(gè)不要漏了哦)

* concat(列名1,列名2):連接兩個(gè)字段或表達(dá)式,類似于||

* substr(列名|表達(dá)式,n1,n2):返回第一個(gè)參數(shù)中,從第n1位開始, 長(zhǎng)度為n2的子串 。

* length(column | expression):取字符長(zhǎng)度

* instr(s1,s2,[,n1],[n2]) :返回s1中,子串s2從n1開始,第n2次出現(xiàn)的位置。n1,n2默認(rèn)值為1

* lpad(s1,n1,s2):返回s1被s2從左面填充到n1長(zhǎng)度后的字符串 。

* rpad(s1,n1,s2) :返回s1被s2從右面填充到n1長(zhǎng)度后的字符串。

* trim:去除字符串頭部或尾部(頭尾)的字符

格式:TRIM([leading | trailing | both] character from source) 注意第一個(gè)參數(shù)和from

* replace(s1,s2,s3) : 把s1中的s2用s3替換。注意誰替換誰

用的比較多的是concat()、substr()、instr()、length()

數(shù)值函數(shù)

round(num,n):將num四舍五入到小數(shù)點(diǎn)后n位

trunc(num,n):將num截取到小數(shù)點(diǎn)后n位

mod(num,n):取num對(duì)n取余

日期函數(shù)

日期函數(shù)默認(rèn)格式是DD-MM-RR,SYSDATE是系統(tǒng)當(dāng)前時(shí)間

日期可直接加減數(shù)值,表示加減對(duì)應(yīng)天數(shù),兩個(gè)日期相減之后得到相隔的天數(shù),除以7是week,除以24是hour,可以轉(zhuǎn)化成相應(yīng)單位進(jìn)行相加減

看圖判斷年份

RR 日期格式:用來判定按照DD-MM-RR格式給定的日期實(shí)際代表的日期是多少

從第一個(gè)表可以看出YY格式的年份和當(dāng)前的年份屬于同一個(gè)世紀(jì),不用做任何判斷。

RR格式的年份判斷規(guī)律:同小同大均為當(dāng)前世紀(jì),前小后大為上世紀(jì),前大后小為下個(gè)世紀(jì)

1.當(dāng)前日期為2015年,指定日期格式為DD-MON-RR,指定日期為01-1月-01,該日期實(shí)際所代表的日期為?

當(dāng)前日期為小,指定日期為小,所以當(dāng)前日期是2001年(當(dāng)前世紀(jì))

2.當(dāng)前日期為2015年,指定日期格式為DD-MON-RR,指定日期為01-1月-95,該日期實(shí)際所代表的日期為?

當(dāng)前日期為小,指定日期為大,所以實(shí)際日期是1995年(上個(gè)世紀(jì))

3.當(dāng)前日期為1998年,指定日期格式為DD-MON-RR,指定日期為01-1月-95,該日期實(shí)際所代表的日期為?

當(dāng)前日期為大,指定日期為大,所以實(shí)際日期是1995年(當(dāng)前世紀(jì))

4.當(dāng)前日期為1998年,指定日期格式為DD-MON-RR,指定日期為01-1月-01,該日期實(shí)際所代表的日期為?

當(dāng)前日期為大,指定日期為小,所以實(shí)際日期是2001年(下個(gè)世紀(jì))

months_between(sysdate,hiredate):返回兩個(gè)日期類型數(shù)據(jù)之間間隔的自然月數(shù)

select ename,job,months_between(sysdate,hiredate) months --當(dāng)前系統(tǒng)時(shí)間與入職時(shí)間的間隔月數(shù)

from emp

order by months

add_months(sysdate,n):返回指定日期加上n個(gè)月后的日期

select empno,ename,job,add_months(hiredate,3) date --入職三個(gè)月后的日期

from emp

next_day:返回某一日期的下一個(gè)指定日期(有點(diǎn)繞,結(jié)合例子來看就懂了)

select next_day(sysdate,'星期一') NextMonday --下個(gè)周一是什么日期

from dual; --虛表

last_day:返回指定日期當(dāng)月的最后一天的日期

select last_day(sysdate) LastDay from dual; --這個(gè)月的最后一天是什么日期

round(sysdate[,'format']):將date按format格式進(jìn)行四舍五入,默認(rèn)四舍五入為最近的天

format:世紀(jì)CC,年YY,月MM,日DD,小時(shí)HH24,分MI,秒SS(這個(gè)需要稍微記一下)

select ename,job,round(hiredate,'MONTH') --入職日期按月四舍五入

from emp;

trunc(sysdate[,format]):將date按format格式進(jìn)行截?cái)?#xff0c;和round差不多

--查詢81年入職的員工姓名,入職日期按月截?cái)嗟娜掌凇?/p>

select ename,trunc(hiredate,'MONTH')

from emp

where substr(hiredate,-2,2) = '81';

extract([YEAR | MONTH | DAY] from date):返回日期類型數(shù)據(jù)中的年份、月份和日期

--部門編號(hào)是10的部門中所有員工入職月份。

select extract(month from hiredate) from emp;

轉(zhuǎn)換函數(shù)

通常需要在字符類型、日期類型、數(shù)值類型之間進(jìn)行顯式轉(zhuǎn)換,轉(zhuǎn)換函數(shù)及對(duì)應(yīng)關(guān)系如下圖所示。

to_char(data,'format'):用于日期型

需要注意的是format大小寫敏感,可通過format提取日期的年or月or日

下面表格的內(nèi)容可以稍微記一下

select empno,ename,job,to_char(hiredate,'DD MONTH YYYY') hiredate --17 November 1981

from emp;

to_char(number,'format'):用于數(shù)值型

select to_char(sal,'$99,999') salary

from emp;

to_number(char,'format'):要轉(zhuǎn)換的char類型數(shù)據(jù)必須是由數(shù)字組成的字符串。

to_date(char,'format'):要轉(zhuǎn)換的char類型數(shù)據(jù)必須是可以轉(zhuǎn)換成日期的字符。

select to_date('2019-1-10','YYYY-MM-DD') from dual;

通用函數(shù)

case函數(shù)

select ename,deptno,

(case deptno

when 10 then '銷售部'

when 20 then '技術(shù)部'

when 30 then '后勤部'

else '無'

end) deptname,

from emp;

decode函數(shù)

select ename,deptno,

decode(deptno,

10, '銷售部',

20,'技術(shù)部',

30,'后勤部',

'無') deptname,

from emp;

多行函數(shù)

分組函數(shù)

分組函數(shù)是對(duì)表中一組記錄進(jìn)行操作,每組只返回一個(gè)結(jié)果,即首先要對(duì)表記錄進(jìn)行分組,然后再進(jìn)行操作匯總,每組返

回一個(gè)結(jié)果,分組時(shí)可能是整個(gè)表分為一組,也可能根據(jù)條件分成多組。

min(column):返回每組的最小值,適用于任何類型的數(shù)據(jù)

max(column):返回每組的最大值,適用于任何類型的數(shù)據(jù)

avg(column):返回每組的平均值,只能夠?qū)?shù)值類型的列或表達(dá)式操作

sum(column):返回每組的總和,只能夠?qū)?shù)值類型的列或表達(dá)式操作

count(column):返回滿足條件的每組記錄條數(shù)

查詢職位以SALES開頭的所有員工平均工資、最低工資、最高工資、工資和。

select avg(sal),min(sal),max(sal),sum(sal)

from emp

where job like 'SALES%';

組函數(shù)中DISTINCT

DISTINCT會(huì)消除重復(fù)記錄后再使用組函數(shù)

select count(distinct deptno) from dept;

分組函數(shù)中空值處理

除了count(*)之外,其它所有分組函數(shù)都會(huì)忽略列中的空值,然后再進(jìn)行計(jì)算。

select avg(comm) from emp; --avg(comm) 500

在分組函數(shù)中使用NVL 函數(shù)可以使分組函數(shù)強(qiáng)制包含含有空值的記錄

select avg(nvl(comm,0)) from emp; --avg(nvl(comm,0)) ---157

需要注意的幾點(diǎn)

select 子句中出現(xiàn)的除分組函數(shù)之外的列都應(yīng)寫在group by子句中

分組函數(shù)的篩選判斷放在having子句中,不能放在where子句中

上面這個(gè)圖很重要,多看幾遍

多表連接

多表連接指的是在多個(gè)表之間通過一定的連接條件,使表之間發(fā)生關(guān)聯(lián),進(jìn)而能從多個(gè)表之間獲取數(shù)據(jù)

語法格式

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

三點(diǎn)要求

* 在 WHERE子句中書寫連接條件。

* 如果在多個(gè)表中出現(xiàn)相同的列名,則需要使用表名(或表別名)作為來自該表的列名的前綴。

* N個(gè)表相連時(shí),至少需要N-1個(gè)連接條件。

最后一個(gè)條件需要特別注意一下

笛卡爾積

什么是笛卡爾積

第一個(gè)表中的所有行和第二個(gè)表中的所有行都發(fā)生連接。

什么時(shí)候會(huì)產(chǎn)生笛卡爾積

連接條件被省略或者無效時(shí),簡(jiǎn)而言之,就是沒有連接條件。

如何避免笛卡爾積

在where子句中包含有效的連接條件

當(dāng)from后面有多個(gè)表時(shí),無論題意如何,連接條件一定要有,且需要N-1個(gè)(N為表的數(shù)量)

等值連接

兩個(gè)部門有相同的列,即可用等值連接,而且大概率會(huì)是用等值連接

select empno,ename,job,dname,loc

from emp,dept

where emp.deptno = dept.deptno;

非等值連接

兩個(gè)表不存在相同的列,但兩個(gè)表的列存在某種不可告人的關(guān)系

select ename,job,grade

from emp,salgrade

where sal between losal and hisal;--losal最低工資 hisal最高工資

自身連接

自身連接即自己跟自己連接,以別名區(qū)別

查詢每個(gè)員工的姓名和直接上級(jí)姓名?

SELECT worker.ename||' leader is '||manager.ename

FROM emp worker, emp manager

WHERE worker.mgr = manager.empno;

外部連接

在兩個(gè)表進(jìn)行等值連接時(shí),有些記錄按照連接條件沒有連接上,可在缺少匹配值的一邊加上(+)

語法

符號(hào)(+)所在邊的表增加一個(gè)“萬能”的行,這個(gè)行全部由空值組成。它可以和另一邊的表中所有不滿足連接條件的行進(jìn)行連接。

由于這個(gè)“萬能”行的各列全部是空值,因此在連接結(jié)果中,來自“萬能”行屬性值全部為空值。

多表連接的寫法

分析要查詢的列都來自于哪些表,構(gòu)成FROM子句;

分析這些表之間的關(guān)聯(lián)關(guān)系,如果表之間沒有直接關(guān)聯(lián)關(guān)系,而是通過另一個(gè)中間表關(guān)聯(lián),則也要在FROM子句中補(bǔ)充中間關(guān)聯(lián)表;

接下來在WHERE子句中補(bǔ)充表之間的關(guān)聯(lián)關(guān)系,通常N個(gè)表,至少要有N-1個(gè)關(guān)聯(lián)關(guān)系;

分析是否還有其它限制條件,補(bǔ)充到WHERE子句的表關(guān)聯(lián)關(guān)系之后,作為限制條件;

根據(jù)用戶想要顯示的信息,補(bǔ)充SELECT子句。

分析是否有排序要求,如果排序要求中還涉及到其它表,則也要進(jìn)行第2步補(bǔ)充排序字段所在的表,并且添加表之間的關(guān)聯(lián)關(guān)系;

表別名

在多表連接且有相同列時(shí),使用表別名可以區(qū)分來自不同表但是名字相同的列。

在定義表別名之后,在對(duì)列進(jìn)行限制時(shí),只能使用表別名,不能使用表名。

SQL:1999語法的連接

語法

這張圖包含了SQL99所有連接方式的語法,看完后面的再來看這個(gè)表就不會(huì)一臉懵逼了

交叉連接

交叉連接是兩個(gè)表進(jìn)行交叉相乘,和笛卡爾積的效果一樣,使用cross join子句。

SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc

FROM emp

CROSS JOIN dept;

自然連接

自然連接類似于等值連接,對(duì)兩個(gè)表之間所有相同名字和數(shù)據(jù)類型的列進(jìn)行等值連接,使用natural join子句連接。

SELECT empno,ename,sal,deptno,loc

FROM emp

NATURAL JOIN dept;

USING子句

自然連接是使用所有名稱和數(shù)據(jù)類型相匹配的列作為連接條件,而USING子句可以指定用某個(gè)或某幾個(gè)相同名字和數(shù)據(jù)類型的列作為連接條件。

SELECT e.ename,e.ename,e.sal,deptno,d.loc

FROM emp e JOIN dept d USING (deptno)

WHERE deptno = 20 ;

使用USING子句創(chuàng)建連接時(shí),應(yīng)注意以下幾點(diǎn):

如果有若干個(gè)列名稱相同但數(shù)據(jù)類型不同,自然連接子句可以用USING子句來替換,以指定產(chǎn)生等值連接的列。

如果有多于一個(gè)列都匹配的情況,使用USING子句只能指定其中的一列。

USING子句中的用到的列不能使用表名和別名作為前綴。

NATURAL JOIN子句和USING子句是相互排斥的,不能同時(shí)使用。

ON子句

自然連接條件基本上是具有相同列名的表之間的等值連接

如果要指定任意連接條件,或指定要連接的列,則可以使用ON子句;

用ON將連接條件和其它檢索條件分隔開,其它檢索條件寫在WHERE子句;

ON子句可以提高代碼的可讀性。

code

SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc

FROM emp e

JOIN dept d

ON (e.deptno = d.deptno); --我覺得很像where

左外連接

左外連接以FROM子句中的左邊表為基表,該表所有行數(shù)據(jù)按照連接條件無論是否與右邊表能匹配上,都會(huì)被顯示出來,是不是覺得很像外部連接。

SELECT e.ename,e.deptno,d.loc

FROM emp e

LEFT OUTER JOIN dept d

ON (e.deptno = d.deptno);

右外連接

右外連接以FROM子句中的右邊表為基表,該表所有行數(shù)據(jù)按照連接條件無論是否與左邊表能匹配上,都會(huì)被顯示出來。

SELECT e.ename,e.deptno,d.loc

FROM emp e

RIGHT OUTER JOIN dept d

ON (e.deptno = d.deptno);

全外連接

返回兩個(gè)表等值連接結(jié)果,以及兩個(gè)表中所有等值連接失敗的記錄

SELECT e.ename,e.deptno,d.loc

FROM emp e

FULL OUTER JOIN dept d

ON (e.deptno = d.deptno);

總結(jié)

以上是生活随笔為你收集整理的oracle判断数据出现交叉,Oracle!你必须要知道的Knowledge points(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。