e的SQL魚句10月份總結

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表格整理出,爲方便對應標出了顏色。
應注意:以黃色數據爲例,左邊數據2條*右邊數據2條,執行後黃色部分4條結果的對應方式
多個連接條件用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表格整理出,爲方便對應標出了顏色。
注意粉色部分,左2*中2*右1=執行結果4條數據
自連接與非自連接沒有運行出來。

自然連接中是以具有相同名字的列爲連接條件的,還可以***使用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])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章