sql--查詢(基本,條件,投影,排序)


要查詢數據庫表的數據,我們使用如下的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的設定排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM