前言上篇文章我們學習了 MySQL 的五種約束,今天這篇文章我們來學習下 SELECT 語句。在數據庫操作語句中,使用最頻繁,也被認為最重要的是 SELECT 查詢語句。在之前的學習中,我們已經在不少地方用到了SELECT * FROM table_name; 這條語句用于查看一張表中的所有內容。而 SELECT 與各種限制條件關鍵詞搭配使用,具有各種豐富的功能,這次就進行詳細的介紹。1、目錄
SELECT 基本語法
數學符號條件
AND OR IN
通配符
排序
SQL 內置函數和計算
子查詢與連接查詢
2、SELECT 基本語法SELECT 語句的基本格式為:SELECT?要查詢的列名?FROM?表名字?WHERE?限制條件;如果要查詢表的所有內容,則把要查詢的列名用一個星號*號表示,代表要查詢表中所有的列。而大多數情況,我們只需要查看某個表的指定的列,比如要查看 employee 表的 name 和 age:SELECT?name,age?FROM?employee;3、數學符號條件SELECT 語句常常會有 WHERE 限制條件,用于達到更加精確的查詢。WHERE 限制條件可以有數學符號 (=,,>=,<=) ,之前的例子,我們查詢了 name 和 age,現在稍作修改:篩選出 age 大于 25 的結果:SELECT?name,age?FROM?employee?WHERE?age>25;或者查找一個名字為 xiaofu 的員工的 name,age 和 phone:4、“AND” 與 “OR”從這兩個單詞就能夠理解它們的作用。WHERE 后面可以有不止一條限制,而根據條件之間的邏輯關系,可以用 [條件一 OR 條件二]] 和 [條件一 AND 條件二] 連接:例如,篩選出 age 小于 25,或 age 大于 30:SELECT?name,age?FROM?employee?WHERE?age<25?OR?age>30;篩選出 age 大于 25,且 age 小于 30:SELECT?name,age?FROM?employee?WHERE?age>25?AND?age<30;而剛才的限制條件 age>25 AND age<30?,如果需要包含 25 和 30這兩個數字的話,可以替換為 age BETWEEN 25 AND 30 。注意這里是包含了 25 和 30 的:5、 IN 和 NOT IN關鍵詞?IN?和?NOT IN?的作用和它們的名字一樣明顯,用于篩選“在”或“不在”某個范圍內的結果,比如說我們要查詢所在部門在?dpt3?或?dpt4?的人:SELECT?name,age,phone,in_dpt?FROM?employee?WHERE?in_dpt?IN?('dpt3','dpt4');而 NOT IN 的效果則是,如下面這條命令,查詢出了不在 dpt1 也不在 dpt3 的人:SELECT?name,age,phone,in_dpt?FROM?employee?WHERE?in_dpt?NOT?IN?('dpt1','dpt3');6、對結果排序為了使查詢結果看起來更順眼,我們可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞了。默認情況下,ORDER BY?的結果是升序排列,而使用關鍵詞?ASC?和?DESC?可指定升序或降序排序。比如,我們按 salary 降序排列,SQL語句為:SELECT?name,age,salary,phone?FROM?employee?ORDER?BY?salary?DESC;需要注意:如果語句后面不加 DESC 或 ASC ,則默認按照升序排列。應用場景:訂單列表按照時間先后順序顯示訂單;博客系統中按時間先后順序顯示文章。7、SQL 內置函數和計算SQL 允許對表中的數據進行計算。對此,SQL 有 5 個內置函數,這些函數都對 SELECT 的結果做操作:其中 COUNT 函數可用于任何數據類型(因為它只是計數),而 SUM 、AVG 函數都只能對數字類數據類型做計算,MAX 和 MIN 可用于數值、字符串或是日期時間數據類型。比如計算出 salary 的最大、最小值,用這樣的一條語句:SELECT?MAX(salary)?AS?max_salary,MIN(salary)?FROM?employee;上面的這條語句,有一個細節你或許注意到了,使用 AS 關鍵詞可以給值重命名,比如最大值被命名為了 max_salary:其它函數大家可以在自己動手實踐一下,加深理解。8、子查詢上面討論的 SELECT 語句都僅涉及一個表中的數據,然而有時必須處理多個表才能獲得所需的信息。例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工信息儲存在 employee 表中,但工程信息儲存在 project 表中。對于這樣的情況,我們可以用子查詢:SELECT of_dpt, COUNT(proj_name) AS count_project FROM project GROUP BY of_dptHAVING of_dpt IN (SELECT?in_dpt?FROM?employee?WHERE?name='xiaobai');上面代碼包含兩個 SELECT 語句,第二個 SELECT 語句將返回一個集合的數據形式,然后被第一個 SELECT 語句用 in 進行判斷。HAVING 關鍵字可以的作用和 WHERE 是一樣的,都是說明接下來要進行條件篩選操作。區別在于 HAVING 用于對分組后的數據進行篩選。9、連接查詢在處理多個表時,子查詢只有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的數據,這時就必須使用連接?(join)?操作。連接的基本思想是把兩個或多個表當作一個新的表來操作,如下:SELECT id,name,people_numFROM employee,departmentWHERE employee.in_dpt = department.dpt_nameORDER?BY?id;這條語句查詢出的是,各員工所在部門的人數,其中員工的 id 和 name 來自 employee 表,people_num 來自 department 表:另一個連接語句格式是使用 JOIN ON 語法,剛才的語句等同于下面這條,結果也相同。SELECT id,name,people_numFROM employee JOIN departmentON employee.in_dpt = department.dpt_nameORDER BY id;10、總結本節實驗中學習了 SELECT 語句的常用方法:基本語法、數學符號條件、AND OR IN、模糊查詢、對查詢結果排序、SQL 內置函數和計算、子查詢與連接查詢。