SQL 養成一個好習慣是一筆財富

來源:MR_ke

鏈接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html

?

?

我們做軟件開發的,大部分人都離不開跟數據庫打交道,特別是erp開發的,跟數據庫打交道更是頻繁,存儲過程動不動就是上千行,如果數據量大,人員流動大,那么我么還能保證下一段時間系統還能流暢的運行嗎?我么還能保證下一個人能看懂我么的存儲過程嗎?那么我結合公司平時的培訓和平時個人工作經驗和大家分享一下,希望對大家有幫助。

?

要知道sql語句,我想我們有必要知道sqlserver查詢分析器怎么執行我么sql語句的,我么很多人會看執行計劃,或者用profile來監視和調優查詢語句或者存儲過程慢的原因,但是如果我們知道查詢分析器的執行邏輯順序,下手的時候就胸有成竹,那么下手是不是有把握點呢?

?

一:查詢的邏輯執行順序

?

?(1) FROM < left_table>?

?

?(3) < join_type> ?JOIN < right_table> ? (2) ON < join_condition>?

?

?(4) WHERE < where_condition>?

?

?(5) GROUP BY < group_by_list>?

?

?(6) WITH {cube | rollup}

?

?(7) HAVING < having_condition>?

?

?(8) SELECT ?(9) DISTINCT (11) < top_specification> ?< select_list>?

?

?(10) ORDER BY < order_by_list>?

?

?標準的SQL 的解析順序為:

?

?(1).FROM 子句 組裝來自不同數據源的數據

?

?(2).WHERE 子句 基于指定的條件對記錄進行篩選

?

?(3).GROUP BY 子句 將數據劃分為多個分組

?

?(4).使用聚合函數進行計算

?

?(5).使用HAVING子句篩選分組

?

?(6).計算所有的表達式

?

?(7).使用ORDER BY對結果集進行排序

?

?

二 執行順序:

?

?1.FROM:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1

?

?2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2

?

?3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重復執行步驟和步驟直接結束

?

?4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4

?

?5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt5

?

?6.CUBE|ROLLUP:把超組(supergroups)插入vt6 生成vt6

?

?7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 為true的組才插入vt7

?

?8.SELECT:處理select列表產生vt8

?

?9.DISTINCT:將重復的行從vt8中去除產生vt9

?

?10.ORDER BY:將vt9的行按order by子句中的列列表排序生成一個游標vc10

?

?11.TOP:從vc10的開始處選擇指定數量或比例的行生成vt11 并返回調用者

?

看到這里,那么用過linqtosql的語法有點相似啊?如果我們我們了解了sqlserver執行順序,那么我們就接下來進一步養成日常sql好習慣,也就是在實現功能同時有考慮性能的思想,數據庫是能進行集合運算的工具,我們應該盡量的利用這個工具,所謂集合運算實際就是批量運算,就是盡量減少在客戶端進行大數據量的循環操作,而用SQL語句或者存儲過程代替。

?

三、只返回需要的數據

?

返回數據到客戶端至少需要數據庫提取數據、網絡傳輸數據、客戶端接收數據以及客戶端處理數據等環節,如果返回不需要的數據,就會增加服務器、網絡和客戶端的無效勞動,其害處是顯而易見的,避免這類事件需要注意:

?

? A、橫向來看,

?

? (1)不要寫SELECT *的語句,而是選擇你需要的字段。

?

? (2)當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤。

?

如有表table1(ID,col1)和table2 (ID,col2)

?

?Select A.ID, A.col1, B.col2

?

?-- Select A.ID, col1, col2 –不要這么寫,不利于將來程序擴展

?

?from table1 A inner join table2 B on A.ID=B.ID Where …

?

?B、縱向來看,

?

?(1)合理寫WHERE子句,不要寫沒有WHERE的SQL語句。

?

?(2) SELECT TOP N * --沒有WHERE條件的用此替代?

?

四 :盡量少做重復的工作

?

A、控制同一語句的多次執行,特別是一些基礎數據的多次執行是很多程序員很少注意的。

?

B、減少多次的數據轉換,也許需要數據轉換是設計的問題,但是減少次數是程序員可以做到的。

?

C、杜絕不必要的子查詢和連接表,子查詢在執行計劃一般解釋成外連接,多余的連接表帶來額外的開銷。

?

D、合并對同一表同一條件的多次UPDATE,比如

?

UPDATE EMPLOYEE SET FNAME='HAIWER'

WHERE EMP_ID=' VPA30890F' UPDATE EMPLOYEE SET LNAME='YANG'

WHERE EMP_ID=' VPA30890F'

?

這兩個語句應該合并成以下一個語句

?

UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG' ?WHERE EMP_ID=' VPA30890F'

?

E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,雖然功能相同,但是性能差別是很大的。

?

五、注意臨時表和表變量的用法

?

在復雜系統中,臨時表和表變量很難避免,關于臨時表和表變量的用法,需要注意:

?

A、如果語句很復雜,連接太多,可以考慮用臨時表和表變量分步完成。

?

B、如果需要多次用到一個大表的同一部分數據,考慮用臨時表和表變量暫存這部分數據。

?

C、如果需要綜合多個表的數據,形成一個結果,可以考慮用臨時表和表變量分步匯總這多個表的數據。

?

D、其他情況下,應該控制臨時表和表變量的使用。

?

E、關于臨時表和表變量的選擇,很多說法是表變量在內存,速度快,應該首選表變量,但是在實際使用中發現,

?

(1)主要考慮需要放在臨時表的數據量,在數據量較多的情況下,臨時表的速度反而更快。

?

(2)執行時間段與預計執行時間(多長)

?

F、關于臨時表產生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,一般情況下,

?

SELECT INTO會比CREATE TABLE + INSERT INTO的方法快很多,

?

但是SELECT INTO會鎖定TEMPDB的系統表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶并發環境下,容易阻塞其他進程,

?

所以我的建議是,在并發系統中,盡量使用CREATE TABLE + INSERT INTO,而大數據量的單個語句使用中,使用SELECT INTO。

?

六、子查詢的用法(1)

?

子查詢是一個 SELECT 查詢,它嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。

?

任何允許使用表達式的地方都可以使用子查詢,子查詢可以使我們的編程靈活多樣,可以用來實現一些特殊的功能。但是在性能上,

?

往往一個不合適的子查詢用法會形成一個性能瓶頸。如果子查詢的條件中使用了其外層的表的字段,這種子查詢就叫作相關子查詢。

?

相關子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 關于相關子查詢,應該注意:

?

(1)

?

A、NOT IN、NOT EXISTS的相關子查詢可以改用LEFT JOIN代替寫法。比如: SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS') 可以改寫成: SELECT A.PUB_NAME FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL

?

(2)

?

SELECT TITLE FROM TITLES?

WHERE NOT EXISTS?

?(SELECT TITLE_ID FROM SALES?

WHERE TITLE_ID = TITLES.TITLE_ID)

?

可以改寫成:

?

SELECT TITLE?

FROM TITLES LEFT JOIN SALES?

ON SALES.TITLE_ID = TITLES.TITLE_ID?

WHERE SALES.TITLE_ID IS NULL

?

B、 如果保證子查詢沒有重復 ,IN、EXISTS的相關子查詢可以用INNER JOIN 代替。比如:

?

SELECT PUB_NAME?

FROM PUBLISHERS?

WHERE PUB_ID IN

?(SELECT PUB_ID?

?FROM TITLES?

?WHERE TYPE = 'BUSINESS')

?

可以改寫成:

?

SELECT A.PUB_NAME --SELECT DISTINCT A.PUB_NAME?

FROM PUBLISHERS A INNER JOIN TITLES B?

ON ? ? ? ?B.TYPE = 'BUSINESS' AND

A.PUB_ID=B. PUB_ID

?

(3)

?

C、 IN的相關子查詢用EXISTS代替,比如

?

SELECT PUB_NAME FROM PUBLISHERS?

WHERE PUB_ID IN

(SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')

?

可以用下面語句代替:

?

SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS?

(SELECT 1 FROM TITLES WHERE TYPE = 'BUSINESS' AND

PUB_ID= PUBLISHERS.PUB_ID)

?

D、不要用COUNT(*)的子查詢判斷是否存在記錄,最好用LEFT JOIN或者EXISTS,比如有人寫這樣的語句:

?

SELECT JOB_DESC FROM JOBS?

WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0

?

應該改成:

?

SELECT JOBS.JOB_DESC FROM JOBS LEFT JOIN EMPLOYEE ?

ON EMPLOYEE.JOB_ID=JOBS.JOB_ID?

WHERE EMPLOYEE.EMP_ID IS NULL

??

SELECT JOB_DESC FROM JOBS?

WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)<>0

?

應該改成:

?

SELECT JOB_DESC FROM JOBS?

WHERE EXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)?

?

七:盡量使用索引

?

建立索引后,并不是每個查詢都會使用索引,在使用索引的情況下,索引的使用效率也會有很大的差別。只要我們在查詢語句中沒有強制指定索引,

?

索引的選擇和使用方法是SQLSERVER的優化器自動作的選擇,而它選擇的根據是查詢語句的條件以及相關表的統計信息,這就要求我們在寫SQL

?

語句的時候盡量使得優化器可以使用索引。為了使得優化器能高效使用索引,寫語句的時候應該注意:

?

(1

?

A、不要對索引字段進行運算,而要想辦法做變換,比如

?

? ? SELECT ID FROM T WHERE NUM/2=100

? ? 應改為:

? ? SELECT ID FROM T WHERE NUM=100*2

?

? ? SELECT ID FROM T WHERE NUM/2=NUM1

? ? 如果NUM有索引應改為:

? ? SELECT ID FROM T WHERE NUM=NUM1*2

?

? ? 如果NUM1有索引則不應該改。

?

(2)

?

發現過這樣的語句:

?

? ? SELECT 年,月,金額 FROM 結余表 ?WHERE 100*年+月=2010*100+10

? ? 應該改為:

?

? ? SELECT 年,月,金額 FROM 結余表 WHERE 年=2010 AND月=10

?

B、 不要對索引字段進行格式轉換

?

日期字段的例子:

?

WHERE CONVERT(VARCHAR(10), 日期字段,120)='2010-07-15'

?

應該改為

?

WHERE日期字段〉='2010-07-15' ? AND ? 日期字段<'2010-07-16'

?

ISNULL轉換的例子:

?

WHERE ISNULL(字段,'')<>''應改為:WHERE字段<>''

WHERE ISNULL(字段,'')=''不應修改

WHERE ISNULL(字段,'F') ='T'應改為: WHERE字段='T'

WHERE ISNULL(字段,'F')<>'T'不應修改

?

(3)

?

C、 不要對索引字段使用函數

?

WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'

?

應改為: WHERE NAME LIKE 'ABC%'

?

日期查詢的例子:

?

WHERE DATEDIFF(DAY, 日期,'2010-06-30')=0

應改為:WHERE 日期>='2010-06-30' AND 日期 <'2010-07-01'

?

WHERE DATEDIFF(DAY, 日期,'2010-06-30')>0

應改為:WHERE 日期 <'2010-06-30'

?

WHERE DATEDIFF(DAY, 日期,'2010-06-30')>=0

應改為:WHERE 日期 <'2010-07-01'

?

WHERE DATEDIFF(DAY, 日期,'2010-06-30')<0

應改為:WHERE 日期>='2010-07-01'

?

WHERE DATEDIFF(DAY, 日期,'2010-06-30')<=0

應改為:WHERE 日期>='2010-06-30'

?

D、不要對索引字段進行多字段連接

?

? 比如:

?

? WHERE FAME+ '. '+LNAME='HAIWEI.YANG'

?

? 應改為:

?

? WHERE FNAME='HAIWEI' AND LNAME='YANG'

?

八:多表連接的連接條件對索引的選擇有著重要的意義,所以我們在寫連接條件條件的時候需要特別注意。

?

? A、多表連接的時候,連接條件必須寫全,寧可重復,不要缺漏。

?

? B、連接條件盡量使用聚集索引

?

? C、注意ON、WHERE和HAVING部分條件的區別

?

? ON是最先執行, WHERE次之,HAVING最后,因為ON是先把不符合條件的記錄過濾后才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,WHERE也應該比 HAVING快點的,因為它過濾數據后才進行SUM,在兩個表聯接時才用ON的,所以在一個表的時候,就剩下WHERE跟HAVING比較了

?

考慮聯接優先順序:

?

(1)INNER JOIN

(2)LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代)

(3)CROSS JOIN

?

其它注意和了解的地方有:

?

A、在IN后面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最后面,減少判斷的次數

?

B、注意UNION和UNION ALL的區別。--允許重復數據用UNION ALL好 ?

?

C、注意使用DISTINCT,在沒有必要時不要用

?

?D、TRUNCATE TABLE 與 DELETE 區別

?

?E、減少訪問數據庫的次數

?

還有就是我們寫存儲過程,如果比較長的話,最后用標記符標開,因為這樣可讀性很好,即使語句寫的不怎么樣但是語句工整,C# 有region

?

sql我比較喜歡用的就是

?

--startof ?查詢在職人數

? ? ?sql語句

? --end of

? ? ??

正式機器上我們一般不能隨便調試程序,但是很多時候程序在我們本機上沒問題,但是進正式系統就有問題,但是我們又不能隨便在正式機器上操作,那么怎么辦呢?我們可以用回滾來調試我們的存儲過程或者是sql語句,從而排錯。

?

BEGIN TRAN

?UPDATE a SET 字段=''

ROLLBACK

? ? ? ?

作業存儲過程我一般會加上下面這段,這樣檢查錯誤可以放在存儲過程,如果執行錯誤回滾操作,但是如果程序里面已經有了事務回滾,那么存儲過程就不要寫事務了,這樣會導致事務回滾嵌套降低執行效率,但是我們很多時候可以把檢查放在存儲過程里,這樣有利于我們解讀這個存儲過程,和排錯。

?

BEGIN TRANSACTION ?

--事務回滾開始 ? ? ??

?

--檢查報錯

?IF ( @@ERROR > 0 ) ? ??

? ? ? ? ? ? ? ? ? ? BEGIN ? ? ??

--回滾操作

? ? ? ? ? ? ? ? ? ? ? ? ROLLBACK TRANSACTION ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? RAISERROR('刪除工作報告錯誤', 16, 3) ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? RETURN ? ? ? ??

? ? ? ? ? ? ? ? ? ? END ? ? ? ??

?

?

--結束事務

? COMMIT TRANSACTION ? ??

? ? ? ??

好久沒有寫博文了,工作項目一個接一個,再加上公司人員流動,新人很多事情接不下來,加班成了家常便飯,倉促寫下這些希望對大家有幫助,不對的也歡迎指點,交流互相提高。

?

有錯誤的地方歡迎大家拍磚,希望交流和共享。

轉載于:https://www.cnblogs.com/xinhuawei/p/5459081.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JAVA】StringTokenizer 迭代方式對字符串進行分割

StringTokenizer是一個用來分隔String的應用類&#xff0c;相當于VB的split函數。1.構造函數public StringTokenizer(String str)public StringTokenizer(String str, String delim)public StringTokenizer(String str, String delim, boolean returnDelims)第一個參數就是要分…

python數組定義_python定義數組

廣告關閉 騰訊云11.11云上盛惠 &#xff0c;精選熱門產品助力上云&#xff0c;云服務器首年88元起&#xff0c;買的越多返的越多&#xff0c;最高返5000元&#xff01; 一、一維數組 1. 直接定義matrix2. 間接定義matrixprint(matrix)輸出&#xff1a;3. 數組乘法matrix*5print…

Android-語言設置流程分析

Android手機語言切換行為&#xff0c;是通過設置-語言和輸入法-語言來改變手機的語言&#xff0c;其實這個功能很少被用戶使用。 以Android5.1工程源碼為基礎,從設置app入手來分析和學習語言切換的過程:一、語言設置界面&#xff1a;首先在設置app中找到語言設置這個Preference…

charles 安裝 ssl_最全面的解決Charles手機抓包的證書問題(步驟非常詳細)

源自公眾號文章: 徹底解決Charles手機抓包的證書問題簡介: Charles 抓包是日常開發當中經常會用到的技術, 在 Android 6 之前, 手機系統既信任系統內置的證書, 也信任用戶自己安裝的證書, 但是在 Android 7 之后, 卻發生了變化, 手機系統只信任系統內置的根證書. 當然了, 這是為…

oracle報錯:ORA-00054: 資源正忙,要求指定 NOWAIT

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源&#xff1a; --首先得到被鎖對象的session_idselect session_id from v$locked_object; --通過上面得到的session_id去取得v$session的sid和serial#&#xff0c;然后對該進程進行終止。--SELECT sid, serial#, username, o…

ARM中ROM,RAM,FLASH區別

RAM&#xff08;Random Access Memory&#xff09;的全名為隨機存取記憶體&#xff0c;它相當于PC機上的移動存儲&#xff0c;用來存儲和保存數據的。它在任何時候都可以讀寫&#xff0c;RAM通常是作為操作系統或其他正在運行程序的臨時存儲介質&#xff08;可稱作系統內存&…

excel 2007 vba與宏完全剖析_Excel宏VBA小技巧系列 | 分段加合

寫在前面的話 知識產權算是一個盛產數據的行業。專利啊商標啊著作啊&#xff0c;都有著錄項目。我們常說的專利分析、產業導航、企業導航、產業預警、競爭情報、技術綜述、知識產權評議等等&#xff0c;常規操作之一就要先處理著錄項目數據&#xff0c;然后再進行不同角度的分…

SecureCRT:保存輸出日志的方法

處理地址&#xff1a; http://blog.sina.com.cn/s/blog_64c1dd210101gzgz.html 或者&#xff1a; http://renchen.blog.51cto.com/4531967/1195862 重點在與設定文檔的文件名稱&#xff0c;里面有說明。 http://renchen.blog.51cto.com/4531967/1195862轉載于:https://www.cnbl…

redhat虛擬機安裝

做過好多使用VMware workstation虛擬機搭建的系統&#xff0c;這是我第一次使用Virtual Box&#xff0c;感覺跟Vmware差不多&#xff0c;我的本子的系統是win7 64位。 下面演示安裝的是在VirtualBox里安裝rhel 6.4 linux 64位系統。 一、VirtualBOX 版本。 二、虛擬機的配置。…

mysql 查看表v空間自增漲_MySQL InnoDB表空間加密

從 MySQL5.7.11開始&#xff0c;MySQL對InnoDB支持存儲在單獨表空間中的表的數據加密 。此功能為物理表空間數據文件提供靜態加密。該加密是在引擎內部數據頁級別的加密手段&#xff0c;在數據頁寫入文件系統時加密&#xff0c;加密用的是AES算法&#xff0c;而其解密是在從文件…

arm之mmu原理

實驗目的&#xff1a;啟用MMU&#xff0c;映射SDRAM的地址空間&#xff0c;操作虛擬地址實現“點燈大法”&#xff0c;借此掌握MMU的使用。實驗環境及說明&#xff1a;恒頤S3C2410開發板H2410。H2410核心板擴展有64MB的K4S561632 SDRAM(4M*16bit*4BANK)&#xff0c;地址范圍是0…

osal_start_timerEx(Lock_TaskID,SBP_START_DEVICE_EVT,SBP_PERIODIC_EVT_PERIOD)的理解

osal_start_timerEx(Lock_TaskID,SBP_START_DEVICE_EVT,SBP_PERIODIC_EVT_PERIOD)與osal_set_event(Music_TaskID,event)的區別是osal_start_timerEx周期性的一直推送事件周期時間由SBP_PERIODIC_EVT_PERIOD決定&#xff0c;而osal_set_event是只推送一次。osal_start_timerEx開…

ideaspringboot項目上傳服務器_PHP中使用 TUS 協議來實現可恢復文件上傳

曾經嘗試過用PHP上傳大文件嗎&#xff1f;想知道您是否可以從上次中斷的地方繼續上傳&#xff0c;而不會在遇到任何中斷的情況下再次重新上傳整個數據&#xff1f;如果您覺得這個場景很熟悉&#xff0c;請接著往下閱讀。文件上傳是我們幾乎所有現代Web項目中的一項很常見的任務…

無密碼登陸

server A /B以root賬戶在A上無密碼ssh到B方式一ON A:ssh-keygen -t dsa -P -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys chmod 644 ~/.ssh/authorized_keys service sshd restart ON B:ssh-keygen -t dsa -P -f ~/.ssh/id_dsa cat ~/.ssh/id_d…

嵌入式常見筆試題總結

預處理器&#xff08;Preprocessor&#xff09;1. 用預處理指令#define 聲明一個常數&#xff0c;用以表明1年中有多少秒&#xff08;忽略閏年問題&#xff09; #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在這想看到幾件事情&#xff1a; 1). #define 語法的基本知識…

【轉】php利用mkdir創建多級目錄

先介紹一下 mkdir() 這個函數&#xff1a; mkdir($path,0777,true); 第一個參數&#xff1a;必須&#xff0c;代表要創建的多級目錄的路徑&#xff1b; 第二個參數&#xff1a;設定目錄的權限&#xff0c;默認是 0777&#xff0c;意味著最大可能的訪問權&#xff1b; 第三個參數…

java使用xml存儲數據_用存儲過程和 JAVA 寫報表數據源有什么弊端?

用存儲過程和 JAVA 寫報表數據源有什么弊端&#xff1f;跟著小編一起來一看一下吧&#xff01;我們在報表開發中經常會使用存儲過程準備數據&#xff0c;存儲過程支持分步計算&#xff0c;可以實現非常復雜的計算邏輯&#xff0c;為報表開發帶來便利。所以&#xff0c;報表開發…

GIT文件的三種狀態

對于任何一個文件&#xff0c;在 Git 內都只有三種狀態&#xff1a;已提交&#xff08;committed&#xff09;&#xff0c;已修改&#xff08;modified&#xff09;和已暫存&#xff08;staged&#xff09;。已提交表示該文件已經被安全地保存在本地數據庫 中了&#xff1b;已修…

嵌入式常見筆試題總結(2)

預處理器&#xff08;Preprocessor&#xff09;   1. 用預處理指令#define 聲明一個常數&#xff0c;用以表明1年中有多少秒&#xff08;忽略閏年問題&#xff09;   #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL   我在這想看到幾件事情&#xff1a;   1). #…

MAC OS上JAVA1.6 升級1.7,以及?maven3.2.1配置

一、我的MAC系統 預裝的Jdk是1.6&#xff0c;由于需要使用eclipse MARs 2版本&#xff0c;故需要升級到1.7 二、下載JAVA jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 不知道為什么直接下非常慢&#xff0c;后來用的迅雷就超級快…