【資料庫】sql連表查詢
SQL總結 連表查詢
連線查詢包括合併、內連線、外連線和交叉連線,如果涉及多表查詢,瞭解這些連線的特點很重要。
只有真正瞭解它們之間的區別,才能正確使用。
1、Union
UNION 運算子用於合併兩個或多個 SELECT 語句的結果集。
UNION 運算子透過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。
當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
注意:使用UNION時,兩張表查詢的結果有相同數量的列、列型別相似。
學生表資訊(Students):
ID | Name | Age | City | MajorID |
101 | Tom | 20 | BeiJing | 10 |
102 | Lucy | 18 | ShangHai | 11 |
教師表資訊(Teachers):
ID | Name |
101 | Mrs Lee |
102 | Lucy |
預置指令碼:
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)
INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')
1)基本UNION查詢,查詢學校教師、學生的總的資訊表,包括ID和姓名
SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers
查詢結果:
ID | Name |
101 | Mrs Lee |
101 | Tom |
102 | Lucy |
2)帶條件的UNION查詢,也可以查詢同一張表,查詢年齡為18,23歲的學生資訊
SELECT ID,Name FROM Student WHERE Age=18
UNION
SELECT ID,Name FROM Student WHERE Age=23
當然,這可以使用IN或者OR很容易實現,這裡只是點到,以後遇到複雜查詢,相信你會用到。
3)查詢教師學生全部姓名
因為UNION只會選擇不同的值,如果學生中和教師中有重名的情況,這就需要UNION ALL
SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers
查詢結果:
ID | Name |
101 | Tom |
102 | Lucy |
101 | Mrs Lee |
102 | Lucy |
2、INNER JOIN(內連線)
INNER JOIN(內連線),也成為自然連線
作用:根據兩個或多個表中的列之間的關係,從這些表中查詢資料。
注意: 內連線是從結果中刪除其他被連線表中沒有匹配行的所有行,所以內連線可能會丟失資訊。
重點:內連線,只查匹配行。
語法:(INNER可省略)
SELECT fieldlist
FROM table1 [INNER] join table2
ON table1.column=table2.column
學生表資訊(Students):
ID | Name | Age | City | MajorID |
101 | Tom | 20 | BeiJing | 10 |
102 | Lucy | 18 | ShangHai | 11 |
專業資訊表(Majors):
ID | Name |
10 | English |
12 | Computer |
預置指令碼:
DELETE FROM Students
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)
DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')
例項:查詢學生資訊,包括ID,姓名、專業名稱
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID
查詢結果:
ID | Name | MajorName |
101 | Tom | English |
根據結果可以清晰看到,確實只有匹配的行。學生Lucy的資訊丟失了。
但是,inner join也會產生重複資料。如果將Majors表的主鍵約束去掉,可以插入重複的ID,如:
DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(10,'Computer')
繼續執行上面的關聯語句,結果為:
ID | Name | MajorName |
101 | Tom | English |
101 | Tom | Computer |
如果是LEFT JOIN也會有重複記錄,其結果為:
ID | Name | MajorName |
101 | Tom | English |
101 | Tom | Computer |
102 | Lucy | NULL |
RIGHT JOIN 結果與INNER JOIN一樣。
後續我們會深入研究JOIN的具體原理。
3、外連線
與內連線相比,即使沒有匹配行,也會返回一個表的全集。
外連線分為三種:左外連線,右外連線,全外連線。對應SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我們省略outer 這個關鍵字。寫成:LEFT/RIGHT/FULL JOIN。
重點:至少有一方保留全集,沒有匹配行用NULL代替。
1)LEFT OUTER JOIN,簡稱LEFT JOIN,左外連線(左連線)
結果集保留左表的所有行,但只包含第二個表與第一表匹配的行。第二個表相應的空行被放入NULL值。
依然沿用內連結的例子
(1)使用左連線查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID
結果:
ID |
Name |
MajorName |
101 |
Tom |
English |
102 |
Lucy |
NULL |
結論:
透過結果,我們可以看到左連線包含了第一張表的所有資訊,在第二張表中如果沒有匹配項,則用NULL代替。
2)RIGHT JOIN(right outer join)右外連線(右連線)
右外連線保留了第二個表的所有行,但只包含第一個表與第二個表匹配的行。第一個表相應空行被入NULL值。
右連線與左連線思想類似。只是第二張保留全集,如果第一張表中沒有匹配項,用NULL代替
依然沿用內連結的例子,只是改為右連線
(1)使用右連線查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID
查詢結果:
ID |
Name |
MajorName |
101 |
Tom |
English |
NULL |
NULL |
Computer |
透過結果可以看到,包含了第二張表Majors的全集,Computer在Students表中沒有匹配項,就用NULL代替。
3)FULL JOIN (FULL OUTER JOIN,全外連線)
全外連線,簡稱:全連線。會把兩個表所有的行都顯示在結果表中
1)使用全連線查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID
查詢結果:
ID |
Name |
MajorName |
101 |
Tom |
English |
102 |
Lucy |
NULL |
NULL |
NULL |
Computer |
包含了兩張表的所有記錄,沒有記錄丟失,沒有匹配的行用NULL代替。
4、CROSS JOIN(交叉連線)
交叉連線。交叉連線返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連線也稱作笛卡爾積。
簡單查詢兩張表組合,這是求笛卡兒積,效率最低。
笛卡兒積:笛卡爾乘積,也叫直積。假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1), (a,2),(b,0),(b,1), (b,2)}。可以擴充套件到多個集合的情況。類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選 課情況。
1)交叉連線查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
查詢結果:
ID |
Name |
MajorName |
101 |
Tom |
English |
102 |
Lucy |
English |
101 |
Tom |
Computer |
102 |
Lucy |
Computer |
2)查詢多表,其實也是笛卡兒積,與CROSS JOIN等價,以下查詢同上述結果一樣。
這個可能很常見,但是大家一定要注意了,這樣就查詢了兩張表中所有組合的全集。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors
3)加了查詢條件
注意:在使用CROSS JOIN關鍵字交叉連線表時,因為生成的是兩個表的笛卡爾積,因而不能使用ON關鍵字,只能在WHERE子句中定義搜尋條件。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID
查詢結果:
ID |
Name |
MajorName |
101 |
Tom |
English |
查詢結果與INNER JOIN一樣,但是其效率就慢很多了。
5、全部例項指令碼
CREATE DATABASE TestDB
USE TestDB
------------------------------------------
--建立相關表
IF OBJECT_ID('Students','U') IS NOT NULL
DROP TABLE Students
--學生資訊表
CREATE TABLE Students(
ID int primary key not null,
Name nvarchar(50),
Age int,
City nvarchar(50),
MajorID int
)
--專業資訊表
IF OBJECT_ID('Majors','U') IS NOT NULL
DROP TABLE Majors
CREATE TABLE Majors(
ID int primary key not null,
Name nvarchar(50)
)
--教師資訊表
IF OBJECT_ID('Teachers','U') IS NOT NULL
DROP TABLE Teachers
CREATE TABLE Teachers(
ID int primary key not null,
Name nvarchar(20) not null
)
--預置資料
DELETE FROM Students
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)
DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')
DELETE FROM Teachers
INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')
SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers
SELECT ID,Name FROM Students
UNION ALL
SELECT ID,Name FROM Teachers
--內連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID
--左連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID
--右連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID
--全連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID
--交叉連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
--交叉連線
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID
--一次查詢多表
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors
相關文章
- 資料庫資料的查詢----連線查詢2017-08-12資料庫
- go 連線資料庫 - GORM學習 - sql查詢2020-12-05Go資料庫ORMSQL
- SQL Server 查詢資料庫中所有表資料條數2024-05-06SQLServer資料庫
- mysql資料庫連表查詢的幾種方法2020-07-23MySql資料庫
- 資料庫三表連線查詢怎麼做2015-07-30資料庫
- SQL server資料庫表碎片比例查詢語句2018-12-20SQLServer資料庫
- 資料庫 - 連線查詢、巢狀查詢、集合查詢2015-05-05資料庫巢狀
- 資料庫基礎查詢--單表查詢2018-07-15資料庫
- CDA資料分析師 - SQL資料庫基礎 查詢&連線2019-03-01SQL資料庫
- SQL Server 跨資料庫查詢2020-05-17SQLServer資料庫
- 【SQL】查詢及修改資料庫預設表空間2009-07-17SQL資料庫
- SQL總結(二)連表查詢2015-11-30SQL
- 資料庫中單表查詢2020-10-05資料庫
- 查詢資料庫表是否存在2014-08-01資料庫
- sql 連線查詢例項(left join)三表連線查詢2019-07-17SQL
- SQL SERVER 資料庫查詢表和欄位資訊語句2014-11-14SQLServer資料庫
- PHP連線、查詢MySQL資料庫2018-09-05PHPMySql資料庫
- SQL Server 查詢資料庫中所有的表名及行數2016-05-04SQLServer資料庫
- 資料庫全表查詢之-分頁查詢優化2020-12-31資料庫優化
- 資料庫學習(四)連線查詢2019-01-22資料庫
- [轉] 連線資料庫查詢手冊2004-12-27資料庫
- Android SQL資料庫查詢方法 query( )2018-12-23AndroidSQL資料庫
- 優化SQL Server資料庫查詢方法2010-01-12優化SQLServer資料庫
- mysql連表查詢出現資料重複2024-07-03MySql
- sql查詢一張表的重複資料2015-08-05SQL
- SQL裡3個表的連線查詢2015-01-06SQL
- SQL Server實戰四:查詢資料庫的資料2024-05-06SQLServer資料庫
- 查詢MySQL資料庫,MySQL表的大小2020-11-03MySql資料庫
- SQL連線查詢2020-04-06SQL
- 資料庫查詢2012-10-10資料庫
- 資料庫 - 資料查詢2015-05-05資料庫
- MySQL資料庫:7、SQL常用查詢語句2022-11-25MySql資料庫
- 改進資料庫效能-SQL查詢優化2014-05-18資料庫SQL優化
- SQL Server:基於WEB的資料庫查詢2009-11-04SQLServerWeb資料庫
- C語言連線mysql資料庫查詢中文的資料表亂碼問題2016-02-11C語言MySql資料庫
- 關係型資料庫查詢語言 SQL 和圖資料庫查詢語言 nGQL 對比2020-07-23資料庫SQL
- JPA 連表查詢2019-01-31
- 資料庫學習筆記之查詢表2021-01-03資料庫筆記