養(yǎng)成這些 SQL 習慣 是一筆財富!
以下內容來自公眾號逆鋒起筆,關注每日干貨及時送達

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?…
WHERE?EMP_ID=' VPA30890F'
UPDATE?EMPLOYEE?SET?LNAME='YANG'
WHERE?EMP_ID=' VPA30890F'
WHERE?EMP_ID=' VPA30890F'
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
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
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
C、 IN的相關子查詢用EXISTS代替,比如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,比如有人寫這樣的語句: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)
應改為:
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有索引則不應該改。
應該改為:
SELECT?年,月,金額?FROM?結余表?WHERE?年=2010?AND月=10
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'不應修改
應改為: 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'
WHERE FAME+?'. '+LNAME='HAIWEI.YANG'
應改為:
WHERE FNAME='HAIWEI'?AND?LNAME='YANG'
考慮聯(lián)接優(yōu)先順序: (1)INNER?JOIN (2)LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代) (3)CROSS?JOIN
--startof? 查詢在職人數(shù) ?????sql語句 ??--end of
UPDATE?a?SET?字段=''
ROLLBACK? ? ? ?
--事務回滾開始
--檢查報錯
IF?( @@ERROR?>?0?) ? ?
? ??BEGIN?? ? ?
--回滾操作
? ? ??ROLLBACK?TRANSACTION?? ? ?
? ? ? RAISERROR('刪除工作報告錯誤',?16,?3) ? ? ? ?
? ? ??RETURN?? ? ? ?
? ??END??
--結束事務
?COMMIT?TRANSACTION
逆鋒起筆專注于程序員圈子,你不但可以學習到java、python等主流技術干貨,還可以第一時間獲悉最新技術動態(tài)、內測資格、BAT大佬的經驗、精品視頻教程、副業(yè)賺錢經驗,微信搜索readdot關注!
圖解 SQL 基礎知識 SQL 中去重的三種方法 MySQL 8.0 可以操作 JSON 了?。?/span> SQL 中如何給指定數(shù)據(jù)庫創(chuàng)建只讀用戶? MySQL 大批量插入,如何過濾掉重復數(shù)據(jù)? 優(yōu)秀的讀者“點贊”傳統(tǒng)美德?
評論
圖片
表情

