資料庫 -- 單表的數據查詢

来源:https://www.cnblogs.com/wenxin1120/archive/2019/06/23/11074003.html
-Advertisement-
Play Games

單表查詢的語法及關鍵字執行的優先順序 單表查詢語法 關鍵字執行的優先順序 1. 找到表: from 2. 拿著where指定的約束條件,去文件 / 表中取出一條條記錄 3. 將取出的一條條記錄進行分組group by , 如果沒有group by ,則整體作為一組 4. 執行select (distin ...


單表查詢的語法及關鍵字執行的優先順序

單表查詢語法

select distinct 欄位一,欄位二,... from 表名
                                where 條件
                                group by field
                                having 篩選
                                order by field
                                limit 限制條數

 關鍵字執行的優先順序

  1. 找到表: from

  2. 拿著where指定的約束條件,去文件 / 表中取出一條條記錄

  3. 將取出的一條條記錄進行分組group by , 如果沒有group by ,則整體作為一組

  4. 執行select  (distinct --> 去重)

  5.  將分組的結果進行having過濾

  6. 將結果按條件排序: order by

  7. 限制結果的顯示條數

 

 建表和數據的準備:

#創建表
create table employee(
id int not null unique auto_increment,
emp_name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一個部門一個屋子
depart_id int
);


#插入記錄
#三個部門:教學,銷售,運營
insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','聯合國外交大使',7300.33,401,1), #以下是教學部
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龍','male',48,'20101111','teacher',10000,401,1),

('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),

('張野','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬銀','female',18,'20130311','operation',19000,403,3),
('程咬銅','male',18,'20150411','operation',18000,403,3),
('程咬鐵','female',18,'20140512','operation',17000,403,3)
;

 

一 . 查詢的語法:

1. select 語句:

  • 基礎命令:
    • select * from 表名;    查看表中的所有數據
    • select 欄位名,欄位名,... from 表名;    查看表中的某幾列數據
    • insert into 已建好的表名(欄位,...) select 欄位,... from 另一張表名;    從另一張表中導入需要的數據
  • 重命名欄位
    • select 欄位名 as 新名字 from 表名;
    • select 欄位名 新名字 from 表名;     
    • 因此加不加 as 的效果一樣
  • 去重:
    • select distinct 欄位 from 表名;
    • 當查詢的欄位中存在相同的數據時,只會查詢到不重覆的數據
  • 定義顯示格式:
    • 使用函數
      • concat()  用於連接字元串
        • select concat('要拼接的字元串',欄位名,'要拼接的字元串',欄位名) from 表名;    
      • concat ws()  第一個參數為分隔符
        • select concat ws('類似於 | : - 的分隔符',欄位名,欄位名) from 表名;    將兩個或多個欄位通過分隔符連接起來
    • 結合case語句    (判斷邏輯,相當於if條件判斷句)
      •  
        select (
        case
        when 欄位名1 = 'aaa' then
            欄位名                                    # 如果欄位名1的內容為aaa時,就返回欄位名原來的數據
        when 欄位名1 = 'bbb' then
            concat(欄位名1,'wahaha')         # 如果欄位名1的內容為bbb時,就將欄位名和wahaha拼接起來返回
        else
            concat(欄位名1,'shuangwaiwai')  # 如果欄位名1的內容不為上面兩個時,就將欄位名和shuangwaiwai拼接起來返回
        end
        )   as new_name    # 給這欄位起一個新名字
        from 表名 

 2. 通過四則運算查詢

  • 從一張員工月薪表中查詢員工的年薪
    • select name,salary*12 from 表名;    乘法運算

3. where 篩選出所有符合條件的行

  • 比較運算符:  < , > , <= , >= , <> , !=   (後兩個為不等於)
  • 關鍵字is : 判斷某個欄位是否為null,不能用等號,要用is
    • where 欄位名 is null;    篩選欄位為null的數據
    • where 欄位名 is not null;    篩選欄位名不為null的數據
  • 關鍵字between 值 and 值
    • where 欄位名 between 90 and 100;    篩選欄位值在90到100的數據
    • 不支持這種寫法: 90 < 欄位名> 100
  • 關鍵字in查詢
    • where 欄位名 in(80,90,100);    篩選欄位值為80或90或100的數據
  • 關鍵字like查詢
    • % : 通配符,表示可以匹配任意長度的任意內容
      • select * from 表名 where 欄位名 like 'xx%';    查詢欄位名是以xx開頭的數據
      • select * from 表名 where 欄位名 like '%xx';    查詢欄位名是以xx結尾的數據
    • _ : 通配符,表示可以匹配一個字元長度的任意內容
      • select * from 表名 where 欄位名 like '林__';    查詢出欄位名是以 '林'開頭,並且字元長度是3的數據

4. 邏輯運算 (與 或 非)

  • 在多個條件下可以直接使用邏輯運算符: 優先順序:  not > and > or

 

二 . 分組聚合

1. 分組:  group by 欄位名;    根據某個欄位分組

  - 根據誰分組,可以求出這個組的總人數,最大值,最小值,平均值,求和,但是這個求出來的值只是和分組欄位對應,並不和其他任何欄位對應,這個時候查出來的所有其他欄位都不生效

單獨使用GROUP BY關鍵字分組
    SELECT post FROM employee GROUP BY post;
    註意:我們按照post欄位分組,那麼select查詢的欄位只能是post,想要獲取組內的其他相關信息,需要藉助函數

GROUP BY關鍵字和GROUP_CONCAT()函數一起使用
    SELECT post,GROUP_CONCAT(emp_name) FROM employee GROUP BY post;#按照崗位分組,並查看組內成員名
    SELECT post,GROUP_CONCAT(emp_name) as emp_members FROM employee GROUP BY post;

GROUP BY與聚合函數一起使用
    select post,count(id) as count from employee group by post;#按照崗位分組,並查看每個組有多少人

 

2. 聚合函數

  • 強調: 聚合函數聚合的是組的內容,若是沒有組,則預設表為一組
  • count(欄位名)  求個數
    • select count(*) from 表名;    查詢表中有多少行數據
  • max  求最大值
    • select 欄位名,max(age) from 表名 group by 欄位名; 根據欄位名分組,然後查詢每個分組中年齡最大的一個
  • min  求最小值
    • select min(age) from 表名;    查詢表中年齡最小的一個
  • sum  求和
    • select sum(age) from 表名;    對錶中age這一列的數據求和
  • avg  求平均值
    • select avg(age) from 表名;    查詢表中年齡的平均值

 

三. having 過濾語句

  • 執行優先順序: where > group by > having
  • where發生在group by之前,ywhere中可以有任意欄位,所以不能用分組聚合函數
  • 適合去篩選符合條件的某一組數據,而不是某一行數據
  • having發生在分組group by之後,因而having中可以使用分組的欄位,無法直接獲取到其他欄位,可以通過聚合函數來獲取
    mysql> select post,group_concat(emp_name) from emp group by post having salary > 10000;
    ERROR 1054 (42S22): Unknown column 'salary' in 'having clause' #錯誤,分組後無法直接取到salary欄位
        
    # 通過分組聚合獲取值:
    查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資
    mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 and avg(salary) <20000;
    +-----------+--------------+
    | post      | avg(salary)  |
    +-----------+--------------+
    | operation | 16800.026000 |

     

四. order by 排列語句

  • 預設是升序(從小到大)  --> asc
  • 降序(從大到小) --> desc
    # 按多列排序:先按照age排序,如果年紀相同,則按照薪資排序
    select * from employee order by age,salary desc;
    
    # 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列
    mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) asc;
    +-----------+---------------+
    | post      | avg(salary)   |
    +-----------+---------------+
    | operation |  16800.026000 |
    | teacher   | 151842.901429 |
    +-----------+---------------+
    2 rows in set (0.00 sec)

     

五. limit 限制查詢的記錄條數

  • limit m,n : 從 m+1 項開始,取n項,如果不寫m,m預設為0
  • 另一種寫法: limit n offset m
    # 從第0開始,即先查詢出第0+1條,然後包含這一條在內往後查3條
    select * from employee order by salary desc limit 3;
    
    # 從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條
    select * from employee order by salary desc limit 5,5;

     

 


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

-Advertisement-
Play Games
更多相關文章
  • 到現在,我們已經完成了POS平臺和前端的網路集成。不過,還是那句話:平臺系統的網路安全是至關重要的。前一篇博客里我們嘗試實現了gRPC ssl/tls網路連接,但測試時用的證書如何產生始終沒有搞清楚。現在akka-http開發的ws同樣面臨HTTPS的設置和使用問題。所以,特別抽出這篇博文討論一下數 ...
  • 本文介紹簡單介紹socket的常用函數,並以python-kafka中的源碼socketpair為例,來講解python socket的運用 ...
  • static是java中很常用的一個關鍵字,使用場景也很多,本文主要介紹了它的五種用法,static變數,static方法,static代碼塊,static內部類,static包內導入,在一定環境下使用,可以提高程式的運行性能,優化程式的結構 ...
  • 所屬網站分類: 資源下載 > python視頻教程 作者:外星人入侵 鏈接: http://www.pythonheidong.com/blog/article/435/ 來源:python黑洞網 www.pythonheidong.com python入門教程-1-Python編程語言歷史及特性. ...
  • 高考完後這麼就才想起這系列教程,實在抱歉,現在該來繼續教程了。 本節利用前面所學知識,來完成一個小工具——文本編輯器! ...
  • 1.一維數組的聲明與初始化 正確的方式: 錯誤的方式 2.一維數組元素的引用:通過角標的方式調用。 3.數組的屬性:length 說明: 4.一維數組的遍歷 5.一維數組元素的預設初始化值 6.一維數組的記憶體解析 : ...
  • 我們都知道Java中的繼承是復用代碼、擴展子類的一種方式,繼承使得Java中重覆的代碼能夠被提取出來供子類共用,對於Java程式的性能以及修改和擴展有很大的意義,所以這是一個非常重要的知識點。 那麼對於繼承的知識點,你真的都瞭解了嗎? 首先,我們都知道子類繼承父類,就能直接訪問父類的公共屬性以及受保 ...
  • 一、給定一個整型數組,包括正負值,找出取任意三個值的乘積最大 1、對整型排序(這裡使用堆排序) 2、最大值只能是最小兩個和最大一個或者最大三個值的乘積 3、測試 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...