文章目錄
- 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
課程內容安排:
-
MySQL概述
-
SQL語句(DDL、DML、DQL)
-
多表設計
-
多表查詢
-
事務
-
索引
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)
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數據庫服務器當中存儲數據,你需要:
先去創建數據庫(可以創建多個數據庫,之間是相互獨立的)
在數據庫下再去創建數據表(一個數據庫下可以創建多張表)
再將數據存放在數據表中(一張表可以存儲多行數據)
3. SQL語句
SQL:結構化查詢語言。一門操作關系型數據庫的編程語言,定義操作所有關系型數據庫的統一標準。SQL語句根據其功能被分為四大類:DDL、DML、DQL、DCL 。
分類
分類 | 全稱 | 說明 |
---|---|---|
DDL | Data Definition Language | 數據定義語言,用來定義數據庫對象(數據庫、表、字段) |
DML | Data Manipulation Language | 數據操作語言,用來對數據庫表中的數據進行增、刪、改 |
DQL | Data Query Language | 數據查詢語言,用來查詢數據庫中表的記錄 |
DCL | Data Control Language | 數據控制語言,用來創建數據庫用戶、控制數據庫的訪問權限 |
3.1 DDL語句
3.1.1 數據庫操作
我們在進行數據庫設計,需要使用到剛才所介紹SQL分類中的DDL語句。
DDL英文全稱是Data Definition Language(數據定義語言),用來定義數據庫對象(數據庫、表、表中字段)。
DDL中數據庫的常見操作:查詢、創建、使用、刪除。
3.1.1.1 查詢數據庫
- 查詢所有數據庫
命令行中執行效果如下:

- 查詢當前數據庫
命令行中執行效果如果:
我們要操作某一個數據庫,必須要切換到對應的數據庫中。
通過指令: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;
3.1.2 圖形化工具
3.1.2.1 介紹
前面我們講解了DDL中關于數據庫操作的SQL語句,在我們編寫這些SQL時,都是在命令行當中完成的。大家在練習的時候應該也感受到了,在命令行當中來敲這些SQL語句很不方便,主要的原因有以下 3 點:
-
沒有任何代碼提示。(全靠記憶,容易敲錯字母造成執行報錯)
-
操作繁瑣,影響開發效率。(所有的功能操作都是通過SQL語句來完成的)
-
編寫過的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 創建
-
語法:
- 注意: [ ] 中的內容為可選參數; 最后一個字段后面沒有逗號
-
案例:創建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表結構,大家會發現里面沒有數據:
添加數據:
我們之前提到過:id字段是一行數據的唯一標識,不能有重復值。但是現在數據表中有兩個相同的id值,這是為什么呢?
- 其實我們現在創建表結構的時候, id這個字段我們只加了一個備注信息說明它是一個唯一標識,但是在數據庫層面呢,并沒有去限制字段存儲的數據。所以id這個字段沒有起到唯一標識的作用。
想要限制字段所存儲的數據,就需要用到數據庫中的約束。
3.1.3.2 約束
-
概念:所謂約束就是作用在表中字段上的規則,用于限制存儲在表中的數據。
-
作用:就是來保證數據庫當中數據的正確性、有效性和完整性。(后面的學習會驗證這些)
-
在MySQL數據庫當中,提供了以下5種約束:
注意:約束是作用于表中字段上的,可以在創建表/修改表的時候添加約束。
- 案例:創建tb_user表,對應的結構如下:
在上述的表結構中:現在我們加上一些限制
建表語句:
-- 創建表(+約束)
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 '用戶信息表';
3.1.3.3 數據類型
在上面建表語句中,我們在指定字段的數據類型時,用到了int 、varchar、char,那么在MySQL中除了以上的數據類型,還有哪些常見的數據類型呢? 接下來,我們就來詳細介紹一下MySQL的數據類型。
MySQL中的數據類型有很多,主要分為三類:數值類型、字符串類型、日期時間類型。
1). 數值類型

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

3). 日期時間類型

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 '員工表';
步驟:
-
閱讀產品原型及需求文檔,看看里面涉及到哪些字段。不僅要考慮頁面展示字段,也要考慮錄入員工需要哪些信息
-
查看需求文檔說明,確認各個字段的類型以及字段存儲數據的長度限制。
- 在頁面原型中描述的基礎字段的基礎上,再增加額外的基礎字段。
使用SQL創建表:
除了使用SQL語句創建表外,我們還可以借助于圖形化界面來創建表結構,這種創建方式會更加直觀、更加方便。
設計表流程:
閱讀頁面原型及需求文檔
基于頁面原則和需求文檔,確定原型字段(類型、長度限制、約束)
再增加表設計所需要的業務基礎字段(id(主鍵,唯一標識一條數據)、create_time、update_time)
create_time:記錄的是當前這條數據插入的時間。
update_time:記錄當前這條數據最后更新的時間。
3.1.3.5 表操作-其他操作
上面講解了表結構的創建、數據類型、設計表的流程,接下來,再來講解表結構的查詢、修改、刪除操作 。
查詢、修改、刪除數據庫表的具體的語法:
-- 查詢當前數據庫所有表
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;
查詢表結構
查詢建表語句
關于表結構的查看、修改、刪除操作,工作中一般都是直接基于圖形化界面操作。在刪除表時,表中的數據也會被全部刪除
3.2 DML語句
DML英文全稱是Data Manipulation Language(數據操作語言),用來對數據庫中表的數據記錄進行增、刪、改操作。
-
添加數據(INSERT)
-
修改數據(UPDATE)
-
刪除數據(DELETE),即刪除某一條數據
3.2.1 增加(insert)
3.2.1.1 語法

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操作的注意事項:
- 插入數據時,指定的字段順序需要與值的順序是一一對應的。
- 字符串和日期型數據應該包含在引號中,會報警告但可執行。
- 插入的數據大小,應該在字段的規定范圍內。
3.2.2 修改(update)
3.2.2.1 語法
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';
注意事項:
修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有數據。
在修改數據時,一般需要同時修改公共字段update_time,將其修改為當前操作時間。
3.2.3 刪除(delete)
3.2.3.1 語法

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查詢語句,語法結構如下:
我們今天會將上面的完整語法拆分為以下幾個部分學習:
-
基本查詢(不帶任何條件)
-
條件查詢(where)
-
分組查詢(group by)
-
排序查詢(order by)
-
分頁查詢(limit)
準備一些測試數據用于查詢操作:
3.3.3 基本查詢
在基本查詢的DQL語句中,不帶任何的查詢條件。
語法如下:
-
查詢多個字段
-
查詢所有字段(通配符)
-
設置別名
-
去除重復記錄
案例演示:
-
案例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;
3.3.4 條件查詢
語法:
學習條件查詢就是學習條件的構建方式,而在SQL語句當中構造條件的運算符分為兩類:
-
比較運算符
-
邏輯運算符
-
案例1:查詢 姓名 為 ‘楊逍’ 的員工
-
案例2:查詢 薪資小于等于 5000 的員工信息
-
案例3:查詢 沒有分配職位 的員工信息
注意:查詢為NULL的數據時,不能使用
= null
或!=null
。得使用is null
或is 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 :計算指定列的平均值
案例演示:
- 案例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 分組查詢
-
分組: 按照某一列或者某幾列,把相同的數據進行合并輸出。
-
分組其實就是按列進行分類(指定列下相同的數據歸為一類),然后可以對分類完的數據進行合并計算。
-
分組查詢通常會使用聚合函數進行計算。
-
語法:

案例演示:
-
案例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可以。
3.3.7 排查查詢
排序在日常開發中是非常常見的一個操作,有升序排序,也有降序排序。
語法:

-
排序方式:
-
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 分頁查詢
分頁操作在業務系統開發時,也是非常常見的一個功能,日常我們在網站中看到的各種各樣的分頁條,后臺也都需要借助于數據庫的分頁操作。
分頁查詢語法:
- 案例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;
注意事項:
起始索引從0開始。
計算公式 :起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數
分頁查詢是數據庫的方言,不同的數據庫有不同的實現,MySQL中是LIMIT
如果查詢的是第一頁數據(0),起始索引可以省略,直接簡寫為 limit 條數