MySQL 數(shù)據(jù)庫(kù)約束、聚合查詢和聯(lián)合查詢使用案例
數(shù)據(jù)庫(kù)約束
約束類型
數(shù)據(jù)庫(kù)的約束類型主要包括以下幾種:
- 主鍵約束(Primary Key Constraint):確保表中的每一行都有唯一的標(biāo)識(shí),且不能為NULL。
- 外鍵約束(Foreign Key Constraint):確保表中的數(shù)據(jù)與另一個(gè)表中的數(shù)據(jù)保持一致性,維護(hù)數(shù)據(jù)之間的關(guān)系。
- 唯一約束(Unique Constraint):確保字段中的所有值都是唯一的,不允許重復(fù)。
- 檢查約束(Check Constraint):限制某一列中的值符合特定條件,如數(shù)值范圍、字符串格式等。
- 非空約束(NOT NULL Constraint):確保某一列不能包含NULL值,必須有實(shí)際數(shù)據(jù)。
- 默認(rèn)約束(Default Constraint):為字段設(shè)置默認(rèn)值,在插入記錄時(shí)若未提供該字段的值,則會(huì)使用默認(rèn)值。
這些約束保證了數(shù)據(jù)庫(kù)中的數(shù)據(jù)完整性和一致性,是設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)的重要組成部分。
使用案例
主鍵約束(Primary Key Constraint)
主鍵約束用于唯一標(biāo)識(shí)表中的每一行,并確保其值不為NULL。
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(20)
);對(duì)于整數(shù)類型的主鍵,常配搭自增長(zhǎng)auto_increment來(lái)使用。插入數(shù)據(jù)對(duì)應(yīng)字段不給值時(shí),使用最大值+1。
StudentID INT PRIMARY KEY auto_increment,
外鍵約束(Foreign Key Constraint)
外鍵約束用于維護(hù)不同表之間的關(guān)系,確保引用的數(shù)據(jù)存在。
CREATE TABLE Courses (
CourseID INT PRIMARY KEY,
CourseName VARCHAR(100)
);
CREATE TABLE Enrollments (
EnrollmentID INT PRIMARY KEY,
StudentID INT,
CourseID INT,
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
); 唯一約束(Unique Constraint)
唯一約束確保字段值的唯一性,不能重復(fù),但允許NULL值。
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Email VARCHAR(100) UNIQUE
);檢查約束(Check Constraint)
檢查約束用于確保字段值滿足特定條件。
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Price DECIMAL(10, 2) CHECK (Price >= 0)
);非空約束(NOT NULL Constraint)
非空約束確保某一列的值不能為空。
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(100) NOT NULL
);默認(rèn)約束(Default Constraint)
默認(rèn)值約束在插入新記錄時(shí)指定列的默認(rèn)值。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATETIME DEFAULT CURRENT_TIMESTAMP
);這些約束在創(chuàng)建和管理數(shù)據(jù)庫(kù)表時(shí)非常重要,有助于維護(hù)數(shù)據(jù)的完整性和準(zhǔn)確性。
聚合查詢
聚合函數(shù)
常見(jiàn)的統(tǒng)計(jì)總數(shù)、計(jì)算平局值等操作,可以使用聚合函數(shù)來(lái)實(shí)現(xiàn),常見(jiàn)的聚合函數(shù)有:
- COUNT():計(jì)算行數(shù)或非NULL值的數(shù)量。
- SUM():計(jì)算數(shù)值型列的總和。
- AVG():計(jì)算數(shù)值型列的平均值。
- MAX():返回指定列中的最大值。
- MIN():返回指定列中的最小值。
- GROUP_CONCAT()(某些數(shù)據(jù)庫(kù)):將多行的值連接成一個(gè)字符串。
- VARIANCE():計(jì)算數(shù)值型列的方差。
- STDDEV():計(jì)算數(shù)值型列的標(biāo)準(zhǔn)差。
這些聚合函數(shù)用于對(duì)一組數(shù)據(jù)進(jìn)行匯總和分析,是數(shù)據(jù)庫(kù)查詢的重要工具。
使用案例
COUNT()COUNT() 函數(shù)用于計(jì)算表中的行數(shù)或特定列中非NULL值的數(shù)量。
用法:
- 計(jì)算總行數(shù):
SELECT COUNT(*) FROM 表名; - 計(jì)算某列非NULL值的數(shù)量:
SELECT COUNT(列名) FROM 表名
示例:
SELECT COUNT(*) FROM Employees; -- 計(jì)算員工總數(shù) SELECT COUNT(EmployeeID) FROM Employees; -- 計(jì)算非NULL的員工ID數(shù)量
SUM()SUM() 函數(shù)用于計(jì)算數(shù)值型列的總和。
用法:SELECT SUM(列名) FROM 表名;
示例:
SELECT SUM(Salary) FROM Employees; -- 計(jì)算所有員工的工資總和
AVG()AVG() 函數(shù)用于計(jì)算數(shù)值型列的平均值。
用法:SELECT AVG(列名) FROM 表名;
示例:
SELECT AVG(Salary) FROM Employees; -- 計(jì)算所有員工的平均工資
MAX()MAX() 函數(shù)用于返回指定列中的最大值。
用法:SELECT MAX(列名) FROM 表名;
示例:
SELECT MAX(Salary) FROM Employees; -- 找到最高的工資
MIN()MIN() 函數(shù)用于返回指定列中的最小值。
用法:SELECT MIN(列名) FROM 表名;
示例:
SELECT MIN(Salary) FROM Employees; -- 找到最低的工資
這些聚合函數(shù)可以單獨(dú)使用,也可以與 GROUP BY 子句結(jié)合使用,以對(duì)結(jié)果進(jìn)行分組和匯總分析。
GROUP BY子句
SELECT 中使用 GROUP BY 子句可以對(duì)指定列進(jìn)行分組查詢。需要滿足:使用 GROUP BY 進(jìn)行分組查詢時(shí),SELECT 指定的字段必須是“分組依據(jù)字段”,其他字段若想出現(xiàn)在SELECT 中則必須包含在聚合函數(shù)中。
select column1, sum(column2), .. from table group by column1,column3;
HAVING
GROUP BY 子句進(jìn)行分組以后,需要對(duì)分組結(jié)果再進(jìn)行條件過(guò)濾時(shí),不能使用 WHERE 語(yǔ)句,而需要用HAVING。
使用案例
下面是一個(gè)結(jié)合聚合函數(shù)、GROUP BY 和 HAVING 的使用案例。
假設(shè)我們有一個(gè)名為 Sales 的表,其中包含以下字段:
SalesID:銷售記錄的唯一標(biāo)識(shí)SalesAmount:銷售金額SalesPerson:銷售人員的名稱SalesDate:銷售日期
我們想要查詢每個(gè)銷售人員的總銷售金額和平均銷售金額,并且只返回那些總銷售金額超過(guò) 10,000 的銷售人員。
以下是相應(yīng)的 SQL 查詢示例:
SELECT
SalesPerson,
SUM(SalesAmount) AS TotalSales,
AVG(SalesAmount) AS AverageSales
FROM
Sales
GROUP BY
SalesPerson
HAVING
SUM(SalesAmount) > 10000;在這個(gè)查詢中:
GROUP BY SalesPerson將結(jié)果按銷售人員進(jìn)行分組。SUM(SalesAmount)計(jì)算每個(gè)銷售人員的總銷售金額。AVG(SalesAmount)計(jì)算每個(gè)銷售人員的平均銷售金額。HAVING SUM(SalesAmount) > 10000篩選出總銷售金額超過(guò) 10,000 的銷售人員。
這個(gè)案例展示了如何結(jié)合聚合函數(shù)和 GROUP BY 與 HAVING 條件來(lái)分析數(shù)據(jù)。
聯(lián)合查詢
實(shí)際開(kāi)發(fā)中往往數(shù)據(jù)來(lái)自不同的表,所以需要多表聯(lián)合查詢。多表查詢是對(duì)多張表的數(shù)據(jù)取笛卡爾積:

注意:關(guān)聯(lián)查詢可以對(duì)關(guān)聯(lián)表使用別名。
內(nèi)連接
select 字段 from 表1 別名1 [inner] join 表2 別名2 on 連接條件 and 其他條件;
select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;
外連接
外連接分為左外連接和右外連接。如果聯(lián)合查詢,左側(cè)的表完全顯示我們就說(shuō)是左外連接;右側(cè)的表完全顯示我們就說(shuō)是右外連接。
-- 左外連接,表1完全顯示
select 字段名 from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;
自連接
自連接是指在同一張表連接自身進(jìn)行查詢。
select 字段名 from 表1 as 別名 ,表1 as 別名 where 連接條件 and 其他條件;
聯(lián)合查詢使用案例
下面是一個(gè)關(guān)于數(shù)據(jù)庫(kù)中聯(lián)合查詢(也稱為聯(lián)接查詢)的案例,結(jié)合多個(gè)表進(jìn)行數(shù)據(jù)檢索。
假設(shè)我們有兩個(gè)表:
Customers 表
CustomerID:客戶唯一標(biāo)識(shí)CustomerName:客戶姓名ContactNumber:聯(lián)系方式
Orders 表
OrderID:訂單唯一標(biāo)識(shí)OrderDate:訂單日期CustomerID:關(guān)聯(lián)的客戶ID(外鍵)TotalAmount:訂單總金額
我們希望查詢每個(gè)客戶的訂單信息,包括客戶姓名和訂單總金額。
以下是結(jié)合 INNER JOIN 的 SQL 查詢示例:
SELECT
Customers.CustomerName,
Orders.TotalAmount
FROM
Customers
INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;在這個(gè)查詢中:
INNER JOIN用于將Customers表和Orders表連接起來(lái)。- 連接條件是
ON Customers.CustomerID = Orders.CustomerID,即通過(guò)客戶ID來(lái)匹配訂單和客戶信息。 - 選擇了
Customers.CustomerName和Orders.TotalAmount來(lái)顯示客戶姓名和相應(yīng)的訂單總金額。
這個(gè)案例展示了如何在數(shù)據(jù)庫(kù)中使用聯(lián)合查詢來(lái)獲取來(lái)自多個(gè)表的相關(guān)數(shù)據(jù)。
子查詢
子查詢是指嵌入在其他sql語(yǔ)句中的select語(yǔ)句,也叫嵌套查詢
1、單行子查詢:返回一行記錄的子查詢
2、多行子查詢:返回多行記錄的子查詢
- [NOT] IN關(guān)鍵字
- [NOT] EXISTS關(guān)鍵字
子查詢案例
下面是一個(gè)關(guān)于數(shù)據(jù)庫(kù)中子查詢的案例,展示如何使用子查詢來(lái)獲取相關(guān)數(shù)據(jù)。
假設(shè)我們有兩個(gè)表:
Employees 表
EmployeeID:?jiǎn)T工唯一標(biāo)識(shí)EmployeeName:?jiǎn)T工姓名DepartmentID:?jiǎn)T工所在部門的IDSalary:?jiǎn)T工工資
Departments 表
DepartmentID:部門唯一標(biāo)識(shí)DepartmentName:部門名稱
現(xiàn)在,我們想要查詢那些工資高于該部門平均工資的員工姓名和工資。我們可以通過(guò)子查詢來(lái)實(shí)現(xiàn)這個(gè)目標(biāo)。
以下是相應(yīng)的 SQL 查詢示例:
SELECT
EmployeeName,
Salary
FROM
Employees
WHERE
Salary > (
SELECT
AVG(Salary)
FROM
Employees
WHERE
DepartmentID = Employees.DepartmentID
);在這個(gè)查詢中:
- 外層查詢從
Employees表中選擇EmployeeName和Salary。 - 子查詢
(SELECT AVG(Salary) FROM Employees WHERE DepartmentID = Employees.DepartmentID)計(jì)算每個(gè)部門的平均工資。 - 外層查詢的
WHERE子句中,條件Salary > (子查詢)用于過(guò)濾出工資高于該部門平均工資的員工。
這個(gè)案例展示了如何在數(shù)據(jù)庫(kù)中使用子查詢來(lái)進(jìn)一步篩選和獲取數(shù)據(jù)。
合并查詢
在實(shí)際應(yīng)用中,為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。使用UNION和UNION ALL時(shí),前后查詢的結(jié)果集中,字段需要一致。
union
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行。
union all
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。
合并查詢案例
合并查詢通常是指使用 UNION 運(yùn)算符將多個(gè) SELECT 查詢的結(jié)果合并在一起。下面是一個(gè)關(guān)于數(shù)據(jù)庫(kù)中合并查詢的案例。
假設(shè)我們有兩個(gè)表:
Customers 表
CustomerID:客戶唯一標(biāo)識(shí)CustomerName:客戶姓名ContactNumber:聯(lián)系方式
Suppliers 表
SupplierID:供應(yīng)商唯一標(biāo)識(shí)SupplierName:供應(yīng)商姓名ContactNumber:聯(lián)系方式
我們希望從這兩個(gè)表中獲取所有聯(lián)系人姓名,無(wú)論是客戶還是供應(yīng)商。可以使用 UNION 查詢來(lái)合并兩個(gè)表中的聯(lián)系人的姓名。
以下是相應(yīng)的 SQL 查詢示例:
SELECT
CustomerName AS ContactName
FROM
Customers
UNION
SELECT
SupplierName AS ContactName
FROM
Suppliers;在這個(gè)查詢中:
- 第一個(gè)
SELECT查詢從Customers表中選取CustomerName,并將其重命名為ContactName。 - 第二個(gè)
SELECT查詢從Suppliers表中選取SupplierName,同樣將其重命名為ContactName。 UNION將兩個(gè)查詢的結(jié)果合并在一起,自動(dòng)去除重復(fù)的值。
請(qǐng)注意,使用 UNION 時(shí),兩個(gè)查詢的列數(shù)和數(shù)據(jù)類型必須相匹配。
這個(gè)案例展示了如何在數(shù)據(jù)庫(kù)中使用合并查詢來(lái)獲取來(lái)自多個(gè)表的相關(guān)數(shù)據(jù)。
到此這篇關(guān)于MySQL 數(shù)據(jù)庫(kù)約束、聚合查詢和聯(lián)合查詢的文章就介紹到這了,更多相關(guān)mysql聚合查詢和聯(lián)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
云服務(wù)器安裝mysql的實(shí)現(xiàn)步驟
在當(dāng)前的互聯(lián)網(wǎng)時(shí)代,云計(jì)算已經(jīng)成為重要的平臺(tái)支撐,本文就來(lái)介紹一下云服務(wù)器安裝mysql的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
MySQL UNION操作符基礎(chǔ)知識(shí)點(diǎn)
在本文里小編給大家整理了關(guān)于MySQL UNION操作符的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們跟著學(xué)習(xí)下。2019-02-02
mysql啟動(dòng)時(shí)出現(xiàn)ERROR 2003 (HY000)問(wèn)題的解決方法

