MySQL教程 SQL基礎查詢

来源:https://www.cnblogs.com/huangminwen/archive/2018/07/11/9248908.html
-Advertisement-
Play Games

其實在資料庫最經常用的當屬查詢操作 基本語法 所有被使用的子句必須按語法說明中顯示的順序嚴格地排序。例如,一個HAVING子句必須位於GROUP BY子句之後,並位於ORDER BY子句之前。 ALL, DISTINCT和DISTINCTROW選項指定是否重覆行應被返回,如果沒有指定則預設值為ALL ...


其實在資料庫最經常用的當屬查詢操作

基本語法

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    欄位列表 AS 欄位別名
    [FROM 表名
    WHERE 條件表示式
    GROUP BY 欄位名|表達式
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING 條件表達式]
    [ORDER BY 欄位名|表達式
      [ASC | DESC] , ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]  

所有被使用的子句必須按語法說明中顯示的順序嚴格地排序。例如,一個HAVING子句必須位於GROUP BY子句之後,並位於ORDER BY子句之前。

ALL, DISTINCT和DISTINCTROW選項指定是否重覆行應被返回,如果沒有指定則預設值為ALL(返回所有匹配的行),DISTINCT和DISTINCTROW表示去重(如果是要刪除重覆的行,那麼所有的欄位都需要相同)

數據準備

CREATE TABLE IF NOT EXISTS score (
    id INT, -- 學生id
    name VARCHAR(10), -- 課程名稱
    score NUMERIC(4, 1)); -- 分數

INSERT INTO score VALUES(1, '語文', 90);
INSERT INTO score VALUES(1, '數學', 95);
INSERT INTO score VALUES(1, '英語', 98);
INSERT INTO score VALUES(2, '語文', 92);
INSERT INTO score VALUES(2, '數學', 88);
INSERT INTO score VALUES(2, '英語', 90);
INSERT INTO score VALUES(3, '語文', 96);
INSERT INTO score VALUES(3, '數學', 100);
INSERT INTO score VALUES(3, '英語', 98);

欄位別名:當數據進行查詢出來的時候,有時候數據表的欄位並不能符合我們的需求(多表查詢的時候,可能會有同名的欄位),這時候就需要對欄位進行重命名

註意:在一個WHERE子句中使用列別名是不允許的,因為當執行WHERE子句時,列值可能還沒有被確定。

mysql> SELECT name, score FROM score; -- 沒有使用別名
+------+-------+
| name | score |
+------+-------+
| 語文 | 90    |
| 數學 | 95    |
| 英語 | 98    |
| 語文 | 92    |
| 數學 | 88    |
| 英語 | 90    |
| 語文 | 96    |
| 數學 | 100   |
| 英語 | 98    |
+------+-------+
9 rows in set

mysql> SELECT name AS '課程名稱', score '分數' FROM score; -- 使用別名,score欄位使用了AS關鍵字
+----------+------+
| 課程名稱 | 分數 |
+----------+------+
| 語文     | 90   |
| 數學     | 95   |
| 英語     | 98   |
| 語文     | 92   |
| 數學     | 88   |
| 英語     | 90   |
| 語文     | 96   |
| 數學     | 100  |
| 英語     | 98   |
+----------+------+
9 rows in set

使用AS明確地指定列的別名,把它作為習慣,是一個良好的操作規範。

條件過濾WHERE

在SELECT語句中,數據根據WHERE子句中指定的搜索條件來進行過濾,在搜索條件中用來判斷條件的有比較運算符與邏輯運算符,其中

比較運算符有:>,<,>=,<=,!=,<>,like,between and,in/not in

邏輯運算符有:&&(and),||(or),!(not)

當SQL執行到WHERE子句時,會先從磁碟中根據搜索條件進行逐條判斷,如果成立則保存到記憶體中,否則跳過。

註意:WHERE子句返回的結果只有0或者1(要麼成立,要麼不成立),其中0代表false,1代表true。

mysql> SELECT * FROM score WHERE id = 1; -- 查找id為1的學生信息
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 語文 | 90    |
|  1 | 數學 | 95    |
|  1 | 英語 | 98    |
+----+------+-------+
3 rows in set

mysql> SELECT * FROM score WHERE id = 1 OR id = 2; -- 查找id為1或者id為2的學生信息
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 語文 | 90    |
|  1 | 數學 | 95    |
|  1 | 英語 | 98    |
|  2 | 語文 | 92    |
|  2 | 數學 | 88    |
|  2 | 英語 | 90    |
+----+------+-------+
6 rows in set

mysql> SELECT * FROM score WHERE score BETWEEN 95 AND 98; -- 查找課程分數在95到98之間的學生信息
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 數學 | 95    |
|  1 | 英語 | 98    |
|  3 | 語文 | 96    |
|  3 | 英語 | 98    |
+----+------+-------+
4 rows in set

分組函數GROUP BY

GROUP BY從語義上面來看意思是根據BY後面的欄位名或者表達式進行分組,所謂的分組就是將SELECT出來的數據分成若幹個組,相同的放一組),通常分組是為了做數據統計分析,所以常常配合聚合(統計)函數進行使用

常用的聚合(統計)函數有:

COUNT():返回SELECT語句檢索到的行中非NULL值的數目,若找不到匹配的行,則COUNT() 返回 0,COUNT(*)則包含非NULL值

SUM(): 統計每組數據的總數,表中列值為NULL的行不參與計算,若找不到匹配的行,則返回NULL

AVG():統計每組數據的平均值,表中列值為NULL的行不參與計算,若找不到匹配的行,則返回 NULL

MAX():統計每組中的最大值,如果統計的列中只有NULL值,那麼返回NULL

MIN():統計每組中的最小值,如果統計的列中只有NULL值,那麼返回NULL

聚合函數的特點:只有一個返回值

mysql> SELECT name, AVG(score), SUM(score) FROM score GROUP BY name; -- 統計各科的平均成績與總成績
+------+------------+------------+
| name | AVG(score) | SUM(score) |
+------+------------+------------+
| 數學 | 94.33333   | 283.0      |
| 英語 | 95.33333   | 286.0      |
| 語文 | 92.66667   | 278.0      |
+------+------------+------------+
3 rows in set

分組會根據分組的欄位進行預設排序,這裡的排序指的是對每個組的結果集這個整體進行排序,而不是分組中每一條記錄,實際上分組後每組也就一條記錄了。

現在有個需求,想要對上面的結果再進行一次彙總,那麼可能會考慮到用聯合查詢,不過MySQL中提供了WITH ROOLUP關鍵字就能輕鬆完成這件事情

mysql> SELECT name, AVG(score), SUM(score) FROM score GROUP BY name WITH ROLLUP;
+------+------------+------------+
| name | AVG(score) | SUM(score) |
+------+------------+------------+
| 數學 | 94.33333   | 283.0      |
| 英語 | 95.33333   | 286.0      |
| 語文 | 92.66667   | 278.0      |
| NULL | 94.11111   | 847.0      |
+------+------------+------------+
4 rows in set

與GROUP BY相比,在查詢的最後一行多了對平均成績與總成績的彙總。對單個維度的彙總並不能體現出ROLLUP的優勢,下麵對id與name進行彙總統計

mysql> SELECT id, name, AVG(score), SUM(score) FROM score GROUP BY id, name WITH ROLLUP;
+------+------+------------+------------+
| id   | name | AVG(score) | SUM(score) |
+------+------+------------+------------+
|    1 | 數學 | 95         | 95.0       |
|    1 | 英語 | 98         | 98.0       |
|    1 | 語文 | 90         | 90.0       |
|    1 | NULL | 94.33333   | 283.0      |
|    2 | 數學 | 88         | 88.0       |
|    2 | 英語 | 90         | 90.0       |
|    2 | 語文 | 92         | 92.0       |
|    2 | NULL | 90         | 270.0      |
|    3 | 數學 | 100        | 100.0      |
|    3 | 英語 | 98         | 98.0       |
|    3 | 語文 | 96         | 96.0       |
|    3 | NULL | 98         | 294.0      |
| NULL | NULL | 94.11111   | 847.0      |
+------+------+------------+------------+
13 rows in set

其中(NULL, NULL)與GROUP BY  name WITH ROLLUP類似,表示對最後數據的彙總

(id, NULL)表示對學生進行分組後的聚合結果,這裡表示對每個學生的成績進行彙總

(id, name)表示對學生與科目進行分組後的聚合結果,這裡表示對每個學生的各科成績進行彙總

MySQL 擴展了 GROUP BY的用途,因此你可以使用SELECT 列表中不出現在GROUP BY語句中的列或運算。例如

mysql> SELECT id, name, AVG(score), SUM(score) FROM score GROUP BY id;
+----+------+------------+------------+
| id | name | AVG(score) | SUM(score) |
+----+------+------------+------------+
|  1 | 語文 | 94.33333   | 283.0      |
|  2 | 語文 | 90         | 270.0      |
|  3 | 語文 | 98         | 294.0      |
+----+------+------------+------------+
3 rows in set

從上面的結果可以看出分組函數的特點:返回值為該組中的第一條記錄

在標準SQL中,你必須將 name添加到 GROUP BY子句中。假如你從GROUP BY部分省略的列在該組中不是唯一的,那麼不要使用這個功能!你會得到非預測性結果。例如根據學生查詢最高成績時所對應課程名稱為每組中第一條記錄值,這並不是我們想要的

mysql> SELECT id, name, AVG(score), MAX(score) FROM score GROUP BY id;
+----+------+------------+------------+
| id | name | AVG(score) | MAX(score) |
+----+------+------------+------------+
|  1 | 語文 | 94.33333   | 98         |
|  2 | 語文 | 90         | 92         |
|  3 | 語文 | 98         | 100        |
+----+------+------------+------------+
3 rows in set

如果需要在一行中顯示每個學生的各科成績,可以用GROUP_CONCAT函數,該函數通常配合GROUP BY使用,如果沒有GROUP BY,將返回列中的所有值

mysql> SELECT id, GROUP_CONCAT(score) FROM score GROUP BY id;
+----+---------------------+
| id | GROUP_CONCAT(score) |
+----+---------------------+
|  1 | 90.0,95.0,98.0      |
|  2 | 92.0,88.0,90.0      |
|  3 | 96.0,100.0,98.0     |
+----+---------------------+
3 rows in set

mysql> SELECT id, GROUP_CONCAT(score) FROM score;
+----+-----------------------------------------------+
| id | GROUP_CONCAT(score)                           |
+----+-----------------------------------------------+
|  1 | 90.0,95.0,98.0,92.0,88.0,90.0,96.0,100.0,98.0 |
+----+-----------------------------------------------+
1 row in set

過濾分組HAVING

HAVING是用來對分組後的數據進行數據篩選的,例如要查詢平均成績小於95的學生信息,使用having時,此時數據已經在記憶體中了。

mysql> SELECT id, AVG(score) FROM score GROUP BY id HAVING AVG(score) < 95;
+----+------------+
| id | AVG(score) |
+----+------------+
|  1 | 94.33333   |
|  2 | 90         |
+----+------------+
2 rows in set

排序ORDER BY

根據某個欄位進行升序(預設)或者降序排序,依賴校對集

mysql> SELECT * FROM score WHERE id = 1 ORDER BY score DESC; -- 查詢學生1的成績,並按照成績由高到低進行排序
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 英語 | 98    |
|  1 | 數學 | 95    |
|  1 | 語文 | 90    |
+----+------+-------+
3 rows in set

數量限定LIMIT

兩種使用方式

1、LIMIT row_count:row_count表示數量,如

mysql> SELECT * FROM score LIMIT 2; -- 查找列表前兩條數據
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 語文 | 90    |
|  1 | 數學 | 95    |
+----+------+-------+
2 rows in set

2、LIMIT begin,offset:begin表示起始位置,offset表示數量

mysql> SELECT * FROM score LIMIT 2,3; -- 從第二條開始,取出三條數據,通常用於分頁
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | 英語 | 98    |
|  2 | 語文 | 92    |
|  2 | 數學 | 88    |
+----+------+-------+
3 rows in set

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、Linux的發展 1.1969年在貝爾實驗室誕生Unix,是開源免費的,之後逐漸轉變為收費系統。 2.1986年譚邦寧研發mini Unix,但主要用來教學。 3.斯托曼創建FSF(自由軟體基金會) 項目:GNU 葛奴計劃 4.GPL:FSF制定通用公共許可 開源免費傳播 任意修改,修改之後必須 ...
  • 前言 轉帖請註明出處: http://www.cnblogs.com/Troy-Lv5/ 版本管理當然是選擇git..反正我是被svn坑怕了... 這次安裝的是git 2.18.0 點擊下載 準備安裝 1. 刪除原有Git, 由於系統預設使用的是1.8.3.1的git, 所以要先刪除掉 2. 下載g ...
  • ssh服務 1.檢查是否有被安裝,命令 2.檢查ssh有沒有在運行,命令 3.如何啟動ssh 啟動命令 service sshd start 停止命令 service sshd stop 重啟命令 service sshd restart 查看狀態 service sshd status ***** ...
  • 學習目標: 瞭解arch/arm/kernel/head.S作為內核啟動的第一個文件所實現的功能! 前面通過對內核Makefile的分析,可以知道arch/arm/kernel/head.S是內核啟動的第一個文件。另外,U-boot調用內核時,r1寄存器中存儲“機器類型ID”,內核會使用它。 打開a ...
  • 創建表: 1 1 create table tb1( 2 2 3 3 id int , 4 4 5 5 name nvarchar(20) 6 6 7 7 ) 創建返回游標的存儲過程: 1 create proc tb1_proc ( 2 3 @cur cursor varying output 4 ...
  • 為什麼設置代理,你懂得。 有很多第三方工具可以用,比如proxychains,非常好用,不過今天這不是正題。因為有可能沒有代理,上網你都做不到,更別提下載軟體了。想一想方法還是告訴你,免得你萬一必須用: 通常有三種辦法為apt設置代理,有了代理能上網之後,apt才能為你帶來其它軟體的幫助。 1.設置 ...
  • 今天偶然看到這篇文章,做個入門瞭解還是不錯的。 前一陣子在QQ上和朋友聊天的時候,總會看到有人說Linux上的應用程式開發是高手才可以完成的,而且這種“迷信”在目前似乎還很普遍。然而,情況並不是這樣的,從程式庫的支持方面,Linux平臺為用戶級應用程式的開發提供了很多功能強大且豐富的程式庫,而且它們 ...
  • 支持的數據類型: 字元型char 定長 最大2000varchar2() 變長 最大4000clob 字元型大對象 最大4G 數字型number範圍 -10的38次方到10的+38次方;number(5,2) 一個小數,有效位5個,小數點後2個數字number(5) 表示一個5位的整數 日期類型da ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...