SQL知識累積

詳細介紹select的文章,展現原始數據、SQL、查詢結果,以及在不一樣數據庫下SQL應該如何寫。html

https://en.wikipedia.org/wiki/Select_(SQL)mysql

目錄以下:正則表達式

Contents  [hide] 
1    Examples
2    Limiting result rows
2.1    ROW_NUMBER() window function
2.2    RANK() window function
2.3    FETCH FIRST clause
2.4    Non-standard syntax
2.5    Result limits
2.6    Hierarchical query
3    Query evaluation ANSI
4    Generating Data in T-SQL
5    References
6    Sources
7    External links

 

informix中取第20-30行的數據:SELECT SKIP 20 FIRST 10 * FROM T order by c, d sql

Informix 中如何實現 Oracle rownum 功能的研究數據庫

 

 

統計功能

oracle統計表記錄數(count(*)實現) oracle

統計informix數據庫表記錄數dom

 

mysql 按年度、季度、月度、周、日SQL統計查詢 (

如下INFORMIX SQL語句均通過測試,如非特別註明,測試版本爲IDS11.5開發版。每一期結合一個具體應用詳細介紹。 

1、選擇記錄 
1.選擇前10條記錄select first 10 * from hcrk IDS7.30、IDS11支持   2.選擇11-15條記錄select skip 10 limit 5 * from hcrk IDS7.30不支持,IDS11支持  select first 5 hcrkzlbh from (select first 15 hcrkzlbh from hcrk) order by hcrkzlbh desc  IDS7.30用此方法實現     2、導出數據庫結構  dbschema -d db_name -ss     3、合成表名  select * from hxq(select id from tab_a)  informix 11支持,informix十、9、7均不支持。    4、日期字段  2008-10-13  1.直接從datatime字段()截取其中一段   select extend(hcrkczsj,year to month) from hcrk 取年月  extend 函數,能夠統計月,日,小時,好比統計按小時統計每一年365天的一張表的日誌記錄條數  

----查看某天的量

  select extend(updatetime,year to day),count(*) from table1
  where updatetime>='2016-01-15 00:00:00'
  group by 1
  order by 1ide

5、select語句中group by和order by使用的一些方法    
數據表hcrk,字段hcrkje(數值型
*.**)、hcrkrq(字符型YYYYMM) 
1.在group by、order by 中使用select字段的順序號一、23„指定字段,select 字段能夠是表達式、字段名、別名 
例:
select hcrkje,z_quarter(hcrkrq) as jd from hcrk group by 2 order by 2 
當select字段爲z_quarter(hcrkrq) 
as jd時  group by不容許表達式「z_quarter(hcrkrq)」,也不容許別名「jd」,但容許字段名「hcrkrq」和順序號。 
order by不容許字段名「hcrkrq」,但容許表達式「z_quarter(hcrkrq)」、 順序號和別名「jd」。   

6、select語句中case、when的用法 
算奇、偶月份 
1.select case mod(hcrkrq[5,6] /2) when 1 then 「1」 else 「2」 from hcrk 
2.select case when mod(hcrkrq[5,6] /2)=1 then 「1」 else 「2」 from hcrk 
上面將表達式分別寫在case後,when後,兩種寫法均可以。 case、when也能夠用在自建函數中。   

7、自建函數建立方法 

1.創建函數(SPL?)
能夠象informix內置函數(如sum、max)同樣調用 返回季度,傳入參數rq,格式「YYYYMM」,字符型。 函數必須指定返回類型。 
CREATE FUNCTION z_quarter ( rq VARCHAR(
20) )    RETURNS INTEGER    DEFINE quarter INTEGER;   
LET quarter 
= trunc((rq[5,6]-1)/3)+1;  (或者LET quarter = trunc(mod(rq-1,100)/3)+1;  
RETURN quarter;  
END FUNCTION   
若是返回類型爲字符型,必須指定長度。不然返回單個字符。 
CREATE FUNCTION z_quarter ( rq VARCHAR(
20) )    RETURNS CHAR(20)    DEFINE quarter CHAR(20);   LET quarter case trunc((rq-1)/3)+1 when 1 then "1季度" when 2 then "2季度" when 3 then "3季度"  when 4 then "4季度" else "N" end;    RETURN quarter;  END FUNCTION   
能夠用「
||」鏈接字串(象select中鏈接字串同樣) 
例:LET quarter 
case trunc((rq-1)/3)+1 when 1 then "1" when 2 then "2" when 3 then "3" when 4 then "4" else "N" end||"季度";    可是LET quarter = quarter||"季度";是不行的,報錯。 

2.刪除函數  

drop function z_quarter  3.調用函數 
select trim(z_quarter(hcrkrq[5,6]) from hcrk group by 1 order by 1 trim()函數截去先後空格。 
 
8、按季度統計出庫金額 

1.group by、order by不用字段順序號的方法時需二次select  select jd,sum(zje) from (SELECT sum(hcrkje) as zje, trunc((hcrkrq[5,6]-1)/3)+1 as jd  
FROM hcrk group by hcrkrq order by jd) group by jd order by jd  季度 金額  1 558  2 320  3 2277  4 399 
2. group by、order by用字段順序號 
SELECT trunc((hcrkrq[5,6]-1)/3)+1 as jd,sum(hcrkje)   
FROM hcrk group by 2 order by 2 
 
3.將季度替換爲中文名稱 select  
case trunc((hcrkrq[5,6]-1)/3)+1 when 1 then "1季度" when 2 then "2季度" when 3 then "3季度" when 4 then "4季度" else hcrkrq 
end as jd, sum(hcrkje) 
from hcrk group by 2 order by 2 4.使用自建函數 
使用函數,當規則改變時,只須要修改一處,靈活,使用簡單。 select z_quarter(hcrkrq) as jd, sum(hcrkje) from hcrk group by 2 order by 2函數

7、年、月、周、日統計金額 
SELECT year(date) as year,sum(hcrkje) FROM hcrk group by 1 order by 1 
SELECT month(date) as month,sum(hcrkje) FROM hcrk group by 1 order by 1 測試

SELECT day(date) as day,sum(hcrkje) FROM hcrk group by 1 order by 1

 

SQL的執行順序

mysql

查詢語句書寫順序:select – from- where- group by- having- order by-limit

查詢語句執行順序:from - where -group by - having - select - order by-limit     

 


 

《oracle 查詢優化改寫 技巧與案例》讀書筆記 

查看解釋計劃

SQL>EXPLAIN PLAN FOR  sql語句;

SQL>select * from table(dbms_xplan.display());

 

 

第1章           單表查詢

1.1將空值轉換爲實際值

>>>select coalesce(comm,0) from emp;

爲什麼不用NVL?coalesce更好用,它支持多個參數,能很方便的返回第一個不爲空的值。

好比表V以下

c1

c2

c3

c4

c5

c6

 

 

1

 

2

 

 

 

 

4

 

2

>>>select coalesce(c1,c2,c3,c4,c5,c6) AS C from V;

C

1

3

2rows selected

>>>select  nvl(nvl(nvl(nvl(nvl(c1,c2),c3),c4),c5),c6) as c from v;

1.2在select中使用條件邏輯

Case when

Select ename,sal,

          Case

                   When sal<=2000 THEN ‘太低’

When sal>=5000 THEN ‘太高’

ELSE ‘OK’

END AS STATUS

FROM EMP WHERE DEPTNO=10;

 

1.3從表中隨機取數

限制返回的行數,能夠用rownum過濾。要想隨機需用dbms_random來對數據隨機排序

>>>select empno,ename from

   (select empno,ename from emp order by dbms_random.value())

Where rownum<=3;

這個不能改寫成一條SQL,與SQL的執行順序有關。應該是先隨機排序,再取數據。若是先取數再隨機排序就會有問題。

select empno,ename from emp Where rownum<=3 order by dbms_random.value()

執行順序是先select 再rownum再order by

 

1.4跳過表中n行

好比對錶中數據隔行返回,可用mod函數

>>>select empno,ename,sal,mod(rn,2) as m

From (select rownum as rn,empno,ename,sal from

From (select rownum as rn,empno,ename,sal from emp order by ename) x) y

Where mod(rn,2)=1;

經過它想間隔幾行均可以。

1.5模糊查詢通配符

若是模糊查詢想查出「_BCE」的怎麼辦呢,須要用ESCAPE進行一下轉義。

>>> Select * from v where vname like ‘_\\BCE%’ escape ‘\’ ;

 

第2章           查詢結果排序

2.1將子串排序

好比對手機號尾號排序

Select salary,substr(phonenumber,-4) as 尾號 from emp where rownum<=5 order by 2;

 

2.2空值排序

空值默認顯示在後面,能夠用nulls first,nulls last來肯定先後,nvl(column,-1)方法若數據有變化須要從新維護。

 

2.3根據條件取不一樣列中的值來排序

需求:如領導對工資在1000到2000之間的員工更感興趣,因而要求工資在這個範圍的員工要排在前面,以便優先查看。

Select empno as 編碼,ename as 姓名,

case when sal>=1000 and sal<2000 then 1 else 2 end as 級別

from emp where deptno=30 order by 3,4

也能夠不顯示級別,直接將case when放在order by中。

 

 

第3章           分析函數

2.1查詢同一組或分區中行之間的差

好比需求:各用戶兩次登陸的間隔時間,當前記錄和下條記錄之間相差的天數

Lead()  over

 

 

 

Dense_rank() over

Row_number() over

Rank() over

Lead()  over

Firstvalue

分析函數

 

自關聯要掃兩次表,分析函數只須要一次

第4章           正則

Regexp_substr

Regexp_likes

Regexp

Regexp_replace

Oracle中REGEXP_SUBSTR及其它支持正則表達式的內置函數小結

Oracle REGEXP_LIKE條件

實例:把IP地址的各段取出來

Select regexp_substr(v.ip,’[^.]’,1,1) a, regexp_substr(v.ip,’[^.]’,1,2) b,

regexp_substr(v.ip,’[^.]’,1,3) c, regexp_substr(v.ip,’[^.]’,1,4) d

from (select ‘192.168.1.118’) as ip from dual) v;

相關文章
相關標籤/搜索