方法一
--SQL中的相除
SELECT
CASE WHEN ISNULL(A-B,0)=0 THEN ''
ELSE CAST(CONVERT(DECIMAL(18,2),A*100.0/(A-B)) AS VARCHAR(10))+'%'
END AS '百分數' --FROM 表
這裡我們先要判斷被除數是否為0,如果為0給出一個想輸出的結果,這裡我們返回空白(是字符類型,不是NULL),在不為0的時候就給出具體的計算公式,然後轉換成字符類型再和「%」進行拼接。例如:
SELECT
CASE WHEN ISNULL(5-2,0)=0 THEN ''
ELSE CAST(CONVERT(DECIMAL(18,2),5*100.0/(5-2)) AS VARCHAR(10))+'%'
END AS '百分數' --FROM 表
返回的結果:
方法二
SELECT
(CONVERT(VARCHAR(20),ROUND(41*100.0/88,3))+'%') AS '百分比'
--FROM A
執行結果:
12、四捨五入ROUND函數
ROUND ( numeric_expression , length [ ,function ] )
function 必須為 tinyint、smallint 或 int。
如果省略 function 或其值為 0(默認值),則將捨入 numeric_expression。
如果指定了0以外的值,則將截斷 numeric_expression。
SELECT ROUND(150.45648, 2);
--保留小數點後兩位,需要四捨五入
--結果:
150.46000
SELECT ROUND(150.45648, 2, 0);
--保留小數點後兩位,0為默認值,表示進行四捨五入
--結果:
150.46000
SELECT ROUND(150.45648, 2, 1);
--保留小數點後兩位,不需要四捨五入,這裡除0以外都是有同樣的效果,
--與Oracle的TRUNC函數效果相同
--結果:
150.45000
SELECT ROUND(150.45648, 2, 2);
--保留小數點後兩位,不需要四捨五入,這裡除0以外都是有同樣的效果,
--與Oracle的TRUNC函數效果相同
--結果:
150.45000
(提示:可以左右滑動代碼)
13、對欄位出現NULL值的處理
方法一
--CASE
SELECT
CASE WHEN '欄位名' IS NULL THEN 'NULL'
ELSE CONVERT(VARCHAR(20),'欄位名1') END
AS 'NewName'
--結果:
欄位名1
SELECT CASE WHEN NULL IS NULL THEN 'N'
ELSE CONVERT(VARCHAR(20),NULL) END
AS 'NewName'
--結果:
N
方法二
--SQL Server 2005:COALESCE
SELECT COALESCE('字符串類型欄位','N') AS 'NewName'
--結果:
字符串類型欄位
SELECT COALESCE(CONVERT(VARCHAR(20),'非字符串類型欄位'),'N') AS 'NewName'
--結果:
非字符串類型欄位
SELECT COALESCE(CONVERT(VARCHAR(20),NULL),'N') AS 'NewName'
--結果:
N
--COALESCE,返回其參數中的第一個非空表達式
SELECT COALESCE(NULL,NULL,1,2,NULL)
--結果:
1
SELECT COALESCE(NULL,11,12,13,NULL)
--結果:
11
SELECT COALESCE(111,112,113,114,NULL)
--結果:
111
14、COUNT的幾種情況
--以下三種方法均可統計出表的記錄數
--第一種
select count(*) from tablename
--第二種
select count(ID) from tablename
--第三種,1換成其它值也是可以的
select count(1) from tablename
15、UNION ALL多表插入
把兩個相同結構的表union後插入到一個新表中,
當然兩個以上的相同結構的表也是可以的,
這裡的相同是指兩個或多個表的列數和每個對應列的類型相同,
列名稱可以不同
select *
into table_new
from table_1
union all
select * from table_2
16、查看資料庫緩存的SQL
use master
declare @dbid int
Select @dbid = dbid from sysdatabases
where name = 'SQL_ROAD'--修改成資料庫的名稱
select
dbid,UseCounts ,RefCounts,CacheObjtype,ObjType,
DB_Name(dbid) as DatabaseName,SQL
from syscacheobjects
where dbid=@dbid
order by dbid,useCounts desc,objtype
我們可以看到資料庫中當前正在運行的SQL有哪些
17、刪除計劃緩存
--刪除整個資料庫的計劃緩存
DBCC FREEPROCCACHE
--刪除某個資料庫的計劃緩存
USE master
DECLARE @dbid INT
SELECT @dbid=dbid FROM sysdatabases WHERE NAME = 'SQL_ROAD'
DBCC FLUSHPROCINDB (@dbid)
PRINT 'SQL'+CHAR(13)+'ROAD'
PRINT 'SQL'+CHAR(10)+'ROAD'
PRINT 'SQL'+CHAR(9)+'ROAD'
如果將查詢結果以文本格式顯示,而不是網格格式顯示,SELECT語句也適用,我們先將查詢結果改成以文本格式顯示
--以文本格式顯示結果
SELECT 'SQL'+ CHAR(10)+'ROAD'
SELECT 'SQL'+ CHAR(13)+'ROAD'
SELECT 'SQL' + CHAR(10) + CHAR(13) + 'ROAD'
結果如下:
19、TRUNCATE 與 DELETE
TRUNCATE 是SQL中的一個刪除數據表內容的語句,用法是:
TRUNCATE TABLE [Table Name] 速度快,而且效率高,因為:
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。
DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。
TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。
如果想保留標識計數值,請改用 DELETE。
如果要刪除表定義及其數據,請使用 DROP TABLE 語句。
對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。TRUNCATE TABLE 不能用於參與了索引視圖的表。
20、常用系統檢測腳本
--查看內存狀態
dbcc memorystatus
--查看哪個引起的阻塞,blk
EXEC sp_who active
--查看鎖住了那個資源id,objid
EXEC sp_lock
還有如何查看查詢分析器的SPID,可以在查詢分析器的狀態欄看到,比如sa(57),這就表示當前查詢分析器SPID為57,這樣在使用profile的時候就可以指定當前窗體進行監控。狀態欄在查詢窗口的右下角。
21、獲取腳本的執行時間
declare @timediff datetime
select @timediff=getdate()
select * from Suppliers
print '耗時:'+ convert(varchar(10),datediff(ms,@timediff,getdate()))
結果如下:
在狀態欄是不會精確到毫秒的,只能精確到秒
這個腳本可以更加有效的查看SQL代碼的執行效率。
以上就是今天分享給大家一些比較實用的SQL腳本,以後想到了其他內容再分享給大家,好東西記得分享轉發呀~
·················END·················