《MySQL 入門教程》第 07 篇 簡單查詢

從本篇開始我們將會介紹 MySQL 中的各種查詢語句,主要使用的數據表結構如下:

erd
它們分別是:

  • 部門表(department),包含部門編號(dept_id)和部門名稱(dept_name)字段,主鍵爲部門編號。該表共計 6 條數據。
  • 職位表(job),包含職位編號(job_id)和職位名稱(job_title)字段,主鍵爲職位編號。該表共計 10 條數據。
  • 員工表(employee),包含員工編號(emp_id)和員工姓名(emp_name)等字段,主鍵爲員工編號,部門編號(dept_id)字段是引用部門表的外鍵,職位編號(job_id)字段是引用職位表的外鍵,經理編號(manager)字段是引用員工表自身的外鍵。該表共計 25 條數據。

可以點擊下載創建數據表和生成示例數據的腳本,執行這些腳本完成相關的初始化操作。

準備就緒之後,讓我們從最簡單的查詢語句開始!

7.1 查詢指定字段

在 MySQL 中,使用 SELECT 語句查詢表中的數據。基本的查詢語法如下:

SELECT col1, col2
FROM table_name;

其中,SELECT 表示要查詢的字段或者表達式;FROM 表示從哪個表中查詢;它們都是關鍵字,SQL 不區分大小寫,但是一般關鍵字大寫;最後的分號(;)表示語句的結束。

例如,以下查詢語句返回了員工的姓名和年薪(月薪乘以 12):

SELECT emp_name, salary * 12
FROM employee;
 emp_name|salary * 12|
---------|-----------|
劉備      |  360000.00|
關羽      |  312000.00|
張飛      |  288000.00|
...

7.2 查詢全部字段

查詢表中全部字段的第一個方法就是在 SELECT 列表中寫上所有的字段。例如,以下語句返回了員工表中的所有字段:

SELECT emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email
FROM employee;
emp_id| emp_name| sex|dept_id|manager|hire_date |job_id|salary  |bonus   |email                   |
------|---------|----|-------|-------|----------|------|--------|--------|------------------------|
     1|劉備      ||      1|       |2000-01-01|     1|30000.00|10000.00|liubei@shuguo.com       |
     2|關羽      ||      1|      1|2000-01-01|     2|26000.00|10000.00|guanyu@shuguo.com       |
     3|張飛      ||      1|      1|2000-01-01|     2|24000.00|10000.00|zhangfei@shuguo.com     |
...

另一個方法就是使用星號(*)表示全部字段。例如,以上語句也可以寫成:

SELECT *
FROM employee;

MySQL 在解析該語句時,會自動將星號擴展爲表中的所有字段名。

⚠️星號可以便於快速編寫查詢語句,但是在實際項目中不要使用這種寫法。一方面,應用程序可能並不需要所有的字段,避免返回過多的無用數據;另一方面,當表結構發生變化時,星號返回的信息也會發生改變。

7.3 快速查詢

通常來說,我們查詢的目標都是數據表;意味着查詢語句的基本形式爲 SELECT … FROM … 。不過,MySQL 還支持另一種形式的查詢語句:只有 SELECT,沒有 FROM 的查詢。例如:

SELECT version(), now(), 1 + 1;
version()|now()              |1 + 1|
---------|-------------------|-----|
8.0.20   |2020-06-04 13:14:24|    2|

這種形式的查詢語句通常用於快速查找信息,或者當作計算器使用。上面的示例分別返回了 MySQL 服務器的版本、當前時間以及 1 + 1 的值。

Oracle 爲了實現快速查詢提供了一個特殊的表 dual,它只有一個字段且只包含一行數據。MySQL 也支持類似的寫法,例如:

SELECT version(), now(), 1 + 1 FROM dual;

7.4 使用別名

默認情況下,查詢返回的字段標題就是字段名或者表達式的定義。爲了提高查詢結果的可讀性,可以使用關鍵字 AS 爲返回的字段或者查詢中的表指定一個別名(Alias)。

我們爲 7.1 中的示例指定一些更好理解的標題:

SELECT emp_name AS "員工姓名", salary * 12 "年薪"
FROM employee;
姓名   |年薪     |
-----|---------|
劉備  |360000.00|
關羽  |312000.00|
張飛  |288000.00|

別名中的關鍵字 AS 可以省略。別名不會修改數據庫中存儲的表名或者列名,它只在當前語句中有效。另外,表別名會在多表連接查詢時使用到。

7.5 使用註釋

MySQL 支持代碼的註釋。註釋可以幫助我們理解代碼的作用,一般不會被服務器執行。

MySQL 中的註釋分爲單行註釋和多行註釋。

單行註釋有兩種形式,第一種就是以兩個連字符(--)開始,直到這一行結束。例如:

SELECT * -- 返回全部字段信息
FROM employee;

需要注意的是,與 SQL 標準不同,MySQL 中的兩個連字符號之後必須包含一個空白字符(空格、回車、製表符等)。例如:

SELECT 1 -- 1;
1|
-|
1|

SELECT 1 --1;
1 --1|
-----|
    2|

SELECT 1 --備註
FROM dual;
ERROR 1054 (42S22): Unknown column '備註' in 'field list'

在第一個語句中,兩個連字符號表示註釋;在第二個語句中,兩個連字符號被分開解析,表示 1 減去 -1;第三個語句解析出錯。

第二種形式的單行註釋以井號(#)開始,直到這一行結束。例如:

SELECT 1 #備註
FROM dual;

MySQL 使用 C 語言風格的多行註釋(/* … */),例如:

SELECT *
/* 返回全部字段信息
 * tony.dong
 * 2020-06-04
 */
FROM employee;

MySQL 不支持嵌套的多行註釋。

除了以上不會被執行的註釋之外,MySQL 中還存在一種可能被執行的註釋。這種註釋可以用於實現不同數據庫之間的移植。例如:

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...

其中,STRAIGHT_JOIN 是 MySQL 中的專有特性,會被服務器解析;其他的數據庫則會忽略註釋中的內容。

這種註釋還可以指定 MySQL 的版本。例如:

CREATE TABLE t1 (
    k INT AUTO_INCREMENT,
    KEY (k)
)  /*!50110 KEY_BLOCK_SIZE=1024; */

該語句在 MySQL 5.1.10 之後會指定參數 KEY_BLOCK_SIZE 的值,而在之前的版本中沒有該屬性,不會被執行。因此,這種方式可以編寫支持不同 MySQL 版本的 SQL 語句。

如果你在學習過程中遇到任何問題,歡迎留言提問,不用客氣!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章