第九單元 連接查詢

来源:https://www.cnblogs.com/xuyubing/archive/2023/11/25/17855518.html
-Advertisement-
Play Games

請問上圖中顯示的數據是一張表中的嗎? 1. 連接查詢的分類 內連接 外連接(左外連接,右外連接,全連接) 自連接 交差連接(不講) 2. 內連接 註意:Join 與 inner join等效(預設為內連接) 語法格式: select 欄位列表 from 表1 inner join 表2 on 表1. ...


 

請問上圖中顯示的數據是一張表中的嗎?

1. 連接查詢的分類

  1. 內連接

  2. 外連接(左外連接,右外連接,全連接)

  3. 自連接

  4. 交差連接(不講)

2. 內連接

註意:Join 與 inner join等效(預設為內連接)

語法格式: select 欄位列表 from 表1 inner join 表2 on 表1.外鍵=表2.外鍵 內連接:會把兩表中匹配上的數據進行連接顯示 inner join:內連接 on:當...時候 在使用連接時,儘量避免使用 * 獲取欄位

部門表(Dept)

欄位名類型主鍵非空唯一預設值描述
Id int       部門編號,自增
DName Varchar(30)     部門名稱

 

員工表(Emp)

欄位名類型主鍵非空唯一預設值描述
Id int       員工編號,自增
EName Varchar(30)     員工名稱
Sex char(4)     性別
Age tinyint     10 年齡
Sal Decimal(10,2)     0 工資
Did Int       部門編號
create database unit10;
go
use unit10;
go
create table Dept
(
    Id int primary key identity,
    DName varchar(30) not null unique
);
go
create table Emp
(
    Id int primary key identity,
    EName varchar(30) not null unique,
    Sex char(4) not null default '',
    Age tinyint not null default 10,
    Sal decimal(10,2) not null default 0,
    Did int not null
);
go
insert into Dept values('開發部'),('測試部'),('市場部'),('銷售部'),('賬務部');
go
insert into Emp values
('任我行','',30,8000,1),
('李換英','',20,3100,3),
('張三','',25,6000,2),
('李國華','',30,3000,4),
('徐媛媛','',20,7200,1),
('帥天行','',32,9000,1),
('曲芙蓉','',22,3100,3),
('李四','',25,6000,2),
('王五','',28,4000,4),
('姖倩倩','',23,5200,1);
 

--2.查詢部門編號、部門名
select Id,DName from Dept
​
--3.查詢員工姓名,薪資
select * from Emp
​
--4.查詢員工姓名,薪資,所在部門
select  * from Emp inner join Dept on Emp.Did=Dept.Id
​
--5.查詢分配了部門的員工信息和相應的部門信息(內連接)
-- Dept:部門表   Emp:員工表
select a.*,b.DName  from Emp a join Dept b on a.Did=b.Id -- 為什麼取別名,因為下麵可能還會用到這個表
-- 1.重覆意思的欄位不要查詢出來
-- 2.重名的欄位,但是欄位意思不同,此時應該把欄位取個別名
use step2;
-- 查詢學生的姓名,性別,成績
select stuName,stuSex,skillScore  from StudentInfo 
inner join StudentScore on StudentInfo.stuId=StudentScore.stuId
--查詢學生的學生編號,姓名,性別,成績,課程
--  涉及到2張表
select a.stuId,stuName,stuSex,skillScore,CourseName
from StudentInfo a join  StudentScore b on a.stuId=b.stuId
​
​
-- 查詢學生在20歲以上的 學生編號,姓名,性別,成績,課程
-- 連接查詢+條件 需要把where 放到最後面
select a.stuId,stuName,stuSex,skillScore,CourseName
from StudentInfo a join  StudentScore b on a.stuId=b.stuId
where (year(getdate())-year(stuBirthday))>20

 

等值內連接

select * from  表1  (innerjoin  表2  on  表1的主鍵列 = 表2的外鍵列
註:表1是主鍵表,表2是外鍵表
use step2;
​
-- 1.查詢出分配了班級的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id
​
-- 2.查詢出軟體技術1班的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id
where b.Name='軟體技術1班'-- 3.查詢分配了班級,年齡又在20歲以上的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id
where (year(getdate())-year(stuBirthday))>20-- 4.查詢分配了班級,年齡又在20-24之間的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id
where (year(getdate())-year(stuBirthday)) between 20 and 24-- 5.查詢沒有學生的班級名稱
-- 如果這個班有學生,是不是一定會在學生中有classId
-- 如果說在學生表中沒有出現的classId,是不是就表示 那個班沒有學生呢?
select Name from ClassInfo where id not in
(
    select classId from StudentInfo
)
​
-- 6.查詢分配了班級,性別又為女的學生和班級信息
select stuName,stuBirthday,Name,College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id
where stuSex=''
不等連接
定義:是使用除(=)以外的比較運算符查詢的內連接, 如:>>=<=<!>!<<> ,!=-- 每位同學除了自己所屬的班級外查詢出其餘可選擇的班級
select * from StudentInfo a join ClassInfo b on a.ClassId!=b.Id
​
-- 查詢其他同學的成績
select * from StudentInfo a join StudentScore b on a.stuId!=b.stuId
 

 

3. 自連接

select * from  表1  (innerjoin  表2  on  表1的主鍵列 = 表2的外鍵列
註:表1和表2是一張表
​
create table menu
(
    Id int primary key identity,
    Name varchar(30), -- 菜單名稱
    ParentId int  -- 上級菜單
) ;
​
insert into menu values('商品管理',0),('系統管理',0),('訂單管理',0) ;
insert into menu values('商品列表',1),('商品分類',1),('發佈商品',1) ;
insert into menu values('許可權管理',2),('用戶管理',2),('角色管理',2) ;
insert into menu values('訂單列表',3),('運費模板',3),('物流跟蹤',3) ;

 

-- 查詢所有菜單信息以及它的上級菜單名稱
-- 自連接一定要取別名
select a.*,b.Name from menu a inner join menu b  on a.ParentId=b.Id
​

 

 

4. 外連接

外連接是以一張表為基表,返回基表中所有記錄及連接表中 符合條件的記錄的連接查詢。

  • 左外連接

  • 右外連接

  • 全外連接

1. 左外連接

是以左表為基表,返回左表中所有記錄及連接表中符合條件的記錄的外連接。

1、以左表為基表 2、返回左表中所有數據 3、連接表不符合條件以NULL填充

use step2;
-- 1.查詢所有學生信息以及對應的班級信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
-- 左外連接:left outer join
select * from StudentInfo a left outer join  ClassInfo b on a.ClassId =b.Id
-- 左連接:以左表主表,不管是否匹配上,都會把左表中的數據都顯示出來,未匹配的數據會以NULL進行填充
​
​
-- 執行結果
180325011   任我行 5   138232044561999-09-09 00:00:00.000 5   會計3班    經濟管理系
180325012   張三  4   138232044521998-08-08 00:00:00.000 4   歐美軟體外包班 電腦系
180325013   李四  2   188992511521997-07-07 00:00:00.000 2   會計1班    經濟管理系
180325014   王五  1   135974456451998-08-08 00:00:00.000 1   軟體技術1班  電腦系
180325015   帥天行 5   138142044561998-06-06 00:00:00.000 5   會計3班    經濟管理系
180325016   葉星辰 5   176232049361998-05-05 00:00:00.000 5   會計3班    經濟管理系
180325017   趙日天 0   139220449321997-07-15 00:00:00.000 NULL    NULL    NULL
 

 

2. 右外連接

是以右表為基表,返回右表中所有記錄及連接表中符合條件的記錄的外連接。

1、以右表為基表 2、返回右表中所有數據 3、連接表不符合條件以NULL填充

-- 1.查詢所有班級信息以及對應的學生信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
select * from StudentInfo a right outer join ClassInfo b on a.ClassId=b.Id
-- 右連接:以右表為主表,不管是否匹配上,都會把右表中的數據都顯示出來,未匹配上的數據會以NULL進行填充

 



-- 執行結果
180325014   王五  1   135974456451998-08-08 00:00:00.000 1   軟體技術1班  電腦系
180325013   李四  2   188992511521997-07-07 00:00:00.000 2   會計1班    經濟管理系
NULL       NULL  NULL   NULL    NULL    NULL      3               會計2班    經濟管理系
180325012   張三  4   138232044521998-08-08 00:00:00.000 4   歐美軟體外包班 電腦系
180325011   任我行 5   138232044561999-09-09 00:00:00.000 5   會計3班    經濟管理系
180325015   帥天行 5   138142044561998-06-06 00:00:00.000 5   會計3班    經濟管理系
180325016   葉星辰 5   176232049361998-05-05 00:00:00.000 5   會計3班    經濟管理系

 

 

 

3. 全外連接

是分別以左右表為基表的外連接。

1、將左表和右表所有的記錄都顯示 2、連接表不符合條件以NULL填充

-- 1.查詢所有學生信息以及所有班級信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
-- 全連接:full  join,不管是否有沒有匹配上,都會顯示
select * from StudentInfo a full outer join ClassInfo b on a.ClassId=b.Id
​
180325011   任我行 5   138232044561999-09-09 00:00:00.000 5   會計3班    經濟管理系
180325012   張三  4   138232044521998-08-08 00:00:00.000 4   歐美軟體外包班 電腦系
180325013   李四  2   188992511521997-07-07 00:00:00.000 2   會計1班    經濟管理系
180325014   王五  1   135974456451998-08-08 00:00:00.000 1   軟體技術1班  電腦系
180325015   帥天行 5   138142044561998-06-06 00:00:00.000 5   會計3班    經濟管理系
180325016   葉星辰 5   176232049361998-05-05 00:00:00.000 5   會計3班    經濟管理系
180325017   趙日天 0   139220449321997-07-15 00:00:00.000 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C++ 動態實例化(new 和 malloc) malloc / free 工作原理 malloc 是 stdlib.h 庫中的函數,聲明為 void *__cdecl malloc(size_t _Size); 原理: malloc 函數沿空閑鏈表(位於記憶體 堆空間 中)申請一塊滿足需求的記憶體塊, ...
  • 一:背景 1. 講故事 最近接連遇到了幾起 2G 虛擬地址緊張 導致的程式崩潰,基本上 90% 都集中在醫療行業,真的很無語,他們用的都是一些上古的 XP,Windows7 x86,我也知道技術人很難也基本無法推動硬體系統和設備的升級,這裡蘊含了巨大的人情世故。 寫這一篇的目的是想系統化的整理一下如 ...
  • 介紹 C#跨平臺UI框架 提供NETStandard2.0和net4的庫,通過Netcore可以跨平臺,支持Windows、Mac、Linux,Net4的可以支持XP。 各個平臺運行效果一致,不依賴系統控制項。 支持窗體,控制項任意透明,支持異形窗體,支持SVG圖標顯示。 支持動畫,數據綁定,Mvvm模 ...
  • ConfigureAwait in .NET8 ConfigureAwait(true) 和 ConfigureAwait(false) 首先,讓我們回顧一下原版 ConfigureAwait 的語義和歷史,它採用了一個名為 continueOnCapturedContext 的布爾參數。 當對任務 ...
  • 一、緩存 緩存指在中間層中存儲數據的行為,該行為可使後續數據檢索更快。 從概念上講,緩存是一種性能優化策略和設計考慮因素。 緩存可以顯著提高應用性能,方法是提高不常更改(或檢索成本高)的數據的就緒性。 二、RFC9111 在最新的緩存控制規範文件RFC9111中,詳細描述了瀏覽器緩存和伺服器緩存控制 ...
  • 前言 自從使用docker以來,就經常聽說MySQL資料庫最好別運行在容器中,性能會損失很多。一些之前沒使用過容器的同事,對資料庫運行在容器中也是忌諱莫深,甚至只要資料庫跑在容器中出現性能問題時,首先就把問題推到容器上。 那麼到底會損失多少,性能損失會很多嗎? 為此我裝了兩個MySQL,版本都是8. ...
  • SQL中的IN運算符 IN運算符允許您在WHERE子句中指定多個值,它是多個OR條件的簡寫。 示例:獲取您自己的SQL Server 返回所有來自'Germany'、'France'或'UK'的客戶: SELECT * FROM Customers WHERE Country IN ('German ...
  • 第2章 Redis 的安裝與配置 2.1Redis 的安裝 2.1.1 克隆並配置主機 Redis在Linux上進行安裝,首先有配置Linux操作系統 2.1.2 安裝前的準備工作 (1) 安裝 gcc 由於 Redis 是由 C/C++語言編寫的,而從官網下載的 Redis 安裝包是需要編譯後才可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...