在上一節,我們已經對數據庫、表和SQL語句的概念有了基本的了解,本節進一步和大家一起學習如何編寫和執行查詢語句。
3.1 客戶端工具
訪問數據庫(包括執行查詢語句)需要借助工具,就像從井里打水需要繩子和水桶一樣,在安裝好數據庫之后,數據庫服務器都自帶命令行工具,比如 Oracle 的 Sql*plus ,盡管這些命令行工具功能很強大,基本滿足了我們操作數據庫的需求,但為了更方便更友好的訪問數據庫,最好還是使用客戶端工具,值得推薦的幾款客戶端工具有:連接訪問 Oracle 的 PL/SQL Developer,連接訪問 SQLServer 的SQL Server Management Studio, 而 Navicat Premium 功能比較豐富,可以連接 Oracle、MySQL、SQLServer、PostgreSQL 和 SQLlite 等多種數據庫。
Navicat Premium 的官網地址為:http://www.navicat.com.cn,根據自己的計算機環境下載對應的軟件版本(32位或64位),下載軟件后雙擊按照提示一步步的安裝即可。
3.2 什么是查詢語句
查詢語句(帶 Select 關鍵字)也叫檢索語句,也可以更直觀的叫它 Select 語句,當我們想從數據庫中獲取一個或多個字段的結果集時,就需要使用到查詢語句,查詢語句是我們平時使用最多的 SQL 語句,簡單的查詢語句語法為:
Select 字段 From 表名
Select 語句大小寫不敏感,就是說使用 SELECT STU_NAME FROM STUDENT
和 select stu_name from student
都能執行成功且結果相同。從以上查詢語句可以發現,關鍵字與字段表名之間需要保留空格,空格可以是一個或多個,如果沒有空格會導致執行錯誤。
值得說明的是,由于存在很多種數據庫產品,而且不同數據庫管理系統支持不同的 SQL 語法,但為了與 ANSI 標準相兼容,它們都以相似的方式支持一些關鍵字,比如:Select,Update,Insert,Delete,Drop,Where 等等。
ANSI是美國國家標準化組織的簡稱,它是一個核準多種行業標準的組織,該組織制定的SQL標準被稱為ANSI SQL。1987年,國際標準化組織把ANSI SQL作為國際標準,ANSI SQL標準先后在1992、1999進行了修訂,目前的標準為2011年修訂的SQL-2011。
3.3 檢索多個字段
上面例子中查詢語句是用來查詢學生表 ( student ) 中的姓名字段 ( stu_name ) ,如果希望同時返回學生表中的兩個或多個字段,就需要這樣來編寫 SQL:
select stu_name,sid,age from student
當然,有時我們希望返回學生表中的所有字段,可以這樣來編寫 SQL:
select id,sid,stu_name,gender,age from student
當一個表中的字段很多時,比如十多個甚至幾十個字段,我們將所有字段都完全拼寫正確也不是件容易的事,數據庫開發者考慮到我們會遇到這種場景,所以查詢表中所有字段也可以這樣來編寫 SQL:
select * from student
帶上 *
號的查詢語句雖然給我們提供了很大的方便,但不建議經常使用,就像我們從箱子里取出乒乓球,一次取出所有的球肯定會比取出一只球要費力的多。
盡管數據庫系統功能很強大,獲取所有字段仍會消耗較多的資源,除非業務需要,盡量一次只取出必要的字段,并將字段名寫在 Select 關鍵字后面。
3.4 執行多條 SQL
當多個 SQL 語句放在一起執行時,SQL 結束時是否加上英文分號;
在不同數據庫系統中要求是不同的。在 SQLServer 中是可以不加的,數據庫可以自動識別一條 SQL 語句在哪里結束,但在 PostgreSQL,MySQL 和 Oracle 是必須要加分號的。
為了增加 SQL 的可移植性,養成良好的編程習慣,建議每條 SQL 后面都加上分號,做到“有始有終”。
在 Oracle 客戶端上執行多條 SQL 的例子:
最后那條 SQL 語句在這四種數據庫(SQLServer、PostgreSQL,MySQL 和 Oracle)中都是可以不加分號的。
3.5 SQL 語句的注釋
為了增加 SQL 語句的可讀性,我們經常在 SQL 語句前面添加注釋, ANSI 標準的注釋符 --
用于單行注釋,格式為:--注釋內容
--查詢課程名和學分
select cname,credit from course ;
多行注釋使用/* */
。\*
用于注釋文字的開頭,*/
用于注釋文字的結尾。
/*第一條SQL查詢課程編號,課程名和學分
第二條SQL查選課學生編號和課程編號
*/
select cid,cname,credit from course ;
select cid,sid from elective ;
3.6 別名
與好朋友之間經常起綽號一樣,我們也可以給字段或表名起別名,有時我們在檢索數據時候,認為返回的字段名不夠見文知意,這時,就可以將字段名重新命名,即起一個別名。來看個例子:
select a.cname as ‘Course_Name’ from course a ;
在上面的 SQL 語句中,表 course 的別名是 a ,字段 cname 被重新定義別名為 Course_Name。
字段的別名可以是中文也可以是字符串,來看個例子:
select cname as ‘課程名’ from course ;
也可以對函數處理后的字段進行重新命名:
select count(cid) AS ‘總課程數’ from course ;
盡管別名在 SQL 中可有可無,但為了增加可讀性,還是建議為表設置別名,
3.7 SQL 執行順序
在我們編寫 SQL 語句時一般是按照 select、from 、 where 、 group by、having 、order by 等關鍵字的順序,但數據庫在執行 SQL 的時候,并不是按照這個順序執行的,以查詢年齡大于 29 歲學生為例,讓我們進一步了解數據庫執行 SQL 語句的順序。
select sid,stu_name,age,gender from student where age > 29;
數據庫首先要知道從哪張表中獲取數據,即首先執行 from 關鍵字,得知從 Student(學生表) 獲取信息后,進一步查看我們希望得到哪些數據,這時就要執行 where 關鍵字,從而過濾掉年齡小于等于 29 歲的記錄數據,最后數據庫從 select 關鍵字那里獲取我們最終需要哪些字段的信息。
以上就是數據庫執行簡單 SQL 的大概順序,是否與我們平時從 Excel 獲取數據的操作順序類似(打開Excel–>找到Sheet->篩選數據–>獲取有效列)。然而數據庫實際執行過程中,比這要復雜的多,我們在后面章節中會進一步闡述。
3.8 總結
通過本小節,我們了解了簡單SQL的編寫和執行,對SQL語句中一些專業術語也有了初步的印象。小節最后對SQL的執行順序進行了說明,可能對于剛開始學習SQL的讀者對SQL執行順序還不能馬上理解,但這并不影響下面章節的學習,可以暫時忽略該部分內容,繼續下一小節的學習。