數據表的查詢原理:
從源表中根據需要查詢的列和條件逐行對數據進行判斷並將滿足條件的行重新放入一張新表中,這張新表就是我們看到的查詢結果表格。
查詢的結果稱爲結果表,查詢的結果集是數據庫中的虛擬表,將數據文件的內容以表格的方式進行呈現的結果。
1、查詢語法
select * from 表名
* 是SQL中的通配符,用來匹配表中的所有數據列。
select 列名,列名 from 表名 where 條件
--查詢users所有的人的姓名
select userName from users
--查詢user表中所有人的姓名和他的郵箱
select userName,email from users
--查詢沒有填寫郵箱的用戶姓名,年齡和生日
select userName,age,birthday from users where email is null
2、指定列名查詢
select 列 as 顯示列名 from 表名
或者select 列 顯示列名 from 表名
第二種相對於第一種少個as,但第一種比較直觀,所以儘量使用前者。
--查詢員工的姓名和對應的薪水
select first_name||last_name as empName,salary from emp
select first_name||last_name empName,salary from emp
3、爲表起別名
select * from 表名 新表名
注意:這裏沒有as,不同於爲列起別名
--爲表起別名
select * from users u
4、常量列的查詢
源表中沒有的列作爲常量進行查詢, 如下num列下 都是10
--常量列的查詢
select first_name||last_name as empName,salary,sysdate as oprate_time,10 as num from emp
5、排序查詢
select 列名 from 表名 where 條件 order by 列
升序排列 asc (默認值)
降序排列 desc
--查詢員工的姓名和薪資,並按照由低到高的方式進行呈現
--asc表示升序,默認排序就是升序的方式,desc表示降序
select first_name||last_name as empName,salary from emp order by salary asc
--由高到底顯示工資
select rownum,first_name,salary from emp order by salary desc
1)order by 通常對列進行排序,同時也可以對表達式的結果進行排序呢
select * from emp order by salary+500
2)也可以對數字、日期、字母進行排序
select * from emp order by first_name
3)可以對多個列進行排序,
多個列的排列原則,優先排序第一個列,當第一個列的值存在重複的情況,纔會對第二個列進行排序,並且每個排序列需要單獨設置排序策略
--要求入職時間升序排列,薪資降序排列
select * from emp order by hire_date asc,salary desc
6、rowid 和 rownum
rowid
結果如下:
rownum
rownum在結果集生成後由Oracle自動分配,且必須從1開始,所有基於rownum的查詢也必須從1開始。
--每頁5條數據,查詢第一頁的數據
select first_name||last_name,salary from emp where rownum between 1 and 5
Oracle 函數
函數是PL/SQL對SQL的補充
Oracle函數只在Oracle中使用
日期轉換格式
YYYY 完整年份
MM 月份
DD 天數
HH24 24制小時
MI 分鐘
SS 秒
YEAR 年份拼寫
RR 數值年份的最後兩位
MON 月份字母的縮寫
DAY 星期
數值轉換格式
9 任意數值
0 以0顯示
L 本地系統貨幣符號
. 小數點
, 千位符
$ 以$顯示
0 和 9 的區別:0對不足位數的數字進行補位,9不會補位。
例子:
--將數值按照指定的格式轉換
select to_char('1234.4567','99999.99') from dual
--格式化字符0將進行對不足位數的數字進行補位
select to_char('1234.4567','000000.000') from dual
select to_char(123456.789,'$9,999,999.99') from dual
--查詢所有員工的姓名和薪資,薪資使用財務方式來呈現
select first_name||last_name as empName,to_char(salary,'$99,999,999.99') as salary from emp
常用的Oracle函數
1、字符函數
2、日期函數
3、數值函數
4、轉換函數
7、轉換函數
1)to_char 用於將字符格式化,或者日期轉換成字符串
獲取日期中指定單位
--獲取日期中的指定單位
select to_char(sysdate,'mm') from dual
--查詢部門編號爲80-100的員工的姓名,入職的年份,以及薪水
select first_name||last_name as empName,to_char(hire_date,'yyyy') as hire_year,salary from emp where department_id between 80 and 100
--將這個月入職的員工薪資全部提高100塊
update emp set salary=salary+100 where to_char(sysdate,'mm')=to_char(hire_date,'mm')
2)to_date 將字符串轉換成date類型
select to_date('20160710','yyyymmdd') from dual
3)to_number 將字符轉換成number類型
select to_number('2016') from dual
select * from emp order by to_number(to_char(hire_date,'yyyy'))
8、字符串函數
1)upper 轉換成大寫
--將字母轉換成大寫
select upper('niit') from dual
2)lower 轉換成小寫
--將字母轉換成小寫
select lower('NIIT') from dual
--查詢名字中首字母是t(不區分大小)的用戶名字和入職時間
select first_name||last_name as empName,hire_date from emp where upper(first_name) like 'T%'
select first_name||last_name as empName,hire_date from emp where lower(first_name) like 't%'
3)initcap 首字母大寫
--首字母大寫
select initcap(userName) from users
4)concat 字符串連接
--拼接字符串
select concat(first_name,last_name) from emp
select first_name||last_name from emp
5)length 獲取字符數
--獲取字符串的長度
select length('helloniit') from dual
--查詢users表中姓名長度超過4位的用戶信息
select * from users where length(userName)>4
6)lpad 左填充
7)rpad 右填充
--左右填充數據
--第一個參數表示源字符串,第二個參數表示填充的長度,第三個參數表示填充的字符
select lpad('niit',6,'*') from dual
select rpad('niit',10,'#') from dual
8)ltrim 去除左空格
--去除左空格
select length(ltrim(' niit')) from dual
9)rtrim 去除右空格
--去除右空格
select length(rtrim('niit ')) from dual
--去除左右空格
select ltrim(rtrim(' niit ')) from dual
10)instr 獲取查詢字符串的索引
第一個參數表示源字符串,第二個參數表示要搜索的字符,第三個參數可以不寫,默認從1開始,表示起始的檢索位置
索引從1開始,如果檢索不到數據則返回0
select instr('hello niit','l',5) from dual
--查詢使用niit郵箱的用戶
select * from users where instr(email,'@niit.com') != 0
11)substr 截取字符串
如果只傳一個索引 表示從該索引截取到最後
如果傳2個數值參數,第二個數值參數表示截取的長度
--截取字符串
select substr('hello niit123',2,5) from dual;
--查詢編號爲1020用戶的郵箱用戶名和郵箱名
select substr(email,1,instr(email,'@')-1),substr(email,instr(email,'@')+1) from users where userId=1020
--要求查詢用戶的姓名和電話號碼,要求電話號碼進行加密呈現(只顯示電話號碼的前三位和後三位,其餘部分用*屏蔽)
select substr(tel,1,3)||lpad(substr(tel,length(tel)-2),length(tel)-3,'*') from users
12)replace 替換字符串
第一個參數表示源字符串,第二個參數表示被替換的字符,第三個參數表示替換的新字符
--替換字符串內容
select replace('niit','i','a') from dual
9、日期函數
1)sysdate 獲取系統時間
2)extract 獲取時間單位
--獲取年月日單位
select extract(year from sysdate) from dual;
select extract(month from sysdate) from dual;
select extract(day from sysdate) from dual;
select userName,extract(year from birthday) from users
3)months_between 計算月差
--獲取月份的差值,返回浮點數
select months_between(sysdate,to_date('20150519','yyyymmdd')) from dual
--date可以直接使用算數運算符計算,獲得天數的差
select sysdate-to_date('20160818','yyyymmdd') from dual
4)add_months 添加月份
--添加月份 返回增加月份後的date類型
select add_months(sysdate,5) from dual
--sysdate+1是添加天數
select sysdate+1 from dual
例子:
--查詢15年前入職的員工姓名和入職的時間
select first_name||last_name as empName,hire_date from emp where months_between(sysdate,hire_date)/12>=15
--查詢15年前入職的員工姓名和入職的時間
select first_name||last_name as empName,hire_date from emp where add_months(hire_date,15*12)<=sysdate
5)next_day 下一個星期數
--查詢最近的指定星期的日期
select next_day(sysdate,'星期一') from dual
額外例子:
--查詢今天生日人的姓名和出生年月
select userName,birthday from users where to_char(sysdate,'mm')=to_char(birthday,'mm') and to_char(sysdate,'dd')=to_char(birthday,'dd')
select userName,birthday from users where to_char(sysdate,'mmdd')=to_char(birthday,'mmdd')
select to_char(sysdate,'mmdd') from dual
--查詢最近的週一生日的人的姓名和出生年月
select userName,birthday from users where to_char(next_day(sysdate,'星期一'),'mmdd')=to_char(birthday,'mmdd')
--查詢7天內生日的人
select userName,birthday from users where to_date(to_char(birthday,'mmdd'),'mmdd') between to_date(to_char(sysdate,'mmdd'),'mmdd') and to_date(to_char(sysdate+7,'mmdd'),'mmdd')
select to_char(to_date(to_char(sysdate,'mmdd'),'mmdd'),'yyyy-mm-dd hh24:mi:ss') from dual
6)last_day 當月的最後一天
--獲取這個月的最後一天
select last_day(sysdate) from dual
7)round 對日期四捨五入
如果參數是year則用來判斷是否是上下半年,如果是上半年則返回當前年份的1月1日,如果是下半年則返回下一年的1月1日
如果參數是month則用來判斷是否是上下半月,如果是上個月則返回當前年月的第一天
如果參數是day則用來判斷是否是上下禮拜,如果是前半星期,則返回當前星期的第一天(日)
select round(sysdate,'day') from dual
8)trunc 獲取特定時間的第一天
year獲取這一年的第一天
month獲取這個月的第一天
day獲取這個星期的第一天
select trunc(sysdate,'year') from dual
例:
--查詢下個月第一天生日的人
select userName,birthday from users where to_char(add_months(trunc(sysdate,'month'),1),'mmdd')=to_char(birthday,'mmdd')
10、數值函數
1)abs 絕對值
2)ceil 向上取整
3)floor 向下取整
4)power 冪次方
power(2,3) ------->8
5)round 四捨五入
有兩個參數,第二個參數表示保留的小數位數
6)sqrt 平方根
7)trunc 整值截斷
截斷函數,根據指定的小數位直接截取數字
8)mod 整數取餘