【JavaWeb后端開發03】MySQL入門

文章目錄

    • 1. 前言
      • 1.1 引言
      • 1.2 相關概念
    • 2. MySQL概述
      • 2.1 安裝
      • 2.2 連接
        • 2.2.1 介紹
        • 2.2.2 企業使用方式(了解)
      • 2.3 數據模型
        • 2.3.1 **關系型數據庫(RDBMS)**
        • 2.3.2 數據模型
    • 3. SQL語句
      • 3.1 DDL語句
        • 3.1.1 數據庫操作
          • 3.1.1.1 查詢數據庫
          • 3.1.1.2 創建數據庫
          • 3.1.1.3 使用數據庫
          • 3.1.1.4 刪除數據庫
        • 3.1.2 圖形化工具
          • 3.1.2.1 介紹
          • 3.1.2.2 安裝
          • 3.1.2.3 連接數據庫
        • 3.1.3 表操作
          • 3.1.3.1 創建
          • 3.1.3.2 約束
          • 3.1.3.3 數據類型
          • 3.1.3.4 表結構設計-案例
          • 3.1.3.5 表操作-其他操作
      • 3.2 DML語句
        • 3.2.1 增加(insert)
          • 3.2.1.1 **語法**
          • 3.2.1.2 案例演示
        • 3.2.2 修改(update)
          • 3.2.2.1 語法
          • 3.2.2.2 案例演示
        • 3.2.3 刪除(delete)
          • 3.2.3.1 語法
          • 3.2.3.2 案例演示
      • 3.3 DQL語句
        • 3.3.1 介紹
        • 3.3.2 語法
        • 3.3.3 基本查詢
        • 3.3.4 條件查詢
        • 3.3.5 聚合函數
        • 3.3.6 分組查詢
        • 3.3.7 排查查詢
        • 3.3.8 分頁查詢

1. 前言

1.1 引言

在我們講解SpringBootWeb基礎知識(IOC、DI等)的時候,我們講到在web開發中,為了應用程序職責單一,方便維護,我們一般將web應用程序分為三層,即:Controller、Service、Dao 。

之前我們的案例中,是這樣子的請求流程:瀏覽器發起請求,先請求Controller;Controller接收到請求之后,調用Service進行業務邏輯處理;Service再調用Dao,Dao再解析user.txt中所存儲的數據。

txt文件中可以存儲數據,但是在企業項目開發中一般不會使用文本文件存儲項目數據,因為不便管理維護,操作難度大。

在真實的企業開發中呢,都會采用數據庫來存儲和管理數據,那此時,web開發調用流程圖如下所示:

那么今天我們就要來學習數據庫技術。

1.2 相關概念

首先來了解一下什么是數據庫。

  • 數據庫:英文為 DataBase,簡稱DB,它是存儲和管理數據的倉庫。

像我們日常訪問的電商網站京東,企業內部的管理系統OA、ERP、CRM這類的系統,以及大家每天都會刷的頭條、抖音類的app,那這些大家所看到的數據,其實都是存儲在數據庫中的。最終這些數據,只是在瀏覽器或app中展示出來而已,最終數據的存儲和管理都是數據庫負責的。

數據是存儲在數據庫中的,那我們要如何來操作數據庫以及數據庫中所存放的數據呢?

那這里呢,會涉及到一個軟件,那就是數據庫管理系統。

  • 數據庫管理系統(DataBase Management System,簡稱DBMS),是操作和管理數據庫的大型軟件。

將來我們只需要操作這個軟件,就可以通過這個軟件來操縱和管理數據庫了。

此時又出現一個問題:DBMS這個軟件怎么知道要操作的是哪個數據庫、哪個數據呢?是對數據做修改還是查詢呢?

需要給DBMS軟件發送一條指令,告訴這個軟件我們要執行的是什么樣的操作,要對哪個數據進行操作。而這個指令就是SQL語句。

  • SQL(Structured Query Language,簡稱SQL):結構化查詢語言,它是操作關系型數據庫的編程語言,定義了一套操作關系型數據庫的統一標準。

我們學習數據庫開發,最為重要的就是學習SQL語句 。

關系型數據庫:我們后面會詳細講解,現在大家只需要知道我們學習的數據庫屬于關系型數據庫即可。

結論:程序員給數據庫管理系統(DBMS)發送SQL語句,再由數據庫管理系統操作數據庫當中的數據。

了解了數據庫的一些簡單概念之后,接下來我們再來介紹下目前主流的數據庫,這里截取了排名前十的數據庫:

  • Oracle:大型的收費數據庫,Oracle公司產品,價格昂貴。(通常是不差錢的公司會選擇使用這個數據庫)

  • MySQL:開源免費的中小型數據庫,后來Sun公司收購了MySQL,而Oracle又收購了Sun公司。目前Oracle推出兩個版本的Mysql:社區版(開源免費)、商業版(收費)。

  • SQL Server:Microsoft 公司推出的收費的中型數據庫,C#、.net等語言常用。

  • PostgreSQL:開源免費的中小型數據庫。

  • DB2:IBM公司的大型收費數據庫產品。

  • SQLLite:嵌入式的微型數據庫。Android內置的數據庫采用的就是該數據庫。

  • MariaDB:開源免費的中小型數據庫。是MySQL數據庫的另外一個分支、另外一個衍生產品,與MySQL數據庫有很好的兼容性。

那這么多數據庫,我們全部都需要學習嗎,其實并不用,我們只需要學習其中的一個就可以了,我們此次課程中學習的數據庫是現在互聯網公司開發使用最為流行的MySQL數據庫。

此時大家可能會有一個疑問,我們現在學習的是Mysql數據庫,我們以后去公司做開發,如果用到的是Oracle數據庫或SQL Server數據庫該怎么辦?其實大家完全不用擔心這個問題,因為這些數據庫都是屬于關系型數據庫,要操作關系型數據庫都是通過 SQL語句來實現的,而SQL語句又是操作關系型數據庫的統一標準。

結論:只要我們學會了SQL語句,就可以通過SQL語句來操作Mysql,也可以通過SQL語句來操作Oracle或SQL Server

課程內容安排:

  1. MySQL概述

  2. SQL語句(DDL、DML、DQL)

  3. 多表設計

  4. 多表查詢

  5. 事務

  6. 索引


2. MySQL概述

官網:https://dev.mysql.com/

MySQL官方提供了兩個版本:

  • 商業版本(MySQL Enterprise Edition)

    • 該版本是收費的,我們可以使用30天。 官方會提供對應的技術支持。
  • 社區版本(MySQL Community Server)

    • 該版本是免費的,但是MySQL不會提供任何的技術支持。

本課采用的是MySQL的社區版本(8.0.34)

2.1 安裝

官網下載地址:https://downloads.mysql.com/archives/community/

2.2 連接

2.2.1 介紹

MySQL服務器啟動完畢后,然后再使用如下指令,來連接MySQL服務器:

  • -h 參數不加,默認連接的是本地 127.0.0.1 的MySQL服務器

  • -P 參數不加,默認連接的端口號是 3306

上述指令,可以有兩種形式:

  • 密碼直接在-p參數之后直接指定 (這種方式不安全,密碼直接以明文形式出現在命令行)

  • 密碼在-p回車之后,在命令行中輸入密碼,然后回車

2.2.2 企業使用方式(了解)

上述的MySQL服務器我們是安裝在本地的,這個僅僅是在我們學習階段,在真實的企業開發中,MySQL數據庫服務器是不會在我們本地安裝的,是在公司的服務器上安裝的,而服務器還需要放置在專門的IDC機房中的,IDC機房呢,就需要保證恒溫、恒濕、恒壓,而且還要保證網絡、電源的可靠性(備用電源及網絡)。

那我們要想使用服務器上的這臺MySQL服務器,就需要在我們的電腦上去遠程連接這臺MySQL 。 而服務器上安裝的MySQL數據庫呢,并不是你一個人在訪問,我們項目組的其他開發人員也是需要訪問這臺MySQL的。

接下來,就來演示一下,通過MySQL的客戶端命令行,如何來連接服務器上部署的MySQL :

mysql -u用戶名 -p密碼 -h要連接的mysql服務器的ip地址(默認127.0.0.1) -P端口號(默認3306)

image-20250420152717259

2.3 數據模型

介紹完了Mysql數據庫的安裝配置之后,接下來我們再來聊一聊Mysql當中的數據模型。學完了這一小節之后,我們就能夠知道在Mysql數據庫當中到底是如何來存儲和管理數據的。

在介紹 Mysql的數據模型之前,需要先了解一個概念:關系型數據庫。

2.3.1 關系型數據庫(RDBMS)

概念:建立在關系模型基礎上,由多張相互連接的二維表組成的數據庫。而所謂二維表,指的是由行和列組成的表,如下圖:

二維表的優點:

  • 使用表存儲數據,格式統一,便于維護

  • 使用SQL語言操作,標準統一,使用方便,可用于復雜查詢

我們之前提到的MySQL、Oracle、DB2、SQLServer這些都是屬于關系型數據庫,里面都是基于二維表存儲數據的。

結論:基于二維表存儲數據的數據庫就成為關系型數據庫,不是基于二維表存儲數據的數據庫,就是非關系型數據庫(比如大家后面要學習的Redis,就屬于非關系型數據庫)。

2.3.2 數據模型

介紹完了關系型數據庫之后,接下來我們再來看一看在Mysql數據庫當中到底是如何來存儲數據的,也就是Mysql 的數據模型。

MySQL是關系型數據庫,是基于二維表進行數據存儲的,具體的結構圖下:

  • 通過MySQL客戶端連接數據庫管理系統DBMS,然后通過DBMS操作數據庫。

  • 使用MySQL客戶端,向數據庫管理系統發送一條SQL語句,由數據庫管理系統根據SQL語句指令去操作數據庫中的表結構及數據。

  • 一個數據庫服務器中可以創建多個數據庫,一個數據庫中也可以包含多張表,而一張表中又可以包含多行記錄。

在Mysql數據庫服務器當中存儲數據,你需要:

  1. 先去創建數據庫(可以創建多個數據庫,之間是相互獨立的)

  2. 在數據庫下再去創建數據表(一個數據庫下可以創建多張表)

  3. 再將數據存放在數據表中(一張表可以存儲多行數據)


3. SQL語句

SQL:結構化查詢語言。一門操作關系型數據庫的編程語言,定義操作所有關系型數據庫的統一標準。SQL語句根據其功能被分為四大類:DDL、DML、DQL、DCL 。

分類

分類全稱說明
DDLData Definition Language數據定義語言,用來定義數據庫對象(數據庫、表、字段)
DMLData Manipulation Language數據操作語言,用來對數據庫表中的數據進行增、刪、改
DQLData Query Language數據查詢語言,用來查詢數據庫中表的記錄
DCLData Control Language數據控制語言,用來創建數據庫用戶、控制數據庫的訪問權限

3.1 DDL語句

3.1.1 數據庫操作

我們在進行數據庫設計,需要使用到剛才所介紹SQL分類中的DDL語句。

DDL英文全稱是Data Definition Language(數據定義語言),用來定義數據庫對象(數據庫、表、表中字段)。

DDL中數據庫的常見操作:查詢、創建、使用、刪除。

3.1.1.1 查詢數據庫
  • 查詢所有數據庫

命令行中執行效果如下:

image-20250420160000157
  • 查詢當前數據庫

命令行中執行效果如果:

我們要操作某一個數據庫,必須要切換到對應的數據庫中。

通過指令:select database() ,就可以查詢到當前所處的數據庫


3.1.1.2 創建數據庫
  • 語法:

創建數據庫時,可以不指定字符集。 因為在MySQL8版本之后,默認的字符集就是 utf8mb4。

  • 案例: 創建一個itcast數據庫。

命令行執行效果如下:

注意:在同一個數據庫服務器中,不能創建兩個名稱相同的數據庫,否則將會報錯。

可以使用if not exists來避免這個問題

命令行執行效果如下:


3.1.1.3 使用數據庫
  • 語法:

我們要操作某一個數據庫下的表時,就需要通過該指令,切換到對應的數據庫下,否則不能操作。

  • 案例:切換到itcast數據

命令執行效果如下:


3.1.1.4 刪除數據庫
  • 語法:

    • 如果刪除一個不存在的數據庫,將會報錯。

    • 可以加上參數 if exists ,如果數據庫存在,再執行刪除,否則不執行刪除。

  • 案例:刪除itcast數據庫

命令執行效果如下:

說明:上述語法中的database,也可以替換成 schema

  • 如:create schema db01;

  • 如:show schemas;

image-20250420160738405


3.1.2 圖形化工具
3.1.2.1 介紹

前面我們講解了DDL中關于數據庫操作的SQL語句,在我們編寫這些SQL時,都是在命令行當中完成的。大家在練習的時候應該也感受到了,在命令行當中來敲這些SQL語句很不方便,主要的原因有以下 3 點:

  1. 沒有任何代碼提示。(全靠記憶,容易敲錯字母造成執行報錯)

  2. 操作繁瑣,影響開發效率。(所有的功能操作都是通過SQL語句來完成的)

  3. 編寫過的SQL代碼無法保存。

在項目開發當中,通常為了提高開發效率,都會借助于現成的圖形化管理工具來操作數據庫。

目前MySQL主流的圖形化界面工具有以下幾種:

DataGrip是JetBrains旗下的一款數據庫管理工具,是管理和開發MySQL、Oracle、PostgreSQL的理想解決方案。

官網: https://www.jetbrains.com/zh-cn/datagrip/


3.1.2.2 安裝

安裝: 參考資料中提供的《DataGrip安裝手冊》

說明:DataGrip這款工具可以不用安裝,因為Jetbrains公司已經將DataGrip這款工具的功能已經集成到了 IDEA當中,所以我們就可以使用IDEA來作為一款圖形化界面工具來操作Mysql數據庫。

3.1.2.3 連接數據庫

1). 創建Project

2). 創建連接

下載驅動, 可能會比較耗時, 耐心等待一會兒。

3). 測試連接

下載完驅動之后,可以點擊 Test Connection 來測試一下是否可以正常的連接數據庫。

然后點擊 OK , 就已經連接上了MySQL數據庫了。

默認情況下,連接上了MySQL數據庫之后, 數據庫并沒有全部展示出來。 需要選擇要展示哪些數據庫。具體操作如下:


3.1.3 表操作

學習完了DDL語句當中關于數據庫的操作之后,接下來我們繼續學習DDL語句當中關于表結構的操作。

關于表結構的操作也是包含四個部分:創建表、查詢表、修改表、刪除表。

3.1.3.1 創建
  • 語法:

    image-20250420165604122

    • 注意: [ ] 中的內容為可選參數; 最后一個字段后面沒有逗號
  • 案例:創建tb_user表

    • 對應的結構如下:

    • 建表語句:

      create table user(id int comment 'ID,唯一標識',username varchar(50) comment '用戶名',name varchar(10) comment '姓名',age int comment '年齡',gender char(1) comment '性別'
      ) comment '用戶信息表';
      
    • 數據表創建完成,接下來我們還需要測試一下是否可以往這張表結構當中來存儲數據。

    雙擊打開tb_user表結構,大家會發現里面沒有數據:

添加數據:

image-20250420170606079

我們之前提到過:id字段是一行數據的唯一標識,不能有重復值。但是現在數據表中有兩個相同的id值,這是為什么呢?

  • 其實我們現在創建表結構的時候, id這個字段我們只加了一個備注信息說明它是一個唯一標識,但是在數據庫層面呢,并沒有去限制字段存儲的數據。所以id這個字段沒有起到唯一標識的作用。

想要限制字段所存儲的數據,就需要用到數據庫中的約束。


3.1.3.2 約束
  • 概念:所謂約束就是作用在表中字段上的規則,用于限制存儲在表中的數據。

  • 作用:就是來保證數據庫當中數據的正確性、有效性和完整性。(后面的學習會驗證這些)

  • 在MySQL數據庫當中,提供了以下5種約束:

image-20250420170928064

注意:約束是作用于表中字段上的,可以在創建表/修改表的時候添加約束。

  • 案例:創建tb_user表,對應的結構如下:

在上述的表結構中:現在我們加上一些限制

image-20250420170814121

建表語句:

-- 創建表(+約束)
create table user(id int primary key comment 'ID,唯一標識', -- 主鍵約束username varchar(50) not null unique comment '用戶名', -- 非空且唯一name varchar(10) not null comment '姓名', -- 非空age int comment '年齡',gender char(1) default '男' comment '性別' -- 默認
) comment '用戶信息表';

數據表創建完成,接下來測試一下表中字段上的約束是否生效

大家有沒有發現一個問題:id字段下存儲的值,如果由我們自己來維護會比較麻煩(必須保證值的唯一性)。MySQL數據庫為了解決這個問題,給我們提供了一個關鍵字:auto_increment(自動增長)

主鍵自增:auto_increment

  • 每次插入新的行記錄時,數據庫自動生成id字段(主鍵)下的值

  • 具有auto_increment的數據列是一個正數序列開始增長(從1開始自增)

測試主鍵自增:

-- 創建表(+約束)
create table user(id int primary key auto_increment comment 'ID,唯一標識', -- 主鍵約束且自動增長username varchar(50) not null unique comment '用戶名', -- 非空且唯一name varchar(10) not null comment '姓名', -- 非空age int comment '年齡',gender char(1) default '男' comment '性別' -- 默認
) comment '用戶信息表';

image-20250420172439744


3.1.3.3 數據類型

在上面建表語句中,我們在指定字段的數據類型時,用到了int 、varchar、char,那么在MySQL中除了以上的數據類型,還有哪些常見的數據類型呢? 接下來,我們就來詳細介紹一下MySQL的數據類型。

MySQL中的數據類型有很多,主要分為三類:數值類型、字符串類型、日期時間類型。

1). 數值類型

image-20250420172840751

2). 字符串類型

char 與 varchar 都可以描述字符串,char是定長字符串,指定長度多長,就占用多少個字符,和字段值的長度無關 。而varchar是變長字符串,指定的長度為最大占用長度 。相對來說,char的性能會更高些。

image-20250420172942354

3). 日期時間類型

image-20250420173011303

image-20250420173947607


3.1.3.4 表結構設計-案例

需求:根據產品原型/需求創建表((設計合理的數據類型、長度、約束)

產品原型及需求如下:

1). 列表展示

2). 新增員工

3). 需求說明及字段限制

-- 案例 :員工表單emp
-- 設計表基礎字段:id 主鍵; create_time 創建時間; update_time 修改時間;
create table emp(id int unsigned primary key auto_increment comment 'ID,主鍵',username varchar(20) not null unique comment '用戶名',password varchar(32) default '123456' comment '密碼',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性別,1 男;2 女', -- 在企業中性別一般用編號存儲phone char(11) not null unique comment '手機號' ,job tinyint unsigned comment '職位, 1 班主任; 2 講師; 3 學工主管; 4 教研主管; 5 咨詢師', -- 這里的職位也用編號存儲salary int unsigned comment '薪資',entry_date date comment '入職日期',image varchar(255) comment '圖像',-- 存儲圖片的訪問路徑create_time datetime comment '創建時間',update_time datetime comment '修改時間'
) comment '員工表';

步驟:

  1. 閱讀產品原型及需求文檔,看看里面涉及到哪些字段。不僅要考慮頁面展示字段,也要考慮錄入員工需要哪些信息

  2. 查看需求文檔說明,確認各個字段的類型以及字段存儲數據的長度限制。

  1. 在頁面原型中描述的基礎字段的基礎上,再增加額外的基礎字段。

使用SQL創建表:

除了使用SQL語句創建表外,我們還可以借助于圖形化界面來創建表結構,這種創建方式會更加直觀、更加方便。

設計表流程:

  1. 閱讀頁面原型及需求文檔

  2. 基于頁面原則和需求文檔,確定原型字段(類型、長度限制、約束)

  1. 再增加表設計所需要的業務基礎字段(id(主鍵,唯一標識一條數據)、create_time、update_time)

    • create_time:記錄的是當前這條數據插入的時間。

    • update_time:記錄當前這條數據最后更新的時間。

3.1.3.5 表操作-其他操作

上面講解了表結構的創建、數據類型、設計表的流程,接下來,再來講解表結構的查詢、修改、刪除操作 。

查詢、修改、刪除數據庫表的具體的語法:image-20250420230809800

--  查詢當前數據庫所有表
show tables;-- 查看表結構
desc emp;-- 查詢建表語句
show create  table emp;-- 字段:添加字段qq varchar(13)
alter table emp add qq varchar(13) comment 'QQ'; -- 默認加在最后-- 字段:修改字段類型qq varchar(15)
alter table emp modify qq varchar(15) comment 'QQ'; -- 不加注釋默認刪除注釋-- 字段:修改字段名 qq ->  qq_num varchar(15)
alter table emp change qq qq_num varchar(15) comment 'QQ';-- 字段:刪除字段 qq_num4
alter table emp drop column qq_num;-- 修改表名
alter table emp rename to employee;-- 刪除表
drop table employee;

查詢表結構

image-20250420231346243

查詢建表語句

image-20250420231534660

關于表結構的查看、修改、刪除操作,工作中一般都是直接基于圖形化界面操作。在刪除表時,表中的數據也會被全部刪除


3.2 DML語句

DML英文全稱是Data Manipulation Language(數據操作語言),用來對數據庫中表的數據記錄進行增、刪、改操作。

  • 添加數據(INSERT)

  • 修改數據(UPDATE)

  • 刪除數據(DELETE),即刪除某一條數據

3.2.1 增加(insert)
3.2.1.1 語法
image-20250420232801402
3.2.1.2 案例演示
-- DML : 數據操作語言
-- DML : 插入數據 - insert
-- 1. 為 emp 表的 username, password, name, gender, phone 字段插入值
insert into emp (username, password, name, gender, phone) values('xuner','12345678','尋而',1,'15545679999');-- 2. 為 emp 表的 所有字段插入值
-- 方式一
insert into emp (id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time)values (null,'xiaomi','12345678','小米',1,'15578971114',1,6000,'2020-01-01','1.jpg',now(),now());-- null自動增長
-- 函數now,可以獲取當前系統時間
-- 方式二 : 簡化方式一
insert into emp values(null,'xiaomi2','12345678','小米2',1,'15578971116',1,6000,'2020-01-01','1.jpg',now(),now());-- 3. 批量為 emp 表的 username, password, name, gender, phone  字段插入數據
insert into emp (username, password, name, gender, phone) values('xuner2','12345678','尋2',1,'15545619999'),('xuner1','12345678','尋而1',1,'15545669999');

insert操作的注意事項:

  1. 插入數據時,指定的字段順序需要與值的順序是一一對應的。
  2. 字符串和日期型數據應該包含在引號中,會報警告但可執行。
  3. 插入的數據大小,應該在字段的規定范圍內。

3.2.2 修改(update)
3.2.2.1 語法

image-20250421144443655

3.2.2.2 案例演示
-- DML : 更新數據 - update
-- 1. 將 emp 表的ID為1員工 用戶名更新為 'zhangsan', 姓名name字段更新為 '張三'
update emp set username = 'zhangsan',name = '張三' where id = 1;-- 2. 將 emp 表的所有員工的入職日期更新為 '2010-01-01'
update emp set entry_date = '2010-01-01';

注意事項:

  1. 修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有數據。

  2. 在修改數據時,一般需要同時修改公共字段update_time,將其修改為當前操作時間。


3.2.3 刪除(delete)
3.2.3.1 語法
image-20250421145353462
3.2.3.2 案例演示
-- DML : 刪除數據 - delete
-- 1. 刪除 emp 表中 ID為1的員工
delete from emp where id = 1;-- 2. 刪除 emp 表中的所有員工
delete from emp;

注意事項:

  • DELETE 語句的條件可以有,也可以沒有,如果沒有條件,則會刪除整張表的所有數據。

  • DELETE 語句不能刪除某一個字段的值(可以使用UPDATE,將該字段值置為NULL即可)。

  • 當進行刪除全部數據操作時,會提示詢問是否確認刪除所有數據,直接點擊Execute即可。


3.3 DQL語句

3.3.1 介紹

DQL英文全稱是Data Query Language(數據查詢語言),用來查詢數據庫表中的記錄。

查詢關鍵字:SELECT

查詢操作是所有SQL語句當中最為常見,也是最為重要的操作。在一個正常的業務系統中,查詢操作的使用頻次是要遠高于增刪改操作的。當我們打開某個網站或APP所看到的展示信息,都是通過從數據庫中查詢得到的,而在這個查詢過程中,還會涉及到條件、排序、分頁等操作。

3.3.2 語法

DQL查詢語句,語法結構如下:

image-20250421150020180

我們今天會將上面的完整語法拆分為以下幾個部分學習:

  • 基本查詢(不帶任何條件)

  • 條件查詢(where)

  • 分組查詢(group by)

  • 排序查詢(order by)

  • 分頁查詢(limit)

準備一些測試數據用于查詢操作:

3.3.3 基本查詢

在基本查詢的DQL語句中,不帶任何的查詢條件。

語法如下:

  • 查詢多個字段

  • 查詢所有字段(通配符)

  • 設置別名

  • 去除重復記錄

image-20250421150125206

案例演示:

  • 案例1:查詢指定字段 name,entry_date并返回

  • 案例2:查詢返回所有字段

* 號代表查詢所有字段,在實際開發中盡量少用(不直觀、影響效率)

  • 案例3:查詢所有員工的 name, entry_date,并起別名(姓名、入職日期)

  • 案例4:查詢已有的員工關聯了哪幾種職位(不要重復)

--  =================== DQL: 基本查詢 ======================
-- 1. 查詢指定字段 name,entry_date 并返回
select name,entry_date from emp;-- 2. 查詢返回所有字段
--  方式一:推薦
select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp
-- 方式二:不推薦
select * from emp;-- 3. 查詢所有員工的 name,entry_date, 并起別名(姓名、入職日期)
select name as 姓名,entry_date as 入職日期 from emp;
-- 別名中間有空格,就必須要加引號
select name  as '姓 名',entry_date as 入職日期 from emp;
-- as也可省略
select name '姓 名',entry_date 入職日期 from emp;-- 4. 查詢已有的員工關聯了哪幾種職位(不要重復)
select distinct job from emp;

image-20250421152523330


3.3.4 條件查詢

語法:

image-20250421152557504

學習條件查詢就是學習條件的構建方式,而在SQL語句當中構造條件的運算符分為兩類:

  • 比較運算符

  • 邏輯運算符

image-20250421152730061

  • 案例1:查詢 姓名 為 ‘楊逍’ 的員工

  • 案例2:查詢 薪資小于等于 5000 的員工信息

  • 案例3:查詢 沒有分配職位 的員工信息

注意:查詢為NULL的數據時,不能使用 = null!=null 。得使用 is nullis not null

  • 案例4:查詢 有職位 的員工信息

  • 案例5:查詢 密碼不等于 ‘123456’ 的員工信息

  • 案例6:查詢 入職日期 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之間的員工信息

  • 案例7:查詢 入職時間 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之間 且 性別為女 的員工信息

  • 案例8:查詢 職位是 2 (講師), 3 (學工主管), 4 (教研主管) 的員工信息

  • 案例9:查詢 姓名 為兩個字的員工信息

  • 案例10:查詢 姓 ‘張’ 的員工信息

  • 案例11:查詢 姓名中包含 ‘二’ 的員工信息

--  =================== DQL: 條件查詢 ======================
-- 1. 查詢 姓名 為 柴進 的員工
select * from emp where name = '柴進';-- 2. 查詢 薪資小于等于5000 的員工信息
select * from emp where salary<=5000;-- 3. 查詢 沒有分配職位 的員工信息
select * from emp where job is null;-- 4. 查詢 有職位 的員工信息
select * from emp where job is not null;-- 5. 查詢 密碼不等于 '123456' 的員工信息
select * from emp where password != '123456';
select * from emp where password <> '123456';-- 6. 查詢 入職日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之間的員工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01'; -- between必須由小到大-- 7. 查詢 入職時間 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之間 且 性別為女 的員工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01' && gender = 2;select * from emp where (entry_date between '2000-01-01' and '2010-01-01') and gender = 2;-- 8. 查詢 職位是 2 (講師), 3 (學工主管), 4 (教研主管) 的員工信息
select * from emp where job = 2 or job = 3 or job = 4;
select * from emp where job between 2 and 4;
select * from emp where job in (2,3,4);-- 9. 查詢 姓名 為兩個字的員工信息(_:單個字符;%:任意字符)
select * from emp where name like '__';-- 10. 查詢 姓 '李' 的員工信息
select * from emp where name like '李%';-- 11. 查詢 姓名中包含 '二' 的員工信息
select * from emp where name like '%二%';
3.3.5 聚合函數

之前我們做的查詢都是橫向查詢,就是根據條件一行一行的進行判斷,而使用聚合函數查詢就是縱向查詢,它是對一列的值進行計算,然后返回一個結果值。(將一列數據作為一個整體,進行縱向計算)

常用聚合函數:

注意 : 聚合函數會忽略空值,對NULL值不作為統計。

  • count :按照列去統計有多少行數據。

    • 在根據指定的列統計的時候,如果這一列中有null的行,該行不會被統計在其中。
  • sum :計算指定列的數值和,如果不是數值類型,那么計算結果為0

  • max :計算指定列的最大值

  • min :計算指定列的最小值

  • avg :計算指定列的平均值

image-20250421154201419

案例演示:

  • 案例1:統計該企業員工數量
  • 案例2:統計該企業員工的平均薪資
  • 案例3:統計該企業員工的最低薪資
  • 案例4:統計該企業員工的最高薪資
  • 案例5:統計該企業每月要給員工發放的薪資總額(薪資之和)
-- 聚合函數
-- 注意:所有聚合函數不參與null的統計-- 1. 統計該企業員工數量,優先使用count(*),效率最高,常量性能最低
-- count(字段)
select count(id) from emp;
-- count(*)
select count(*) from emp;
-- count(常量)
select count(0) from emp; -- 任意常量,會去掃描行,把每一行標記成常量,最后統計常量的個數-- 2. 統計該企業員工的平均薪資
select avg(salary) from emp;-- 3. 統計該企業員工的最低薪資
select min(salary) from emp;-- 4. 統計該企業員工的最高薪資
select max(salary) from emp;-- 5. 統計該企業每月要給員工發放的薪資總額(薪資之和)
select sum(salary) from emp;
3.3.6 分組查詢
  • 分組: 按照某一列或者某幾列,把相同的數據進行合并輸出。

    • 分組其實就是按列進行分類(指定列下相同的數據歸為一類),然后可以對分類完的數據進行合并計算。

    • 分組查詢通常會使用聚合函數進行計算。

語法:

image-20250421155104269

案例演示:

  • 案例1:根據性別分組 , 統計男性和女性員工的數量

  • 案例2:查詢入職時間在 ‘2015-01-01’ (包含) 以前的員工 , 并對結果根據職位分組 , 獲取員工數量大于等于2的職位

--  =================== DQL: 分組查詢 ======================
-- 分組
-- 注意:分組之后,select后的字段列表不能隨意書寫,能寫的一般是分組字段 + 聚合函數
-- 1. 根據性別分組 , 統計男性和女性員工的數量
select gender,count(*) from emp group by gender ;-- 2. 先查詢入職時間在 '2015-01-01' (包含) 以前的員工 , 并對結果根據職位分組 , 獲取員工數量大于等于2的職位
select job,count(*) from emp where entry_date <= '2015-01-01' group by job having count(*)>=2;

注意事項:

  • 分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義

  • 執行順序:where > 聚合函數 > having;

where與having區別(面試題)

  • 執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾。

  • 判斷條件不同:where不能對聚合函數進行判斷,而having可以。

image-20250421160205986


3.3.7 排查查詢

排序在日常開發中是非常常見的一個操作,有升序排序,也有降序排序。

語法:

image-20250421160309242
  • 排序方式:

    • ASC :升序(默認值)

    • DESC:降序

案例演示:

  • 案例1:根據入職時間, 對員工進行升序排序

注意事項:如果是升序, 可以不指定排序方式ASC

  • 案例2:根據入職時間,對員工進行降序排序

  • 案例3:根據入職時間對公司的員工進行升序排序,入職時間相同,再按照更新時間進行降序排序

注意事項:如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序

--  =================== 排序查詢 ======================
-- 1. 根據入職時間, 對員工進行升序排序
select * from emp order by entry_date asc;-- 2. 根據入職時間, 對員工進行降序排序
select * from emp order by entry_date desc;-- 3. 根據 入職時間 對公司的員工進行 升序排序 , 入職時間相同 , 再按照 更新時間 進行降序排序
select * from emp order by entry_date asc,update_time desc ;

3.3.8 分頁查詢

分頁操作在業務系統開發時,也是非常常見的一個功能,日常我們在網站中看到的各種各樣的分頁條,后臺也都需要借助于數據庫的分頁操作。

分頁查詢語法:

image-20250421160910144

  • 案例1:從起始索引0開始查詢員工數據, 每頁展示5條記錄
  • 案例2:查詢 第1頁 員工數據, 每頁展示5條記錄
  • 案例3:查詢 第2頁 員工數據, 每頁展示5條記錄
  • 案例4:查詢 第3頁 員工數據, 每頁展示5條記錄
--  =================== 分頁查詢 ======================
-- 起始索引 = (頁碼減一) * 每頁展示記錄數
-- 1. 從起始索引0開始查詢員工數據, 每頁展示5條記錄
select * from emp limit 0,5;
select * from emp limit 5;-- 2. 查詢 第1頁 員工數據, 每頁展示5條記錄
select * from emp limit 0,5; -- 起始索引0就是第一頁-- 3. 查詢 第2頁 員工數據, 每頁展示5條記錄 0-4第一頁 5-9 第二頁
select * from emp limit 5,5;-- 4. 查詢 第3頁 員工數據, 每頁展示5條記錄
select * from emp limit 10,5;

注意事項:

  1. 起始索引從0開始。

    計算公式 :起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數

  2. 分頁查詢是數據庫的方言,不同的數據庫有不同的實現,MySQL中是LIMIT

  3. 如果查詢的是第一頁數據(0),起始索引可以省略,直接簡寫為 limit 條數

image-20250421161523376


求關注2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902299.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能在智能家居中的應用與發展

隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;智能家居逐漸成為現代生活的重要組成部分。從智能語音助手到智能家電&#xff0c;AI正在改變我們與家居環境的互動方式&#xff0c;讓生活更加便捷、舒適和高效。本文將探討人工智能在智能家居中的應用現狀、…

【EasyPan】項目常見問題解答(自用持續更新中…)

EasyPan 網盤項目介紹 一、項目概述 EasyPan 是一個基于 Vue3 SpringBoot 的網盤系統&#xff0c;支持文件存儲、在線預覽、分享協作及后臺管理&#xff0c;技術棧涵蓋主流前后端框架及中間件&#xff08;MySQL、Redis、FFmpeg&#xff09;。 二、核心功能模塊 用戶認證 注冊…

4.1騰訊校招簡歷優化與自我介紹攻略:公式化表達+結構化呈現

騰訊校招簡歷優化與自我介紹攻略&#xff1a;公式化表達結構化呈現 在騰訊校招中&#xff0c;簡歷是敲開面試大門的第一塊磚&#xff0c;自我介紹則是展現個人魅力的黃金30秒。本文結合騰訊面試官偏好&#xff0c;拆解簡歷撰寫公式、自我介紹黃金結構及分崗位避坑指南&#xf…

【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 與 @RequestPart

【Easylive】項目常見問題解答&#xff08;自用&持續更新中…&#xff09; 匯總版 consumes MediaType.MULTIPART_FORM_DATA_VALUE 的作用 1. 定義請求的數據格式 ? 作用&#xff1a;告訴 Feign 和 HTTP 客戶端&#xff0c;這個接口 接收的是 multipart/form-data 格式的…

OpenSSL1.1.1d windows安裝包資源使用

環境&#xff1a; QT版本&#xff1a;5.14.2 用途: openssl1.1.1d版本 問題描述&#xff1a; 今天嘗試用百度云人臉識別api搭載QT的人臉識別程序&#xff0c;需要用到 QNetworkManager 訪問 https 開頭的網址。 但是遇到了QT缺乏 openssl 的相關問題&#xff0c;找了大半天…

代碼實戰保險花銷預測

文章目錄 摘要項目地址實戰代碼&#xff08;初級版&#xff09;實戰代碼&#xff08;進階版&#xff09; 摘要 本文介紹了一個完整的機器學習流程項目&#xff0c;重點涵蓋了多元線性回歸的建模與評估方法。項目詳細講解了特征工程中的多項實用技巧&#xff0c;包括&#xff1…

RS232 串行通信:C++ 實現指南

文章目錄 一、RS232 簡介1. 電氣特性2. 傳輸速率3. 傳輸距離 二、在 C 中實現 RS232 通信1. Windows 平臺&#xff08;1&#xff09;打開串行端口&#xff08;2&#xff09;配置串行通信參數&#xff08;3&#xff09;發送數據&#xff08;4&#xff09;接收數據&#xff08;5&…

Linux指令合集

一、VI的使用 命令行模式&#xff1a;默認此模式&#xff0c;從輸入模式回到命令行模式&#xff1a;esc &#xff0c; esc按完&#xff0c;insert消失 輸入模式&#xff1a;按 i 進入 &#xff0c; 看到insert就能編輯代碼 退出vi 保存代碼 命令行模式下 按&#xf…

IDEA使用jclasslib Bytecode Viewer查看jvm字節碼

學習jvm的時候&#xff0c;想查看字節碼和局部變量表&#xff0c;可以使用idea安裝jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安裝工具&#xff1a; 安裝完成后需要重啟idea. &#xff08;2&#xff09;準備一段代碼&#xff0c;編譯運行 package com.te…

從多個Excel批量篩查數據后合并到一起

這篇文章將講解如何批量的從多個Excel文件中篩選出需要的數據&#xff0c;最后合并到一張新的Excel。 全程0代碼圖形化界面操作。 準備數據 這里準備了3個測試文件&#xff0c;每個文件的格式是一樣的 現在我們需要篩選出每個文件里面&#xff0c;基金簡稱包含“南方遠見”&a…

Debian GNU/Linux的新手入門介紹

Debian GNU/Linux&#xff1a;起源、基本介紹與發行版對比 一、起源與發展歷程 Debian GNU/Linux 是現存最古老的 Linux 發行版之一&#xff0c;由 Ian Murdock 于 1993 年 8 月 16 日創立。其名稱結合了他的女友&#xff08;后成為妻子&#xff09;Debra 和他自己的名字 Ian…

Sentinel源碼—7.參數限流和注解的實現一

大綱 1.參數限流的原理和源碼 2.SentinelResource注解的使用和實現 1.參數限流的原理和源碼 (1)參數限流規則ParamFlowRule的配置Demo (2)ParamFlowSlot根據參數限流規則驗證請求 (1)參數限流規則ParamFlowRule的配置Demo 一.參數限流的應用場景 二.參數限流規則的屬性 …

多數據源配置(MyBatis-Plus vs AbstractRoutingDataSource)

MyBatis-Plus vs AbstractRoutingDataSource MyBatis-Plus多數據源配 1.添加依賴 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> <…

聊透多線程編程-線程互斥與同步-13. C# Mutex類實現線程互斥

目錄 一、什么是臨界區&#xff1f; 二、Mutex類簡介 三、Mutex的基本用法 解釋&#xff1a; 四、Mutex的工作原理 五、使用示例1-保護共享資源 解釋&#xff1a; 六、使用示例2-跨進程同步 示例場景 1. 進程A - 主進程 2. 進程B - 第二個進程 輸出結果 ProcessA …

stm32week12

stm32學習 九.stm32與HAL庫 2.HAL庫框架 總架構&#xff1a; 文件介紹&#xff1a; ppp是某一外設&#xff0c;ex是拓展功能 HAL庫API函數和變量命名規則&#xff1a; HAL庫對寄存器位操作的相關宏定義&#xff1a; HAL庫的回調函數&#xff1a; 3.STM32啟動過程 MDK編譯過…

opencv HSV的具體描述

色調H&#xff1a; 使用角度度量&#xff0c;取值范圍為0\~360&#xff0c;從紅色開始按逆時針方向計算&#xff0c;紅色為0&#xff0c;綠色為120&#xff0c;藍色為240。它們的補色是&#xff1a;黃色為60&#xff0c;青色為180&#xff0c;紫色為300。通過改變H的值&#x…

Java Lambda表達式指南

一、Lambda表達式基礎 1. 什么是Lambda表達式&#xff1f; 匿名函數&#xff1a;沒有名稱的函數函數式編程&#xff1a;可作為參數傳遞的代碼塊簡潔語法&#xff1a;替代匿名內部類的更緊湊寫法 2. 基本語法 (parameters) -> expression 或 (parameters) -> { statem…

面向對象設計中的類的分類:實體類、控制類和邊界類

目錄 前言1. 實體類&#xff08;Entity Class&#xff09;1.1 定義和作用1.2 實體類的特點1.3 實體類的示例 2. 控制類&#xff08;Control Class&#xff09;2.1 定義和作用2.2 控制類的特點2.3 控制類的示例 3. 邊界類&#xff08;Boundary Class&#xff09;3.1 定義和作用3…

C# 封裝教程

原文&#xff1a;C# 封裝_w3cschool &#xff08;注&#xff1a;本文為教程文章&#xff0c;請勿標記為付費文章&#xff01;特此聲明&#xff09; 封裝 被定義為"把一個或多個項目封閉在一個物理的或者邏輯的包中"。在面向對象程序設計方法論中&#xff0c;封裝是…

量化交易 - RSRS(阻力支撐相對強度)- 正確用法 - 年均收益18%

經過研究&#xff0c;發現RSRS的正確用法其實是需要用到兩個數據&#xff0c;分別是 n: 一階擬合樣本數&#xff0c;m:求均值方差樣本數&#xff0c;其中n比較小 如18&#xff0c;m比較大 如1100 經過調優后&#xff0c;收益率顯著上升&#xff01; 如下圖&#xff1a; &…