JavaWeb學習筆記——第七天

zgg1h發表於2024-03-28

MySQL(二)

資料庫查詢-DQL

  • DQL英文全稱是Data Query Language(資料查詢語言),用來查詢資料庫表中的記錄。
  • 關鍵字:SELECT

語法

關鍵字和引數 說明
select 欄位列表 基本查詢
from 表名列表
where 條件列表 條件查詢
group by 分組欄位列表 分組查詢
having 分組後條件列表
order by 排序欄位列表 排序查詢
limit 分頁引數 分頁查詢
### 基本查詢

查詢多個欄位:

select 欄位1, 欄位2, 欄位3 from 表名;

查詢所有欄位(萬用字元):

select * from 表名;

設定別名:

select 欄位1 [ as 別名1 ], 欄位2 [ as 別名2 ] from 表名;

去除重複記錄:

select distinct 欄位列表 from 表名;

注意事項

  • *號代表查詢所有欄位,在實際開發中儘量少用(不直觀、效率低)。
  • 別名會顯示在查詢結果的表頭中。
  • 設定別名時as可省略,且如果別名中包含空格或其他特殊字元,需要用引號圍起來。

條件查詢

select 欄位列表 from 表名 where 條件列表;
select 欄位列表 from 表名 where (欄位1, 欄位2...) = (值1, 值2...); -- 指定多個欄位值查詢時也可以這樣寫

條件運算子

比較運算子 功能
> 大於
>= 大於等於
< 小於
<= 小於等於
= 等於
<> 或 != 不等於
between ... and ... 在某個範圍之內(含最小、最大值)
in(...) 在in之後的列表中的值,多選一,用逗號分隔
like 佔位符 模糊匹配( _ 匹配單個字元,% 匹配任意個字元)
is null 是null
邏輯運算子 功能
and 或 && 並且 (多個條件同時成立)
or 或 || 或者 (多個條件任意一個成立)
not 或 ! 非 , 不是

聚合函式

  • 作用:將一列資料作為一個整體,進行縱向計算。
  • 語法:
select 聚合函式(欄位列表) from 表名;
函式 功能
count() 統計數量
max() 最大值
min() 最小值
avg() 平均值
sum() 求和

注意事項

  • null值不參與所有聚合函式運算。
  • 統計數量可以使用:count(*),count(欄位),count(常量),推薦使用count(*)。count(*) 的作用是統計表的行數,null也會統計;count(常量)的作用也是統計表的行數,但不包括null; count(欄位) 的作用則是統計該欄位值中不為null的行數。

分組查詢

  • 語法:
select 欄位列表 from 表名 [ where 條件 ] group by 分組欄位名 [ having 分組後過濾條件 ];
  • where與having區別:
    1. 執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之後對結果進行過濾。
    2. 判斷條件不同:where不能對聚合函式進行判斷,而having可以。

注意事項

  • 分組之後,查詢的欄位一般為聚合函式和分組欄位,查詢其他欄位無任何意義。
  • 執行順序:where > 聚合函式 > having 。

排序查詢

  • 語法:
select 欄位列表 from 表名 [ where 條件列表 ] [ group by 分組欄位 [ having 分組後過濾條件 ] ] order by 欄位1 排序方式1, 欄位2 排序方式2 … ;
  • 排序方式:
    • ASC:升序(預設值)
    • DESC:降序

注意事項

  • 如果是多欄位排序,當前面所有欄位值都相同時,才會根據當前欄位進行排序。

分頁查詢

  • 語法:
select 欄位列表 from 表名 limit 起始索引, 查詢記錄數;

注意事項

  • 起始索引從0開始,起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數。
  • 分頁查詢是資料庫的方言,不同的資料庫有不同的實現,MySQL中是LIMIT。
  • 如果查詢的是第一頁資料,起始索引可以省略,直接簡寫為 limit 查詢記錄數。

流程控制函式

  • if表示式:
if(表示式, tvalue, fvalue) -- 當表示式為true時,取值tvalue;當表示式為false時,取值fvalue。
  • case表示式:
case expr when value1 then result1 [when value2 then value2 ...] [else result] end -- 類似於Java中的switch語句

多表設計

專案開發中,在進行資料庫表結構設計時,會根據業務需求及業務模組之間的關係,分析並設計表結構,由於業務之間相互關聯,所以各個表結構之間也存在著各種聯絡,基本上分為三種:

  • 一對多(多對一)
  • 多對多
  • 一對一

一對多

  • 例子:部門及員工的關係。

  • 一對多關係實現:在資料庫表中多的一方新增欄位,來關聯一的一方的主鍵。

  • 此時,一的一方也叫父表,多的一方也叫子表。

外來鍵約束

  • 在資料庫層面,將父表和子表建立起關聯,以保證資料的一致性和完整性。
物理外來鍵
  • 概念:使用 foreign key 定義外來鍵關聯另外一張表。

  • 語法:

-- 建立表時指定
create table 表名(
	欄位名 資料型別,
	...
	[constraint] [外來鍵名稱] foreign key (外來鍵欄位名) references 父表名(欄位名)	
);

-- 建完表後,新增外來鍵
alter table 表名 add constraint 外來鍵名稱 foreign key (外來鍵欄位名) references 父表名(欄位名);
  • 缺點:
    • 影響增、刪、改的效率(需要檢查外來鍵關係)。
    • 僅用於單節點資料庫,不適用與分散式、叢集場景。
    • 容易引發資料庫的死鎖問題,消耗效能。
邏輯外來鍵
  • 概念:在業務層邏輯中,解決外來鍵關聯。
  • 透過邏輯外來鍵,就可以很方便的解決物理外來鍵的問題。
  • 推薦使用。

一對一

  • 例子:使用者與身份證資訊的關係。

  • 一對一的關係,多用於單表拆分,將一張表的基礎欄位放在一張表中,其他欄位放在另一張表中,以提升操作效率。

  • 實現:在任意一方加入外來鍵,關聯另外一方的主鍵,並且設定外來鍵為唯一的(UNIQUE)。

多對多

  • 例子:學生與課程的關係。
  • 一個學生可以選修多門課程,一門課程也可以供多個學生選擇。
  • 實現:建立第三張中間表,中間表至少包含兩個外來鍵,分別關聯兩方主鍵。

相關文章