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