久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

12月 2010 的存檔 - ijser

 通徹之冰 2010-12-25



       Hibernate映射類(lèi)型分為兩種:內(nèi)置映射類(lèi)型和客戶(hù)化映射類(lèi)型,。內(nèi)置映射類(lèi)型負(fù)責(zé)把一些常見(jiàn)的Java類(lèi)型映射到相應(yīng)的SQL類(lèi)型,;此外,Hibernate還允許用戶(hù)實(shí)現(xiàn)UserTypeCompositeUserType接口,,來(lái)靈活地定制客戶(hù)化映射類(lèi)型,。客戶(hù)化類(lèi)型能夠把用戶(hù)定義的Java類(lèi)型映射到數(shù)據(jù)庫(kù)表的相應(yīng)字段,。

 

一,、Hibernate的內(nèi)置映射類(lèi)型

1Java基本類(lèi)型的Hibernate映射類(lèi)型

Hibernate映射類(lèi)型

Java類(lèi)型

標(biāo)準(zhǔn)SQL類(lèi)型

大小和取值范圍

integer或者int

int或者java.lang.Integer

INTEGER

4字節(jié)

long

long  Long

BIGINT

8字節(jié)

short

short  Short

SMALLINT

2字節(jié)

byte

byte  Byte

TINYINT

1字節(jié)

float

float  Float

FLOAT

4字節(jié)

double

double  Double

DOUBLE

8字節(jié)

big_decimal

java.math.BigDecimal

NUMERIC

NUMERIC(8,2)8

character

char  Character  String

CHAR(1)

定長(zhǎng)字符

string

String

VARCHAR

變長(zhǎng)字符串

boolean

boolean  Boolean

BIT

布爾類(lèi)型

yes_no

boolean  Boolean

CHAR(1) (Y-N)

布爾類(lèi)型

true_false

boolean  Boolean

CHAR(1) (T-F)

布爾類(lèi)型

 

2,、Java時(shí)間和日期類(lèi)型的Hibernate映射

映射類(lèi)型

Java類(lèi)型

標(biāo)準(zhǔn)SQL類(lèi)型

描述

date

util.Date或者sql.Date

DATE

YYYY-MM-DD

time

Date    Time

TIME

HH:MM:SS

timestamp

Date   Timestamp

TIMESTAMP

YYYYMMDDHHMMSS

calendar

calendar

TIMESTAMP

YYYYMMDDHHMMSS

calendar_date

calendar

DATE

YYYY-MM-DD

 

3,、Java大對(duì)象類(lèi)型的Hibernate映射類(lèi)型

映射類(lèi)型

Java類(lèi)型

標(biāo)準(zhǔn)SQL類(lèi)型

MySQL類(lèi)型

Oracle類(lèi)型

binary

byte[]

VARBINARY(BLOB)

BLOB

BLOB

text

String

CLOB

TEXT

CLOB

serializable

Serializable接口任意實(shí)現(xiàn)類(lèi)

VARBINARY(BLOB)

BLOB

BLOB

clob

java.sql.Clob

CLOB

TEXT

CLOB

blob

java.sql.Blob

BLOB

BLOB

BLOB

 

       在程序中通過(guò)Hibernate來(lái)保存java.sql.Clob或者java.sql.Blob實(shí)例時(shí),必須包含兩個(gè)步驟:

l         在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中先保存一個(gè)空的BlobClob實(shí)例,。

l         接著鎖定這條記錄,,更新上面保存的BlobClob實(shí)例,把二進(jìn)制數(shù)據(jù)或文本數(shù)據(jù)寫(xiě)到BlobClob實(shí)例中,。

 

寫(xiě)出高性能SQL語(yǔ)句的35條方法

2010年12月20日 ijse

(1)整合簡(jiǎn)單,無(wú)關(guān)聯(lián)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn):

    如果你有幾個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,你可以把它們整合到一個(gè)查詢(xún)中(即使它們之間沒(méi)有關(guān)系)

    (2)刪除重復(fù)記錄:

    最高效的刪除重復(fù)記錄方法 ( 因?yàn)槭褂昧薘OWID)例子:

    DELETE  FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID)

    FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);

    (3)用TRUNCATE替代DELETE:

    當(dāng)刪除表中的記錄時(shí),在通常情況下, 回滾段(rollback segments ) 用來(lái)存放可以被恢復(fù)的信息. 如果你沒(méi)有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)(準(zhǔn)確地說(shuō)是恢復(fù)到執(zhí)行刪除命令之前的狀況) 而當(dāng)運(yùn)用TRUNCATE時(shí), 回滾段不再存放任何可被恢復(fù)的信息.當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù).因此很少的資源被調(diào)用,執(zhí)行時(shí)間也會(huì)很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)

    (4)選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效):

    ORACLE 的解析器按照從右到左的順序處理FROM子句中的表名,,F(xiàn)ROM子句中寫(xiě)在最后的表(基礎(chǔ)表 driving table)將被最先處理,在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表,。如果有3個(gè)以上的表連接查詢(xún), 那就需要選擇交叉表(intersection table)作為基礎(chǔ)表, 交叉表是指那個(gè)被其他表所引用的表.

    (5)WHERE子句中的連接順序.:

    ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫(xiě)在其他WHERE條件之前, 那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的末尾.

    (6)SELECT子句中避免使用 ‘ * ‘:

    ORACLE在解析的過(guò)程中, 會(huì)將’*’ 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過(guò)查詢(xún)數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間

    (7)減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù):

    ORACLE在內(nèi)部執(zhí)行了許多工作: 解析SQL語(yǔ)句, 估算索引的利用率, 綁定變量 , 讀數(shù)據(jù)塊等,;

    (8)在SQL*Plus , SQL*Forms和Pro*C中重新設(shè)置ARRAYSIZE參數(shù), 可以增加每次數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的檢索數(shù)據(jù)量 ,建議值為200

    (9)使用DECODE函數(shù)來(lái)減少處理時(shí)間:

    使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表.

    (11) 用Where子句替換HAVING子句:

    避免使用HAVING子句, HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾. 這個(gè)處理需要排序,總計(jì)等操作. 如果能通過(guò)WHERE子句限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷(xiāo). (非oracle中)on、where,、having這三個(gè)都可以加條件的子句中,,on是最先執(zhí)行,where次之,,having最后,,因?yàn)閛n是先把不符合條件的記錄過(guò)濾后才進(jìn)行統(tǒng)計(jì),它就可以減少中間運(yùn)算要處理的數(shù)據(jù),,按理說(shuō)應(yīng)該速度是最快的,,where也應(yīng)該比having快點(diǎn)的,因?yàn)樗^(guò)濾數(shù)據(jù)后才進(jìn)行sum,,在兩個(gè)表聯(lián)接時(shí)才用on的,,所以在一個(gè)表的時(shí)候,就剩下where跟having比較了,。在這單表查詢(xún)統(tǒng)計(jì)的情況下,,如果要過(guò)濾的條件沒(méi)有涉及到要計(jì)算字段,那它們的結(jié)果是一樣的,,只是where可以使用rushmore技術(shù),,而having就不能,在速度上后者要慢如果要涉及到計(jì)算的字段,,就表示在沒(méi)計(jì)算之前,,這個(gè)字段的值是不確定的,,根據(jù)上篇寫(xiě)的工作流程,where的作用時(shí)間是在計(jì)算之前就完成的,,而having就是在計(jì)算后才起作用的,,所以在這種情況下,兩者的結(jié)果會(huì)不同,。在多表聯(lián)接查詢(xún)時(shí),,on比where更早起作用。系統(tǒng)首先根據(jù)各個(gè)表之間的聯(lián)接條件,,把多個(gè)表合成一個(gè)臨時(shí)表后,,再由where進(jìn)行過(guò)濾,然后再計(jì)算,,計(jì)算完后再由having進(jìn)行過(guò)濾,。由此可見(jiàn),要想過(guò)濾條件起到正確的作用,,首先要明白這個(gè)條件應(yīng)該在什么時(shí)候起作用,,然后再?zèng)Q定放在那里

    (12) 減少對(duì)表的查詢(xún):

    在含有子查詢(xún)的SQL語(yǔ)句中,要特別注意減少對(duì)表的查詢(xún).例子:

    SELECT  TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT

    TAB_NAME,DB_VER FROM  TAB_COLUMNS  WHERE  VERSION = 604)

    (13) 通過(guò)內(nèi)部函數(shù)提高SQL效率.:

    復(fù)雜的SQL往往犧牲了執(zhí)行效率. 能夠掌握上面的運(yùn)用函數(shù)解決問(wèn)題的方法在實(shí)際工作中是非常有意義的

    (14) 使用表的別名(Alias):

    當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上.這樣一來(lái),就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤.

    (15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:

    在許多基于基礎(chǔ)表的查詢(xún)中,為了滿(mǎn)足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢(xún)的效率. 在子查詢(xún)中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并. 無(wú)論在哪種情況下,NOT IN都是最低效的 (因?yàn)樗鼘?duì)子查詢(xún)中的表執(zhí)行了一個(gè)全表遍歷). 為了避免使用NOT IN ,我們可以把它改寫(xiě)成外連接(Outer Joins)或NOT EXISTS.

    例子:

    (高效)SELECT * FROM  EMP (基礎(chǔ)表)  WHERE  EMPNO > 0  AND  EXISTS (SELECT ‘X’  FROM DEPT  WHERE  DEPT.DEPTNO = EMP.DEPTNO  AND  LOC = ‘MELB’)

    (低效)SELECT  * FROM  EMP (基礎(chǔ)表)  WHERE  EMPNO > 0  AND  DEPTNO IN(SELECT DEPTNO  FROM  DEPT  WHERE  LOC = ‘MELB’)

    (16) 識(shí)別’低效執(zhí)行’的SQL語(yǔ)句:

    雖然目前各種關(guān)于SQL優(yōu)化的圖形化工具層出不窮,但是寫(xiě)出自己的SQL工具來(lái)解決問(wèn)題始終是一個(gè)最好的方法:

    SELECT  EXECUTIONS , DISK_READS, BUFFER_GETS,

    ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,

    ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

    SQL_TEXT

    FROM  V$SQLAREA

    WHERE  EXECUTIONS>0

    AND  BUFFER_GETS > 0

    AND  (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

    ORDER BY  4 DESC;

    (17) 用索引提高效率:

    索引是表的一個(gè)概念部分,用來(lái)提高檢索數(shù)據(jù)的效率,,ORACLE使用了一個(gè)復(fù)雜的自平衡B-tree結(jié)構(gòu). 通常,通過(guò)索引查詢(xún)數(shù)據(jù)比全表掃描要快. 當(dāng)ORACLE找出執(zhí)行查詢(xún)和Update語(yǔ)句的最佳路徑時(shí), ORACLE優(yōu)化器將使用索引. 同樣在聯(lián)結(jié)多個(gè)表時(shí)使用索引也可以提高效率. 另一個(gè)使用索引的好處是,它提供了主鍵(primary key)的唯一性驗(yàn)證.,。那些LONG或LONG RAW數(shù)據(jù)類(lèi)型, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當(dāng)然,你也會(huì)發(fā)現(xiàn), 在掃描小表時(shí),使用索引同樣能提高效率. 雖然使用索引能得到查詢(xún)效率的提高,但是我們也必須注意到它的代價(jià). 索引需要空間來(lái)存儲(chǔ),也需要定期維護(hù), 每當(dāng)有記錄在表中增減或索引列被修改時(shí), 索引本身也會(huì)被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出4 , 5 次的磁盤(pán)I/O . 因?yàn)樗饕枰~外的存儲(chǔ)空間和處理,那些不必要的索引反而會(huì)使查詢(xún)反應(yīng)時(shí)間變慢.。定期的重構(gòu)索引是有必要的.:

    ALTER  INDEX <INDEXNAME> REBUILD <TABLESPACENAME>

    18) 用EXISTS替換DISTINCT:

    當(dāng)提交一個(gè)包含一對(duì)多表信息(比如部門(mén)表和雇員表)的查詢(xún)時(shí),避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換, EXISTS 使查詢(xún)更為迅速,因?yàn)镽DBMS核心模塊將在子查詢(xún)的條件一旦滿(mǎn)足后,立刻返回結(jié)果. 例子:

    (低效):

    SELECT  DISTINCT  DEPT_NO,DEPT_NAME  FROM  DEPT D , EMP E

    WHERE  D.DEPT_NO = E.DEPT_NO

    (高效):

    SELECT  DEPT_NO,DEPT_NAME  FROM  DEPT D  WHERE  EXISTS ( SELECT ‘X’

    FROM  EMP E  WHERE E.DEPT_NO = D.DEPT_NO);

    (19) sql語(yǔ)句用大寫(xiě)的,;因?yàn)閛racle總是先解析sql語(yǔ)句,,把小寫(xiě)的字母轉(zhuǎn)換成大寫(xiě)的再執(zhí)行

    (20) 在java代碼中盡量少用連接符“+”連接字符串!

    (21) 避免在索引列上使用NOT 通常,,

    我們要避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描.

    (22) 避免在索引列上使用計(jì)算.

    WHERE子句中,,如果索引列是函數(shù)的一部分.優(yōu)化器將不使用索引而使用全表掃描.

    舉例:

    低效:

    SELECT … FROM  DEPT  WHERE SAL * 12 > 25000;

    高效:

    SELECT … FROM DEPT WHERE SAL > 25000/12;

(23) 用>=替代>

    高效:

    SELECT * FROM  EMP  WHERE  DEPTNO >=4

    低效:

    SELECT * FROM EMP WHERE DEPTNO >3

    兩者的區(qū)別在于, 前者DBMS將直接跳到第一個(gè)DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個(gè)DEPT大于3的記錄.

    (24) 用UNION替換OR (適用于索引列)

    通常情況下, 用UNION替換WHERE子句中的OR將會(huì)起到較好的效果. 對(duì)索引列使用OR將造成全表掃描. 注意, 以上規(guī)則只針對(duì)多個(gè)索引列有效. 如果有column沒(méi)有被索引, 查詢(xún)效率可能會(huì)因?yàn)槟銢](méi)有選擇OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.

    高效:

    SELECT LOC_ID , LOC_DESC , REGION

    FROM LOCATION

    WHERE LOC_ID = 10

    UNION

    SELECT LOC_ID , LOC_DESC , REGION

    FROM LOCATION

    WHERE REGION = “MELBOURNE”

    低效:

    SELECT LOC_ID , LOC_DESC , REGION

    FROM LOCATION

    WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

    如果你堅(jiān)持要用OR, 那就需要返回記錄最少的索引列寫(xiě)在最前面.

    (25) 用IN來(lái)替換OR

    這是一條簡(jiǎn)單易記的規(guī)則,,但是實(shí)際的執(zhí)行效果還須檢驗(yàn),,在ORACLE8i下,兩者的執(zhí)行路徑似乎是相同的.

    低效:

    SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30

    高效

    SELECT… FROM LOCATION WHERE LOC_IN  IN (10,20,30);

    (26) 避免在索引列上使用IS NULL和IS NOT NULL

    避免在索引中使用任何可以為空的列,,ORACLE將無(wú)法使用該索引.對(duì)于單列索引,如果列包含空值,,索引中將不存在此記錄. 對(duì)于復(fù)合索引,,如果每個(gè)列都為空,索引中同樣不存在此記錄. 如果至少有一個(gè)列不為空,,則記錄存在于索引中.舉例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一條記錄的A,B值為(123,null) , ORACLE將不接受下一條具有相同A,B值(123,null)的記錄(插入). 然而如果所有的索引列都為空,,ORACLE將認(rèn)為整個(gè)鍵值為空而空不等于空. 因此你可以插入1000 條具有相同鍵值的記錄,當(dāng)然它們都是空! 因?yàn)榭罩挡淮嬖谟谒饕兄?所以WHERE子句中對(duì)索引列進(jìn)行空值比較將使ORACLE停用該索引.

    低效: (索引失效)

    SELECT … FROM  DEPARTMENT  WHERE  DEPT_CODE IS NOT NULL;

    高效: (索引有效)

    SELECT … FROM  DEPARTMENT  WHERE  DEPT_CODE >=0;

    (27) 總是使用索引的第一個(gè)列:

    如果索引是建立在多個(gè)列上, 只有在它的第一個(gè)列(leading column)被where子句引用時(shí),優(yōu)化器才會(huì)選擇使用該索引. 這也是一條簡(jiǎn)單而重要的規(guī)則,當(dāng)僅引用索引的第二個(gè)列時(shí),優(yōu)化器使用了全表掃描而忽略了索引

    28) 用UNION-ALL 替換UNION ( 如果有可能的話(huà)):

    當(dāng)SQL 語(yǔ)句需要UNION兩個(gè)查詢(xún)結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UNION-ALL的方式被合并, 然后在輸出最終結(jié)果前進(jìn)行排序. 如果用UNION ALL替代UNION, 這樣排序就不是必要了. 效率就會(huì)因此得到提高. 需要注意的是,,UNION ALL 將重復(fù)輸出兩個(gè)結(jié)果集合中相同記錄. 因此各位還是要從業(yè)務(wù)需求分析使用UNION ALL的可行性. UNION 將對(duì)結(jié)果集合排序,這個(gè)操作會(huì)使用到SORT_AREA_SIZE這塊內(nèi)存. 對(duì)于這塊內(nèi)存的優(yōu)化也是相當(dāng)重要的. 下面的SQL可以用來(lái)查詢(xún)排序的消耗量

    低效:

    SELECT  ACCT_NUM, BALANCE_AMT

    FROM  DEBIT_TRANSACTIONS

    WHERE TRAN_DATE = ’31-DEC-95’

    UNION

    SELECT ACCT_NUM, BALANCE_AMT

    FROM DEBIT_TRANSACTIONS

    WHERE TRAN_DATE = ’31-DEC-95’

    高效:

    SELECT ACCT_NUM, BALANCE_AMT

    FROM DEBIT_TRANSACTIONS

    WHERE TRAN_DATE = ’31-DEC-95’

    UNION ALL

    SELECT ACCT_NUM, BALANCE_AMT

    FROM DEBIT_TRANSACTIONS

    WHERE TRAN_DATE = ’31-DEC-95’

    (29) 用WHERE替代ORDER BY:

    ORDER BY 子句只在兩種嚴(yán)格的條件下使用索引.

    ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序.

    ORDER BY中所有的列必須定義為非空.

    WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

    例如:

    表DEPT包含以下列:

    DEPT_CODE PK NOT NULL

    DEPT_DESC NOT NULL

    DEPT_TYPE NULL

    低效: (索引不被使用)

    SELECT DEPT_CODE FROM  DEPT  ORDER BY  DEPT_TYPE

    高效: (使用索引)

    SELECT DEPT_CODE  FROM  DEPT  WHERE  DEPT_TYPE > 0

    (30) 避免改變索引列的類(lèi)型.:

    當(dāng)比較不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)時(shí), ORACLE自動(dòng)對(duì)列進(jìn)行簡(jiǎn)單的類(lèi)型轉(zhuǎn)換.

    假設(shè) EMPNO是一個(gè)數(shù)值類(lèi)型的索引列.

    SELECT …  FROM EMP  WHERE  EMPNO = ‘123’

    實(shí)際上,經(jīng)過(guò)ORACLE類(lèi)型轉(zhuǎn)換, 語(yǔ)句轉(zhuǎn)化為:

    SELECT …  FROM EMP  WHERE  EMPNO = TO_NUMBER(‘123’)

    幸運(yùn)的是,類(lèi)型轉(zhuǎn)換沒(méi)有發(fā)生在索引列上,索引的用途沒(méi)有被改變.

    現(xiàn)在,假設(shè)EMP_TYPE是一個(gè)字符類(lèi)型的索引列.

    SELECT …  FROM EMP  WHERE EMP_TYPE = 123

    這個(gè)語(yǔ)句被ORACLE轉(zhuǎn)換為:

    SELECT …  FROM EMP  WHERETO_NUMBER(EMP_TYPE)=123

    因?yàn)閮?nèi)部發(fā)生的類(lèi)型轉(zhuǎn)換, 這個(gè)索引將不會(huì)被用到! 為了避免ORACLE對(duì)你的SQL進(jìn)行隱式的類(lèi)型轉(zhuǎn)換, 最好把類(lèi)型轉(zhuǎn)換用顯式表現(xiàn)出來(lái). 注意當(dāng)字符和數(shù)值比較時(shí), ORACLE會(huì)優(yōu)先轉(zhuǎn)換數(shù)值類(lèi)型到字符類(lèi)型

    (31) 需要當(dāng)心的WHERE子句:

    某些SELECT 語(yǔ)句中的WHERE子句不使用索引. 這里有一些例子.

    在下面的例子里, (1)‘!=’ 將不使用索引. 記住, 索引只能告訴你什么存在于表中, 而不能告訴你什么不存在于表中. (2) ‘||’是字符連接函數(shù). 就象其他函數(shù)那樣, 停用了索引. (3) ‘+’是數(shù)學(xué)函數(shù). 就象其他數(shù)學(xué)函數(shù)那樣, 停用了索引. (4)相同的索引列不能互相比較,這將會(huì)啟用全表掃描.

    (32) a. 如果檢索數(shù)據(jù)量超過(guò)30%的表中記錄數(shù).使用索引將沒(méi)有顯著的效率提高.

    b. 在特定情況下, 使用索引也許會(huì)比全表掃描慢, 但這是同一個(gè)數(shù)量級(jí)上的區(qū)別. 而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!

    (33) 避免使用耗費(fèi)資源的操作:

    帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語(yǔ)句會(huì)啟動(dòng)SQL引擎

    執(zhí)行耗費(fèi)資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執(zhí)行兩次排序. 通常, 帶有UNION, MINUS , INTERSECT的SQL語(yǔ)句都可以用其他方式重寫(xiě). 如果你的數(shù)據(jù)庫(kù)的SORT_AREA_SIZE調(diào)配得好, 使用UNION , MINUS, INTERSECT也是可以考慮的, 畢竟它們的可讀性很強(qiáng)

    (34) 優(yōu)化GROUP BY:

    提高GROUP BY 語(yǔ)句的效率, 可以通過(guò)將不需要的記錄在GROUP BY 之前過(guò)濾掉.下面兩個(gè)查詢(xún)返回相同結(jié)果但第二個(gè)明顯就快了許多.

    低效:

    SELECT JOB , AVG(SAL)

    FROM EMP

    GROUP by JOB

    HAVING JOB = ‘PRESIDENT’

    OR JOB = ‘MANAGER’

    高效:

    SELECT JOB , AVG(SAL)

    FROM EMP

    WHERE JOB = ‘PRESIDENT’

    OR JOB = ‘MANAGER’

    GROUP by JOB

SqlServer語(yǔ)句 整理

2010年12月20日 ijse

一,、基礎(chǔ)

1,、說(shuō)明:創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE database-name
2、說(shuō)明:刪除數(shù)據(jù)庫(kù)
drop database dbname

3,、說(shuō)明:備份sql server
— 創(chuàng)建 備份數(shù)據(jù)的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 開(kāi)始 備份
BACKUP DATABASE pubs TO testBack

4,、說(shuō)明:創(chuàng)建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根據(jù)已有的表創(chuàng)建新表:
A:create table tab_new like tab_old (使用舊表創(chuàng)建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、說(shuō)明:刪除新表
drop table tabname

6,、說(shuō)明:增加一個(gè)列
Alter table tabname add column col type

:列增加后將不能刪除,。DB2中列加上后數(shù)據(jù)類(lèi)型也不能改變,唯一能改變的是增加varchar類(lèi)型的長(zhǎng)度,。
7,、說(shuō)明:添加主鍵Alter table tabname add primary key(col)
說(shuō)明:刪除主鍵: Alter table tabname drop primary key(col)
8、說(shuō)明:創(chuàng)建索引create [unique] index idxname on tabname(col….)
刪除索引:drop index idxname
注:索引是不可更改的,,想更改必須刪除重新建,。
9、說(shuō)明:創(chuàng)建視圖:create view viewname as select statement
刪除視圖:drop view viewname
10,、說(shuō)明:幾個(gè)簡(jiǎn)單的基本的sql語(yǔ)句
選擇:
select * from table1 where 范圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 范圍
更新
:update table1 set field1=value1 where 范圍
查找:select * from table1 where field1 like ’%value1%’ —like的語(yǔ)法很精妙,,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數(shù):select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、說(shuō)明:幾個(gè)高級(jí)查詢(xún)運(yùn)算詞
A: UNION 運(yùn)算符

UNION 運(yùn)算符通過(guò)組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表,。當(dāng) ALL 隨 UNION 一起使用時(shí)(即 UNION ALL),,不消除重復(fù)行。兩種情況下,,派生表的每一行不是來(lái)自 TABLE1 就是來(lái)自 TABLE2,。
B: EXCEPT 運(yùn)算符
EXCEPT
運(yùn)算符通過(guò)包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí) (EXCEPT ALL),,不消除重復(fù)行,。
C: INTERSECT 運(yùn)算符
INTERSECT
運(yùn)算符通過(guò)只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí) (INTERSECT ALL),,不消除重復(fù)行,。
注:使用運(yùn)算詞的幾個(gè)查詢(xún)結(jié)果行必須是一致的。
12,、說(shuō)明:使用外連接
A,、left (outer) join
左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行,。
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
B:right (outer) join:
右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,,也包括右連接表的所有行。
C:full/cross (outer) join
全外連接:不僅包括符號(hào)連接表的匹配行,,還包括兩個(gè)連接表中的所有記錄,。
12、分組:Group by:
一張表,一旦分組 完成后,,查詢(xún)后只能得到組相關(guān)的信息,。
組相關(guān)的信息:(統(tǒng)計(jì)信息) count,sum,max,min,avg 分組的標(biāo)準(zhǔn))
在SQLServer中分組時(shí):不能以text,ntext,image類(lèi)型的字段作為分組依據(jù)
在selecte統(tǒng)計(jì)函數(shù)中的字段,不能和普通的字段放在一起,;

13,、對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作:
分離數(shù)據(jù)庫(kù)
sp_detach_db; 附加數(shù)據(jù)庫(kù)sp_attach_db 后接表明,附加需要完整的路徑名
14.如何修改數(shù)據(jù)庫(kù)的名稱(chēng):
sp_renamedb ‘old_name’, ‘new_name’

二,、提升

1,、說(shuō)明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b) (Access可用)
法一:
select * into b from a where 1<>1(僅用于SQlServer)
法二:select top 0 * into b from a
2、說(shuō)明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3,、說(shuō)明:跨數(shù)據(jù)庫(kù)之間表的拷貝(具體數(shù)據(jù)使用絕對(duì)路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數(shù)據(jù)庫(kù)’ where 條件
例子:..from b in ‘"&Server.MapPath(".")&"\data.mdb" &"’ where..

4,、說(shuō)明:子查詢(xún)(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說(shuō)明:顯示文章,、提交人和最后回復(fù)時(shí)間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6,、說(shuō)明:外連接查詢(xún)(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說(shuō)明:在線(xiàn)視圖查詢(xún)(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8,、說(shuō)明:between的用法,between限制查詢(xún)數(shù)據(jù)范圍時(shí)包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數(shù)值1 and 數(shù)值2

9,、說(shuō)明:in 的使用方法
select * from table1 where a [not] in (‘值
1’,’值2’,’值4’,’值6’)

10、說(shuō)明:兩張關(guān)聯(lián)表,,刪除主表中已經(jīng)在副表中沒(méi)有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11,、說(shuō)明:四表聯(lián)查問(wèn)題:
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 …..

12、說(shuō)明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff(‘minute’,f開(kāi)始時(shí)間,getdate())>5

13,、說(shuō)明:一條sql 語(yǔ)句搞定數(shù)據(jù)庫(kù)分頁(yè)
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
具體實(shí)現(xiàn):
關(guān)于數(shù)據(jù)庫(kù)分頁(yè):

declare @start int,@end int

@sql nvarchar(600)

set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’

exec sp_executesql @sql

注意:在top后不能直接跟一個(gè)變量,,所以在實(shí)際應(yīng)用中只有這樣的進(jìn)行特殊的處理。Rid為一個(gè)標(biāo)識(shí)列,,如果top后還有具體的字段,,這樣做是非常有好處的。因?yàn)檫@樣可以避免 top的字段如果是邏輯索引的,,查詢(xún)的結(jié)果后實(shí)際表中的不一致(邏輯索引中的數(shù)據(jù)有可能和數(shù)據(jù)表中的不一致,,而查詢(xún)時(shí)如果處在索引則首先查詢(xún)索引

14、說(shuō)明:前10條記錄
select top 10 * form table1 where 范圍

15,、說(shuō)明:選擇在每一組b值相同的數(shù)據(jù)中對(duì)應(yīng)的a最大的記錄的所有信息(類(lèi)似這樣的用法可以用于論壇每月排行榜,每月熱銷(xiāo)產(chǎn)品分析,按科目成績(jī)排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16,、說(shuō)明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17,、說(shuō)明:隨機(jī)取出10條數(shù)據(jù)
select top 10 * from tablename order by newid()

18,、說(shuō)明:隨機(jī)選擇記錄
select newid()

19、說(shuō)明:刪除重復(fù)記錄
1),
delete from tablename where id not in (select max(id) from tablename group by col1,col2,…)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
評(píng)價(jià): 這種操作牽連大量的數(shù)據(jù)的移動(dòng),,這種做法不適合大容量但數(shù)據(jù)操作
3),例如:在一個(gè)外部表中導(dǎo)入數(shù)據(jù),,由于某些原因第一次只導(dǎo)入了一部分,但很難判斷具體位置,這樣只有在下一次全部導(dǎo)入,,這樣也就產(chǎn)生好多重復(fù)的字段,,怎樣刪除重復(fù)字段

alter table tablename
–添加一個(gè)自增列
add column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,…)
alter table tablename drop column column_b

20、說(shuō)明:列出數(shù)據(jù)庫(kù)里所有的表名
select name from sysobjects where type=’U’ // U代表用戶(hù)

21,、說(shuō)明:列出表里的所有的列名
select name from syscolumns where id=object_id(‘TableName’)

22,、說(shuō)明:列示type、vender,、pcs字段,,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,,類(lèi)似select 中的case,。
select type,sum(case vender when ‘A’ then pcs else 0 end),sum(case vender when ‘C’ then pcs else 0 end),sum(case vender when ‘B’ then pcs else 0 end) FROM tablename group by type
顯示結(jié)果:
type vender pcs
電腦 A 1
電腦 A 1
光盤(pán) B 2
光盤(pán) A 2
手機(jī) B 3
手機(jī) C 3

23、說(shuō)明:初始化表table1

TRUNCATE TABLE table1

24,、說(shuō)明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

三,、技巧

1、1=1,,1=2的使用,,在SQL語(yǔ)句組合時(shí)用的較多

“where 1=1” 是表示選擇全部    “where 1=2”全部不選,
如:
if @strWhere !=”
begin
set @strSQL = ‘select count(*) as Total from [' + @tblName + '] where ‘ + @strWhere
end
else
begin
set @strSQL = ‘select count(*) as Total from [' + @tblName + ']‘
end

我們可以直接寫(xiě)成

錯(cuò)誤,!未找到目錄項(xiàng),。
set @strSQL = ‘select count(*) as Total from [' + @tblName + '] where 1=1 安定 ‘+ @strWhere 2、收縮數(shù)據(jù)庫(kù)
–重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
–收縮數(shù)據(jù)和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3,、壓縮數(shù)據(jù)庫(kù)
dbcc shrinkdatabase(dbname)

4,、轉(zhuǎn)移數(shù)據(jù)庫(kù)給新用戶(hù)以已存在用戶(hù)權(quán)限
exec sp_change_users_login ‘update_one’,'newname’,'oldname’
go

5、檢查備份集
RESTORE VERIFYONLY from disk=’E:\dvbbs.bak’

6,、修復(fù)數(shù)據(jù)庫(kù)
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(‘dvbbs’,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7,、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT

USE tablename — 要操作的數(shù)據(jù)庫(kù)名
SELECT @LogicalFileName = ‘tablename_log’, — 日志文件名
@MaxMinutes = 10, — Limit on time allowed to wrap log.
@NewSize = 1 — 你想設(shè)定的日志文件的大小(M)

Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT ‘Original Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),@OriginalSize) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)

DECLARE @Counter    INT,
@StartTime DATETIME,
@TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = ‘BACKUP LOG ‘ + db_name() + ‘ WITH TRUNCATE_ONLY’

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
– Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
AND (@OriginalSize * 8 /1024) > @NewSize  
BEGIN — Outer loop.
SELECT @Counter = 0
WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN — update
INSERT DummyTrans VALUES (‘Fill Log’) DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)  
END
SELECT ‘Final Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),size) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(size*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

8、說(shuō)明:更改某個(gè)表
exec sp_changeobjectowner ‘tablename’,'dbo’

9,、存儲(chǔ)更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)

DECLARE curObject CURSOR FOR
select ‘Name’    = name,
   ‘Owner’    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN     
if @Owner=@OldOwner
begin
   set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)
   exec sp_changeobjectowner @OwnerName, @NewOwner
end
– select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject
GO

10,、SQL SERVER中直接循環(huán)寫(xiě)入數(shù)據(jù)
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
案例
有如下表,要求就裱中所有沒(méi)有及格的成績(jī),,在每次增長(zhǎng)0.1的基礎(chǔ)上,,使他們剛好及格:

Name score

Zhangshan 80

Lishi 59

Wangwu 50

Songquan 69

while((select min(score) from tb_table)<60)

begin

update tb_table set score =score*1.01

where score<60

if (select min(score) from tb_table)>60

break

else

continue

end

數(shù)據(jù)開(kāi)發(fā)-經(jīng)典

1.按姓氏筆畫(huà)排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //從少到多

2.數(shù)據(jù)庫(kù)加密:
select encrypt(‘原始密碼’)
select pwdencrypt(‘原始密碼’)
select pwdcompare(‘原始密碼’,'加密后密碼’) = 1–相同;否則不相同 encrypt(‘原始密碼’)
select pwdencrypt(‘原始密碼’)
select pwdcompare(‘原始密碼’,'加密后密碼’) = 1–相同,;否則不相同

3.取回表中字段:
declare @list varchar(1000),
@sql nvarchar(1000)
select @list=@list+’,'+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=’表A’
set @sql=’select ‘+right(@list,len(@list)-1)+’ from 表A’
exec (@sql)

4.查看硬盤(pán)分區(qū):
EXEC master..xp_fixeddrives

5.比較A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
     =
    (select checksum_agg(binary_checksum(*)) from B)
print ‘相等’
else
print ‘不相等’

6.殺掉所有的事件探察器進(jìn)程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT ‘kill ‘+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN(‘SQL profiler’,N’SQL 事件探查器’)
EXEC sp_msforeach_worker ‘?

7.記錄搜索:
開(kāi)頭到N條記錄
Select Top N * From 表
——————————-
NM條記錄(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc
———————————-
N到結(jié)尾記錄
Select Top N * From 表 Order by ID Desc
案例
例如1:一張表有一萬(wàn)多條記錄,,表的第一個(gè)字段 RecID 是自增長(zhǎng)字段, 寫(xiě)一個(gè)SQL語(yǔ)句,, 找出表的第31到第40個(gè)記錄,。

select top 10 recid from A where recid not in(select top 30 recid from A)

分析:如果這樣寫(xiě)會(huì)產(chǎn)生某些問(wèn)題,,如果recid在表中存在邏輯索引。

select top 10 recid from A where……是從索引中查找,,而后面的select top 30 recid from A則在數(shù)據(jù)表中查找,,這樣由于索引中的順序有可能和數(shù)據(jù)表中的不一致,這樣就導(dǎo)致查詢(xún)到的不是本來(lái)的欲得到的數(shù)據(jù),。

解決方案

1,, 用order by select top 30 recid from A order by ricid 如果該字段不是自增長(zhǎng),就會(huì)出現(xiàn)問(wèn)題

2,, 在那個(gè)子查詢(xún)中也加條件:select top 30 recid from A where recid>-1

例2:查詢(xún)表中的最后以條記錄,,并不知道這個(gè)表共有多少數(shù)據(jù),以及表結(jié)構(gòu)。
set @s = ‘select top 1 * from T where pid not in (select top ‘ + str(@count-1) + ‘ pid from T)’

print @s exec sp_executesql @s

9:獲取當(dāng)前數(shù)據(jù)庫(kù)中的所有用戶(hù)表
select Name from sysobjects where xtype=’u’ and status>=0

10:獲取某一個(gè)表的所有字段
select name from syscolumns where id=object_id(‘表名’)

select name from syscolumns where id in (select id from sysobjects where type = ‘u’ and name = ‘表名’)

兩種方式的效果相同

11:查看與某一個(gè)表相關(guān)的視圖,、存儲(chǔ)過(guò)程,、函數(shù)
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ‘%表名%’

12:查看當(dāng)前數(shù)據(jù)庫(kù)中所有存儲(chǔ)過(guò)程
select name as 存儲(chǔ)過(guò)程名稱(chēng) from sysobjects where xtype=’P’

13:查詢(xún)用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=’sa’)
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0×01

14:查詢(xún)某一個(gè)表的字段和數(shù)據(jù)類(lèi)型
select column_name,data_type from information_schema.columns
where table_name = ‘表名’

15:不同服務(wù)器數(shù)據(jù)庫(kù)之間的數(shù)據(jù)操作

創(chuàng)建鏈接服務(wù)器

exec sp_addlinkedserver ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘遠(yuǎn)程服務(wù)器名或ip地址 ‘

exec sp_addlinkedsrvlogin ‘ITSV ‘, ‘false ‘,null, ‘用戶(hù)名 ‘, ‘密碼 ‘

–查詢(xún)示例

select * from ITSV.數(shù)據(jù)庫(kù)名.dbo.表名

–導(dǎo)入示例

select * into 表 from ITSV.數(shù)據(jù)庫(kù)名.dbo.表名

以后不再使用時(shí)刪除鏈接服務(wù)器

exec sp_dropserver ‘ITSV ‘, ‘droplogins ‘

連接遠(yuǎn)程/局域網(wǎng)數(shù)據(jù)(openrowset/openquery/opendatasource)

–1、openrowset

–查詢(xún)示例

select * from openrowset( ‘SQLOLEDB ‘, ‘sql服務(wù)器名 ‘; ‘用戶(hù)名 ‘; ‘密碼 ‘,數(shù)據(jù)庫(kù)名.dbo.表名)

–生成本地表

select * into 表 from openrowset( ‘SQLOLEDB ‘, ‘sql服務(wù)器名 ‘; ‘用戶(hù)名 ‘; ‘密碼 ‘,數(shù)據(jù)庫(kù)名.dbo.表名)

–把本地表導(dǎo)入遠(yuǎn)程表

insert openrowset( ‘SQLOLEDB ‘, ‘sql服務(wù)器名 ‘; ‘用戶(hù)名 ‘; ‘密碼 ‘,數(shù)據(jù)庫(kù)名.dbo.表名)

select *from 本地表

–更新本地表

update b

set b.列A=a.列A

from openrowset( ‘SQLOLEDB ‘, ‘sql服務(wù)器名 ‘; ‘用戶(hù)名 ‘; ‘密碼 ‘,數(shù)據(jù)庫(kù)名.dbo.表名)as a inner join 本地表 b

on a.column1=b.column1

–openquery用法需要?jiǎng)?chuàng)建一個(gè)連接

–首先創(chuàng)建一個(gè)連接創(chuàng)建鏈接服務(wù)器

exec sp_addlinkedserver ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘遠(yuǎn)程服務(wù)器名或ip地址 ‘

–查詢(xún)

select *

FROM openquery(ITSV, ‘SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ‘)

–把本地表導(dǎo)入遠(yuǎn)程表

insert openquery(ITSV, ‘SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ‘)

select * from 本地表

–更新本地表

update b

set b.列B=a.列B

FROM openquery(ITSV, ‘SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ‘) as a

inner join 本地表 b on a.列A=b.列A

–3,、opendatasource/openrowset

SELECT *

FROM opendatasource( ‘SQLOLEDB ‘, ‘Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ‘ ).test.dbo.roy_ta

–把本地表導(dǎo)入遠(yuǎn)程表

insert opendatasource( ‘SQLOLEDB ‘, ‘Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ‘).數(shù)據(jù)庫(kù).dbo.表名

select * from 本地表

SQL Server基本函數(shù)

SQL Server基本函數(shù)

1.字符串函數(shù) 長(zhǎng)度與分析用

1,datalength(Char_expr) 返回字符串包含字符數(shù),但不包含后面的空格
2,substring(expression,start,length) 取子串,,字符串的下標(biāo)是從“1”,start為起始位置,,length為字符串長(zhǎng)度,,實(shí)際應(yīng)用中以len(expression)取得其長(zhǎng)度
3,right(char_expr,int_expr) 返回字符串右邊第int_expr個(gè)字符,還用left于之相反
4,isnull( check_expression , replacement_value )如果check_expression為空,,則返回replacement_value的值,,不為空,就返回check_expression字符操作類(lèi)

5,Sp_addtype 自定義數(shù)據(jù)類(lèi)型
例如:EXEC sp_addtype birthday, datetime, 'NULL'

6,set nocount {on|off}
使返回的結(jié)果中不包含有關(guān)受 Transact-SQL 語(yǔ)句影響的行數(shù)的信息,。如果存儲(chǔ)過(guò)程中包含的一些語(yǔ)句并不返回許多實(shí)際的數(shù)據(jù),,則該設(shè)置由于大量減少了網(wǎng)絡(luò)流量,因此可顯著提高性能,。SET NOCOUNT 設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,,而不是在分析時(shí)設(shè)置。
SET NOCOUNT 為 ON 時(shí),,不返回計(jì)數(shù)(表示受 Transact-SQL 語(yǔ)句影響的行數(shù)),。
SET NOCOUNT 為 OFF 時(shí),返回計(jì)數(shù)
常識(shí)
 
在SQL查詢(xún)中:from后最多可以跟多少?gòu)埍砘蛞晥D:256
SQL語(yǔ)句中出現(xiàn) Order by,查詢(xún)時(shí),,先排序,,后取
SQL中,一個(gè)字段的最大容量是8000,,而對(duì)于nvarchar(4000),由于nvarchar是Unicode碼,。  
        
SQLServer2000同步復(fù)制技術(shù)實(shí)現(xiàn)步驟
一、 預(yù)備工作
1.發(fā)布服務(wù)器,訂閱服務(wù)器都創(chuàng)建一個(gè)同名的windows用戶(hù),并設(shè)置相同的密碼,做為發(fā)布快照文件夾的有效訪(fǎng)問(wèn)用戶(hù)
--管理工具
--計(jì)算機(jī)管理
--用戶(hù)和組
--右鍵用戶(hù)
--新建用戶(hù)
--建立一個(gè)隸屬于administrator組的登陸windows的用戶(hù)(SynUser)
2.在發(fā)布服務(wù)器上,新建一個(gè)共享目錄,做為發(fā)布的快照文件的存放目錄,操作:
我的電腦--D:\ 新建一個(gè)目錄,名為: PUB
--右鍵這個(gè)新建的目錄
--屬性--共享
--選擇"共享該文件夾"
--通過(guò)"權(quán)限"按紐來(lái)設(shè)置具體的用戶(hù)權(quán)限,保證第一步中創(chuàng)建的用戶(hù)(SynUser) 具有對(duì)該文件夾的所有權(quán)限
 
--確定
3.設(shè)置SQL代理(SQLSERVERAGENT)服務(wù)的啟動(dòng)用戶(hù)(發(fā)布/訂閱服務(wù)器均做此設(shè)置)
開(kāi)始--程序--管理工具--服務(wù)
--右鍵SQLSERVERAGENT
--屬性--登陸--選擇"此賬戶(hù)"
--輸入或者選擇第一步中創(chuàng)建的windows登錄用戶(hù)名(SynUser)
--"密碼"中輸入該用戶(hù)的密碼
4.設(shè)置SQL Server身份驗(yàn)證模式,解決連接時(shí)的權(quán)限問(wèn)題(發(fā)布/訂閱服務(wù)器均做此設(shè)置)
企業(yè)管理器
--右鍵SQL實(shí)例--屬性
--安全性--身份驗(yàn)證
--選擇"SQL Server 和 Windows"
--確定
5.在發(fā)布服務(wù)器和訂閱服務(wù)器上互相注冊(cè)
企業(yè)管理器
--右鍵SQL Server組
--新建SQL Server注冊(cè)...
--下一步--可用的服務(wù)器中,輸入你要注冊(cè)的遠(yuǎn)程服務(wù)器名 --添加
--下一步--連接使用,選擇第二個(gè)"SQL Server身份驗(yàn)證"
--下一步--輸入用戶(hù)名和密碼(SynUser)
--下一步--選擇SQL Server組,也可以創(chuàng)建一個(gè)新組
--下一步--完成
6.對(duì)于只能用IP,不能用計(jì)算機(jī)名的,為其注冊(cè)服務(wù)器別名(此步在實(shí)施中沒(méi)用到)
 (在連接端配置,比如,在訂閱服務(wù)器上配置的話(huà),服務(wù)器名稱(chēng)中輸入的是發(fā)布服務(wù)器的IP)
開(kāi)始--程序--Microsoft SQL Server--客戶(hù)端網(wǎng)絡(luò)實(shí)用工具
--別名--添加
--網(wǎng)絡(luò)庫(kù)選擇"tcp/ip"--服務(wù)器別名輸入SQL服務(wù)器名
--連接參數(shù)--服務(wù)器名稱(chēng)中輸入SQL服務(wù)器ip地址
--如果你修改了SQL的端口,取消選擇"動(dòng)態(tài)決定端口",并輸入對(duì)應(yīng)的端口號(hào)
二,、 正式配置
1,、配置發(fā)布服務(wù)器
打開(kāi)企業(yè)管理器,,在發(fā)布服務(wù)器(B,、C,、D)上執(zhí)行以下步驟:
(1) 從[工具]下拉菜單的[復(fù)制]子菜單中選擇[配置發(fā)布、訂閱服務(wù)器和分發(fā)]出現(xiàn)配置發(fā)布和分發(fā)向?qū)?
(2) [下一步] 選擇分發(fā)服務(wù)器 可以選擇把發(fā)布服務(wù)器自己作為分發(fā)服務(wù)器或者其他sql的服務(wù)器(選擇自己)
(3) [下一步] 設(shè)置快照文件夾
采用默認(rèn)\\servername\Pub
(4) [下一步] 自定義配置 
可以選擇:是,讓我設(shè)置分發(fā)數(shù)據(jù)庫(kù)屬性啟用發(fā)布服務(wù)器或設(shè)置發(fā)布設(shè)置
否,使用下列默認(rèn)設(shè)置(推薦)
(5) [下一步] 設(shè)置分發(fā)數(shù)據(jù)庫(kù)名稱(chēng)和位置 采用默認(rèn)值
(6) [下一步] 啟用發(fā)布服務(wù)器 選擇作為發(fā)布的服務(wù)器
(7) [下一步] 選擇需要發(fā)布的數(shù)據(jù)庫(kù)和發(fā)布類(lèi)型
(8) [下一步] 選擇注冊(cè)訂閱服務(wù)器
(9) [下一步] 完成配置
2,、創(chuàng)建出版物
發(fā)布服務(wù)器B,、C、D上
(1)從[工具]菜單的[復(fù)制]子菜單中選擇[創(chuàng)建和管理發(fā)布]命令
(2)選擇要?jiǎng)?chuàng)建出版物的數(shù)據(jù)庫(kù),,然后單擊[創(chuàng)建發(fā)布]
(3)在[創(chuàng)建發(fā)布向?qū)的提示對(duì)話(huà)框中單擊[下一步]系統(tǒng)就會(huì)彈出一個(gè)對(duì)話(huà)框,。對(duì)話(huà)框上的內(nèi)容是復(fù)制的三個(gè)類(lèi)型。我們現(xiàn)在選第一個(gè)也就是默認(rèn)的快照發(fā)布(其他兩個(gè)大家可以去看看幫助)
(4)單擊[下一步]系統(tǒng)要求指定可以訂閱該發(fā)布的數(shù)據(jù)庫(kù)服務(wù)器類(lèi)型,
SQLSERVER允許在不同的數(shù)據(jù)庫(kù)如 orACLE或ACCESS之間進(jìn)行數(shù)據(jù)復(fù)制,。
但是在這里我們選擇運(yùn)行"SQL SERVER 2000"的數(shù)據(jù)庫(kù)服務(wù)器
(5)單擊[下一步]系統(tǒng)就彈出一個(gè)定義文章的對(duì)話(huà)框也就是選擇要出版的表
注意: 如果前面選擇了事務(wù)發(fā)布 則再這一步中只能選擇帶有主鍵的表
(6)選擇發(fā)布名稱(chēng)和描述
(7)自定義發(fā)布屬性 向?qū)峁┑倪x擇:
是 我將自定義數(shù)據(jù)篩選,啟用匿名訂閱和或其他自定義屬性
否 根據(jù)指定方式創(chuàng)建發(fā)布 (建議采用自定義的方式)
(8)[下一步] 選擇篩選發(fā)布的方式 
(9)[下一步] 可以選擇是否允許匿名訂閱
1)如果選擇署名訂閱,則需要在發(fā)布服務(wù)器上添加訂閱服務(wù)器
方法: [工具]->[復(fù)制]->[配置發(fā)布,、訂閱服務(wù)器和分發(fā)的屬性]->[訂閱服務(wù)器] 中添加
否則在訂閱服務(wù)器上請(qǐng)求訂閱時(shí)會(huì)出現(xiàn)的提示:改發(fā)布不允許匿名訂閱
如果仍然需要匿名訂閱則用以下解決辦法 
[企業(yè)管理器]->[復(fù)制]->[發(fā)布內(nèi)容]->[屬性]->[訂閱選項(xiàng)] 選擇允許匿名請(qǐng)求訂閱
2)如果選擇匿名訂閱,則配置訂閱服務(wù)器時(shí)不會(huì)出現(xiàn)以上提示
(10)[下一步] 設(shè)置快照 代理程序調(diào)度
(11)[下一步] 完成配置
當(dāng)完成出版物的創(chuàng)建后創(chuàng)建出版物的數(shù)據(jù)庫(kù)也就變成了一個(gè)共享數(shù)據(jù)庫(kù)
有數(shù)據(jù) 
srv1.庫(kù)名..author有字段:id,name,phone, 
srv2.庫(kù)名..author有字段:id,name,telphone,adress 
 
要求: 
srv1.庫(kù)名..author增加記錄則srv1.庫(kù)名..author記錄增加 
srv1.庫(kù)名..author的phone字段更新,則srv1.庫(kù)名..author對(duì)應(yīng)字段telphone更新 
--*/ 
 
--大致的處理步驟 
--1.在 srv1 上創(chuàng)建連接服務(wù)器,以便在 srv1 中操作 srv2,實(shí)現(xiàn)同步 
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql實(shí)例名或ip' 
exec sp_addlinkedsrvlogin 'srv2','false',null,'用戶(hù)名','密碼' 
go
--2.在 srv1 和 srv2 這兩臺(tái)電腦中,啟動(dòng) msdtc(分布式事務(wù)處理服務(wù)),并且設(shè)置為自動(dòng)啟動(dòng)
,。我的電腦--控制面板--管理工具--服務(wù)--右鍵 Distributed Transaction Coordinator--屬性--啟動(dòng)--并將啟動(dòng)類(lèi)型設(shè)置為自動(dòng)啟動(dòng) 
go 
 
 
--然后創(chuàng)建一個(gè)作業(yè)定時(shí)調(diào)用上面的同步處理存儲(chǔ)過(guò)程就行了 
 
企業(yè)管理器 
--管理 
--SQL Server代理 
--右鍵作業(yè) 
--新建作業(yè) 
--"常規(guī)"項(xiàng)中輸入作業(yè)名稱(chēng) 
--"步驟"項(xiàng) 
--新建 
--"步驟名"中輸入步驟名 
--"類(lèi)型"中選擇"Transact-SQL 腳本(TSQL)" 
--"數(shù)據(jù)庫(kù)"選擇執(zhí)行命令的數(shù)據(jù)庫(kù) 
--"命令"中輸入要執(zhí)行的語(yǔ)句: exec p_process 
--確定 
--"調(diào)度"項(xiàng) 
--新建調(diào)度 
--"名稱(chēng)"中輸入調(diào)度名稱(chēng) 
--"調(diào)度類(lèi)型"中選擇你的作業(yè)執(zhí)行安排 
--如果選擇"反復(fù)出現(xiàn)" 
--點(diǎn)"更改"來(lái)設(shè)置你的時(shí)間安排 
 
 
然后將SQL Agent服務(wù)啟動(dòng),并設(shè)置為自動(dòng)啟動(dòng),否則你的作業(yè)不會(huì)被執(zhí)行 
 
設(shè)置方法: 
我的電腦--控制面板--管理工具--服務(wù)--右鍵 SQLSERVERAGENT--屬性--啟動(dòng)類(lèi)型--選擇"自動(dòng)啟動(dòng)"--確定. 
 
 
--3.實(shí)現(xiàn)同步處理的方法2,定時(shí)同步 
 
--在srv1中創(chuàng)建如下的同步處理存儲(chǔ)過(guò)程 
create proc p_process 
as 
--更新修改過(guò)的數(shù)據(jù) 
update b set name=i.name,telphone=i.telphone 
from srv2.庫(kù)名.dbo.author b,author i 
where b.id=i.id and
(b.name <> i.name or b.telphone <> i.telphone) 
 
--插入新增的數(shù)據(jù) 
insert srv2.庫(kù)名.dbo.author(id,name,telphone) 
select id,name,telphone from author i 
where not exists( 
select * from srv2.庫(kù)名.dbo.author where id=i.id) 
 
--刪除已經(jīng)刪除的數(shù)據(jù)(如果需要的話(huà)) 
delete b 
from srv2.庫(kù)名.dbo.author b 
where not exists( 
select * from author where id=b.id)
go

十個(gè)習(xí)慣讓你精通新的開(kāi)發(fā)技術(shù)

2010年12月18日 ijse

1. 要看書(shū),。在成千上萬(wàn)的編程圖書(shū)中,可能很大一部分根本毫無(wú)用處,。但是仍然有很多圖書(shū)對(duì)你的(編程)能力有很大的提升,。我一直堅(jiān)持,相比在網(wǎng)絡(luò)上查找很多有用信息,,在同類(lèi)圖書(shū)中查找要來(lái)得更容易更快捷,。閱讀技術(shù)圖書(shū)可心更好地抓住核心內(nèi)容。對(duì)于理論,,架構(gòu)和設(shè)計(jì)等方面來(lái)說(shuō),,圖書(shū)也一樣很有幫助。只不過(guò)要找到高質(zhì)量的,、權(quán)威的信息,,就不如網(wǎng)絡(luò)上可供查找的范圍廣。
2. 讀代碼,。這也是我很喜歡的一種方式,。如果我并沒(méi)有幾年的專(zhuān)業(yè)編程工作經(jīng)驗(yàn),,在學(xué)習(xí)之初我并不會(huì)去讀很多復(fù)雜的代碼,。如果我要是早些開(kāi)始學(xué)習(xí),我將是一個(gè)比現(xiàn)在更好的程序員,。但是,,開(kāi)始時(shí)我會(huì)從一些開(kāi)源項(xiàng)目里,去學(xué)習(xí)那些源代碼(當(dāng)然,,這些代碼不能與我的工作有關(guān),,也不是我自己寫(xiě)的),。要從自己會(huì)使用到的,或者自己感興趣的程序開(kāi)始這項(xiàng)工作,。我是從 Paint.net 這個(gè)網(wǎng)站里開(kāi)始學(xué)習(xí)的,,而且已經(jīng)積累了很多關(guān)于 .NET 的編程技術(shù)。
讀別人的代碼可以為你提供更多不同的工作思路,,這比你完全憑自己思考得到的工作方式要多,。
3. 寫(xiě)代碼。謹(jǐn)記,,要寫(xiě)大量的代碼,。從根本上來(lái)講,最好的學(xué)習(xí)方法就是實(shí)踐,。如果不寫(xiě)代碼,,你根本不能把(某種語(yǔ)言中)內(nèi)在的東西學(xué)習(xí)透徹。學(xué)習(xí)之初,,可以從一些技術(shù)指南和圖書(shū)中照搬一些盡量簡(jiǎn)單的程序,。當(dāng)然,這種照搬是要自己完全手工輸入,,而不是復(fù)制和粘貼,,這兩種之間的效果差別是很大的。這種方法的主旨就在于,,使知識(shí)內(nèi)在化,,并思考其用法,而不是盲目照抄,。學(xué)習(xí)過(guò)程中,,要時(shí)常查找新的 API 調(diào)用方法,,這其實(shí)是簡(jiǎn)單的事情,。
最重要的是,要寫(xiě)一個(gè)你自己的程序,,不管它是一個(gè)簡(jiǎn)單的游戲,或者是一個(gè)參與開(kāi)源項(xiàng)目的程序,,還是一個(gè)公為你自己使用的簡(jiǎn)單插件,。用不同的方式來(lái)寫(xiě)程序,盡量嘗試使用新的技術(shù),,新的技巧,,新的設(shè)計(jì)方式。一定要讓現(xiàn)在的項(xiàng)目比以往的項(xiàng)目更好,。想要成一個(gè)優(yōu)秀的開(kāi)發(fā)者,,這一點(diǎn)是核心,。
4. 與其他開(kāi)發(fā)者交流,。像 Apple,,微軟,,Google 等大公司一樣的新聞描述的一樣,,(與其他開(kāi)發(fā)者交流)可以讓你解決一些復(fù)雜的問(wèn)題,。雖然這并不能讓你感覺(jué)到自己已經(jīng)成一個(gè)團(tuán)隊(duì)或是社區(qū)的成員,但是這種方法可以讓你接觸到更多不同的想法,。
不同類(lèi)型的項(xiàng)目要求不同的設(shè)計(jì)方法,,代碼技術(shù),開(kāi)發(fā)流程和設(shè)計(jì)思想,。如果你工作在一個(gè)小團(tuán)隊(duì)里,,你不必與太多的人接觸,只要在用戶(hù)群會(huì)議中找到一些人(來(lái)討論)即可,。如果這樣還不行的話(huà),,參與到在線(xiàn)論壇中與其他人討論(這時(shí)你需要更努力地尋找高質(zhì)量的討論內(nèi)容),。
6. 教會(huì)別人,。相對(duì)于僅僅讀代碼之類(lèi)的工作,教其他人學(xué)習(xí)可以讓你更深入地學(xué)習(xí)某個(gè)技術(shù),,這種方法有著非凡的效果,。教會(huì)別人某個(gè)技術(shù),同樣也會(huì)讓你更專(zhuān)注于這種技術(shù),,并且可以比別人更深層次地理解它,。同樣你也會(huì)面對(duì)一些問(wèn)題。
“如果你不能向一個(gè)六歲的兒童解析清楚一個(gè)概念,,那么其實(shí)是你并沒(méi)有完全理解它,。”Albert Einstein說(shuō),。
教學(xué)場(chǎng)景可以是無(wú)窮無(wú)盡的:與工作搭檔一對(duì)一交流,,休息碰面,非正式周會(huì),,學(xué)習(xí)茶會(huì),,教室,討論發(fā)表會(huì),,等等,。每周在相同理念開(kāi)發(fā)者之間舉辦一次30分鐘的非正式會(huì)議怎么樣,?每周,讓幾個(gè)人來(lái)就他們想要更深入了解話(huà)題,,向大家傳授這些技術(shù)知識(shí),,并且展開(kāi)討論。如果你知道你將要向團(tuán)隊(duì)成員們傳授正學(xué)學(xué)習(xí)的知識(shí),,你是不是更想要了解這項(xiàng)技術(shù)的每個(gè)細(xì)節(jié)呢,?
6. 收聽(tīng)網(wǎng)絡(luò)電臺(tái)。如果你有空閑的時(shí)間,,可以訂閱網(wǎng)絡(luò)電臺(tái)節(jié)目,。我現(xiàn)在最喜歡的編程節(jié)目就是 .Net Rocks。這個(gè)節(jié)目還會(huì)做一些視頻節(jié)目,,叫做 dnrTV ,。這樣會(huì)讓你即時(shí)捕捉到最新最好的技術(shù)。一個(gè)人是不能學(xué)習(xí)到所有知識(shí)的,,而網(wǎng)絡(luò)電臺(tái)剛是一個(gè)學(xué)習(xí)了解廣泛知識(shí)的途徑,。
7. 閱讀博客。博客遠(yuǎn)遠(yuǎn)比閱讀者要多,,但是其中有一些卻是極其優(yōu)秀的,。我這里不并不是要推薦博客,因?yàn)榫W(wǎng)絡(luò)上已經(jīng)有了足夠多的博客,。這是與真正在開(kāi)發(fā)你所喜歡和使用的軟件的開(kāi)者聯(lián)系的好方法,。
8. 學(xué)習(xí)新的語(yǔ)言。即使你已經(jīng)在 C(++,#) / JAVA 等語(yǔ)言上有很好的造詣,,仍然有很多其他可以解決問(wèn)題的編程語(yǔ)言,。學(xué)習(xí)新的語(yǔ)言,是對(duì)你已有思維方式的挑戰(zhàn),。這不僅僅是另一種語(yǔ)言,,更是對(duì)思維的重新架構(gòu)。的確,,所有的語(yǔ)言最后都會(huì)被編譯成匯編程序,,但是這并不意味著高級(jí)語(yǔ)言毫無(wú)價(jià)值。
9. 學(xué)習(xí)不正確的方式,。除了要學(xué)習(xí)應(yīng)該怎么做,,還要學(xué)習(xí)不應(yīng)該怎么做。經(jīng)常閱讀 Dailywtf.com ,,學(xué)習(xí)你并不知道的經(jīng)驗(yàn)與教訓(xùn),。學(xué)習(xí)適當(dāng)?shù)拿嫦驅(qū)ο笤O(shè)計(jì)方式,代碼寫(xiě)作方式,和必須要寫(xiě)的代碼等,,是很好的方式,,但是如果不細(xì)心的話(huà)也容易養(yǎng)成不良習(xí)慣。學(xué)習(xí)認(rèn)識(shí)不正確的思路是負(fù)責(zé)項(xiàng)目開(kāi)發(fā)至關(guān)重要的一環(huán),。
維基百科對(duì)很多覺(jué)的不正確方式有十分透徹的分類(lèi),。
10. 要謙虛。
學(xué)習(xí),,意味著:

  • 用更好的知識(shí)代替不完美的知識(shí)
  • 增長(zhǎng)你所不知道的知識(shí)

只有承認(rèn)自己有所不足,,才能有學(xué)習(xí)的動(dòng)力。歸根到底,,就是謙虛,,不對(duì)嗎?如果你開(kāi)始認(rèn)為你已經(jīng)掌握了所有需要的知識(shí),,那么你就危險(xiǎn)了,。真正的學(xué)習(xí)是如饑似渴地追逐知識(shí)并使其內(nèi)在化,,這需要很大的努力,。我們都知道這一點(diǎn),但是要必須時(shí)常不斷地提醒自己,。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多