要查詢數據庫表的數據,我們使用如下的SQL語句:
SELECT * FROM <表名>
使用SELECT * FROM students時,SELECT是關鍵字,表示將要執行一個查詢,*表示“所有列”,FROM表示將要從哪個表查詢,
該SQL將查詢出students表的所有數據。注意:查詢結果也是一個二維表,它包含列名和每一行的數據。
SELECT語句其實並不要求一定要有FROM子句。
雖然SELECT可以用作計算,但它並不是SQL的強項。但是,不帶FROM子句的SELECT語句有一個有用的用途,就是用來判斷當前到數據庫的連接是否有效。許多檢測工具會執行一條SELECT 1;來測試數據庫連接。
使用SELECT查詢的基本語句SELECT * FROM <表名>可以查詢一個表的所有行和所有列的數據。
SELECT查詢的結果是一個二維表。
條件查詢
使用SELECT * FROM <表名>可以查詢到一張表的所有記錄。但是,很多時候,我們並不希望獲得所有記錄,而是根據條件選擇性地獲取指定條件的記錄,例如,查詢分數在80分以上的學生記錄。在一張表有數百萬記錄的情況下,獲取所有記錄不僅費時,還費內存和網絡帶寬。
SELECT語句可以通過WHERE條件來設定查詢條件,查詢結果是滿足查詢條件的記錄。
例如,要指定條件“分數在80分或以上的學生”,寫成WHERE條件就是
SELECT * FROM students WHERE score >= 80。
其中,WHERE關鍵字后面的score >= 80就是條件。score是列名,該列存儲了學生的成績,因此,score >= 80就篩選出了指定條件的記錄
因此,條件查詢的語法就是:
SELECT * FROM <表名> WHERE <條件表達式>
條件表達式可以用<條件1> AND <條件2>表達滿足條件1並且滿足條件2。例如,符合條件“分數在80分或以上”,並且還符合條件“男生”,把這兩個條件寫出來:
條件1:根據score列的數據判斷:score >= 80;
條件2:根據gender列的數據判斷:gender = 'M',注意gender列存儲的是字符串,需要用單引號括起來。
就可以寫出WHERE條件:score >= 80 AND gender = 'M':
第二種條件是<條件1> OR <條件2>,表示滿足條件1或者滿足條件2。例如,把上述AND查詢的兩個條件改為OR,查詢結果就是“分數在80分或以上”或者“男生”,滿足任意之一的條件即選出該記錄:
很顯然OR條件要比AND條件寬松,返回的符合條件的記錄也更多。
第三種條件是NOT <條件>,表示“不符合該條件”的記錄。
例如,寫一個“不是2班的學生”這個條件,可以先寫出“是2班的學生”:class_id = 2,再加上NOT:NOT class_id = 2:
上述NOT條件NOT class_id = 2其實等價於class_id <> 2,因此,NOT查詢不是很常用。
要組合三個或者更多的條件,就需要用小括號()表示如何進行條件運算。例如,編寫一個復雜的條件:分數在80以下或者90以上,並且是男生:
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';
如果不加括號,條件運算按照NOT、AND、OR的優先級進行,即NOT優先級最高,其次是AND,最后是OR。加上括號可以改變優先級。
常用的條件表達式
條件 | 表達式舉例1 | 表達式舉例2 | 說明 |
---|---|---|---|
使用=判斷相等 | score = 80 | name = 'abc' | 字符串需要用單引號括起來 |
使用>判斷大於 | score > 80 | name > 'abc' | 字符串比較根據ASCII碼,中文字符比較根據數據庫設置 |
使用>=判斷大於或相等 | score >= 80 | name >= 'abc' | |
使用<判斷小於 | score < 80 | name <= 'abc' | |
使用<=判斷小於或相等 | score <= 80 | name <= 'abc' | |
使用<>判斷不相等 | score <> 80 | name <> 'abc' | |
使用LIKE判斷相似 | name LIKE 'ab%' | name LIKE '%bc%' | %表示任意字符,例如'ab%'將匹配'ab','abc','abcd' |
投影查詢
- 使用SELECT *表示查詢表的所有列,使用SELECT 列1, 列2, 列3則可以僅返回指定列,這種操作稱為投影。
- SELECT語句可以對結果集的列進行重命名。
使用SELECT * FROM <表名> WHERE <條件>可以選出表中的若干條記錄。我們注意到返回的二維表結構和原表是相同的,即結果集的所有列與原表的所有列都一一對應。
如果我們只希望返回某些列的數據,而不是所有列的數據,我們可以用SELECT 列1, 列2, 列3 FROM ...,讓結果集僅包含指定列。這種操作稱為投影查詢。
例如,從students表中返回id、score和name這三列:
SELECT id, score, name FROM students;
這樣返回的結果集就只包含了我們指定的列,並且,結果集的列的順序和原表可以不一樣。
使用SELECT 列1, 列2, 列3 FROM ...時,還可以給每一列起個別名,這樣,結果集的列名就可以與原表的列名不同。它的語法是SELECT 列1 別名1, 列2 別名2, 列3 別名3 FROM ...。
例如,以下SELECT語句將列名score重命名為points,而id和name列名保持不變:
SELECT id, score points, name FROM students;
投影查詢同樣可以接WHERE條件,實現復雜的查詢:
SELECT id, score points, name FROM students WHERE gender = 'M';
排序
- 使用ORDER BY可以對結果集進行排序;
- 可以對多列進行升序、倒序排序。
我們使用SELECT查詢時,細心的讀者可能注意到,查詢結果集通常是按照id排序的,也就是根據主鍵排序。這也是大部分數據庫的做法。如果我們要根據其他條件排序怎么辦?可以加上ORDER BY子句。例如按照成績從低到高進行排序:
-- 按score從低到高
SELECT id, name, gender, score FROM students ORDER BY score;
如果要反過來,按照成績從高到底排序,我們可以加上DESC表示“倒序”:
-- 按score從高到低
SELECT id, name, gender, score FROM students ORDER BY score DESC;
如果score列有相同的數據,要進一步排序,可以繼續添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分數的,再按gender列排序:
-- 按score, gender排序:
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
默認的排序規則是ASC:“升序”,即從小到大。ASC可以省略,即ORDER BY score ASC和ORDER BY score效果一樣。
如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。例如,查詢一班的學生成績,並按照倒序排序:
-- 帶WHERE條件的ORDER BY:
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;
這樣,結果集僅包含符合WHERE條件的記錄,並按照ORDER BY的設定排序。