2018-06-22 第四十七天 oracle
SQL基本語句
一、單行函數
--創建scott 用戶??為了后面操作scott 用戶
--scott 是oracle 第一個員工??他有一只貓,叫tiger
create?user?scott?identified?by?tiger;
--一個用戶剛剛創建,連登錄的權限都沒有。需要給用戶分配權限。
--在oracle 中定義了角色這個概念。角色是權限的集合。
--connect Resource
--授予scott 指定的權限
grant?connect,?resource?to?scott;
--給scott 用戶一些權限去創建屬于soctt 的四張表。
--四張表
--bonus 獎金表??空表
--dept 部門表???部門編號deptno ??部門名稱dname ?部門所在地址loc
--emp ?員工表??員工編號??empno ?員工名稱??ename 工種??job ?上級編號??mgr ?入職日期?hiredate ?工資?sal ?獎金?comm 所在部門?deptno
--SALGRADE ?工資等級表???grade 等級???最低工資?losal ?最高工資??hisal
---創建scott 用戶,分配權限????給scott 四張表
--基本的DQL語句
--注釋?使用?--
--最簡單的sql 語句
--查詢所有員工的信息
--需要告訴DBMS查詢那張表,說明查詢表的那些字段的數據
--from 后跟表的名稱???select 后跟的是?查詢的字段的內容??* 是通配符,代表當前表的所有的字段。
select?*?from?emp
--顯示部分內容?,需要顯示的字段使用逗號分割
select?empno,?ename,?job?from?emp
--使用算術表達式
--查詢員工的姓名,工作,年薪
select?*?from?emp
select?ename,?job,sal*12?from?emp
--任何數據和null 空做運算,結果還是空?¤
select?ename,?job,sal*12+comm*12??from?emp
select?ename,job,sal*12,?comm*12?from?emp
--使用別名?
--在sql 中,通過使用單引號?表示字符串,唯獨?在??使用別名的時候,可以使用雙引號表示字符串,as 關鍵字可以省略。
--除了別名,其他的地方基本上不使用雙引號。都是單引號。
select?ename?姓名?,?job?as?職位?,?sal*12?as?"年薪",?comm*12?as?年獎金?from?emp
--使用連接符???||
--顯示??:?xxx員工的編號為XXXX,入職日期為?XXXX,年薪為XXXX
select?*?from?emp
select?ename?||?' 員工的編號?'?||?empno?||??' , 入職日期為?'?||?hiredate?||?' ,年薪為?'?||?sal*?12?from?emp
--去除重復行??distinct
--顯示所有的部門編號
select?deptno?from?emp
select?distinct?deptno?from?emp
--顯示工作和部門編號
select?job,?deptno?from?emp
--去除字段組合的重復行
select?distinct?job,?deptno?from?emp
--排序
--顯示員工的所有信息
select?*?from?emp
--按照部門編號排序??默認是升序排列?asc ?降序是?desc
select?*?from?emp?order?by?deptno?asc
select?*?from?emp?order?by?deptno?desc
--按照員工的年薪排序
select?ename,?job,sal,sal*12?年薪?from?emp?order?by?sal*12
--排序的時候,使用字段的別名
select?ename,job,sal,sal*12?年薪?from?emp?order?by?年薪
-- 顯示員工的?姓名,工資,部門編號,部門編號按照升序排列,如果部門編號相同,按照工資降序排列
select?ename,sal,deptno?from?emp?order?by?deptno?asc?,sal?desc
--sql 中那些內容是大小寫敏感的?哪些是不敏感的。
--關鍵字???大小寫不敏感
SELECT?*?from?emp
--字段名??大小寫不敏感
select?ENAME,?JOB,?sal?from?emp
--表名稱??大小寫不敏感
select?*?from?EMP
--字段的內容???查詢?員工名為?scott 的員工的所有的信息
--字段的內容大小寫敏感
select?*?from?emp??where?ename='SCOTT'
--where 子句
--作用:進行行數據的過濾
--查詢姓名?為?scott的員工的信息
select?*?from?emp??where?ename='SCOTT'
--查詢入職日期為1981/4/2 的員工的信息
--1 :使用默認的日期的字符串形式?'DD-MON-RR‘?
select?*?from?emp?where?hiredate='2-4月-1981'
-- 2:將日期字符串轉換成?日期對象??to_date()
--查詢工資大于1600的員工的信息
select?*?from?emp?where?sal?>?1600?order?by?sal
select?*?from?emp?where?sal?>=?1600
select?*?from?emp?where?sal?<?1600
select?*?from?emp?where?sal?<=?1600
select?*?from?emp?where?sal=1600
select?*?from?emp?where?sal?!=?1600
select?*?from?emp?where?sal?<>?1600
--查詢1982/1/23 日期之后入職的員工的信息
--日期可以比較大小,是否相等
select?*?from?emp?where?hiredate?<?'23-1月-1982'
--查詢工資在1000-2000之間的所有的員工的信息???and ?代表?并且??java 中的&&
select?*?from?emp?where?sal?>=1000?and?sal<=2000
--between xx and xx ?閉區間的
select?*?from?emp?where?sal?between?1000?and?2000
--查詢?員工信息??工資是?1100 或者是?1600 ?or ???或者的意思??java ?||
select?*?from?emp?where?sal?=?1100?or?sal?=?1600
--查詢所有員工中工種為??clerk ?manager ?analyst ?的員工的信息??ename ,job ?deptno
--字符串的排序規則?和?java 類似
select?ename,?job,?deptno??from?emp?where?job='CLERK'?or?job='MANAGER'?or?job='ANALYST'?order?by?job
-- 在集合中的某一個值就可以??in ()
select?ename,job,deptno?from?emp?where?job?in?('CLERK','MANAGER','ANALYST')
--模糊查詢??like
-- 通配符?% :代表任意個字符
--通配符?_ :代表任意一個字符
--查詢員工姓名中包含?S 的員工的信息??
select?*?from?emp?where?ename?like?'%S%'
--查詢員工姓名?第二個字符為A的員工的信息
select?*?from?emp?where?ename?like?'_A%'
--查詢名字中包含?_ 的員工的信息
select?*?from?emp
--escape 轉義指定字符為轉義字符
select?*?from?emp?where?ename?like?'%\_%'?escape?'\'
--查詢名稱中不包含?S 的員工的信息??not like
select?*?from?emp?where?ename?not?like?'%S%'
--空判斷,顯示所有獎金是?null 的員工的信息
select?*?from?emp?where?comm?is?null
--非空判斷??顯示所有獎金是?不是?null 的員工的信息
select?*?from?emp?where?comm?is?not?null
--工作是?clerk 或者?manager 并且?sal 大于?2000的
select?*?from?emp?where?job='MANAGER'
--條件連接符?and ?or ?的連接的?優先級?不同??and 的優先級?大于?or ?,需要配合小括號控制結合的順序
select?ename,?job,sal?from?emp?where?(job='CLERK'?or?job='MANAGER')?and?sal?>2500?order?by?job
---偽表??dual ??也成為虛表
--當需要做一些不依賴于任何一張存在的表的操作的時候,就可以使用虛表了?dual
-- 查詢系統日期,和當前用戶
select?sysdate?from?dual
select?user?from?dual
select?*?from?dual
select?1+1?from?dual
--函數,就是方法??直接使用即可
--函數的分類:
???????????--1:單行函數:對一個查詢結果的記錄產生對應的一個計算結果。
???????????--2:多行函數:對一個查詢結果的多條記錄產生一個計算結果。
--單行函數??字符串處理的函數???數學相關的函數???日期函數
--將emp表中所有的員工的姓名全部小寫輸出
select?ename?,?lower(ename)?as?小寫?from??emp
--將ppt 中所有的涉及到的字符函數和數值函數,依次測試。
-- 查詢所有員工的名字?和入職天數?
select?ename?名字,?sysdate-hiredate?入職天數?from?emp
select?ename?,round(sysdate-hiredate)?入職天數?from?emp
-- 查詢所有員工的名字?和入職月數,要求整月輸出。
select?ename,?round(months_between(sysdate,hiredate))?from?emp
-- 查詢下周三的日期
select?next_day(sysdate,'星期三')?from?dual
-- 查詢本月最后一天的日期
select?last_day(sysdate)?from?dual
-- 查詢下周一后的星期二的日期??嵌套函數使用
select?next_day(next_day(sysdate,'星期一')?,?'星期二')?from?dual
-- 查詢所有員工的入職的星期數,年數,使用別名顯示
select?(sysdate-hiredate)/7??入職星期數?,?(sysdate-hiredate)/365??入職年數?from?emp
--轉換函數??to_number ?to_char ?to_date
--to_number : ?字符串?-->數值的轉換
--to_char :數值--->字符串?的轉換?????日期?--->字符串的轉換
--to_date : 字符串--->日期的轉換?
--數值和字符串之間的相互轉換
--java ?Integer.toString(int) ???Integer.parseInt(String)
--日期對象和字符串之間的相互轉換
--sdf ?String ?format(Date) ??Date ?parse(String) ?????
--自動轉換?
--字符串自動轉換為數值形式
select?'2'+'1'?from?dual--3 ?
--數值向字符串的自動轉換
select?1?||?'2'?from?dual
--函數轉換
--to_char
--數值--->字符串?的轉換??
--to_char(number, format) ?結果是一個字符串
-- 格式化特殊符號的意義:
--9 :整數部分,如果被轉換的數值的位數少于9 的個數,那么多余的9 的位數,忽略不顯示的。小數部分,多余的9使用0強制補齊。
--如果9 的個數不夠,那么按照9的個數進行強制顯示。
select?to_char(123.4566,'999.999')?from?dual
--0: 小數部分和?9 一樣,整數部分,多余的0 顯示的時候強制補0
select?to_char(123.567,'000,000.000000')?from?dual
--$直接顯示
select?to_char(123.678,'$999.99999')?from?dual
--L本地貨幣的符號
select?to_char(123.678,'L999.99999')?from?dual
--日期-->字符串
--to_char(date,format)
--將所有員工的受雇日期,按照指定的格式顯示
select?ename,hiredate,to_char(hiredate,'YYYY-MM-DD HH24:MI:SS')?入職日期?from?emp
-- 得到當前年份的字符串形式減去?受雇日期的字符串形式,返回受雇的年數??自動類型轉換
select?ename,to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY')?from?emp
--to_date : 字符串到日期對象
--查詢?XXXX時間之后入職的員工信息?1981/4/2
select?ename,hiredate?from?emp?where?hiredate>to_date('1981/4/2','YYYY/MM/DD')
--查詢?指定?日期之間的入職的員工的信息???1981/4/2 ?1982/1/23
select?*?from?emp?where?hiredate?>?to_date('1981/4/2','YYYY/MM/DD')?and?hiredate?<?to_date('1982/1/23','YYYY/MM/DD')
select?*?from?emp?where?hiredate?between?to_date('1981/4/2','YYYY/MM/DD')?and?to_date('1982/1/23','YYYY/MM/DD')
--to_number
--將字符串轉換為?數值?
select?to_number('$123.123','$000.000')+1?from?dual
select?to_number('¥123.123','L000.000')+1?from?dual
--通用函數
--nvl (exp1,exp2) : 如果exp1 是null 那么返回?exp2 如果不是null 就返回自身
--顯示所有員工的年薪
select?ename,sal*12+comm*12?年薪??from?emp
select?ename,sal?*12?+?nvl(comm,0)*12?年薪?from?emp
--nvl2(exp1,exp2,exp3) : 參數的意義?:如果exp1 是null 就返回?exp3 ,否則返回?exp2
select?ename,?sal*12?+?nvl2(comm,?comm?,?0)?*12?年薪?from?emp
--decode (value, key0,value0,key1,value 1,..... ,valuen)
--參數的意思,如果?value 的值?是?key0??整個函數返回?value0 ,如果值是key1就返回value1,以此類推,如果都沒有找到合適,最后返回?valuen。
--把所有的工作的名稱先全部顯示
select?distinct?job?from?emp
--將emp 表中所有的員工的名字?工作?以及工作的中文顯示?
select?ename,job,decode(job,'CLERK','職員','SALESMAN','銷售員','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師')?工種?from?emp
select?ename,job,decode(job,'SALESMAN','銷售員','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師','職員')?工種?from?emp
二、多行函數
--多行函數?可以分為兩類
--1:?只能對數值型的數據進行計算,?sum,avg
--2:?可以對任意類型的進行計算,max,min,count 。
-- avg 所有有獎金的人的獎金的平均值?
--忽略了null 的?comm
select?avg(comm)?from?emp
--avg 所有員工的獎金的平均值
select?avg(nvl(comm,0))?from?emp
--多行函數對于?null 的數據,直接忽略,不會進行統計
--count(*) : 使用這樣的形式去統計有多少條記錄,會自動的優化,對效率最高的字段進行統計。
--count(*) :永遠返回的是一個?>=0 的值,如果是一個空表,那么就返回0.
select?count(*)?from?bonus
--統計部門編號是?10 的員工的總數
select?count(*)?from?emp?where?deptno=10
select?count(*)?from?emp?where?deptno=20
select?count(*)?from?emp?where?deptno=30
select?distinct?deptno?from?emp
--統計部門編號是?10 的員工的總數,并顯示部門編號
--多行函數和單行函數不能一起使用。多行函數不能和字段一起顯示(除非使用該字段進行多行)
select?deptno,?count(*)?from?emp?where?deptno=10-----不可以。
三、分組函數
--統計排除10部門的,其他部門的總人數,工資的總和,工資的平均值,工資的最大值,工資的最小值,使用工資的總和排序?desc
select?deptno,?count(*),sum(sal)?工資總和?,avg(sal),max(sal),min(sal)?
from?emp
where?deptno?<>?10
group?by?deptno
order?by?工資總和?desc
--sql 書寫順序有嚴格的要求,必須遵守
--執行的順序?
---from---->where--->group by---->select---->order by
--從指定的表中去查數據,然后使用where 過濾滿足條件的數據。
---統計每個部門的總人數,工資的總和,工資的平均值,工資的最大值,工資的最小值,使用工資的總和排序,只顯示工資的平均值?>= 2000
select?deptno,?count(*),sum(sal),avg(sal),max(sal),min(sal)?
from?emp
where?avg(sal)>=2000---- where 只能對?行數據過濾,不能過濾分組的數據?如果想進行分組條件過濾,having
group?by?deptno
order?by?sum(sal)?desc
select?deptno,?count(*),sum(sal),avg(sal),max(sal),min(sal)?
from?emp
--where avg(sal)>=2000---- where 只能對?行數據過濾,不能過濾分組的數據?如果想進行分組條件過濾,having
group?by?deptno
having?avg(sal)>=2000
order?by?sum(sal)?desc
--sql 書寫順序有嚴格的要求,必須遵守
--執行順序
---from---->where--->group by---having---->select---->order by
--having ?后可以進行條件判斷的內容,和where 是一樣的。可以使用?關系運算符?like
--使用別名排序,過濾
--統計部門人數,平均工資,排除10部門,和平均工資> 1000的部門
select?deptno,?count(*),?avg(sal)?
from?emp?
where?deptno?<>?10?
group?by?deptno
having?avg(sal)?>1000
order?by?avg(sal)?desc
--使用別名
select?deptno?部門編號,?count(*)?部門人數?,?avg(sal)?平均工資
from?emp?
where?deptno?<>?10?
group?by?deptno
having?平均工資?>1000----sql 的執行的順序,select 的執行在??having 之后,別名不能?在having 中使用。只要在?select 執行之前的語句,都不能使用別名
order?by?平均工資?desc
--平均工資大于1200的部門和工作的組合--多字段分組??
--deptno ?和?job 組合不重復??分組?group by deptno,job
select?deptno,?job?from?emp?group?by?deptno,job
--統計部門人數小于4的部門的平均工資?和?人數
select?deptno?,?count(*),avg(sal)
from?emp
group?by?deptno
having?count(*)?<?4
--統計各部門最高工資,排除最高工資小于3000的部門
select?deptno,max(sal)
from?emp
group?by?deptno
having?max(sal)?>=?3000
總結
以上是生活随笔為你收集整理的2018-06-22 第四十七天 oracle的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 【spring data jpa】spr
 - 下一篇: 金枝玉叶1(金枝玉叶1电影)