SQL語句分爲如下三種類型:sql
1、基本的SQL-SELECT語句數據庫
別名 函數
①直接在字段名後面寫 select last_name name,employee_id id from empolyees;spa
②在字段名後加as select last_name as name,employee_id as id from empolyees;code
③加雙引號(當別名由多個單詞構成且中間以空格隔開時必用) select last_name "my name",employee_id as id from empolyees; blog
鏈接符排序
①把列與列,列與字符鏈接在一塊兒事務
②用 || 表示ip
③能夠用來'合成'列ci
select last_name||'`s job_id is '||job_id as details from employees
重複行(去重)distinct
select distinct department_id from employees;
注意:null值也單獨爲一行
注意:字符和日期必須用單引號括起來(SQL中只有在上面提到的別名時會用到雙引號,其它狀況都用單引號),SQL語言大小寫不敏感,但''括起來的字符串嚴格區分大小寫
2、過濾和排序
過濾 where
-- AND OR NOT 邏輯且/邏輯或/邏輯否
-- [NOT] BETWEEN AND 表示區間內的值,包含邊界 等價於 >= and <=
-- [NOT] IN 表示離散的值,where department_id in(70,80,90) 等價於 where department_id=70 or department_id=80 or department_id=90
-- [NOT] LIKE 模糊查詢
百分號%表示0…n個字符;
下劃線_表示單個字符;
轉義字符 ESCAPE,where last_name like '%\_%' escape '\' (轉義字符能夠是任何字符 如 \ # $ 等)
-- IS [NOT] NULL 空值
-- 運算優先級
算術運算符>鏈接符>比較符>IS NULL,LIKE,IN>BETWEEN>NOT>AND>OR
括號能夠改變優先級
排序
ORDER BY … DESC(逆序)/ASC(順序,默認)
select last_name,department_id,salary*12 annual_sal
from employees--order by 能夠不放在where子句
--where department_id > 80
--多級排序
--依字段別名排序
order by annul_sal,last_name desc
3、單行函數
字符
① 大小寫控制函數:由於被單引號括出來的內容是嚴格區分大小寫,而有時候查詢不在意大小寫,這時候此類函數派上用場
LOWER('SQL Course') → sql course 所有小寫
UPPER('SQL Course') → SQL COURSE 所有大寫
INITCAP('SQL Course') → Sql Course 單詞首字母大寫
② 字符控制函數:
CONCAT('Hello','World') → HelloWorld 鏈接字符串
SUBSTR('HelloWorld',1,5) → Hello 從第1個下角標位置開始截取長度爲5的子字符串--Java中下標從0開始,-1表明無效數據;SQL中下標從1開始,0表明無效數據
LENGTH('HelloWorld') → 10 字符串長度
INSTER('HelloWorld','W') → 6 字符在字符串中的位置
LPAD(salary,10,'*') → *****24000 字符串左對齊,用10個位去存,不足在左端用*補齊
RPAD(salary,10,'*') → 24000***** 字符串右對齊,用10個位去存,不足在右端用*補齊
TRIM('H' FROM 'HelloHWorldH') → elloHWorld 去除原字符串中首尾與指定字符相同的字符
REPLACE('abcdb','b','m') → amcdm 將字符串中全部與指定字符相同的字符替換爲另外一個字符
數值
ROUND() 四捨五入
--ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
435.5 435 440TRUNC() 截斷
--ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
435.4 435 430MOD() 求餘
--MOD(1600,15)
10
日期:Oracle中的日期型數據實際含有兩個值(日期和時間)
在日期上加上或減去一個數字結果仍爲日期
兩個日期相減返回日期之間相差的天數
MONTHS_BETWEEN 兩個日期相差的月數
ADD_MONTHS 向指定日期中加上若干月數
NEXT_DAY 指定日期的下一個星期幾對應的日期
LAST_DAY 本月的最後一天
ROUND 日期四捨五入
TRUNC 日期截斷
數據類型轉換
① 隱式 DATE ←→ VARCHAR2 ←→ NUMBER
源數據類型 目標數據類型 VARCHAR2/CHAR NUMBER VARCHAR2/CHAR DATE NUMBER VARCHAR2 DATE VARCHAR2 --注意區別,JAVA中+號在字符串運算中表明字符串鏈接,SQL中字符串鏈接用的是 ||,+號則表示數學加法運算
select '12' + 2 from dual; --此處'12'隱性轉換爲NUMBER類型的12
14
② 顯式
TO_CHAR
select employee_id,to_char(hire_date,'yyyy"年"mm"月"dd"日"') --此處在輸出日期格式中穿插的字符要用""括起來
from employees
where to_char(hire_date,'yyyy/mm/dd') = '1994/06/07' -- to_date('1994/06/07','yyyy/mm/dd')TO_DATE
TO_NUMBER
select to_char(1234567.89,'999,999,999.99') from dual; -- 1,234,567.89 不足不用補零
select to_char(1234567.89,'000,000,999.99') from dual; -- 001,234,567.89 不足位數補零
select to_char(1234567.89,'$999,999,999.99') from dual; -- $1,234,567.89 美圓符號
select to_char(1234567.89,'L999,999,999.99') from dual; -- ¥1,234,567.89 本地貨幣符號
select to_number('¥1,234,567.89','L999,999,999.99') from dual; -- 1234567.89 格式要對應上
通用
這些函數適用於任何數據類型,同時也適用於空值
NVL(expr1,expr2) 等價於 expr1!=null?expr1:expr2
--commission_pct 獎金率字段的值有可能爲null,是null則用 0 代替
select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) annual_sal,commission_pct from employees;
--因爲department_id是NUMBER類型,而'沒有部門'是嚴格的字符類型,直接調用NVL函數報「無效數字」錯誤,需進行處理
select last_name,nvl(to_char(department_id),'沒有部門') from employees;
NVL2(expr1,expr2,expr3) 等價於 expr1!=null?expr2:expr3
select last_name,nvl2(commission_pct,commission_pct + 0.015,0.01) from employees;
NULLIF(expr1,expr2) 等價於 expr1==expr2?null:expr1
select first_name,length(first_name) "expr1",
last_name,length(last_name) "expr2",
nullif(length(first_name),length(last_name)) result
from employeesCOALESCE(expr1,expr2,…,exprn) 若是第一個表達式爲null,則返回下一個表達式,依次迭代
條件表達式(IF-THEN-ELSE邏輯)
① CASE表達式
CASE expr1 WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]END
--查詢部門號爲10,20,30的員工信息,若部門號爲10,則打印
--其工做的1.1倍,20號部門,1.2倍,30號部門,1.3倍
select employee_id,last_name,department_id,
case department_id when 10 then salary*1.1
when 20 then salary*1.2
else salary*1.3
end REVISED_SALARY
from employees
where department_id in(10,20,30)
② DECODE函數
select employee_id,last_name,department_id, decode(department_id,10,salary*1.1, 20,salary*1.2, salary*1.3) REVISED_SALARYfrom employeeswhere department_id in(10,20,30)