經典SQL回顧之晉級篇

     上篇博文在說SQL基礎的時候,有一個地方有點誤導你們,文中說到SQL 中的substring()和C#中的substring()相同,這有點歧義。基本原理雖然相同,可是有一點很不同,就是C#中索引是從0開始的,而SQL中索引是從1開始的,因此在截取的時候須要稍微注意一下,在這裏也感謝給我指出來的那位朋友。其實咱們不少時候在閱讀別人文章的時候,若是發現其中不妥的地方,耐心的,並且清楚的指出來,不但對本身是一種提升,對做者也是一種鼓勵。由於不少時候,本身能明白是一回事兒,但要描述清楚,讓別人明白又是另一回事兒。好了,開頭說了幾句題外話,如今切入正題。面試

      索引-->Index,能夠對常常須要查詢的字段添加索引,從而增長訪問速率,提升檢索速度。若是說索引不太好理解,我們換個說法,書的目錄你們都知道,通俗的說,索引跟目錄挺類似的。有了目錄,咱們能夠很方便,快捷的查詢書中的內容,這比一頁一頁翻效率要高的多。可是,書中的內容一發生變化,咱們要想目錄還有效的話,就得及時的更改目錄。索引也同樣,雖然不少時候能夠提升效率,可是若是庫中的數據頻繁變化的話,用不用索引就得論證一下了。另外索引佔空間,並且添加,更新,刪除數據時也須要同步更新,所以下降了Insert,Update,Delete的速度,因此只在常常檢索的字段上建立索引。還有一個地方要注意的就是,爲了不全表掃描,儘可能別在索引裏用like之類的模糊查詢。數據庫

      IN,邏輯運算符,用來查找值屬於指定結婚的元組,格式用法:express

//語法格式
//列名  [not] IN (常量1,常量2,常量3......)
//例:
SELECT Sname,Ssex from Student where sdept

IN ('信息系','計算機系','數學系')

//查詢表中系別爲信息系,計算機系或者數學系的學生
View Code

      SQL中經常使用的字符匹配ide

      _ 匹配任意一個字符     %匹配0或多個字符     [] 匹配 []中的任意一個字符    [^ ]不匹配[]中的任意一個字符函數

     請看示例:     學習

SELECT ......Sname like '張%'  --查姓張的學生信息
SELECT ......Sname like '[張李劉]%' --查姓張,姓劉,或者姓李的學生信息
SELECT ......Sname like '_[小大]%'--查名字中第二個字爲大或者小的學生
SELECT ......Sname not like '劉%' --查全部不姓劉的學生信息
SELECT ......Sno like '%[^235]' --查學號最後一位不是2,3,5的學生信息
View Code

     鏈接查詢:咱們在作SQL設計時,不可能將全部的信息都放入一個表,因此在查詢信息的時候常常須要聯合幾個表來查詢。不論是什麼數據庫,Oracle,MS SQL,DB2或者是Sybase,獲取信息時鏈接查詢都不可避免。本文將簡單的說一下幾個不一樣的鏈接,包括:內鏈接,自鏈接和外鏈接。測試

      內鏈接:Inner join邏輯運算符返回知足第一個(頂端)輸入與第二個(底端)輸入聯接的每一行。這個和用select查詢多表是同樣的效果,因此內鏈接用的比較少。還有一點要說明的就是Join 默認就是inner join。 因此咱們在寫內鏈接的時候能夠省略inner 這個關鍵字。例:     spa

//格式:select xxxx from 表1 join 表2 on 條件
select student.sno,sname......from student join sc
on student.sno=sc.sno
View Code

      自鏈接:相互鏈接的表在物理上爲同一張表,但在邏輯上能夠分爲兩張。使用自鏈接時必須爲兩個表取別名。如:查詢與范冰冰在同一系學習的學生姓名和所在系。咱們能夠按這個思路來:先找到范冰冰在哪一個系學習,在學生表中將這個表稱爲s1,而後找出此係全部學生,在student表中將這個表稱爲s2,s1和s2鏈接的條件就是兩個表的系別相同。設計

select s2.sname,s2.sdept from student s2 join student s1
on s1.sdept=s2.sdept where s1.name='范冰冰'
and s2.name!='范冰冰'
View Code

      外鏈接:外鏈接又分左(外)鏈接,右(外)鏈接,全(外)鏈接。左外鏈接和右外鏈接時都會以一張表爲基表,該表的內容會所有顯示,而後加上兩張表匹配的內容。 若是基表的數據在另外一張表沒有記錄。 那麼在相關聯的結果集行中列顯示爲空值(NULL)。形如:3d

      from 表1 left|right join 表2 on 條件   左鏈接的含義是限制表2中的數據必須知足鏈接條件,而無論表1中的數據是否知足鏈接條件,均會輸出表1中的內容。右鏈接則正好相反。說了這麼多鏈接可能仍是有點迷糊,我也看過其餘一些寫SQL鏈接的文章,有一篇還真不錯,這裏借鑑一些:

      關於內鏈接:

//1.2.1 先建立2張測試表並插入數據:
SQL> select * from dave;
ID  NAME
---------- ----------
1  dave
2  bl
1  bl
2  dave
SQL> select * from bl;
ID  NAME
---------- ----------
1  dave
2  bl
//1.2.3 用內連接進行查詢:
SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;   -- 標準寫法
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id;  -- 這裏省略了inner 關鍵字
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id;  -- select 多表查詢
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
View Code

      外鏈接:

--如下爲模擬數據
SQL> select * from bl;
        ID NAME
---------- ----------
         1 dave
         2 bl
         3 big bird
         4 exc
         9 懷寧
SQL> select * from dave;
        ID NAME
---------- ----------
         8 安慶
         1 dave
         2 bl
         1 bl
         2 dave
         3 dba
         4 sf-express
         5 dmm
View Code

    左外鏈接(Left outer join/ left join)

    left join是以表的記錄爲基礎的,示例中Dave能夠當作左表,BL能夠當作右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會所有表示出來,而右表(BL)只會顯示符合搜索條件的記錄BL表記錄不足的地方均爲NULL.右外鏈接的結果和左外鏈接相反,就不舉例了。

示例:
SQL> select * from dave a left join bl b on a.id = b.id;
       ID NAME               ID NAME
--------- ---------- ---------- ----------
        1 bl                  1 dave
        1 dave                1 dave
        2 dave                2 bl
        2 bl                  2 bl
        3 dba                 3 big bird
        4 sf-express          4 exc
        5 dmm                             -- 此處B表爲null,由於沒有匹配到
        8 安慶                             -- 此處B表爲null,由於沒有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
        ID NAME               ID NAME
---------- ---------- ---------- ----------
         1 bl                  1 dave
         1 dave                1 dave
         2 dave                2 bl
         2 bl                  2 bl
         3 dba                 3 big bird
         4 sf-express          4 exc
         5 dmm
         8 安慶
View Code

    如下這張圖-1很好的表示了各鏈接的關係。

 

    視圖: 從數據庫的基本表中選取出來的數據組成的邏輯窗口,數據庫中只存放視圖的定義,而不包含數據,其數據仍放在原表中。

    一、單原表視圖,顧名思義,從一個表中查詢出來的數據,如:    

create view is_student
as
select sno,sname,sage
from student where sdept='計算機系'
View Code

    二、多原表視圖(創建計算機系選修了‘c01’的視圖)

create view v_s1(sno,sname,grade)
as
select student.sno,sname,grade
from student join sc on student.sno=sc.sno
where sdept='計算機系' and sc.cno='c01'
View Code

     三、在已有的視圖上定義新的視圖。相似於2,刪除視圖:drop view<viewname>

     因爲時間關係,其餘的內容放到下篇寫吧,但願小夥伴們可以多多包含!謝謝。

     下篇會介紹一下存儲過程,事務和函數,以及我的以前在面試的時候遇到的幾個經典的SQL問題,還有我的用的幾個比較高效的SQL寫法。

相關文章
相關標籤/搜索