第四章 數據基本查詢

數據表的查詢原理:
                從源表中根據需要查詢的列和條件逐行對數據進行判斷並將滿足條件的行重新放入一張新表中,這張新表就是我們看到的查詢結果表格。
                查詢的結果稱爲結果表,查詢的結果集是數據庫中的虛擬表,將數據文件的內容以表格的方式進行呈現的結果。

1、查詢語法
    select    *    from    表名
*    是SQL中的通配符,用來匹配表中的所有數據列。
  1. select * from users

   select    列名,列名    from    表名    where    條件
  1. --查詢users所有的人的姓名
  2. select userName from users
  3. --查詢user表中所有人的姓名和他的郵箱
  4. select userName,email from users
  5. --查詢沒有填寫郵箱的用戶姓名,年齡和生日
  6. select userName,age,birthday from users where email is null

2、指定列名查詢
       select    列    as    顯示列名    from    表名
     或者select    列    顯示列名    from    表名
第二種相對於第一種少個as,但第一種比較直觀,所以儘量使用前者。
  1. --查詢員工的姓名和對應的薪水
  2. select first_name||last_name as empName,salary from emp
  3. select first_name||last_name empName,salary from emp

3、爲表起別名
           select    *    from    表名 新表名
注意:這裏沒有as,不同於爲列起別名
  1. --爲表起別名
  2. select * from users u

4、常量列的查詢
源表中沒有的列作爲常量進行查詢, 如下num列下 都是10
  1. --常量列的查詢
  2. 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
  1. --查詢員工的姓名和薪資,並按照由低到高的方式進行呈現
  2. --asc表示升序,默認排序就是升序的方式,desc表示降序
  3. select first_name||last_name as empName,salary from emp order by salary asc
  4. --由高到底顯示工資
  5. select rownum,first_name,salary from emp order by salary desc
       1)order by 通常對列進行排序,同時也可以對表達式的結果進行排序呢
  1. select * from emp order by salary+500
       2)也可以對數字、日期、字母進行排序
  1. select * from emp order by first_name

       3)可以對多個列進行排序,
多個列的排列原則,優先排序第一個列,當第一個列的值存在重複的情況,纔會對第二個列進行排序,並且每個排序列需要單獨設置排序策略
  1. --要求入職時間升序排列,薪資降序排列
  2. select * from emp order by hire_date asc,salary desc

6、rowid 和 rownum
rowid
  1. select rowid from emp
結果如下:
 
rownum
    rownum在結果集生成後由Oracle自動分配,且必須從1開始,所有基於rownum的查詢也必須從1開始。
  1. --每頁5條數據,查詢第一頁的數據
  2. 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不會補位。
例子:
  1. --將數值按照指定的格式轉換
  2. select to_char('1234.4567','99999.99') from dual
  3. --格式化字符0將進行對不足位數的數字進行補位
  4. select to_char('1234.4567','000000.000') from dual
  5. select to_char(123456.789,'$9,999,999.99') from dual
  6. --查詢所有員工的姓名和薪資,薪資使用財務方式來呈現
  7. 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    用於將字符格式化,或者日期轉換成字符串
                獲取日期中指定單位
  1. --獲取日期中的指定單位
  2. select to_char(sysdate,'mm') from dual
  1. --查詢部門編號爲80-100的員工的姓名,入職的年份,以及薪水
  2. 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
  3. --將這個月入職的員工薪資全部提高100
  4. update emp set salary=salary+100 where to_char(sysdate,'mm')=to_char(hire_date,'mm')

        2)to_date    將字符串轉換成date類型
  1. select to_date('20160710','yyyymmdd') from dual

        3)to_number   將字符轉換成number類型
  1. select to_number('2016') from dual
  1. select * from emp order by to_number(to_char(hire_date,'yyyy'))


8、字符串函數
        1)upper    轉換成大寫
  1. --將字母轉換成大寫
  2. select upper('niit') from dual

        2)lower    轉換成小寫
  1. --將字母轉換成小寫
  2. select lower('NIIT') from dual

  1. --查詢名字中首字母是t(不區分大小)的用戶名字和入職時間
  2. select first_name||last_name as empName,hire_date from emp where upper(first_name) like 'T%'
  3. select first_name||last_name as empName,hire_date from emp where lower(first_name) like 't%'

        3)initcap    首字母大寫
  1. --首字母大寫
  2. select initcap(userName) from users

        4)concat    字符串連接
  1. --拼接字符串
  2. select concat(first_name,last_name) from emp
  3. select first_name||last_name from emp

        5)length    獲取字符數
  1. --獲取字符串的長度
  2. select length('helloniit') from dual
  3. --查詢users表中姓名長度超過4位的用戶信息
  4. select * from users where length(userName)>4

        6)lpad        左填充
        7)rpad        右填充
  1. --左右填充數據
  2. --第一個參數表示源字符串,第二個參數表示填充的長度,第三個參數表示填充的字符
  3. select lpad('niit',6,'*') from dual
  4. select rpad('niit',10,'#') from dual

        8)ltrim        去除左空格
  1. --去除左空格
  2. select length(ltrim(' niit')) from dual

        9)rtrim        去除右空格
  1. --去除右空格
  2. select length(rtrim('niit ')) from dual

  1. --去除左右空格
  2. select ltrim(rtrim(' niit ')) from dual

        10)instr        獲取查詢字符串的索引
                第一個參數表示源字符串,第二個參數表示要搜索的字符,第三個參數可以不寫,默認從1開始,表示起始的檢索位置
                索引從1開始,如果檢索不到數據則返回0
  1. select instr('hello niit','l',5) from dual
  1. --查詢使用niit郵箱的用戶
  2. select * from users where instr(email,'@niit.com') != 0


        11)substr    截取字符串
                如果只傳一個索引 表示從該索引截取到最後
                如果傳2個數值參數,第二個數值參數表示截取的長度
  1. --截取字符串
  2. select substr('hello niit123',2,5) from dual;
  1. --查詢編號爲1020用戶的郵箱用戶名和郵箱名
  2. select substr(email,1,instr(email,'@')-1),substr(email,instr(email,'@')+1) from users where userId=1020
  3. --要求查詢用戶的姓名和電話號碼,要求電話號碼進行加密呈現(只顯示電話號碼的前三位和後三位,其餘部分用*屏蔽)
  4. select substr(tel,1,3)||lpad(substr(tel,length(tel)-2),length(tel)-3,'*') from users

        12)replace    替換字符串
                       第一個參數表示源字符串,第二個參數表示被替換的字符,第三個參數表示替換的新字符
  1. --替換字符串內容
  2. select replace('niit','i','a') from dual

9、日期函數
            1)sysdate                        獲取系統時間
 
            2)extract                          獲取時間單位
  
  1. --獲取年月日單位
  2. select extract(year from sysdate) from dual;
  3. select extract(month from sysdate) from dual;
  4. select extract(day from sysdate) from dual;
  5. select userName,extract(year from birthday) from users

            3)months_between         計算月差
  1. --獲取月份的差值,返回浮點數
  2. select months_between(sysdate,to_date('20150519','yyyymmdd')) from dual
  3. --date可以直接使用算數運算符計算,獲得天數的差
  4. select sysdate-to_date('20160818','yyyymmdd') from dual

            4)add_months                 添加月份
  1. --添加月份 返回增加月份後的date類型
  2. select add_months(sysdate,5) from dual
  3. --sysdate+1是添加天數
  4. select sysdate+1 from dual

例子:
  1. --查詢15年前入職的員工姓名和入職的時間
  2. select first_name||last_name as empName,hire_date from emp where months_between(sysdate,hire_date)/12>=15
  3. --查詢15年前入職的員工姓名和入職的時間
  4. select first_name||last_name as empName,hire_date from emp where add_months(hire_date,15*12)<=sysdate

            5)next_day                       下一個星期數
  1. --查詢最近的指定星期的日期
  2. select next_day(sysdate,'星期一') from dual


額外例子:
  1. --查詢今天生日人的姓名和出生年月
  2. select userName,birthday from users where to_char(sysdate,'mm')=to_char(birthday,'mm') and to_char(sysdate,'dd')=to_char(birthday,'dd')
  3. select userName,birthday from users where to_char(sysdate,'mmdd')=to_char(birthday,'mmdd')
  4. select to_char(sysdate,'mmdd') from dual
  5. --查詢最近的週一生日的人的姓名和出生年月
  6. select userName,birthday from users where to_char(next_day(sysdate,'星期一'),'mmdd')=to_char(birthday,'mmdd')
  7. --查詢7天內生日的人
  8. 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')
  9. select to_char(to_date(to_char(sysdate,'mmdd'),'mmdd'),'yyyy-mm-dd hh24:mi:ss') from dual

            6)last_day                        當月的最後一天
  1. --獲取這個月的最後一天
  2. select last_day(sysdate) from dual

            7)round                            對日期四捨五入
                    如果參數是year則用來判斷是否是上下半年,如果是上半年則返回當前年份的1月1日,如果是下半年則返回下一年的1月1日
                   如果參數是month則用來判斷是否是上下半月,如果是上個月則返回當前年月的第一天
                   如果參數是day則用來判斷是否是上下禮拜,如果是前半星期,則返回當前星期的第一天(日)
  1. select round(sysdate,'day') from dual

            8)trunc                             獲取特定時間的第一天
                       year獲取這一年的第一天
                       month獲取這個月的第一天
                       day獲取這個星期的第一天     
  1. select trunc(sysdate,'year') from dual

例:
  1. --查詢下個月第一天生日的人
  2. 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                               整數取餘
發佈了46 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章