一、多數據表之間的數據查詢
在SQL中,多數據表之間的查詢主要用于以下方面:
在SQL Server中,多數據表之間的數據查詢主要用于以下幾個方面:
-
關聯(lián)數據提取:現(xiàn)代數據庫通常將數據分散在多個相關的表中以便于管理。例如,訂單信息可能存儲在一個表中,而客戶信息可能存儲在另一個表中。為了獲取完整的訂單詳情,你可能需要從兩個表中提取并合并信息。
-
數據整合:多表查詢可用于整合來自不同數據源的信息,這對于報告和分析非常重要。比如,銷售報告可能需要結合產品、銷售和客戶表中的數據。
-
性能優(yōu)化:合理設計的數據庫模型會將數據分散在多個表中,以減少冗余和提高性能。通過多表查詢,可以有效地檢索分散的數據而無需過多冗余。
-
數據完整性:數據庫設計時通常會使用外鍵來維護不同數據表之間的關系,確保數據的一致性和完整性。多表查詢可以利用這些關系來確保查詢結果的準確性。
-
復雜的數據操作:多表查詢允許執(zhí)行復雜的數據操作,如連接(JOIN)、子查詢(subquery)、并集(UNION)等,以執(zhí)行復雜的業(yè)務邏輯和數據分析。
-
條件篩選:在多表查詢中,可以通過在 WHERE 子句中設定條件來篩選跨多個表的數據,以滿足特定的查詢需求。
多表之間的數據查詢主要有下面三種方式:
1.內連接查詢
2.左外連接查詢
3.右外連接查詢
還有一些延伸的的方式,作簡單介紹
1.1內連接查詢(Inner join)
內連接用來查詢兩個或多個表中存在匹配關系的記錄。僅返回在連接的表之間具有匹配值的行。既然是匹配關系,那也就是說內連接用于查找兩個表中都有的記錄,比如第一個表中有十行,那么響應的第二個表中也應該有十行與之對應。
語法格式:
select columns
from table1
inner join table2
on table1.column_name = table2.column_name;
最后一句解釋:ON table1.column_name = table2.column_name
是 SQL 查詢中的一個語句片段,通常用在 JOIN
操作中,用來指定兩個數據表之間的連接條件。這個語句的意思是,系統(tǒng)在連接 table1
和 table2
這兩張表時,會按照兩張表中的指定列 column_name
的值是否相等來確定哪些行之間應該被連接。
我們看一個具體的例子:
我們有兩張表,表一Students:
表二ScoreList:
用下列程序:
select ScoreList.StudentId,StudentName,Gender ,Csharp
from ScoreList
inner join Students on Students.StudentId=ScoreList.StudentId
where CSharp>80
得到結果:
就是說我們可以以兩個表上相同的列為橋梁將兩個表中我們想要的數據合到一張表上,而且兩張表無先后位置。
1.2 左外連接 (LEFT JOIN):
左外連接返回左表(FROM
子句中指定的表)的所有記錄以及右表中匹配的記錄。外連接(左、右、全)用于包含沒有匹配的行的情景如果左表的行在右表中沒有匹配,則結果集中這些行的右表部分為 NULL。語法:
select columns
from table1
left join table2
on table1.column_name = table2.column_name;
比如:table1(左表)是:
table2(右表)是:
我們看到右表比左表少了一行,所以自動補上了NULL
1.3右外連接 (RIGHT JOIN):
右外連接與左外連接對應,返回右表的所有記錄以及左表中匹配的記錄。如果右表的行在左表中沒有匹配,則結果集中這些行的左表部分為 NULL。
select columns
from table1
right join table2
on table1.column_name = table2.column_name;
1.4. 全外連接 (FULL OUTER JOIN):
全外連接返回左表和右表中的所有記錄。當左表中的行在右表中沒有匹配時,或者右表中的行在左表中沒有匹配時,結果集會用 NULL 補充。
select columns
from table1
full outer join table2
on table1.column_name = table2.column_name;
1.5 交叉連接 (CROSS JOIN):
交叉連接返回兩個表中所有可能的行組合。如果第一個表有10行,第二個表有5行,交叉連接的結果將有50行。不常用
select columns
from table1
cross join table2;
1.6 自連接 (SELF JOIN):
自連接是一種特殊形式的內連接或外連接,表與自身連接。不常用:
SQL Server 中的自連接(SELF JOIN)是一種特殊類型的連接,其中一個表會根據與自身的某些條件關聯(lián)來進行連接。自連接通常用于處理那些在同一表內部就需要關聯(lián)查詢的情況,比如層級數據、樹狀結構或是任何需要比較同一個表內兩個不同記錄的場景。
在自連接中,實際上是把同一個表當作是兩個獨立的表進行連接操作。雖然物理上只有一個表,但是通過給表使用不同的別名,可以在查詢中將其視為兩個不同的表。
舉個自連接的例子,假設我們有一個員工表 Employees
,其中包含以下列:
-
EmployeeID
(員工ID) -EmployeeName
(員工姓名) -ManagerID
(上級經理的員工ID)
在這種情況下,ManagerID
是這個員工的上級經理的 EmployeeID
。我們想要列出所有員工及其對應的上級經理姓名。在這里,我們可以使用自連接來實現(xiàn)這個目標。
示例 SQL 查詢如下:
select
e1.EmployeeName as EmployeeName,
e2.EmployeeName as ManagerName
from
Employees e1
left join Employees e2
on e1.ManagerID = e2.EmployeeID;
在這個查詢中,Employees
表以 e1
和 e2
兩個不同的別名存在。我們在查詢中使用 left join
自連接這個表,通過 e1.ManagerID = e2.EmployeeID
條件來找到員工的上級經理。e1
代表的是員工,而 e2
代表的是經理。left join
確保了即使某些員工沒有上級經理(ManagerID
為 NULL
),他們的信息也會被列出。
結果將是一個兩列的列表,第一列是員工的姓名,第二列是他們經理的姓名。如果某個員工沒有經理,對應的 ManagerName
列會顯示為 NULL
。
1.7 子查詢:
子查詢可以在另一個查詢中使用,它可以從一個表中篩選數據,然后用來與另一個表比較或操作。
select columns
from table1
where column_name IN (SELECT column_name FROM table2 where condition);
二、分組查詢
2.1 分組查詢
在SQL Server Management Studio(SSMS)中,分組查詢主要通過group by
子句實現(xiàn)。group by
子句通常與聚合函數(如COUNT()
、SUM()
、AVG()
、MAX()
、MIN()
等)一起使用,可以對一組行中的某些列進行分組,并對每個組進行聚合計算。
以下是一個簡單的分組查詢示例,假設有一個名為Sales
的表,包含了Item
、Quantity
和SaleDate
三個字段:
Sales Table
-------------------------------------
| Item | Quantity | SaleDate |
-------------------------------------
| Pen | 10 | 2023-01-01 |
| Notebook | 20 | 2023-01-01 |
| Pen | 5 | 2023-01-02 |
| Eraser | 15 | 2023-01-02 |
| Notebook | 30 | 2023-01-03 |
| Pen | 10 | 2023-01-03 |
| Eraser | 20 | 2023-01-03 |
-------------------------------------
我們運行以下SQL查詢:
select Item, SUM(Quantity) as TotalQuantity
from Sales
group by Item;
這個呢,將返回每個不同物品(Item)的總銷售數量(TotalQuantity)。結果如下所示:
Result
------------------------
| Item | TotalQuantity |
------------------------
| Pen | 25 |
| Notebook | 50 |
| Eraser | 35 |
------------------------
在這個結果中,Pen
的TotalQuantity
是25(10+5+10),Notebook
的TotalQuantity
是50(20+30),而Eraser
的TotalQuantity
是35(15+20)。
如果我們還想過濾出總銷售數量大于30的物品,那就可以使用having
子句,如下所示:
select Item, SUM(Quantity) as TotalQuantity
from Sales
group by Item
having SUM(Quantity) > 30;
此查詢將返回總銷售數量超過30的物品的列表。結果集將會是:
Result
------------------------
| Item | TotalQuantity |
------------------------
| Notebook | 50 |
| Eraser | 35 |
------------------------
在這個結果中,只有Notebook
和Eraser
顯示在列表中,因為它們的TotalQuantity
值分別是50和35,都大于30。
2.2 查詢重復數據
在SQL Server中,要篩選出重復的數據,可以使用group by
和having
子句結合聚合函數。例如,我么想要找出Sales
表中Item
字段重復的記錄,可以使用以下查詢:
select Item, COUNT(*)
FROM Sales
GROUP BY Item
HAVING COUNT(*) > 1;
這個查詢是按Item
分組的,然后數每個分組的行數。having count(*) > 1
這個條件將篩選出那些行數大于1的分組,也就是那些有重復Item
值的記錄。
在SQL中,COUNT(*)
是一個聚合函數,用來計算某個結果集中的行數。它會包含所有的行,包括NULL值在內。這里使用COUNT(*)
來找出Sales
表中Item
字段重復的記錄。這里COUNT(*)
計算的是每個Item
分組內的記錄數,然后使用having COUNT(*) > 1
來過濾,只顯示那些出現(xiàn)了不止一次的Item
,這樣就能找出重復的記錄。
現(xiàn)在假設Sales
表的內容如下所示:
Sales Table
-------------------------------------
| ID | Item | Quantity | SaleDate |
-------------------------------------
| 1 | Pen | 10 | 2023-01-01 |
| 2 | Notebook | 20 | 2023-01-01 |
| 3 | Pen | 5 | 2023-01-02 |
| 4 | Eraser | 15 | 2023-01-02 |
| 5 | Notebook | 30 | 2023-01-03 |
| 6 | Pen | 10 | 2023-01-03 |
-------------------------------------
運行上述查詢后,會得到如下結果:
Result
------------------------
| Item | (No column name) |
------------------------
| Pen | 3 |
| Notebook | 2 |
------------------------
這個結果中顯示了Pen
和Notebook
是重復的,因為它們各自出現(xiàn)了3次和2次。
(不常用)如果我們還想要獲取到具體的重復記錄,可以使用子查詢或者with
關鍵字(CTE,也就是公用表達式)來獲取這些數據。以下是使用子查詢的例子:
select *
from Sales
where Item in (
select Item
from Sales
group by Item
having COUNT(*) > 1
);
這個查詢返回了Item
字段重復的所有記錄。
而下面是使用CTE的例子:
with DuplicateItems as (
select Item, COUNT(*) AS Count
from Sales
group by Item
having COUNT(*) > 1
)
select s.*
from Sales s
Inner join DuplicateItems d on s.Item = d.Item;
這個查詢使用CTE先找出重復的Item
,然后通過內連接返回Sales
表中相關的所有記錄。文章來源:http://www.zghlxwxcb.cn/news/detail-820914.html
運行上述任一查詢后,你將會得到包含重復Item
所有數據的結果集,它們都包含Item
為Pen
和Notebook
的記錄。文章來源地址http://www.zghlxwxcb.cn/news/detail-820914.html
到了這里,關于SQL Server多數據表之間的數據查詢和分組查詢的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!