上篇博文在說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 ('信息系','計算機系','數學系') //查詢表中系別爲信息系,計算機系或者數學系的學生
SQL中經常使用的字符匹配:ide
_ 匹配任意一個字符 %匹配0或多個字符 [] 匹配 []中的任意一個字符 [^ ]不匹配[]中的任意一個字符函數
請看示例: 學習
SELECT ......Sname like '張%' --查姓張的學生信息 SELECT ......Sname like '[張李劉]%' --查姓張,姓劉,或者姓李的學生信息 SELECT ......Sname like '_[小大]%'--查名字中第二個字爲大或者小的學生 SELECT ......Sname not like '劉%' --查全部不姓劉的學生信息 SELECT ......Sno like '%[^235]' --查學號最後一位不是2,3,5的學生信息
鏈接查詢:咱們在作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
自鏈接:相互鏈接的表在物理上爲同一張表,但在邏輯上能夠分爲兩張。使用自鏈接時必須爲兩個表取別名。如:查詢與范冰冰在同一系學習的學生姓名和所在系。咱們能夠按這個思路來:先找到范冰冰在哪一個系學習,在學生表中將這個表稱爲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!='范冰冰'
外鏈接:外鏈接又分左(外)鏈接,右(外)鏈接,全(外)鏈接。左外鏈接和右外鏈接時都會以一張表爲基表,該表的內容會所有顯示,而後加上兩張表匹配的內容。 若是基表的數據在另外一張表沒有記錄。 那麼在相關聯的結果集行中列顯示爲空值(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
外鏈接:
--如下爲模擬數據 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
左外鏈接(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 安慶
如下這張圖-1很好的表示了各鏈接的關係。
視圖: 從數據庫的基本表中選取出來的數據組成的邏輯窗口,數據庫中只存放視圖的定義,而不包含數據,其數據仍放在原表中。
一、單原表視圖,顧名思義,從一個表中查詢出來的數據,如:
create view is_student as select sno,sname,sage from student where sdept='計算機系'
二、多原表視圖(創建計算機系選修了‘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'
三、在已有的視圖上定義新的視圖。相似於2,刪除視圖:drop view<viewname>
因爲時間關係,其餘的內容放到下篇寫吧,但願小夥伴們可以多多包含!謝謝。
下篇會介紹一下存儲過程,事務和函數,以及我的以前在面試的時候遇到的幾個經典的SQL問題,還有我的用的幾個比較高效的SQL寫法。