3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)
2019獨角獸企業重金招聘Python工程師標準>>>
表結構與數據:https://github.com/XuePeng87/TSQLV4
使用字符數據
??? 設計字符數據的查詢操作,包括數據類型、排序規則、運算符和函數,以及模式匹配。
數據類型
??? SQL Server支持兩種字符數據類型,即常規和Unicode。常規數據類型包括CHAR和VARCHAR,Unicode數據類型包括NCHAR和NVARCHAR。常規字符的每個字符使用1個字節存儲,而Unicode數據的每個字符要求2個字節,并且需要一個代理項對時,要求4個字節。如果為列選擇了常規字符類型,會被限制除英語之外僅能使用一種語言。列支持的語言取決于列的有效規則。使用Unicode數據類型可以支持多種語言,所以如果你需要存儲多種語言的字符數據,請確保使用Unicode字符類型,而不是常規字符類型。
??? 名稱中沒有VAR元素的任何數據類型(CHAR、NCHAR)具有固定長度,即SQL Server按照列定義的大小保留行空間,而不是按照字符串中的實際字符數保留空間。
??? 名稱中含有VAR元素的數據類型(VARCHAR、NVARCHAR)具有可變長度,即SQL Server根據存儲需要,在行中使用盡可能多的存儲空間存儲字符串中的字符,外加兩個額外的字節偏移數據。
??? 可變長度數據類型的數據更新效率低于固定長度數據類型。
??? 還可以使用MAX來定義可變長度數據類型,而不是使用最大字符數。MAX默認是8000個字節,超過這個數值的任何值會作為大型對象(LOB)存儲在行的外部。
排序規則
??? 排序規則是一個字符數據屬性,包括語言支持、排序順序、區分大小寫和區分重音等。可以查詢表函數fn_helpcollations查看支持的排序規則及其說明的結果集。
SELECT name, description FROM sys.fn_helpcollations();??? 例如,對排序規則Latin1_General_CI_AS的說明:
- Latin1_General:支持英語和德語字符,以及大多數西歐國家使用的字符;
- CI數據不區分大小寫(a=A);
- AS數據區分重音(à<>ā);
??? 在企業內部部署SQL Server實施中,排序規則可以定義在4個不同層級:實例、數據庫、列和表達式,SQL Server將使用最低有效級別的排序規則。
??? 實例的排序規則是安裝程序選擇的一部分,它確定所有系統數據庫的排序規則,并作為用戶數據庫的默認規則。數據庫的排序規則決定了數據庫對象元數據的排序規則,并默認應用與用戶列表。可以在列定義中使用COLLATE子句顯示地指定列的排序規則,否則默認使用數據庫的排序規則。例如:
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname = N'davis';??? 將返回lastname=Davis的行,盡管大小寫不匹配,但是不區分大小寫是有效的書寫形式,如果希望篩選區分大小寫,那么可以按下面的轉換表達式排序規則進行查詢:
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname COLLATE Latin1_General_CS_AS = N'Davis';運算符和函數
1.字符串連接
????T-SQL提供了+和CONCAT函數(SQL Server2012提供)連接字符串,例如:
SELECT empid, firstname + N' ' + lastname AS fullname FROM HR.Employees;SELECT custid, country, region, city, country + N',' + region + N',' + city AS location FROM Sales.Customers;SELECT custid, country, region, city, CONCAT(country, N',' + region, N',' + city) AS location FROM Sales.Customers;??? 標準SQL規定了連接NULL的結果應為NULL。而CONCAT函數則會將NULL替換成空字符串。
2.SUBSTRING函數
??? 次函數對于輸入的string字符串,從start位置開始,提取length個字符。例如,下面的代碼返回"abc":
SELECT SUBSTRING('abcdefg', 1, 3);??? 如果第三個參數超出了輸入的字符串的末尾,并不會引發錯誤,函數將返回一直到末尾的所有字符。
3.LEFT和RIGHT函數
??? LEFT和RIGHT函數是SUBSTRING函數的簡化形式,可以從輸入字符串的左邊或右邊返回制定數量的字符串,例如,下面的代碼返回"ced":
SELECT RIGHT('abced', 3);4.LEN和DATALENGTH函數
??? LEN函數返回輸入字符串中字符的數量,并且會刪除尾隨的空格,下面代碼返回5:
SELECT LEN(N'abcde')??? DATALENGTH函數返回輸入字符串存儲的字節數,不刪除尾隨的空格,下面代碼返回10:
SELECT DATALENGTH(N'abcde')5.CHARINDEX函數
??? CHARINDEX函數返回子字符串在字符串中第一次出現的位置,例如,下面代碼返回6:
SELECT CHARINDEX(' ','Itzik Ben-Gan');6.PATINDEX函數
??? 返回模式在字符串中第一次出現的位置,例如下面的代碼返回5:
SELECT PATINDEX('%[0-9]%','abcd123efgh');7.REPLACE函數
??? REPLACE(string,substring1,substring2)函數,使用substring2替換string中出現的所有substring1,例如,下面將'1-a 2-b'中的'-'替換成':':
SELECT REPLACE('1-a 2-b', '-', ':')8.REPLICATE函數
??? 可以按照指定的次數重復一個字符串,例如下面的代碼將返回'abcabcabc':
SELECT REPLICATE('abc', 3)9.STUFF函數
????允許從字符串中逸出指定數量的字符,并插入一個替代的新子字符串。例如將'xyz'中的'y'替換成'abc':
SELECT STUFF('xyz', 2, 1, 'abc')10.UPPER和LOWER函數
??? 將字符串全部轉大寫或轉小寫。
11.RTRIM和LTRIM喊出
??? 刪除尾隨的或者前端的空格。
12.FORMAT函數
??? 允許按照Microsoft.NET格式字符串和一個可選的區域參數,將輸入值格式化成另一個字符串,例如將1759前面加上6個0:
SELECT FORMAT(1759, '0000000000')13.LIKE謂詞
??? 1.(%)百分號通配符:代表一個任意大小的字符串,包括空字符串;
??? 2.(_)下劃線通配符:代表單個字符;
??? 3.([<List of Characters>])字符列表通配符:方括號內帶有字符列表的意思是,代表單個字符必須是列表中的指定字符之一,例如下面的查詢返回姓氏的第一個字符是A、B或C的雇員:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[ABC]%';??? 4.([<Character>]-<Character>)字符范圍通配符:代表單個字符必須在指定的范圍內,例如,下面的查詢返回姓氏的第一個字符位于字母A~E范圍內的雇員:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[A-E]%';??? 5.([^<Character List or Range>])未指定范圍通配符:代表單個字符沒有在指定的字符列表或范圍內,例如,下面的查詢將返回姓氏第一個字符不是A~E范圍內的雇員:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[^A-E]%';??? 6.ESCAPE字符
??? 如果想要搜索已用作通配符的字符(如"%"、"_"、"["或]""),需要使用一個轉義字符。例如,要檢查col1列中是否包含下劃線,可以用 col1 LIKE '%!_%' ESCAPE '!'。
轉載于:https://my.oschina.net/u/2981366/blog/775513
總結
以上是生活随笔為你收集整理的3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: d3.js学习笔记--Mike Bost
- 下一篇: 1024程序员节获奖通知