MySQL基礎:SELECT查詢語句總結

来源:https://www.cnblogs.com/Rohn/archive/2020/06/24/13186540.html
-Advertisement-
Play Games

SELECT語句用於從表中選取/查詢數據,結果被存儲在一個結果表中(稱為結果集)。 ...


blog:https://www.cnblogs.com/Rohn/

目錄

概述

SELECT語句用於從表中選取/查詢數據,結果被存儲在一個結果表中(稱為結果集)。

語法格式

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [into_option]
    [FOR UPDATE | LOCK IN SHARE MODE]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

資料庫案例

shell> unzip test_db-master.zip
shell> cd test_db-master/

# 設置引擎為InnoDB
shell> set storage_engine = InnoDB

# 執行初始化sql
shell> mysql -t < employees.sql
+-----------------------------+
| INFO                        |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
+------------------------+
| INFO                   |
+------------------------+
| storage engine: InnoDB |
+------------------------+
+---------------------+
| INFO                |
+---------------------+
| LOADING departments |
+---------------------+
+-------------------+
| INFO              |
+-------------------+
| LOADING employees |
+-------------------+
+------------------+
| INFO             |
+------------------+
| LOADING dept_emp |
+------------------+
+----------------------+
| INFO                 |
+----------------------+
| LOADING dept_manager |
+----------------------+
+----------------+
| INFO           |
+----------------+
| LOADING titles |
+----------------+
+------------------+
| INFO             |
+------------------+
| LOADING salaries |
+------------------+

表說明:

  • departments:記錄的是9個部門的部門編號和部門名稱;
  • dept_emp:部門員工數據,員工id和部門id,其實時間和結束時間(註:9999的意思就是仍在職);
  • dept_manger:同第二張表結構差不多,每個部門的每個經理的任職時期,總共就24個人,每個部門至少有過兩個經理;
  • employees:員工信息表,emp_no是唯一鍵值;
  • salaries:記錄每個員工每段時期的薪資;
  • title:記錄每個員工每段時期的職位名稱,但請註意,周期與第五張表是不同的,因為在同一職位上你也是會漲工資的;

模型如下:

image

常用語法

使用*查詢表中的全部內容

SELECT語句中使用星號*通配符查詢所有欄位。

語法格式

語法格式如下:

SELECT * FROM 表名;

實例

例如,從employees表中檢索所有欄位的數據

SELECT * FROM employees;

輸出結果如下:
image

查詢表中指定的欄位

語法格式

查詢表中的某一個欄位的語法格式為:

SELECT < 列名 > FROM < 表名 >;

實例

例如,查詢employees表中所有員工的firstname。

SELECT first_name FROM employees;

例如,查詢employees表中所有員工的firstname、lastname及生日。

SELECT first_name,last_name,birth_date FROM employees;

過濾重覆數據(去重)

有時出於對數據分析的要求,需要消除重覆的記錄值。這時候就需要用到DISTINCT關鍵字指示MySQL消除重覆的記錄值。

語法格式

語法格式為:

SELECT DISTINCT <欄位名> FROM <表名>;

實例

例如,查詢employees表中所有員工的生日(去掉重覆)。

SELECT DISTINCT birth_date FROM employees;

設置別名

表別名

在使用MySQL查詢時,當表名很長或者執行一些特殊查詢的時候,為了方便操作或者需要多次使用相同的表時,可以為表指定別名,用這個別名代替表原來的名稱。

語法格式

語法格式如下:

<表名> [AS] <別名>

實例

例如,查詢員工每個時期的薪資。

SELECT sa.salary FROM salaries AS sa;

欄位別名

在使用SELECT語句顯示查詢結果時,MySQL會顯示每個SELECT後面指定輸出的欄位,在有些情況下,顯示的欄位名稱會很長或者名稱不夠直觀,MySQL可以指定欄位的別名,替換欄位或表達式。

語法格式

<欄位名> [AS] <欄位別名>

限制查詢結果的記錄條數

在使用MySQL SELECT語句時往往返回的是所有匹配的行,有些時候我們僅需要返回第一行或者前幾行,這時候就需要用到MySQLLIMT子句。

LIMIT接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。

第一個參數“位置偏移量”指示 MySQL 從哪一行開始顯示,是一個可選參數,如果不指定“位置偏移量”,將會從表中的第一條記錄開始(第一條記錄的位置偏移量是 0,第二條記錄的位置偏移量是 1,以此類推);第二個參數“行數”指示返回的記錄條數。

語法格式

語法格式如下:

<LIMIT> [<位置偏移量>,] <行數>

實例

例如,查詢employees表中第3條起的10條數據。

mysql> SELECT * FROM employees LIMIT 2,10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
|  10011 | 1953-11-07 | Mary       | Sluis     | F      | 1990-01-22 |
|  10012 | 1960-10-04 | Patricio   | Bridgland | M      | 1992-12-18 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)

對查詢結果進行排序

ORDER BY子句主要用來將結果集中的數據按照一定的順序進行排序。

語法格式

語法格式如下:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][預設 ASC]], [field2...] [ASC [DESC][預設 ASC]]

關鍵字ASC表示按升序分組,關鍵字DESC表示按降序分組,其中ASC為預設值。這兩個關鍵字必須位於對應的欄位名、表達式、列的位置之後。

實例

例如,根據出生日期降序排序,查詢employees表所有員工信息。

SELECT * FROM employees ORDER BY birth_date DESC;

例如,根據出生日期降序、員工編號升序排序,查詢employees表所有員工信息。

SELECT * FROM employees ORDER BY birth_date DESC,emp_no ASC;

條件查詢

使用WHERE子句來指定查詢條件,從FROM子句的中間結果中選取適當的數據行,達到數據過濾的效果。

語法格式

語法格式如下:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

說明:

  • 查詢語句中你可以使用一個或者多個表,表之間使用逗號,分割,並使用WHERE語句來設定查詢條件;
  • 你可以在WHERE子句中指定任何條件;
  • 你可以使用AND或者OR指定一個或多個條件;
  • WHERE子句也可以運用於SQL的DELETE或者UPDATE命令;
  • WHERE子句類似於程式語言中的if條件,根據MySQL表中的欄位值來讀取指定的數據;

實例

例如,查詢employees表所有firstname叫Zhonghua的員工信息。

SELECT * FROM employees WHERE first_name = 'Zhonghua';

內連接查詢

內連接是通過在查詢中設置連接條件的方式,來移除查詢結果集中某些數據行後的交叉連接。簡單來說,就是利用條件表達式來消除交叉連接的某些數據行。

在MySQL FROM子句中使用關鍵字 INNER JOIN連接兩張表,並使用 ON子句來設置連接條件。如果沒有任何條件,INNER JOINCROSS JOIN在語法上是等同的,兩者可以互換。

語法格式

語法格式如下:

SELECT <欄位名1,欄位名2 …>
FROM <表名1> INNER JOIN <表名2> [ ON子句]

內連接是系統預設的表連接,所以在FROM子句後可以省略INNER 關鍵字,只用關鍵字 JOIN。使用內連接後,FROM 子句中的ON子句可用來設置連接表的條件。

實例

例如,查詢所有人的title。

SELECT e.emp_no,e.first_name,e.last_name,t.title,t.from_date,t.to_date FROM `employees` e JOIN titles t WHERE e.emp_no = t.emp_no;

外連接查詢

內連接是在交叉連接的結果集上返回滿足條件的記錄;而外連接先將連接的表分為基表參考表,再以基表為依據返回滿足和不滿足條件的記錄。

外連接更加註重兩張表之間的關係。按照連接表的順序,可以分為左外連接右外連接

左外連接查詢

左外連接又稱為左連接,在 FROM子句中使用關鍵字LEFT OUTER JOIN或者LEFT JOIN,用於接收該關鍵字左表(基表)的所有行,並用這些行與該關鍵字右表(參考表)中的行進行匹配,即匹配左表中的每一行及右表中符合條件的行

在左外連接的結果集中,除了匹配的行之外,還包括左表中有但在右表中不匹配的行,對於這樣的行,從右表中選擇的列的值被設置為 NULL,即左外連接的結果集中的 NULL值表示右表中沒有找到與左表相符的記錄

實例

例如,查詢所有員工的部門編號。

SELECT e.emp_no,e.first_name,e.last_name,d.dept_no FROM `employees` e LEFT JOIN`dept_emp` d on e.emp_no = d.emp_no;

右外連接查詢

右外連接又稱為右連接,在FROM子句中使用RIGHT OUTER JOIN或者RIGHT JOIN。與左外連接相反,右外連接以右表為基表,連接方法和左外連接相同。在右外連接的結果集中,除了匹配的行外,還包括右表中有但在左表中不匹配的行,對於這樣的行,從左表中選擇的值被設置為NULL

實例

例如,查詢所有員工的部門編號。

SELECT e.first_name,e.last_name,d.dept_no FROM employees e RIGHT JOIN dept_emp d ON e.emp_no = d.emp_no;

子查詢

子查詢指一個查詢語句嵌套在另一個查詢語句內部的查詢,這個特性從 MySQL 4.1 開始引入,在SELECT 子句中先計運算元查詢,子查詢結果作為外層另一個查詢的過濾條件,查詢可以基於一個表或者多個表。

子查詢中常用的操作符有ANY(SOME)ALLINEXISTS

子查詢可以添加到SELECTUPDATEDELETE語句中,而且可以進行多層嵌套。子查詢也可以使用比較運算符,如<<=>>=!=等。

IN子查詢

結合關鍵字IN所使用的子查詢主要用於判斷一個給定值是否存在於子查詢的結果集中。

語法格式

語法格式為:

<表達式> [NOT] IN <子查詢>

語法說明如下:

  • <表達式>:用於指定表達式。當表達式與子查詢返回的結果集中的某個值相等時,返回TRUE,否則返回FALSE;若使用關鍵字NOT,則返回的值正好相反。
  • <子查詢>:用於指定子查詢。這裡的子查詢只能返回一列數據。對於比較複雜的查詢要求,可以使用SELECT 語句實現子查詢的多層嵌套。

比較運算符子查詢

比較運算符所使用的子查詢主要用於對錶達式的值和子查詢返回的值進行比較運算。

語法格式

其語法格式為:

<表達式> {= | < | > | >= | <= | <=> | < > | != }
{ ALL | SOME | ANY} <子查詢>

語法說明如下:

  • <子查詢>:用於指定子查詢。
  • <表達式>:用於指定要進行比較的表達式。
  • ALLSOMEANY:可選項。用於指定對比較運算的限制。其中,關鍵字ALL用於指定表達式需要與子查詢結果集中的每個值都進行比較,當表達式與每個值都滿足比較關係時,會返回TRUE,否則返回FALSE;關鍵字SOMEANY 是同義詞,表示表達式只要與子查詢結果集中的某個值滿足比較關係,就返回TRUE,否則返回FALSE

實例

例如,查詢Giri Koblick歷年工資。

SELECT * FROM salaries WHERE emp_no in (SELECT emp_no FROM employees WHERE first_name = 'Giri' AND last_name = 'Koblick');

結果如下:

+--------+--------+------------+------------+
| emp_no | salary | from_date  | to_date    |
+--------+--------+------------+------------+
|  26466 |  73178 | 1999-07-26 | 2000-07-25 |
|  26466 |  77529 | 2000-07-25 | 2001-07-25 |
|  26466 |  81844 | 2001-07-25 | 2002-07-25 |
|  26466 |  84824 | 2002-07-25 | 9999-01-01 |
+--------+--------+------------+------------+

EXIST子查詢

關鍵字EXISTS所使用的子查詢主要用於判斷子查詢的結果集是否為空。

語法格式

其語法格式為:

EXISTS <子查詢>

若子查詢的結果集不為空,則返回TRUE;否則返回FALSE

分組查詢

在MySQL SELECT語句中,允許使用GROUP BY子句,將結果集中的數據行根據選擇列的值進行邏輯分組,以便能彙總表內容的子集,實現對每個組而不是對整個結果集進行整合。

語法格式

語法格式如下:

GROUP BY { <欄位名> | <表達式> | <位置> } [ASC | DESC]

說明:

  • <欄位名>:指定用於分組的欄位。可以指定多個欄位,彼此間用逗號分隔。
  • <表達式>:指定用於分組的表達式。通常與聚合函數一塊使用,例如可將表達式COUNT(*)AS' 人數 '作為 SELECT 選擇列表清單的一項。
  • <位置>:指定用於分組的選擇欄位在SELECT語句結果集中的位置,通常是一個正整數。例如,GROUP BY 2表示根據SELECT 語句列清單上的第2欄位的值進行邏輯分組。
  • ASC|DESC:關鍵字ASC表示按升序分組,關鍵字DESC表示按降序分組,其中ASC為預設值,註意這兩個關鍵字必須位於對應的欄位名、表達式、欄位的位置之後。

GROUP BY必須得配合聚合函數來用,分組之後你可以計數(COUNT),求和(SUM),求平均數(AVG)等。

對於GROUP BY子句的使用,需要註意以下幾點。

  • GROUP BY子句可以包含任意數目的列,使其可以對分組進行嵌套,為數據分組提供更加細緻的控制。
  • GROUP BY子句列出的每個列都必須是檢索列或有效的表達式,但不能是聚合函數。若在SELECT語句中使用表達式,則必須在 GROUP BY子句中指定相同的表達式。
  • 除聚合函數之外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
  • 若用於分組的列中包含有NULL 值,則NULL將作為一個單獨的分組返回;若該列中存在多個NULL 值,則將這些NULL值所在的行分為一組。

實例

例如,統計同一天生日的員工:

SELECT GROUP_CONCAT(emp_no),birth_date FROM `employees` GROUP BY birth_date;

例如,統計每個部門有多少在職員工:

SELECT
  dept_no as 部門,
  count(emp_no) as 人數
FROM
  dept_emp 
WHERE
  to_date = '9999-01-01' 
GROUP BY
  dept_no;

結果如下:

+--------+--------+
| 部門   | 人數   |
+--------+--------+
| d001   |  14842 |
| d002   |  12437 |
| d003   |  12898 |
| d004   |  53304 |
| d005   |  61386 |
| d006   |  14546 |
| d007   |  37701 |
| d008   |  15441 |
| d009   |  17569 |
+--------+--------+

指定過濾條件

在MySQL SELECT語句中,除了能使用GROUP BY子句分組數據外,還可以使用 HAVING子句過濾分組,在結果集中規定了包含哪些分組和排除哪些分組。

語法格式

語法格式如下:

HAVING <條件>

HAVING子句和WHERE子句非常相似,HAVING子句支持WHERE子句中所有的操作符和語法,但是兩者存在幾點差異:

  • WHERE 子句主要用於過濾數據行,而HAVING子句主要用於過濾分組,即HAVING子句基於分組的聚合值而不是特定行的值來過濾數據,主要用來過濾分組。
  • WHERE 子句不可以包含聚合函數,HAVING子句中的條件可以包含聚合函數。
  • HAVING子句是在數據分組後進行過濾,WHERE子句會在數據分組前進行過濾。WHERE子句排除的行不包含在分組中,可能會影響HAVING子句基於這些值過濾掉的分組。

實例

例如,統計員工人數大於30000的部門。

SELECT
    (SELECT d.dept_name FROM departments d WHERE de.dept_no = d.dept_no) AS 部門,
    count( de.emp_no ) AS 人數 
FROM
    dept_emp de 
WHERE
    de.to_date = '9999-01-01' 
GROUP BY
    de.dept_no 
HAVING
    count(de.emp_no) > 30000; 

結果如下:

+-------------+--------+
| 部門        | 人數   |
+-------------+--------+
| Production  |  53304 |
| Development |  61386 |
| Sales       |  37701 |
+-------------+--------+

正則表達式查詢

MySQL中正式表達式通常被用來檢索或替換符合某個模式的文本內容,根據指定的匹配模式匹配文中符合要求的特殊字元串。

MySQL中使用REGEXP關鍵字指定正則表達式的字元匹配模式,下表列出了REGEXP操作符中常用的匹配列表。

image

實例

例如,統計9月2日出生的f開頭lastname的員工。

SELECT * FROM employees WHERE birth_date REGEXP '09-02$' AND last_name REGEXP '^f';

image-20200624104509627


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在我們將U盤插入裝有CentOS的系統時,經常會出現如圖所示的錯誤提示。這是因為linux系統並不能相容NTFS的文件系統。其解決方法如下(建議先進入root模式): **1、首先下載“ntfs-3g”**(NTFS-3G 是一個開源的軟體,可以實現 Linux、Free BSD、Mac OSX、N ...
  • 1. 概念 自旋鎖的目的是在短期間內進行輕量級的鎖定,解決對某項共用資源的互斥使用,在等待鎖重新可用期間進行自旋,所以自旋鎖不應該被持有時間過長,如果需要長時間鎖定的話,推薦使用信號量。實際操作的數據結構如下: 2. 獲取鎖 最終執行的代碼是體繫結構相關的自旋鎖實現:arch_spin_lock。 ...
  • 實驗一 安裝OpenShift1.1 前置準備[student@workstation ~]$ lab review-install setup1.2 配置規劃OpenShift集群有三個節點:master.lab.example.com:OpenShift master節點,是一個不可調度pod的 ...
  • 鍵盤俠Linux乾貨| ELK(Elasticsearch + Logstash + Kibana) 搭建教程 全網最簡單 ...
  • 常見註釋 -- 很少支持 #行內註釋 /**/段落註釋 基礎語法 SELECT 檢索數據 語法 作用 例子 釋義 select 查找列,並返回行 select prod_name from products;#可使用,分隔列名來查找多個列。 查找prod_name列,並返回其下的所有行,在produ ...
  • 索引首碼 使用 字元串列的索引規範中的語法,您可以創建僅使用列首字元的索引 。以這種方式僅索引列值的首碼可以使索引文件小得多。為a 或 column 編製索引時 , 必須為索引指定首碼長度。例如: col_name(N)NBLOBTEXT CREATE TABLE test (blob_col BL ...
  • 一、異常現象截圖 二、解決方式: 1、背景 早期的canal版本(<=1.0.24),在處理表結構的DDL變更時採用了一種簡單的策略,在記憶體里維護了一個當前資料庫內表結構的鏡像(通過desc table獲取)。 這樣的記憶體表結構鏡像的維護存在問題,如果當前在處理的binlog為歷史時間段T0,當前時 ...
  • 1 select DATE_FORMAT(dtl.transdate,'%Y-%m-%d') as transdate, 2 right(DATE_FORMAT(concat(transdate,transtime),'%Y-%m-%d %H:%i:%s'),8) as 3 transtime,dt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...