原創(chuàng)|使用教程|編輯:龔雪|2014-12-09 09:55:47.000|閱讀 775 次
概述:一些經(jīng)典的SQL編程問題。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
數(shù)字輔助表是一個只包含從1到N的N個整數(shù)的簡單表,N通常很大。數(shù)字輔助表是一個非常強大的工具,所以我們創(chuàng)建一個持久的數(shù)字輔助表:
CREATE TABLE Nums( a INT UNSIGNED NOT NULL PRIMARY KRY )ENGINE=InnoDB; CREATE PRODURE CreateNums (t INT UNSIGNED ) BEGIN DECLARE s INT UNSIGNED DEFAULT 1; TRUNCATE TABLE Nums; INSERT INTO Nums SELECT s; WHILE s*2 <= t DO BEGIN INSERT INTO Nums SELECT a+s FROM Nums; SET s = s*2 END; END WHILE; END;
CREATE TABLE t (a INT UNSIGNED NOT NULL PRIMARY KEY); INSERT INTO t VALUES(1); INSERT INTO t VALUES(2); INSERT INTO t VALUES(3); INSERT INTO t VALUES(100); INSERT INTO t VALUES(101); INSERT INTO t VALUES(103); INSERT INTO t VALUES(104); INSERT INTO t VALUES(105);
如何得到下面的輸出結(jié)果呢?
SELECT MIN(a) start,MAX(a) end FROM ( SELECT a,rn,a-rn AS diff FROM (SELECT a,@a:=@a+1 rn FROM t,(SELECT @a:=0) AS a) AS b )AS c GROUP BY diff;
點擊(此處)折疊或打開
CREATE TABLE x( a INT UNSIGNED PRIMARY KEY, b CHAR(1) NOT NULL )ENGINE = InnoDB; INSERT INTO x SELECT 3,'a'; INSERT INTO x SELECT 4,'b'; INSERT INTO x SELECT 6,'c'; INSERT INTO x SELECT 7,'d';
注意a列必須是一個正整數(shù),所以這里的類型為INT UNSGINED。最小缺失值的問題是,假設(shè)列a從1開始,對于當前表中的數(shù)據(jù)3、4、6、7,查詢應(yīng)返回1。如果當前表的數(shù)據(jù)為1、2、3、4、6、7,則返回5。
解決方案如下:
SELECT CASE WHEN NOT EXISTS (SELECT a FROM x WHERE a=1)THEN 1 ELSE (SELECT MIN(a)+1 AS missing FROM x AS A WHERE NOT EXISTS (SELECT * FROM x AS B WHERE A.a+1=B.a)) END AS missing;
運行上面的SQL,得到結(jié)果為1,若向a列插入1,2后得到的結(jié)果為5。
若要對最小缺失值進行補缺操作,解決方案如下:
INSERT INTO x SELECT CASE WHEN NOT EXISTS (SELECT a FROM x WHERE a=1)THEN 1 ELSE (SELECT MIN(a)+1 AS missing FROM x AS A WHERE NOT EXISTS (SELECT * FROM x AS B WHERE A.a+1=B.a)) END AS missing, 'p';
運行上面的SQL,我們將會在a列插入5,b列插入'p'。
行號是指按順序為查詢結(jié)果集的行分配的連續(xù)整數(shù)。
CREATE TABLE sales ( empid varchar(10) NOT NULL, mgrid varchar(10) NOT NULL, qty` int(11) NOT NULL, PRIMARY KEY (empid) ); INSER INTO salses VALUES('A',Z',300); INSER INTO salses VALUES('B',X',100); INSER INTO salses VALUES('C',Y',100); INSER INTO salses VALUES('D',Z',300); INSER INTO salses VALUES('E',X',200); INSER INTO salses VALUES('F',Z',100);
現(xiàn)在我們根據(jù)empid進行行號統(tǒng)計
SELECT empid, (SELECT COUNT(*) FROM sales AS T2 WHERE T2.empid <= T1.empid) AS rownum FROM sales AS T1;
但是上面這句SQL效率不是最理想的,在Mysql數(shù)據(jù)庫中得到行號最快的解決方案是采用CROSS JOIN。
狂歡繼續(xù)!【年終大促 巔峰盛"慧" 】促銷火熱進行中 iPhone 6 Plus、 iPhone 6、iPad Air滿就送,還不趕快買買買!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)