1. 程式人生 > >第8周學習筆記

第8周學習筆記

adding 不顯示 位置 pan 允許 大小寫 操作 視圖 log

一、查詢知識點思維導圖

技術分享

SELECT子句

FROM子句

WHERE子句

GROUP BY子句

數據庫查詢語句的組成 ORDER BY子句

HAVING子句

子查詢

集運算符

二、查詢知識要點

1、 在查詢之前需要導入之前已經建立好的數據庫文件。

第一步:打開SQL,進行連接後右擊數據庫出現如圖一式界面;

技術分享

技術分享

技術分享

技術分享

第二步:點擊附加,出現如圖二式界面,點擊添加,查找需要的文件,如圖三所示。

第三步:添加完數據庫文件,再進行查詢操作。

技術分享

技術分享

2、 篩選列

(1) 查詢某表所有信息

SELECT

*

FROM

tb_Drug;

2、在病人視圖中,查詢全體病人的姓名、出生年份、年齡

SELECT

S.Name AS 姓名

,YEAR(S.BirthDate) AS 出生年份 ,YEAR(GETDATE())—YEAR(S.BirthDate) AS 年齡

FROM

vw_Patient AS S;

盡管上一條列表達式能夠算出出生年份,且已定義別名,但不允許在其它任一列表達式中調用該別名;

因為SQL Server對表的查詢具有同時操作特性,所有表達式同時執行,故期間無法得知其它表達式定義的別名.

3、 篩選行

(1)在病人視圖中,查詢所有病人號碼 SELECT

SS. PatientNo

FROM

vw_ Patient AS SS;

--消除重復:

SELECT DISTINCT

SS. PatientNo

FROM

vw_ Patient AS SS;

(2)在病人視圖中,查詢年齡在19~22歲之間的病人姓名、年齡

SELECT

S.*

FROM

(SELECT

S.Name

,DATEDIFF(YEAR,S.BirthDate,GETDATE()) AS Age

FROM

vw_Patient AS S) AS S

WHERE

S.Age BETWEEN 19 AND 22;

--或:

WITH cte_Age AS

(SELECT

S.Name

,DATEDIFF(YEAR,S.BirthDate,GETDATE()) AS Age

FROM

vw_Patient AS S)

SELECT

S.*

FROM

cte_Age AS S

WHERE

S.Age BETWEEN 19 AND 22;

3、字符

在查詢字符中會使用到許多函數,而函數的使用則就是需要特別註意。

(1)通配符%代替任意個未知字符

(2)通配符_代替1個未知字符

(3)為避免查詢內容中的_與通配符沖突,使用[ ]作為轉義符,將查詢內容中的_轉成普通文本

(4)使用ESCAPE自定義轉義符

(5)以行為單位的字符串拼接,例如‘+’

(6)SUBSTRING(列名,長度)字符串函數

(7)RIGHT(列名,長度)取右值函數,在某列中取從右邊開始的多少長度。

(8)LEFT(列名,長度)取右值函數,在某列中取從左邊開始的多少長度。

(9)STUFF(列名,位置 ,長度,替換內容) 替換字符串函數

(10)CHARINDEX(查找特定字符,列名) 查找指定字符串在原字符串中的起始位置,從某列中查找某個特定的字符的位置。

4、排序

(1)排序過程中很經常使用到降序或者升序,其中降序使用DESC,升序使用ASC.

(2)

在病人視圖中,查詢所有病人名單,並按姓名筆畫排序

SELECT

S.*

FROM

vw_Fatient AS S

ORDER BY

S.Name COLLATE CHINESE_PRC_STROKE_CS_AS_KS_WS;

指定排序規則 簡體中文 筆畫 區分大小寫、區分重音、區分假名、區分全半角。

(3)查詢某排列順序前三名,使用SELECT TOP 3 WITH TIES語句,其中WITH TIES可以排除包含並列的情況。

(4)查詢某排列順序前3%的人,使用

SELECT TOP 3 PERCENT來查詢。

(5)在查詢過程中涉及查詢的列別名,使用ORDER BY語句實現此功能,因為ORDER BY語句最後執行,故能識別列別名。

三、查詢誤點

1、使用查詢之前必須先使用數據庫“USE Eduse”語句,不然是無法實現查詢功能的。如下面第一圖與第二圖

技術分享

技術分享

2、在使用函數STUFF(列名,位置 ,長度,替換內容) 替換字符串函數時需要查找指定位置使用到CHARINDEX(查找特定字符,列名)函數需要給此時查找到的位置再加一才是真正需要替換的位置,例如:在病人表中,查詢所有病人的電話,其中固定電話前的區號均不顯示;

SELECT

S.Phone

,SUBSTRING(S.Phone ,CHARINDEX(‘-‘,S.Phone),100)

FROM

tb_Fatient AS S; (下面第一張圖)

與下面這個代碼的區別

SELECT

S.Phone

,SUBSTRING(S.Phone ,CHARINDEX(‘-‘,S.Phone)+1,100)

FROM

tb_Fatient AS S; (下面第二張圖)

見下面兩張運行結果圖

技術分享

技術分享

第8周學習筆記