MySQL 數(shù)據庫約束、聚合查詢和聯(lián)合查詢使用案例
數(shù)據庫約束
約束類型
數(shù)據庫的約束類型主要包括以下幾種:
- 主鍵約束(Primary Key Constraint):確保表中的每一行都有唯一的標識,且不能為NULL。
- 外鍵約束(Foreign Key Constraint):確保表中的數(shù)據與另一個表中的數(shù)據保持一致性,維護數(shù)據之間的關系。
- 唯一約束(Unique Constraint):確保字段中的所有值都是唯一的,不允許重復。
- 檢查約束(Check Constraint):限制某一列中的值符合特定條件,如數(shù)值范圍、字符串格式等。
- 非空約束(NOT NULL Constraint):確保某一列不能包含NULL值,必須有實際數(shù)據。
- 默認約束(Default Constraint):為字段設置默認值,在插入記錄時若未提供該字段的值,則會使用默認值。
這些約束保證了數(shù)據庫中的數(shù)據完整性和一致性,是設計數(shù)據庫時的重要組成部分。
使用案例
主鍵約束(Primary Key Constraint)
主鍵約束用于唯一標識表中的每一行,并確保其值不為NULL。
CREATE TABLE Students ( StudentID INT PRIMARY KEY, StudentName VARCHAR(20) );
對于整數(shù)類型的主鍵,常配搭自增長auto_increment來使用。插入數(shù)據對應字段不給值時,使用最大值+1。
StudentID INT PRIMARY KEY auto_increment,
外鍵約束(Foreign Key Constraint)
外鍵約束用于維護不同表之間的關系,確保引用的數(shù)據存在。
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)
唯一約束確保字段值的唯一性,不能重復,但允許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 );
默認約束(Default Constraint)
默認值約束在插入新記錄時指定列的默認值。
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, OrderDate DATETIME DEFAULT CURRENT_TIMESTAMP );
這些約束在創(chuàng)建和管理數(shù)據庫表時非常重要,有助于維護數(shù)據的完整性和準確性。
聚合查詢
聚合函數(shù)
常見的統(tǒng)計總數(shù)、計算平局值等操作,可以使用聚合函數(shù)來實現(xiàn),常見的聚合函數(shù)有:
- COUNT():計算行數(shù)或非NULL值的數(shù)量。
- SUM():計算數(shù)值型列的總和。
- AVG():計算數(shù)值型列的平均值。
- MAX():返回指定列中的最大值。
- MIN():返回指定列中的最小值。
- GROUP_CONCAT()(某些數(shù)據庫):將多行的值連接成一個字符串。
- VARIANCE():計算數(shù)值型列的方差。
- STDDEV():計算數(shù)值型列的標準差。
這些聚合函數(shù)用于對一組數(shù)據進行匯總和分析,是數(shù)據庫查詢的重要工具。
使用案例
COUNT()COUNT()
函數(shù)用于計算表中的行數(shù)或特定列中非NULL值的數(shù)量。
用法:
- 計算總行數(shù):
SELECT COUNT(*) FROM 表名;
- 計算某列非NULL值的數(shù)量:
SELECT COUNT(列名) FROM 表名
示例:
SELECT COUNT(*) FROM Employees; -- 計算員工總數(shù) SELECT COUNT(EmployeeID) FROM Employees; -- 計算非NULL的員工ID數(shù)量
SUM()SUM()
函數(shù)用于計算數(shù)值型列的總和。
用法:SELECT SUM(列名) FROM 表名;
示例:
SELECT SUM(Salary) FROM Employees; -- 計算所有員工的工資總和
AVG()AVG()
函數(shù)用于計算數(shù)值型列的平均值。
用法:SELECT AVG(列名) FROM 表名;
示例:
SELECT AVG(Salary) FROM Employees; -- 計算所有員工的平均工資
MAX()MAX()
函數(shù)用于返回指定列中的最大值。
用法:SELECT MAX(列名) FROM 表名;
示例:
SELECT MAX(Salary) FROM Employees; -- 找到最高的工資
MIN()MIN()
函數(shù)用于返回指定列中的最小值。
用法:SELECT MIN(列名) FROM 表名;
示例:
SELECT MIN(Salary) FROM Employees; -- 找到最低的工資
這些聚合函數(shù)可以單獨使用,也可以與 GROUP BY
子句結合使用,以對結果進行分組和匯總分析。
GROUP BY子句
SELECT 中使用 GROUP BY 子句可以對指定列進行分組查詢。需要滿足:使用 GROUP BY 進行分組查詢時,SELECT 指定的字段必須是“分組依據字段”,其他字段若想出現(xiàn)在SELECT 中則必須包含在聚合函數(shù)中。
select column1, sum(column2), .. from table group by column1,column3;
HAVING
GROUP BY 子句進行分組以后,需要對分組結果再進行條件過濾時,不能使用 WHERE 語句,而需要用HAVING。
使用案例
下面是一個結合聚合函數(shù)、GROUP BY
和 HAVING
的使用案例。
假設我們有一個名為 Sales
的表,其中包含以下字段:
SalesID
:銷售記錄的唯一標識SalesAmount
:銷售金額SalesPerson
:銷售人員的名稱SalesDate
:銷售日期
我們想要查詢每個銷售人員的總銷售金額和平均銷售金額,并且只返回那些總銷售金額超過 10,000 的銷售人員。
以下是相應的 SQL 查詢示例:
SELECT SalesPerson, SUM(SalesAmount) AS TotalSales, AVG(SalesAmount) AS AverageSales FROM Sales GROUP BY SalesPerson HAVING SUM(SalesAmount) > 10000;
在這個查詢中:
GROUP BY SalesPerson
將結果按銷售人員進行分組。SUM(SalesAmount)
計算每個銷售人員的總銷售金額。AVG(SalesAmount)
計算每個銷售人員的平均銷售金額。HAVING SUM(SalesAmount) > 10000
篩選出總銷售金額超過 10,000 的銷售人員。
這個案例展示了如何結合聚合函數(shù)和 GROUP BY
與 HAVING
條件來分析數(shù)據。
聯(lián)合查詢
實際開發(fā)中往往數(shù)據來自不同的表,所以需要多表聯(lián)合查詢。多表查詢是對多張表的數(shù)據取笛卡爾積:
注意:關聯(lián)查詢可以對關聯(lián)表使用別名。
內連接
select 字段 from 表1 別名1 [inner] join 表2 別名2 on 連接條件 and 其他條件;
select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;
外連接
外連接分為左外連接和右外連接。如果聯(lián)合查詢,左側的表完全顯示我們就說是左外連接;右側的表完全顯示我們就說是右外連接。
-- 左外連接,表1完全顯示
select 字段名 from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;
自連接
自連接是指在同一張表連接自身進行查詢。
select 字段名 from 表1 as 別名 ,表1 as 別名 where 連接條件 and 其他條件;
聯(lián)合查詢使用案例
下面是一個關于數(shù)據庫中聯(lián)合查詢(也稱為聯(lián)接查詢)的案例,結合多個表進行數(shù)據檢索。
假設我們有兩個表:
Customers 表
CustomerID
:客戶唯一標識CustomerName
:客戶姓名ContactNumber
:聯(lián)系方式
Orders 表
OrderID
:訂單唯一標識OrderDate
:訂單日期CustomerID
:關聯(lián)的客戶ID(外鍵)TotalAmount
:訂單總金額
我們希望查詢每個客戶的訂單信息,包括客戶姓名和訂單總金額。
以下是結合 INNER JOIN
的 SQL 查詢示例:
SELECT Customers.CustomerName, Orders.TotalAmount FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
在這個查詢中:
INNER JOIN
用于將Customers
表和Orders
表連接起來。- 連接條件是
ON Customers.CustomerID = Orders.CustomerID
,即通過客戶ID來匹配訂單和客戶信息。 - 選擇了
Customers.CustomerName
和Orders.TotalAmount
來顯示客戶姓名和相應的訂單總金額。
這個案例展示了如何在數(shù)據庫中使用聯(lián)合查詢來獲取來自多個表的相關數(shù)據。
子查詢
子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢
1、單行子查詢:返回一行記錄的子查詢
2、多行子查詢:返回多行記錄的子查詢
- [NOT] IN關鍵字
- [NOT] EXISTS關鍵字
子查詢案例
下面是一個關于數(shù)據庫中子查詢的案例,展示如何使用子查詢來獲取相關數(shù)據。
假設我們有兩個表:
Employees 表
EmployeeID
:員工唯一標識EmployeeName
:員工姓名DepartmentID
:員工所在部門的IDSalary
:員工工資
Departments 表
DepartmentID
:部門唯一標識DepartmentName
:部門名稱
現(xiàn)在,我們想要查詢那些工資高于該部門平均工資的員工姓名和工資。我們可以通過子查詢來實現(xiàn)這個目標。
以下是相應的 SQL 查詢示例:
SELECT EmployeeName, Salary FROM Employees WHERE Salary > ( SELECT AVG(Salary) FROM Employees WHERE DepartmentID = Employees.DepartmentID );
在這個查詢中:
- 外層查詢從
Employees
表中選擇EmployeeName
和Salary
。 - 子查詢
(SELECT AVG(Salary) FROM Employees WHERE DepartmentID = Employees.DepartmentID)
計算每個部門的平均工資。 - 外層查詢的
WHERE
子句中,條件Salary > (子查詢)
用于過濾出工資高于該部門平均工資的員工。
這個案例展示了如何在數(shù)據庫中使用子查詢來進一步篩選和獲取數(shù)據。
合并查詢
在實際應用中,為了合并多個select的執(zhí)行結果,可以使用集合操作符 union,union all。使用UNION和UNION ALL時,前后查詢的結果集中,字段需要一致。
union
該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。
union all
該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。
合并查詢案例
合并查詢通常是指使用 UNION
運算符將多個 SELECT 查詢的結果合并在一起。下面是一個關于數(shù)據庫中合并查詢的案例。
假設我們有兩個表:
Customers 表
CustomerID
:客戶唯一標識CustomerName
:客戶姓名ContactNumber
:聯(lián)系方式
Suppliers 表
SupplierID
:供應商唯一標識SupplierName
:供應商姓名ContactNumber
:聯(lián)系方式
我們希望從這兩個表中獲取所有聯(lián)系人姓名,無論是客戶還是供應商??梢允褂?nbsp;UNION
查詢來合并兩個表中的聯(lián)系人的姓名。
以下是相應的 SQL 查詢示例:
SELECT CustomerName AS ContactName FROM Customers UNION SELECT SupplierName AS ContactName FROM Suppliers;
在這個查詢中:
- 第一個
SELECT
查詢從Customers
表中選取CustomerName
,并將其重命名為ContactName
。 - 第二個
SELECT
查詢從Suppliers
表中選取SupplierName
,同樣將其重命名為ContactName
。 UNION
將兩個查詢的結果合并在一起,自動去除重復的值。
請注意,使用 UNION
時,兩個查詢的列數(shù)和數(shù)據類型必須相匹配。
這個案例展示了如何在數(shù)據庫中使用合并查詢來獲取來自多個表的相關數(shù)據。
到此這篇關于MySQL 數(shù)據庫約束、聚合查詢和聯(lián)合查詢的文章就介紹到這了,更多相關mysql聚合查詢和聯(lián)合查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Ubuntu?18.04.4安裝mysql的過程詳解?親測可用
這篇文章主要介紹了Ubuntu?18.04.4安裝mysql-親測可用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12pymysql.err.DataError:(1264, ")異常的有效解決方法(最新推薦)
遇到pymysql.err.DataError錯誤時,錯誤代碼1264通常指的是MySQL數(shù)據庫中的Out of range value for column錯誤,這意味著你嘗試插入或更新的數(shù)據超過了對應數(shù)據庫列所允許的范圍,這篇文章主要介紹了pymysql.err.DataError:(1264, ")異常的有效問題,需要的朋友可以參考下2024-05-05mysql把一個表某個字段的內容復制到另一張表的某個字段的SQL語句寫法
有時候,我們需要復制某個字段一整列的數(shù)據到另外一個新的字段中,或是需要把某個表的某個字段的值跨表復制到另一個表中的某個字段,本文就羅列了一些SQL語句寫法,需要的朋友可以參考下2014-04-04MySQL數(shù)據庫MyISAM存儲引擎轉為Innodb的方法
mysql數(shù)據庫存儲引擎為MyISAM的時候,在大訪問量的情況下數(shù)據表有可能會出現(xiàn)被鎖的情況,這就會導致用戶連接網站時超時而返回502,此時就需要MySQL數(shù)據庫MyISAM存儲引擎轉為Innodb,這篇文章主要介紹了MySQL數(shù)據庫MyISAM存儲引擎轉為Innodb的方法,需要的朋友可以參考下2014-06-06