第九單元 連接查詢

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...