oracle有四個用戶,分別爲sys、system、sysman和scott,其中sys是oracle權限最高的用戶,相似於Linux
系統的root,scott是示例用戶,上課就以這個用戶裏的三張員工表empno、dept、salgrade做爲示例來授課。sql
1. 快捷鍵ctrl+alt+del打開任務管理器 2. 選擇服務 3. 啓動OracleServiceXXXX(XXXX是全局名字)和oracleXXXXXXXListener服務(選中一個按o快速找到哦) 這個很是重要(!important),沒有啓動一切免談(記筆記.....)
win+R+cmd打開windows命令行控制檯(小黑窗) C:\User\PC>sqlplus /nolog 若出現SQL>則證實數據庫建立成功
語法格式:conn[ect] 用戶名/口令 [AS SYSDBA | AS SYSOPER] 注:中括號表示能夠省略
conn /as sysdba(用戶名和口令都爲空) 只能以「sysdba」或者「sysoper」系統身份登陸 ,不能用 normal。
剛開始scott用戶默認被鎖定,須要登錄sys用戶以後執行alter user scott account unlock; 並從新設置口令便可登錄,默認口令是tiger 登錄:conn scott/tiger(password)
虛表不是真實存在的表,只有一個字段和一行記錄,當須要查詢且不想從已存在的表中獲取數據時即可以使用虛表,更詳細的解釋你能夠百度一下。數據庫
考試好像一直考,應該蠻重要的吧。
子句:關鍵字加其餘語法元素,例如,select * 是一個子句,from table是一個子句。
列別名:列名 as 列別名 or 列名 列別名,須要注意的是若包含空格、需區分大寫以及含特殊字符時,需加引號
關鍵字一般使用大寫,其餘語法元素小寫,一般以子句爲單位進行分行。express
空值是一種無效的、未被賦值的、未知的或不可用的值。任何包含空值的算術表達式運算結果均爲空值。(這一點須要注意)windows
nvl(comm,0):若comm不爲空,就返回comm,不然返回0 nvl2(expr1,expr2,0):若expr1不爲空,就返回expr2,不然返回0 NULLIF(expr1,expr2):數據類型需一致,相等返回null,不然返回第一個表達式 coalesce(expr1,expr2,...)返回第一個非空參數,數據類型需一致
between and 判斷要比較的值是否在某個範圍內。 eg: sal [not] between 1500 and 2000
in 判斷要比較的值是否和集合列表中的任何一個值相等。 eg: sal [not] in (1500,1600,1800)
like 判斷要比較的值是否知足部分匹配。 eg: ename [not] like '%T_' 注:'%'表明任意多字符(>=0),下劃線表明一個任意字符
is null 判斷要比較的值是否爲空值NULL 。 eg: where comm is [not] nulloracle
()、算術運算符(+-*/)、鏈接運算符(||)、比較運算符(<> 不等於)、特殊比較運算符(like、in、between and、is null)、邏輯運算符(not>and>or)ide
在select字句中使用關鍵字DISTINCT可消除重複行。 eg :select distinct deptno from emp;
原義字符串函數
鏈接操做符 命令行
打開plsqldev(紅色油桶),打開Command Window,或者在windows控制檯上操做也行。 SQL>desc tablename;
select* from table where condition group by column having condition order by column [asc|desc] asc升序,desc是降序 執行順序:from > where > group by > having > select > order by
1. 單行函數返回一個結果 2. 支持嵌套 3. 單行函數能夠放在select、where、order by子句中 4. 單行函數對單行數據操做
* lower(列名|表達式):將大寫或大小寫混合的字符轉換成小寫 * upper(列名|表達式) :將小寫或大小寫混合的字符轉換成大寫 * initcap(列名|表達式) :將每一個單詞的第一個字母轉換成大寫,其他的字母都轉換成小寫(這個不要漏了哦) * concat(列名1,列名2):鏈接兩個字段或表達式,相似於|| * substr(列名|表達式,n1,n2):返回第一個參數中,從第n1位開始, 長度爲n2的子串 。 * length(column | expression):取字符長度 * instr(s1,s2,[,n1],[n2]) :返回s1中,子串s2從n1開始,第n2次出現的位置。n1,n2默認值爲1 * lpad(s1,n1,s2):返回s1被s2從左面填充到n1長度後的字符串 。 * rpad(s1,n1,s2) :返回s1被s2從右面填充到n1長度後的字符串。 * trim:去除字符串頭部或尾部(頭尾)的字符 格式:TRIM([leading | trailing | both] character from source) 注意第一個參數和from * replace(s1,s2,s3) : 把s1中的s2用s3替換。注意誰替換誰 用的比較多的是concat()、substr()、instr()、length()
round(num,n):將num四捨五入到小數點後n位 trunc(num,n):將num截取到小數點後n位 mod(num,n):取num對n取餘
日期函數默認格式是DD-MM-RR,SYSDATE是系統當前時間
日期可直接加減數值,表示加減對應天數,兩個日期相減以後獲得相隔的天數,除以7是week,除以24是hour,能夠轉化成相應單位進行相加減
看圖判斷年份
RR 日期格式:用來斷定按照DD-MM-RR格式給定的日期實際表明的日期是多少
從第一個表能夠看出YY格式的年份和當前的年份屬於同一個世紀,不用作任何判斷。
RR格式的年份判斷規律:同小同大均爲當前世紀,前小後大爲上世紀,前大後小爲下個世紀3d
1.當前日期爲2015年,指定日期格式爲DD-MON-RR,指定日期爲01-1月-01,該日期實際所表明的日期爲? 當前日期爲小,指定日期爲小,因此當前日期是2001年(當前世紀) 2.當前日期爲2015年,指定日期格式爲DD-MON-RR,指定日期爲01-1月-95,該日期實際所表明的日期爲? 當前日期爲小,指定日期爲大,因此實際日期是1995年(上個世紀) 3.當前日期爲1998年,指定日期格式爲DD-MON-RR,指定日期爲01-1月-95,該日期實際所表明的日期爲? 當前日期爲大,指定日期爲大,因此實際日期是1995年(當前世紀) 4.當前日期爲1998年,指定日期格式爲DD-MON-RR,指定日期爲01-1月-01,該日期實際所表明的日期爲? 當前日期爲大,指定日期爲小,因此實際日期是2001年(下個世紀)
months_between(sysdate,hiredate):返回兩個日期類型數據之間間隔的天然月數code
select ename,job,months_between(sysdate,hiredate) months --當前系統時間與入職時間的間隔月數 from emp order by months
add_months(sysdate,n):返回指定日期加上n個月後的日期
select empno,ename,job,add_months(hiredate,3) date --入職三個月後的日期 from emp
next_day:返回某一日期的下一個指定日期(有點繞,結合例子來看就懂了)
select next_day(sysdate,'星期一') NextMonday --下個週一是什麼日期 from dual; --虛表
last_day:返回指定日期當月的最後一天的日期
select last_day(sysdate) LastDay from dual; --這個月的最後一天是什麼日期
round(sysdate[,'format']):將date按format格式進行四捨五入,默認四捨五入爲最近的天
format:世紀CC,年YY,月MM,日DD,小時HH24,分MI,秒SS(這個須要稍微記一下)
select ename,job,round(hiredate,'MONTH') --入職日期按月四捨五入 from emp;
trunc(sysdate[,format]):將date按format格式進行截斷,和round差很少
--查詢81年入職的員工姓名,入職日期按月截斷的日期。 select ename,trunc(hiredate,'MONTH') from emp where substr(hiredate,-2,2) = '81';
extract([YEAR | MONTH | DAY] from date):返回日期類型數據中的年份、月份和日期
--部門編號是10的部門中全部員工入職月份。 select extract(month from hiredate) from emp;
一般須要在字符類型、日期類型、數值類型之間進行顯式轉換,轉換函數及對應關係以下圖所示。
to_char(data,'format'):用於日期型
須要注意的是format大小寫敏感,可經過format提取日期的年or月or日
下面表格的內容能夠稍微記一下
select empno,ename,job,to_char(hiredate,'DD MONTH YYYY') hiredate --17 November 1981 from emp;
to_char(number,'format'):用於數值型
select to_char(sal,'$99,999') salary from emp;
to_number(char,'format'):要轉換的char類型數據必須是由數字組成的字符串。
to_date(char,'format'):要轉換的char類型數據必須是能夠轉換成日期的字符。
select to_date('2019-1-10','YYYY-MM-DD') from dual;
case函數
select ename,deptno, (case deptno when 10 then '銷售部' when 20 then '技術部' when 30 then '後勤部' else '無' end) deptname, from emp;
decode函數
select ename,deptno, decode(deptno, 10, '銷售部', 20,'技術部', 30,'後勤部', '無') deptname, from emp;
分組函數是對錶中一組記錄進行操做,每組只返回一個結果,即首先要對錶記錄進行分組,而後再進行操做彙總,每組返
回一個結果,分組時多是整個表分爲一組,也可能根據條件分紅多組。
min(column):返回每組的最小值,適用於任何類型的數據 max(column):返回每組的最大值,適用於任何類型的數據 avg(column):返回每組的平均值,只可以對數值類型的列或表達式操做 sum(column):返回每組的總和,只可以對數值類型的列或表達式操做 count(column):返回知足條件的每組記錄條數 查詢職位以SALES開頭的全部員工平均工資、最低工資、最高工資、工資和。 select avg(sal),min(sal),max(sal),sum(sal) from emp where job like 'SALES%';
DISTINCT會消除重複記錄後再使用組函數
select count(distinct deptno) from dept;
除了count(*)以外,其它全部分組函數都會忽略列中的空值,而後再進行計算。
select avg(comm) from emp; --avg(comm) 500
在分組函數中使用NVL 函數可使分組函數強制包含含有空值的記錄
select avg(nvl(comm,0)) from emp; --avg(nvl(comm,0)) ---157
多表鏈接指的是在多個表之間經過必定的鏈接條件,使表之間發生關聯,進而能從多個表之間獲取數據
SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;
* 在 WHERE子句中書寫鏈接條件。 * 若是在多個表中出現相同的列名,則須要使用表名(或表別名)做爲來自該表的列名的前綴。 * N個表相連時,至少須要N-1個鏈接條件。 最後一個條件須要特別注意一下
第一個表中的全部行和第二個表中的全部行都發生鏈接。
鏈接條件被省略或者無效時,簡而言之,就是沒有鏈接條件。
在where子句中包含有效的鏈接條件
當from後面有多個表時,不管題意如何,鏈接條件必定要有,且須要N-1個(N爲表的數量)
兩個部門有相同的列,便可用等值鏈接,並且大機率會是用等值鏈接
select empno,ename,job,dname,loc from emp,dept where emp.deptno = dept.deptno;
兩個表不存在相同的列,但兩個表的列存在某種不可告人的關係
select ename,job,grade from emp,salgrade where sal between losal and hisal;--losal最低工資 hisal最高工資
自身鏈接即本身跟本身鏈接,以別名區別
查詢每一個員工的姓名和直接上級姓名? SELECT worker.ename||' leader is '||manager.ename FROM emp worker, emp manager WHERE worker.mgr = manager.empno;
在兩個表進行等值鏈接時,有些記錄按照鏈接條件沒有鏈接上,可在缺乏匹配值的一邊加上(+)
符號(+)所在邊的表增長一個「萬能」的行,這個行所有由空值組成。它能夠和另外一邊的表中全部不知足鏈接條件的行進行鏈接。
因爲這個「萬能」行的各列所有是空值,所以在鏈接結果中,來自「萬能」行屬性值所有爲空值。
在多表鏈接且有相同列時,使用表別名能夠區分來自不一樣表可是名字相同的列。
在定義表別名以後,在對列進行限制時,只能使用表別名,不能使用表名。
這張圖包含了SQL99全部鏈接方式的語法,看完後面的再來看這個表就不會一臉懵逼了
交叉鏈接是兩個表進行交叉相乘,和笛卡爾積的效果同樣,使用cross join子句。
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc FROM emp CROSS JOIN dept;
天然鏈接相似於等值鏈接,對兩個表之間全部相同名字和數據類型的列進行等值鏈接,使用natural join子句鏈接。
SELECT empno,ename,sal,deptno,loc FROM emp NATURAL JOIN dept;
天然鏈接是使用全部名稱和數據類型相匹配的列做爲鏈接條件,而USING子句能夠指定用某個或某幾個相同名字和數據類型的列做爲鏈接條件。
SELECT e.ename,e.ename,e.sal,deptno,d.loc FROM emp e JOIN dept d USING (deptno) WHERE deptno = 20 ;
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc FROM emp e JOIN dept d ON (e.deptno = d.deptno); --我以爲很像where
左外鏈接以FROM子句中的左邊表爲基表,該表全部行數據按照鏈接條件不管是否與右邊表能匹配上,都會被顯示出來,是否是以爲很像外部鏈接。
SELECT e.ename,e.deptno,d.loc FROM emp e LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);
右外鏈接以FROM子句中的右邊表爲基表,該表全部行數據按照鏈接條件不管是否與左邊表能匹配上,都會被顯示出來。
SELECT e.ename,e.deptno,d.loc FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno = d.deptno);
返回兩個表等值鏈接結果,以及兩個表中全部等值鏈接失敗的記錄
SELECT e.ename,e.deptno,d.loc FROM emp e FULL OUTER JOIN dept d ON (e.deptno = d.deptno);