詳細介紹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 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字段的順序號一、2、3„指定字段,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
SQL>EXPLAIN PLAN FOR sql語句;
SQL>select * from table(dbms_xplan.display());
>>>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;
Case when
Select ename,sal,
Case
When sal<=2000 THEN ‘太低’
When sal>=5000 THEN ‘太高’
ELSE ‘OK’
END AS STATUS
FROM EMP WHERE DEPTNO=10;
限制返回的行數,能夠用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
好比對錶中數據隔行返回,可用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;
經過它想間隔幾行均可以。
若是模糊查詢想查出「_BCE」的怎麼辦呢,須要用ESCAPE進行一下轉義。
>>> Select * from v where vname like ‘_\\BCE%’ escape ‘\’ ;
好比對手機號尾號排序
Select salary,substr(phonenumber,-4) as 尾號 from emp where rownum<=5 order by 2;
空值默認顯示在後面,能夠用nulls first,nulls last來肯定先後,nvl(column,-1)方法若數據有變化須要從新維護。
需求:如領導對工資在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中。
好比需求:各用戶兩次登陸的間隔時間,當前記錄和下條記錄之間相差的天數
Lead() over
Dense_rank() over
Row_number() over
Rank() over
Lead() over
Firstvalue
分析函數
自關聯要掃兩次表,分析函數只須要一次
Regexp_substr
Regexp_likes
Regexp
Regexp_replace
Oracle中REGEXP_SUBSTR及其它支持正則表達式的內置函數小結
實例:把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;