天天看點

從零開始學 MySQL -- SELECT 語句詳解

閱讀本文大概需要 7 分鐘

從零開始學 MySQL -- SELECT 語句詳解

前言

上篇文章我們學習了 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      
從零開始學 MySQL -- SELECT 語句詳解

3、數學符号條件

SELECT 語句常常會有 WHERE 限制條件,用于達到更加精确的查詢。WHERE 限制條件可以有數學符号 (=,<,>,>=,<=) ,之前的例子,我們查詢了 name 和 age,現在稍作修改:篩選出 age 大于 25 的結果:

SELECT name,age FROM employee WHERE age>25;      
從零開始學 MySQL -- SELECT 語句詳解

或者查找一個名字為 xiaofu 的員工的 name,age 和 phone:

從零開始學 MySQL -- SELECT 語句詳解

4、“AND” 與 “OR”

從這兩個單詞就能夠了解它們的作用。WHERE 後面可以有不止一條限制,而根據條件之間的邏輯關系,可以用 [條件一 OR 條件二]] 和 [條件一 AND 條件二] 連接配接:

例如,篩選出 age 小于 25,或 age 大于 30:

SELECT name,age FROM employee WHERE age<25 OR age>30;      
從零開始學 MySQL -- SELECT 語句詳解

篩選出 age 大于 25,且 age 小于 30:

SELECT name,age FROM employee WHERE age>25 AND age<30;      
從零開始學 MySQL -- SELECT 語句詳解

而剛才的限制條件 age>25 AND age<30 ,如果需要包含 25 和 30這兩個數字的話,可以替換為 age BETWEEN 25 AND 30 。注意這裡是包含了 25 和 30 的:

從零開始學 MySQL -- SELECT 語句詳解

5、 IN 和 NOT IN

關鍵詞 IN 和 NOT IN 的作用和它們的名字一樣明顯,用于篩選“在”或“不在”某個範圍内的結果,比如說我們要查詢所在部門在 dpt3 或 dpt4 的人:

SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN ('dpt3','dpt4');      
從零開始學 MySQL -- SELECT 語句詳解

而 NOT IN 的效果則是,如下面這條指令,查詢出了不在 dpt1 也不在 dpt3 的人:

SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN ('dpt1','dpt3');      
從零開始學 MySQL -- SELECT 語句詳解

6、對結果排序

為了使查詢結果看起來更順眼,我們可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞了。

預設情況下,ORDER BY 的結果是升序排列,而使用關鍵詞 ASC 和 DESC 可指定升序或降序排序。比如,我們按 salary 降序排列,SQL語句為:

SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;      
從零開始學 MySQL -- SELECT 語句詳解

需要注意:如果語句後面不加 DESC 或 ASC ,則預設按照升序排列。

應用場景:訂單清單按照時間先後順序顯示訂單;部落格系統中按時間先後順序顯示文章。

7、SQL 内置函數和計算

SQL 允許對表中的資料進行計算。對此,SQL 有 5 個内置函數,這些函數都對 SELECT 的結果做操作:

從零開始學 MySQL -- SELECT 語句詳解

其中 COUNT 函數可用于任何資料類型(因為它隻是計數),而 SUM 、AVG 函數都隻能對數字類資料類型做計算,MAX 和 MIN 可用于數值、字元串或是日期時間資料類型。

比如計算出 salary 的最大、最小值,用這樣的一條語句:

SELECT MAX(salary) AS max_salary,MIN(salary) FROM      

上面的這條語句,有一個細節你或許注意到了,使用 AS 關鍵詞可以給值重命名,比如最大值被命名為了 max_salary:

從零開始學 MySQL -- SELECT 語句詳解

其它函數大家可以在自己動手實踐一下,加深了解。

8、子查詢

上面讨論的 SELECT 語句都僅涉及一個表中的資料,然而有時必須處理多個表才能獲得所需的資訊。例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工資訊儲存在 employee 表中,但工程資訊儲存在 project 表中。

對于這樣的情況,我們可以用子查詢:

SELECT of_dpt, COUNT(proj_name) AS count_project FROM project GROUP BYHAVING of_dpt 
IN(SELECT in_dpt FROM employee WHERE name='xiaobai');      

上面代碼包含兩個 SELECT 語句,第二個 SELECT 語句将傳回一個集合的資料形式,然後被第一個 SELECT 語句用 in 進行判斷。HAVING 關鍵字可以的作用和 WHERE 是一樣的,都是說明接下來要進行條件篩選操作。差別在于 HAVING 用于對分組後的資料進行篩選。

從零開始學 MySQL -- SELECT 語句詳解

9、連接配接查詢

在處理多個表時,子查詢隻有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的資料,這時就必須使用連接配接 (join) 操作。連接配接的基本思想是把兩個或多個表當作一個新的表來操作,如下:

SELECT id,name,people_num
FROM employee,department
WHERE employee.in_dpt = department.dpt_name
ORDER BY id;      

這條語句查詢出的是,各員工所在部門的人數,其中員工的 id 和 name 來自 employee 表,people_num 來自 department 表:

從零開始學 MySQL -- SELECT 語句詳解

另一個連接配接語句格式是使用 JOIN ON 文法,剛才的語句等同于下面這條,結果也相同。

SELECT id,name,people_num
FROM employee JOIN department
ON employee.in_dpt = department.dpt_name
ORDER BY id;      

10、總結

本節實驗中學習了 SELECT 語句的常用方法:基本文法、數學符号條件、AND OR IN、模糊查詢、對查詢結果排序、SQL 内置函數和計算、子查詢與連接配接查詢。

今天的學習就到這裡啦。

如果大家在閱讀的過程中,有什麼建議和看法,非常歡迎在下方留言,每個留言我都會認真看的

從零開始學 MySQL -- SELECT 語句詳解