TIPS:
語句關鍵字儘量大寫,關鍵字不要分行也不要縮寫,
字符串型和日期時間類型使用單引號 ’ ’
別名,使用雙引號 " ",不要省略as
所有運算符或列值遇到null值,運算的結果都爲null
SQL語句 | 功能 | 關鍵詞舉例 |
---|---|---|
DDL | 定義 | CREATE、DROP、ALTER |
DML | 操作 | INSERT、DELETE、UPDATE、SELECT |
DCL | 控制 | GRANT、ROVOKE、COMMINT、ROLLBACK、SAVEPOINT |
查詢語句
代碼執行記錄
查詢表的前五行ID:
SELECT TOP 5 [ID] FROM [test]
查詢表的ID並把表頭更名爲ONE:
SELECT [ID] AS ONE FROM [test]
或用雙引號
SELECT [ID] "ONE" FROM [test]
查詢ID並去掉重複行:
SELECT DISTINCT [ID] FROM [test]
顯示錶結構代碼沒有執行出來:DESCRIBE 表名。
顯示ID=62的名字:
SELECT [Name] FROM [test] WHERE [ID]=62
顯示ID=62、63、64的名字:
SELECT [Name] FROM [test] WHERE [ID]IN (62,63,64)
顯示ID介於62到65之間的名字:
SELECT [Name] FROM [test] WHERE [ID]BETWEEN 62 AND 65
ESCAPE轉義字符串:
請注意區別“ % ”和“ _ ”的區別。“ % ”會通配顯示多個字符,比如會顯示出19、39、109、1279。“ _ ”會通配顯示一個字符,比如會顯示出19、39、79。
SELECT [ID] FROM [test] WHERE [ID] LIKE '%9'
SELECT [ID] FROM [test] WHERE [ID] LIKE '_9'
如果要查詢的username中含有“ % ” 和“ _ ”的,需要使他們不再作爲通配符。需將 “ % ”和“ _ ”在like中轉義,以“ _ ”舉例。
SELECT [ID] FROM [test] WHERE [ID] LIKE '/_9' escape '/'
顯示ID爲空的名字:
SELECT [Name] FROM [test] WHERE [ID] is NULL
顯示ID不爲空的名字:
SELECT [Name] FROM [test] WHERE [ID] is not NULL
異或顯示不出來:XOR ??
排序數據,默認升序排列,降序需要加 DESC:
SELECT [ID] FROM [test] ORDER BY [ID]
SELECT [ID] FROM [test] ORDER BY [ID] DESC
多表查詢
此後對代碼不做刪減,直接複製感受,因從實際項目中導出的數據,故表的名稱列名比較長。
多表查詢顯示中,需要給表做連接,連接時WHERE處寫 左表名.左表中的列名=右表名.右表中的列名,這裏的表與列名中間用“. ”點來連接;代碼之前的列與列、表與表用“,”逗號連接。
SELECT [ContractFilingBodyRemindID],[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind],
[test].[dbo].[ContractFilingBodyPayment]
WHERE [test].[dbo].[ContractFilingBodyRemind].[ContractFilingHeadID]=[test].[dbo].[ContractFilingBodyPayment].[ContractFilingHeadID]
顯示結果用Excel表格整理出,爲方便對應標出了顏色。
多個連接條件用AND操作符連接。
表的別名:
使用表名可簡化查詢,提高執行效率。代碼中用一個字母縮寫代表了一個表名。
SELECT d.[ContractFilingBodyRemindID],t.[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind] d,
[test].[dbo].[ContractFilingBodyPayment] t
WHERE d.[ContractFilingHeadID]=t.[ContractFilingHeadID]
查詢多個表就需要多個連接條件。如三個表,條件處就需要用AND,**不是寫成連等!!**連等的話會報錯。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
x.[AnnexID]
FROM [test].[dbo].[ContractFilingBodyRemind] d,
[test].[dbo].[ContractFilingBodyPayment] t,
[test].[dbo].[ContractFilingBodyAnnex] x
WHERE d.[ContractFilingHeadID]=t.[ContractFilingHeadID]
AND t.[ContractFilingHeadID]=x.[ContractFilingID]
顯示結果用Excel表格整理出,爲方便對應標出了顏色。
自連接與非自連接沒有運行出來。
自然連接中是以具有相同名字的列爲連接條件的,還可以***使用ON子句創建連接***。
使用 ON 子句指定額外的連接條件是與其它條件分開的。ON 子句使語句具有更高的易讀性。
SELECT d.[ContractFilingBodyRemindID],t.[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
多條件時多個ON子句
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
x.[AnnexID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
JOIN [test].[dbo].[ContractFilingBodyAnnex] x
ON t.[ContractFilingHeadID] = x.[ContractFilingID]
左連接是以左表的數據爲基準,當右表沒有對應數據顯示爲空。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
d.[ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
LEFT OUTER JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
執行結果如圖,對比紅色字體的數據。
右連接是以右表的數據爲基準,當左表沒有對應數據顯示爲空。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
t.[ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
RIGHT OUTER JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
執行結果如圖,對比紅色字體的數據。
最後編輯於2019年10月30日
函數
基本函數(雜)
追加補充(2019年10月31日)
1.UNION ALL操作符返回兩個查詢結果集的並集,對兩個結果集的重複部分不去重。
函數 | 用法 |
---|---|
CONCAT(S1,S2,…,Sn) | 連接S1,S2,…,Sn爲一個字符串 |
CHAR_LENGTH(s) | 返回字符串s的字符數 |
LENGTH(s) | 返回字符串s的字節數,和字符集有關 |
INSERT(str,index,len,instr) | 將字符串str從第index位置開始,len個字符長的子串替換爲字符串instr |
UPPER(s)或UCASE(s) | 將字符串s的所有字母轉成大寫字母 |
LOWER(s)或LCASE(s) | 將字符串s的所有字母轉成小寫字母 |
LEFT(s,n) | 返回字符串s最左邊的n個字符 |
RIGHT(s,n) | 返回字符串s最右邊的n個字符 |
REPLACE(str,a,b) | 用字符串b替換字符串str中所有出現的字符串a |
STRCMP(s1,s2) | 比較字符串s1,s2 |
ABS(x) | 返回x的絕對值 |
RAND() | 返回0~1的隨機值 |
ROUND(x,y) | 返回參數x的四捨五入的有y位的小數的值 |
SQRT(x) | 返回x的平方根 |
POW(x,y) | 返回x的y次方 |
IF(value,t,f) | 如果value是真,返回t,否則返回f |
IF NULL(value1,value2) | 如果value1不爲空,返回value1,否則返回value2 |
CASE WHEN 條件1 THEN result1 WHEN 條件2 THEN result2…[ELSE result n]END | 相當於Java的if…else if…else |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1…[ELSE 值n]END | 相當於Java的switch…case… |
database() | 返回當前數據庫名 |
version() | 返回當前數據庫版本 |
user() | 返回當前登錄用戶名 |
分組函數
分組函數作用於一組數據,並對一組數據返回一個值。
對數值型數據使用AVG()和SUM()函數。
對任意數據使用MAX()、MIN()和COUNT()函數。
SELECT AVG([ContractFilingBodyRemindID]),
MAX([ContractFilingBodyRemindID]),
MIN ([ContractFilingBodyRemindID]),
SUM([ContractFilingBodyRemindID])
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [RemindName] LIKE '趙宏%'
COUNT(*)返回表中記錄總個數,COUNT(expr)返回expr不爲空的記錄總數。
SELECT COUNT(*)
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID]=19
子查詢:
代碼表示:返回[ContractFilingHeadID]與134相同的,[ContractFilingBodyRemindID]大於135的數據的[RemindNumber]和[RemindRemark]列。
SELECT [RemindNumber],[RemindRemark]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID] =
(SELECT [ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingBodyRemindID]=134)
AND [ContractFilingBodyRemindID] >
(SELECT [ContractFilingBodyRemindID]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingBodyRemindID]=135)
代碼表示:返回[ContractFilingHeadID]最少的數據的[RemindNumber]和[RemindRemark]列。
SELECT [RemindNumber],[RemindRemark]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID] =
(SELECT MIN([ContractFilingHeadID])
FROM [test].[dbo].[ContractFilingBodyRemind])