12.29 SQL點滴(查詢篇):數據庫基礎查詢案例實戰


本文主要是對微頭條SQL小技能的彙總,便於收藏查閱,為數據庫初學者提供多快好省又可實際操作的幫助。


SQL點滴(查詢篇):數據庫基礎查詢案例實戰


下面為正文。

1.通用*查詢

在從數據庫表中檢索所有行與列,若要查詢所有數據,通常做法為:
select * from sometable
這會返回標的所有記錄。其實在SQL中,“*”具有特殊含義,代表從指定表中返回每一列。同時,因為沒有指定where子句,結果會返回每一行(即表的所有行)。注意,若是在編程中,推薦寫出每一列的字段名子,這與*查詢性能相同。但顯式的指定列名,可以更容易理解你sql的意圖,也便於他人的維護。畢竟,大多數軟件都是個多人協作的活兒嘛。

2.如何按條件檢索指定列數據?


前面說過查詢所有列的方式,如果數據量大,字段又多,檢索返回所有行和列顯然是不合適的。這時就需要根據條件返回所需行列了。比如我們有一個表employee,共包含empid、empname、departid,salary、job和hiredate及comm共7個字段。如果我想查詢departid(部門編號)為4的員工編號和姓名,此時這一編寫sql語句即可:select empid,empname from employee where departid=4。
只有就可返回你希望的結果數據了。當然,與“=”運算符類似的還有(大多數DB廠商都支持的運算符)q其他的,如、<=、>=、!、<>等。如果要檢索滿足多個條件的行,還可以使用使用and 、or和圓括號來組合。比如select empname,salary,job from employee where (departid=6 or departid=9) and salary>=6000 。

3.如何為查詢列或表取別名並在條件中應用別名?


通常在編寫SQL語句時,如果用星號*,則返回數據庫中定義的列明,如果列是個表達式它返回的列明就是表達式,比如select count(*) from sometable 列名為“count(*)”,這顯然不太友好。此時我們可以為列取別名,比如,select count(*) as quatity from sometable。如果想同時為列和表名取別名可以這樣:select t.dpid id,t.dpname as name from tx_department as t 。as可以省略。若果想在條件字句中使用列別名,那就得這樣了:select * from (select t.dpid id,t.dpname as name from tx_department as t) where id>2.這樣主要是為了生成查詢的內聯視圖,以使作為條件別名列生效,否則會報未知列錯誤(以mysql為演示基準)。

4.如何實現表多字段(列)值的連接單列返回?


有時候在查詢表時,希望把多個列的值作為一列返回,比如前面我們說的employee表,把員工名和工作等列值作為一列返回。我們可以這樣做(以MySQL為例):
select concat(ename , '是公司的 ', job) as intr from employee where departid=2。這樣用concat函數可以連接你需要的列值。
另外,如果你的數據庫是Oracle或者是DB2或PostgreSQL,可以用“||”理解列,形如:
select ename || 'somestring' || job as msg from sometable。若是SQL Server,則用“+”可以實現通用的目的。

5.如何在select語句中對列值使用條件邏輯?


比如針對僱員工資分三檔,大於12000的為高薪,低於4000的為低薪,中間的的為正常薪資。我們這樣來實現:
select ename,salary,
case when salary>=12000 then '高薪組'
when salary<=4000 then '低薪組'
else '正常薪資'
end as salaryGroup
from employee
case表達式可以針對查詢結果返回的值執行條件邏輯。推薦給case表達式去個別名以便於理解。else是可選的,若無else,不滿足判斷的列case就返回null,若有多餘2中情況的,一般推薦使用else,便於分組分類。

6.查詢時如何限制返回的行數?


如果查詢時,數據表的符合條件的數據過多,可以通過數據庫內置的函數來控制返回的行數。各類數據庫的內置函數常不同,這裡以mysql為了,其內置的限制返回行數的函數是limit。可以這一天來用:
select * from sometable limit rownum 。rownum是個整數,默認是從0行到rownum行。若想從第5條開始返回rownum條記錄,可以這樣:select * from sometable limit 4,rownum。這種模式常用語頁面數據列表的翻頁操作。limit是個有兩個參數的,第一參數是位置偏移量,第二個是返回行數。另外,其它數據庫的這種內置函數為:Oracle是用rownum,SQL Server是top,DB2是fetch,PostgreSQL與MySQL一樣。示例語句就略了^_^

7.如何從表中隨機返回n條記錄呢?


基於某種目的,想從某表中隨機返回n條記錄,需要怎麼操作呢?為了達到這個目的,通常就是使用DBMS支持的內置函數來生產隨機數值,再結合Order by自己來使用此函數,對行隨機排序,然後再使用前面說過的限制返回行數的技術就可以實現此目的了。比如,再MySQL中,同事使用內置的rand函數、limit和order by,示例如下:
select ename,job from employee order by rand() limit n.
其它DB環境中實現此目的的示例參考如下:
PostgreSQL=>select ename,job from employee order by random() limit n.
MS SQL=>select top n ename,job from employee order by newid()
Oracle=>select * from(select ename,job from employee order by dbms_random.value()) where rownum<=n.自己試試吧。

8.如何查詢某列值為空的所有行?


對這個問題,我們必須知道確定值是否為空的方法,那就是必須用 IS NULL。示例語句如下:
select * from employee where comm is null
此語句查詢comm列值為空的行。
這裡要特別注意的是:NULL 不能用等於或不等於號跟任何之比較,包括自身。也就是說不能用=或!=來判斷列是否為null。如果判斷是否為空必須用 is null ,如果判斷非空,必須用is not null。

9.如何將查詢到的空值轉為實際值?

對查詢到的列為空值時,出於某種需要,想把空值列轉換為某一特定值,如何實現呢。此時我們可以這樣來實現: select ename,COALESCE(comm,'空值') ,salary from employee
含義是當comm是null時,函數會把空的列值轉為‘空值’,若非空,則直接顯示對應的列值。
這裡要注意的是函數COALESCE,此函數有1個或多個參數,其返回列表中第一個非空值。此函數可以用於所有的DBMS。不同的數據庫也有內置的這種功能函數,比如oracle的NVL也有此功能。
另外,還可以用case實現同樣的功能,但是比較麻煩點。參考示例如下:
select ename,case
when comm is null then '空值-'
else comm end ,salary from employee
所以,實際應用中我們推薦coalesce函數。

10、按模式進行檢索查詢

所謂按模式進行檢索,就是返回匹配特定子串或模式的行,比如我們想查找名字中帶有‘張’的人,可以這麼寫SQL語句:select ename,job,salary,comm from employee where ename like "%張%"

這樣就可以查找到所有ename中包含有張的人員,其不管“張”是名字的何位置。若想只包含“張”開頭的名字可以"張%",若想包含“張”結尾的則可以這樣"%張"。當然了還可以where子句中使用各種條件的組合應用,例如:select * from employee where departid in(2,3) and(ename like"%靜%" or job like "%經理")。

這裡一般要注意是引號中的%號的應用,此%可以匹配任意字符(單個或多個),若在開始位置則表示開始的任意字符,若在結尾,表示結尾的任意字符,而引號中指定的字符則是必須要滿足的字符——即查詢結果必是相應列包含指定字符值的結果。

好了。對於數據庫初學者來說(以MySQL為主),第一篇對於數據的基本查詢操作就到這裡,每一個都是可以操作的,你可以動手練練以強化理解。

記得分享出去吧。


分享到:


相關文章: