《SQLSERVER2012之T-SQL教程》T-SQL單表查詢(三)

表結構與數據:https://github.com/XuePeng87/TSQLV4前端

使用字符數據

    設計字符數據的查詢操做,包括數據類型、排序規則、運算符和函數,以及模式匹配。git

數據類型

    SQL Server支持兩種字符數據類型,即常規和Unicode。常規數據類型包括CHAR和VARCHAR,Unicode數據類型包括NCHAR和NVARCHAR。常規字符的每一個字符使用1個字節存儲,而Unicode數據的每一個字符要求2個字節,而且須要一個代理項對時,要求4個字節。若是爲列選擇了常規字符類型,會被限制除英語以外僅能使用一種語言。列支持的語言取決於列的有效規則。使用Unicode數據類型能夠支持多種語言,因此若是你須要存儲多種語言的字符數據,請確保使用Unicode字符類型,而不是常規字符類型。github

    名稱中沒有VAR元素的任何數據類型(CHAR、NCHAR)具備固定長度,即SQL Server按照列定義的大小保留行空間,而不是按照字符串中的實際字符數保留空間。sql

    名稱中含有VAR元素的數據類型(VARCHAR、NVARCHAR)具備可變長度,即SQL Server根據存儲須要,在行中使用盡量多的存儲空間存儲字符串中的字符,外加兩個額外的字節偏移數據。數據庫

    可變長度數據類型的數據更新效率低於固定長度數據類型。函數

    還可使用MAX來定義可變長度數據類型,而不是使用最大字符數。MAX默認是8000個字節,超過這個數值的任何值會做爲大型對象(LOB)存儲在行的外部。spa

排序規則

    排序規則是一個字符數據屬性,包括語言支持、排序順序、區分大小寫和區分重音等。能夠查詢表函數fn_helpcollations查看支持的排序規則及其說明的結果集。設計

SELECT name, description FROM sys.fn_helpcollations();

    例如,對排序規則Latin1_General_CI_AS的說明:代理

  • Latin1_General:支持英語和德語字符,以及大多數西歐國家使用的字符;
  • CI數據不區分大小寫(a=A);
  • AS數據區分重音(à<>ā);

    在企業內部部署SQL Server實施中,排序規則能夠定義在4個不一樣層級:實例、數據庫、列和表達式,SQL Server將使用最低有效級別的排序規則。code

    實例的排序規則是安裝程序選擇的一部分,它肯定全部系統數據庫的排序規則,並做爲用戶數據庫的默認規則。數據庫的排序規則決定了數據庫對象元數據的排序規則,並默認應用與用戶列表。能夠在列定義中使用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 '!'。

相關文章
相關標籤/搜索