當前位置 博文首頁 > 信息技術智庫:9.MySQL數據查詢SQL

    信息技術智庫:9.MySQL數據查詢SQL

    作者:[db:作者] 時間:2021-09-13 18:56

    9.MySQL數據查詢SQL

    語法格式:

    select?字段列表|*?from?表名

    [where?搜索條件]

    [group?by?分組字段?[having?分組條件]]

    [order?by?排序字段?排序規則]

    [limit?分頁參數]

    基礎查詢

    #?查詢表中所有列?所有數據

    select?*?from?users;

    #?指定字段列表進行查詢

    select?id,name,phone?from?users;

    Where?條件查詢

    可以在where子句中指定任何條件

    可以使用?and?或者?or?指定一個或多個條件

    where條件也可以運用在update和delete語句的后面

    where子句類似程序語言中if條件,根據mysql表中的字段值來進行數據的過濾

    示例:

    --?查詢users表中?age > 22的數據

    select?*?from?users?where?age >?22;

    --?查詢?users?表中?name=某個條件值?的數據

    select?*?from?users?where?name =?'王五';

    --?查詢?users?表中?年齡在22到25之間的數據

    select?*?from?users?where?age >=?22?and?age <=?25;

    select?*?from?users?where?age?between?22?and?25;

    --?查詢?users?表中?年齡不在22到25之間的數據

    select?*?from?users?where?age <?22?or?age >?25;

    select?*?from?users?where?age?not?between?22?and?25;

    --?查詢?users?表中?年齡在22到25之間的女生信息

    select?*?from?users?where?age >=?22?and?age <=?25?and?sex =?'女';

    and和or?使用時注意

    假設要求?查詢?users?表中?年齡為22或者25?的女生信息

    select * from users where age=22 or age = 25 and sex = '女';

    思考上面的語句能否返回符合條件的數據?

    實際查詢結果并不符合要求?

    select?*?from?users?where?age=22?or?age =?25?and?sex =?'女';

    +------+--------+------+-------+-------+------+------+

    | id | name | age | phone | email | sex | mm |

    +------+--------+------+-------+-------+------+------+

    |?1?|?章三?|?22?| |?NULL?|?男?|?0?|

    |?1002?| cc |?25?|?123?|?NULL?|?女?|?NULL?|

    +------+--------+------+-------+-------+------+------+

    2?rows?in?set?(0.00?sec)

    --?上面的查詢結果并不符合?查詢條件的要求。

    --?問題出在?sql?計算的順序上,sql會優先處理and條件,所以上面的sql語句就變成了

    --?查詢變成了為年齡22的不管性別,或者年齡為?25的女生

    --?如何改造sql符合我們的查詢條件呢?

    --?使用小括號來關聯相同的條件

    select?*?from?users?where?(age=22?or?age =?25)?and?sex =?'女';

    +------+------+------+-------+-------+------+------+

    | id | name | age | phone | email | sex | mm |

    +------+------+------+-------+-------+------+------+

    |?1002?| cc |?25?|?123?|?NULL?|?女?|?NULL?|

    +------+------+------+-------+-------+------+------+

    1?row?in?set?(0.00?sec)

    Like?子句

    我們可以在where條件中使用=,<,>?等符合進行條件的過濾,但是當想查詢某個字段是否包含時如何過濾?

    可以使用like語句進行某個字段的模糊搜索,

    例如:?查詢?name字段中包含五的數據

    -- like?語句?like某個確定的值?和。where name = '王五'?是一樣

    select?*?from?users?where?name?like?'王五';

    +----+--------+------+-------+-----------+------+------+

    | id | name | age | phone | email | sex | mm |

    +----+--------+------+-------+-----------+------+------+

    |?5?|?王五?|?24?|?10011?| ww@qq.com?|?男?|?0?|

    +----+--------+------+-------+-----------+------+------+

    1?row?in?set?(0.00?sec)

    --?使用?%?模糊搜索。%代表任意個任意字符

    --?查詢name字段中包含五的

    select?*?from?users?where?name?like?'%五%';

    --?查詢name字段中最后一個字符?為?五的

    select?*?from?users?where?name?like?'%五';

    --?查詢name字段中第一個字符?為?王?的

    select?*?from?users?where?name?like?'王%';

    --?使用?_?單個的下劃線。表示一個任意字符,使用和%類似

    --?查詢表中?name?字段為兩個字符的數據

    select?*?from?users?where?name?like?'__';

    --?查詢?name?字段最后為五,的兩個字符的數據

    select?*?from?users?where?name?like?'_五';

    注意:where子句中的like在使用%或者_進行模糊搜索時,效率不高,使用時注意:

    盡可能的不去使用%或者_

    如果需要使用,也盡可能不要把通配符放在開頭處

    Mysql中的統計函數(聚合函數)

    max(),min(),count(),sum(),avg()

    #?計算?users?表中?最大年齡,最小年齡,年齡和及平均年齡

    select?max(age),min(age),sum(age),avg(age)?from?users;

    +----------+----------+----------+----------+

    |?max(age) |?min(age) |?sum(age) |?avg(age) |

    +----------+----------+----------+----------+

    |?28?|?20?|?202?|?22.4444?|

    +----------+----------+----------+----------+

    --?上面數據中的列都是在查詢時使用的函數名,不方便閱讀和后期的調用,可以通過別名方式?美化

    select?max(age)?as?max_age,

    min(age) min_age,sum(age)?as?sum_age,

    avg(age)?as?avg_age

    from?users;

    +---------+---------+---------+---------+

    | max_age | min_age | sum_age | avg_age |

    +---------+---------+---------+---------+

    |?28?|?20?|?202?|?22.4444?|

    +---------+---------+---------+---------+

    --?統計?users?表中的數據量

    select?count(*)?from?users;

    +----------+

    |?count(*) |

    +----------+

    |?9?|

    +----------+

    select?count(id)?from?users;

    +-----------+

    |?count(id) |

    +-----------+

    |?9?|

    +-----------+

    --?上面的兩個統計,分別使用了?count(*)?和?count(id),結果目前都一樣,有什么區別?

    -- count(*)?是按照?users表中所有的列進行數據的統計,只要其中一列上有數據,就可以計算

    -- count(id)?是按照指定的?id?字段進行統計,也可以使用別的字段進行統計,

    --?但是注意,如果指定的列上出現了NULL值,那么為NULL的這個數據不會被統計

    --?假設有下面這樣的一張表需要統計

    +------+-----------+------+--------+-----------+------+------+

    | id | name | age | phone | email | sex | mm |

    +------+-----------+------+--------+-----------+------+------+

    |?1?|?章三?|?22?| |?NULL?|?男?|?0?|

    |?2?|?李四?|?20?| |?NULL?|?女?|?0?|

    |?5?|?王五?|?24?|?10011?| ww@qq.com?|?男?|?0?|

    |?1000?| aa |?20?|?123?|?NULL?|?女?|?NULL?|

    |?1001?| bb |?20?|?123456?|?NULL?|?女?|?NULL?|

    |?1002?| cc |?25?|?123?|?NULL?|?女?|?NULL?|

    |?1003?| dd |?20?|?456?|?NULL?|?女?|?NULL?|

    |?1004?| ff |?28?|?789?|?NULL?|?男?|?NULL?|

    |?1005?|?王五六?|?23?|?890?|?NULL?|?NULL?|?NULL?|

    +------+-----------+------+--------+-----------+------+------+

    9?rows?in?set?(0.00?sec)

    --?如果按照sex這一列進行統計,結果就是8個而不是9個,因為sex這一列中有NULL值存在

    mysql>?select?count(sex)?from?users;

    +------------+

    |?count(sex) |

    +------------+

    |?8?|

    +------------+

    聚合函數除了以上簡單的使用意外,通常情況下都是配合著分組進行數據的統計和計算

    Group BY?分組

    group by?語句根據一個或多個列對結果集進行分組

    一般情況下,是用與數據的統計或計算,配合聚合函數使用

    --?統計?users?表中?男女生人數

    --?很明顯按照上面的需要,可以寫出兩個語句進行分別統計

    select?count(*)?from?users?where?sex =?'女';

    select?count(*)?from?users?where?sex =?'男';

    --?可以使用分組進行統計,更方便

    select?sex,count(*)?from?users?group?by?sex;

    +------+----------+

    | sex |?count(*) |

    +------+----------+

    |?男?|?4?|

    |?女?|?5?|

    +------+----------+

    --?統計1班和2班的人數

    select?classid,count(*)?from?users?group?by?classid;

    +---------+----------+

    | classid |?count(*) |

    +---------+----------+

    |?1?|?5?|

    |?2?|?4?|

    +---------+----------+

    --?分別統計每個班級的男女生人數

    select?classid,sex,count(*)?as?num?from?users?group?by?classid,sex;

    +---------+------+-----+

    | classid | sex | num |

    +---------+------+-----+

    |?1?|?男?|?2?|

    |?1?|?女?|?3?|

    |?2?|?男?|?2?|

    |?2?|?女?|?2?|

    +---------+------+-----+

    #?注意,在使用。group by分組時,一般除了聚合函數,其它在select后面出現的字段列都需要出現在grouop by?后面

    Having?子句

    having時在分組聚合計算后,對結果再一次進行過濾,類似于where,

    where過濾的是行數據,having過濾的是分組數據

    --?要統計班級人數

    select?classid,count(*)?from?users?group?by?classid;

    --?統計班級人數,并且要人數達到5人及以上

    select?classid,count(*)?as?num?from?users?group?by?classid?having?num >=5;

    Order by?排序

    我們在mysql中使用select的語句查詢的數據結果是根據數據在底層文件的結構來排序的,

    首先不要依賴默認的排序,另外在需要排序時要使用orderby對返回的結果進行排序

    Asc?升序,默認

    desc降序

    --?按照年齡對結果進行排序,從大到小

    select?*?from?users?order?by?age?desc;

    --?從小到大排序?asc?默認就是?梢圆粚

    select?*?from?users?order?by?age;

    --?也可以按照多個字段進行排序

    select?*?from?users?order?by?age,id;?#?先按照age進行排序,age相同情況下,按照id進行排序

    select?*?from?users?order?by?age,id?desc;

    Limit?數據分頁

    limit n?提取n條數據,

    limit m,n?跳過m跳數據,提取n條數據

    --?查詢users表中的數據,只要3條

    select?*?from?users?limit?3;

    --?跳過前4條數據,再取3條數據

    select?*?from?users?limit?4,3;

    -- limit一般應用在數據分頁上面

    --?例如每頁顯示10條數據,第三頁的?limit應該怎么寫??思考

    第一頁?limit?0,10

    第二頁?limit?10,10

    第三頁?limit?20,10

    第四頁?limit?30,10

    --?提取?user表中?年齡最大的三個用戶數據?怎么查詢?

    select?*?from?users?order?by?age?desc?limit?3;

    cs
zxbackspace的博客:Visual Studio Code 編輯后同步至 GitHub zxbackspace的博客:Python實現定時在微信群發送消息 zxbackspace的博客:Linux-UOS系統使用命令安裝Java hallobike的博客:從單幅圖像學習生成模型,可應用于多種圖像處 hallobike的博客:win10+tomcat 8的安裝和環境配置 hallobike的博客:Win10系統 Visual Studio 2015+openCV3.4.1安 hallobike的博客:win10系統下調通SeetaFace1.0人臉識別引擎 hallobike的博客:win10系統下Qt和VS環境配置問題 hallobike的博客:SeetaFace6人臉識別算法 hallobike的博客:人臉識別的介紹 hallobike的博客:win10系統下基于SeetaFace2.0的人臉識別系統的 hallobike的博客:神經網絡和深度學習的介紹 hallobike的博客:第三屆全國高校綠色計算系列大賽-任務挑戰組預 hallobike的博客:Python中PyTorch環境配置 hallobike的博客:數據結構課設(C++版) hallobike的博客:Win10下Tesseract-OCR安裝 hallobike的博客:使用OpenCV進行圖像全景拼接 hallobike的博客:讀COMPUTING MACHINERY AND INTELLIGENCE有感 hallobike的博客:利用OpenCV實現圖像修復 hallobike的博客:基于自適應顯著性的圖像分割 hallobike的博客:TensorFlow2.0簡介和線性回歸 hallobike的博客:邏輯回歸與交叉熵 hallobike的博客:梯度下降和多層感知器 hallobike的博客:多分類情況使用softmax函數激活 hallobike的博客:優化函數、學習速率、反向傳播 hallobike的博客:Dropout與過擬合抑制、函數式API hallobike的博客:使用遺傳算法計算函數最大值(C++代碼) hallobike的博客:python中使用matplotlib.pyplot畫函數圖像 hallobike的博客:網絡優化、超參數選擇、過擬合處理 hallobike的博客:使用tf.data數據轉換來訓練MNIST數據集 hallobike的博客:卷積深網絡CNN簡介 hallobike的博客:TensorFlow2.0的Eager模式 hallobike的博客:TensorFlow2.0批標準化 hallobike的博客:深度學習中常見的圖像處理任務 hallobike的博客:TensorFlow2.0中圖運算模式和GPU調用規則 hallobike的博客:圖像語義分割 hallobike的博客:語義分割網絡――FCN hallobike的博客:中藥槲皮素-AKT1與木犀草素IL6/VEGFA直接結合 hallobike的博客:Meat quality evaluation based on computer v hallobike的博客:京東開源FaceX-Zoo,一站式人臉識別研究平臺 hallobike的博客:目標檢測與分類API(TensorFlow官方) hallobike的博客:深度學習圖像處理相關文獻 hallobike的博客:圖像分類中的深度學習網絡匯總 hallobike的博客:一文看懂網絡中間層特征矩陣和卷積層參數 hallobike的博客:python移動文件到新的文件夾并重命名 hallobike的博客:解決OpenCV讀取視頻結束后報錯的問題 貓耳山在天邊:《Linux命令行與shell腳本編程大全》(第三版)讀 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 lyndon:CPU 上下文切換 lyndon:printf()、printk()、消息級別、日志級別 .net平臺的rabbitmq使用封裝demo詳解 C++類的特種函數生成機制詳解 Python調用百度AI實現圖片上表格識別功能 node自定義安裝更改npm全局模塊默認安裝路徑的步驟 帶你用C語言實現strtok和字符串分割函數 靜態網頁和靜態網頁性能比較 網頁標題優化原則和描述優化原則 php 怎么設置cookie記住密碼 php設置時區無效怎么辦 php __autoload 失效怎么辦 有關PHP調試的小技巧,看看吧! 從0開始:教你微信小店怎么開! 成本5元竟然賣50元 微信朋友圈賣面膜真黑啊 HashMap原理及put方法與get方法的調用過程 基于IDEA 的遠程調試 Weblogic的操作過程 UTC時間、GMT時間、本地時間、Unix時間戳的具體使用 如何利用SwiftUI實現可縮放的圖片預覽器 網站怎么利用內容更新雙重境界快速提高網站權重? php顯示繁體亂碼怎么辦 php不能開啟php_curl怎么辦
A级免费视频