內連接,又稱作普通連接或自然連接,是一種基本的數據庫操作,用于合并來自不同表格的信息。它會從結果集中刪除所有與另一個表格中沒有匹配行的行,因此可能丟失一些信息。
SQL連接查詢分類
內連接
內連接通過比較兩個表格中指定字段的值來確定它們之間的聯系。其語法形式為:
```sql
SELECT fieldlist FROM table1 INNER JOIN table2 ON table1.column = table2.column
```
這種連接只會返回符合條件的行,其他不符合條件的行會被過濾掉。
外連接
左連接
左連接的特點在于,無論右邊表格是否有對應的匹配行,都會顯示左邊表格的所有行。其語法示例為:
```SQL
SELECT courses.cno, max(coursename), 計數(sno)
FROM courses LEFT JOIN grades ON courses.cno = grades.cno
GROUP BY courses.cno
```
右連接
右連接與左連接類似,只是角色互換,無論左邊表格是否有對應的匹配行,都會顯示右邊表格的所有行。
全連接
全連接會顯示左右兩個表格的所有行,包括沒有對應匹配行的行。其語法示例為:
```SQL
SELECT sno, name, major
FROM students FULL JOIN majors ON students.mno = majors.mno
```
自身連接
自身連接是指對同一個表格進行連接,通常需要使用別名來區分不同的實例。其語法示例為:
```sql
SELECT c1.cno, c1.coursename, c1.pno, c2.coursename
FROM courses c1, courses c2 WHERE c1.pno = C2Cno
```
交叉連接
交叉連接會產生笛卡爾積,即將第一個表格中的每一行與第二個表格中的每一行組合起來。其語法示例為:
```SQL
SELECT lastname + firstname FROM lastname CROSS JOIN firstanme
```
嵌套查詢
嵌套查詢可以通過`IN`或`EXISTS`關鍵字實現。例如,查詢某個學生的同鄉時,可以使用以下語句:
```sql
SELECT * FROM students
WHERE native IN (SELECT native FROM students WHERE name = '李山')
```
排序
SQL中的`ORDER BY`子句可用于按指定字段進行排序,默認為升序(`ASC`),也可以指定為降序(`DESC`)。例如,按平均成績排序時,可以使用以下語句:
```sql
SELECT sno, 計數(*), avg(mark) FROM grades
GROUP BY sno HAVING avg(mark) > 85
ORDER BY 3 DESC
```
注意事項
空格處理
當字段名稱包含空格時,需要用方括號`[]`將其括起來以確保正確識別。
NULL值處理
如果想要查找某個字段為空的行,可以使用`IS NULL`條件,例如:
```SQL
SELECT sno, courseno FROM grades WHERE mark IS NULL
```
ANY與ALL區別
在嵌套查詢中,`ANY`相當于邏輯運算符`OR`,而`ALL`相當于邏輯運算符`AND`。
否定查詢陷阱
在進行否定意義的查詢時,需要注意避免誤判。例如,查詢沒有選修某個課程的學生時,正確的語句應該是:
```sql
SELECT * FROM students
WHERE NOT EXISTS (SELECT * FROM grades WHERE grades.sno = students.sno AND cno = 'B2')
```
多重嵌套查詢
對于復雜的多重嵌套查詢,需要仔細分析并逐步排除不符合條件的行。例如,查詢選修了所有課程的學生時,可以使用以下語句:
```SQL
SELECT *
FROM students
WHERE NOT EXISTS (
SELECT *
FROM courses
WHERE NOT EXISTS (
SELECT *
FROM grades
WHERE sno = students.sno AND cno = courses.cno
)
)
```
實例
內連接的一個簡單例子是在兩個Excel工作簿之間建立連接。假設有一個出貨表和一個產品表,分別存儲著出貨信息和產品的詳細資料。出貨表包含日期、客戶、產品編碼和數量等字段,而產品表包含產品編碼、產品名稱和生產廠家等字段。為了將這兩個表格連接起來,我們可以使用內連接,條件為出貨表的產品編碼等于產品表的產品編碼。這樣得到的結果集將會包含出貨表和產品表中所有匹配的行,即具有相同的商品編碼的行。
參考資料 >
內連接 .簡書.2024-10-24
SQL內連接與外連接的區別.豆丁網.2024-10-24
兩通球閥 法蘭連接內螺紋連接.豆丁建筑網.2024-10-24