朋的博客

          MySQL資料,Java技術,管理思想,博弈論,Ajax,XP極限編程,H.264,HEVC,HDR
          隨筆 - 86, 文章 - 59, 評論 - 1069, 引用 - 0
          數(shù)據(jù)加載中……

          SQL 精妙語句(確實牛!)

          如何從一位菜鳥蛻變成為高手,靈活使用的SQL語句是必不可少的。本文收集了部分比較經典,常用的SQL語句供大家參考,希望對大家有所幫助。

            說明:復制表(只復制結構,源表名:a 新表名:b)  

            SQL: select * into b from a where 1<>1

            說明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標表名:b)  

            SQL: insert into b(a, b, c) select d,e,f from b;

            說明:顯示文章、提交人和最后回復時間  

            SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

            說明:外連接查詢(表名1:a 表名2:b)  

            SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

            說明:日程安排提前五分鐘提醒  

            SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5  

            說明:兩張關聯(lián)表,刪除主表中已經在副表中沒有的信息

            SQL:   

            delete from info where not exists ( select * from infobz where info.infid=infobz.infid

            說明:--

            SQL:   

            SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

             FROM TABLE1,

             (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

             FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

             FROM TABLE2

             WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

             (SELECT NUM, UPD_DATE, STOCK_ONHAND

             FROM TABLE2

             WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

             TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') &brvbar;&brvbar; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y,

             WHERE X.NUM = Y.NUM (+)

             AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND B

            WHERE A.NUM = B.NUM

            說明:--

            SQL:   

            select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專業(yè)名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績

            說明:

            從數(shù)據(jù)庫中去一年的各單位電話費統(tǒng)計(電話費定額賀電化肥清單兩個表來源)

            SQL:  

            SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

             SUM(decode(TO_CHAR(a.telfeedate, '
          mm'), '01', a.factration)) AS JAN,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

            FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

             FROM TELFEESTAND a, TELFEE b

             WHERE a.tel = b.telfax) a

            GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

            說明:四表聯(lián)查問題:  

            SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

            說明:得到表中最小的未使用的ID號

            SQL: 

            SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

             FROM Handle

             WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)

          posted on 2005-07-17 00:02 benchensz 閱讀(5476) 評論(7)  編輯  收藏 所屬分類: MySQL資料翻譯

          評論

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          select * into b from a where 1<>1
          我怎么用不來呀
          顯示
          ERROR 1327 (42000): Undeclared variable: b
          如果能用那真是太好了
          2005-07-19 15:41 | 胡陽

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          假設表a,ID字段為id,"得到表中最小的未使用的ID號"貌似這樣寫更簡單(可能效率會低點)

          select min(id+1) from (select id from a)as a1 where id not in(select id-1 from a)
          2005-07-26 04:56 | 于行義

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          回復:
          select * into b from a where 1<>1
          我怎么用不來呀
          顯示
          ERROR 1327 (42000): Undeclared variable: b
          如果能用那真是太好了

          我在MYSQL中如下試用成功:
          create table b as select * from a where 1<>1
          請試一下
          2005-07-27 16:40 | 梁剛

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          才看到……
          呵呵,胡兄弟少了Create語句
          于兄弟的SQL應該用得比我好,這是轉載的,不過其實這里sql的子查詢語句只是為了獲得原表的結構,如果需要的只是某些列也可以將*改為那些列的名字。
          復制表的某些列也可以使用這樣的方法:
          create table b as select a.id, a.name, a.address from user a;
          2005-07-27 23:30 | 陳朋奕

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          還是你寫的那個是對的......我這個少算了一種情況......
          手比腦子動作的快,肯定是會出錯的,汗........

          select min(id+1) from a where id not in(select id-1 from a);
          這樣子大多數(shù)情況都適用,但是唯獨當缺失的ID為1的時候,不適用了.會返回"除1以外最小的缺失ID",而不返回1.

          所以單獨判斷一下子這個id=1是不是存在,就是你上面說的那種辦法了...
          select (case when exists(select id from a where id=1) then min(id+1) else 1 end) from a where id not in(select id-1 from a);

          現(xiàn)在看來,這種方法應該是最優(yōu)的辦法了,就MySQL-4.1.x來說.
          2005-07-29 07:29 | 于行義

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          看來于大哥是個SQL高手,呵呵,對SQL的理解很深刻
          給了另一種解法,讓小弟開了眼界
          只是我覺得這樣做的話會加大SQL的開銷,似乎沒有必要。
          有個問題請教,假設我現(xiàn)在有兩個表,表結構一樣,但里面有些數(shù)據(jù)不一樣,如果我想要將這兩個表中不一樣的部分輸出到第三個表中,怎么寫SQL?
          2005-07-30 00:11 | 陳朋奕

          # re: SQL 精妙語句(確實牛!)  回復  更多評論   

          假設表a,b,c,均有字段val,把a和b中不一樣的部分輸入到c中,似乎可以這樣做:

          b里面有a里面沒有的-->輸入進c:
          insert into c(val) select val from a where val not in (select val from b);

          a里面有b里面沒有的-->輸入進c:
          insert into c(val) select val from b where val not in (select val from a);

          合起來大概是這樣:
          insert into c(val) select val from a where val not in (select val from b) union select val from b where val not in (select val from a);
          2005-07-30 06:46 | 于行義
          主站蜘蛛池模板: 桓仁| 宕昌县| 容城县| 安化县| 郁南县| 镇安县| 贵港市| 呼图壁县| 天祝| 衡水市| 安庆市| 遂溪县| 城市| 马鞍山市| 乌鲁木齐县| 陇川县| 通州区| 同心县| 马龙县| 边坝县| 马山县| 庆云县| 长兴县| 根河市| 乌兰县| 资源县| 左云县| 星座| 九龙县| 齐齐哈尔市| 昭苏县| 凭祥市| 灌南县| 兴安县| 五家渠市| 武穴市| 隆子县| 延庆县| 运城市| 安陆市| 弥渡县|