MySQL -- 連接查詢

MySQL使用連接查詢(JOIN)是為了從多個相關表中獲取數據。連接查詢是一種強大且常用的操作,可以根據某些條件將兩張或多張表中的數據組合在一起,返回一個聯合結果集。

1.為什么使用連接查詢

  1. 數據規范化

    • 數據庫設計時通常會將數據拆分到不同的表中,以減少數據冗余和提高數據一致性。這種方法稱為規范化。
    • 例如,將用戶信息存儲在一個表中,將訂單信息存儲在另一個表中。這時,如果你需要獲取某用戶的訂單信息,就需要使用連接查詢將這兩個表的數據組合在一起。
  2. 提高查詢效率

    • 通過使用連接查詢,可以減少重復的數據存儲,優化數據的管理和查詢效率。
    • 比如,一個表中存儲用戶ID,另一個表中存儲用戶詳細信息,查詢時只需要連接用戶ID和詳細信息表即可獲取完整信息,而不需要在單個表中存儲冗余數據。
  3. 復雜查詢需求

    • 在實際應用中,很多查詢需求都涉及多個表的數據。例如,報表生成、數據分析、統計等都需要從多個表中提取相關數據。
    • 連接查詢可以實現這些復雜的查詢需求,通過合并相關表的數據來滿足業務邏輯。

2.主要類型的連接查詢

INNER JOIN

  • 僅返回兩個表中滿足連接條件的記錄。
SELECT users.username, orders.order_id
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
  • 說明:這將返回所有用戶和他們的訂單,前提是用戶和訂單在兩個表中都有匹配。

LEFT JOIN (或 LEFT OUTER JOIN)

  • 返回左表中的所有記錄,即使右表中沒有匹配的記錄。如果右表沒有匹配,則結果為NULL。
SELECT users.username, orders.order_id
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
  • 說明:這將返回所有用戶以及他們的訂單。如果某個用戶沒有訂單,則相應的訂單ID將為NULL。

RIGHT JOIN (或 RIGHT OUTER JOIN)

  • 返回右表中的所有記錄,即使左表中沒有匹配的記錄。如果左表沒有匹配,則結果為NULL。
SELECT users.username, orders.order_id
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;
users. Username
  • 說明:這將返回所有訂單以及對應的用戶。如果某個訂單沒有匹配的用戶,則相應的用戶名將為NULL。

FULL JOIN (或 FULL OUTER JOIN)

  • 返回左表和右表中的所有記錄,如果沒有匹配則返回NULL。MySQL不直接支持FULL JOIN,可以通過UNION實現。
SELECT users.username, orders.order_id
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id
UNION
SELECT users.username, orders.order_id
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;
users. Username

3.測試連接查詢

  1. student 表

  • 存儲學生的基本信息。
  • uid:學生的唯一標識(主鍵),自動遞增。
  • name:學生姓名。
  • age:學生年齡。
  • sex:學生性別,使用枚舉類型,值可以是'M'或'W'。
  1. course 表

  • 存儲課程的基本信息。
  • cid:課程的唯一標識(主鍵),自動遞增。
  • cname:課程名稱。
  • credit:課程學分。
  1. exame 表

  • 存儲考試信息,包括學生、課程和考試成績。
  • uid:學生ID,對應student表中的uid
  • cid:課程ID,對應course表中的cid
  • time:考試時間。
  • score:考試成績。
  • PRIMARY KEY(uid,cid):聯合主鍵,確保每個學生在每門課程中只有一個成績記錄。
CREATE TABLE student(
uid INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
sex ENUM('M','W') NOT NULL);CREATE TABLE course(
cid INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
cname VARCHAR(50) NOT NULL,
credit TINYINT UNSIGNED NOT NULL);CREATE TABLE exame(
uid INT UNSIGNED NOT NULL,
cid INT UNSIGNED NOT NULL,
time DATE NOT NULL,
score FLOAT NOT NULL,
PRIMARY KEY(uid,cid));

插入一些數據

-- 插入數據到 student 表
INSERT INTO student (name, age, sex) VALUES 
('Alice', 20, 'W'),
('Bob', 21, 'M'),
('Charlie', 22, 'M'),
('David', 20, 'M'),
('Eve', 21, 'W');-- 插入數據到 course 表
INSERT INTO course (cname, credit) VALUES 
('Mathematics', 3),
('Physics', 4),
('Chemistry', 3),
('Biology', 2),
('Computer Science', 3);-- 插入數據到 exame 表
INSERT INTO exame (uid, cid, time, score) VALUES 
(1, 1, '2024-01-10', 85.5),
(1, 2, '2024-01-11', 90.0),
(2, 1, '2024-01-9', 88.0),
(2, 3, '2024-01-10', 92.5),
(3, 4, '2024-01-12', 75.0),
(3, 5, '2024-01-9', 80.0),
(4, 2, '2024-01-12', 85.0),
(4, 3, '2024-01-12', 87.5),
(5, 1, '2024-01-11', 89.0),
(5, 5, '2024-01-11', 95.0);

?

?

?

?內連接

SELECT a.屬性名1,a.屬性名2,...,b,屬性名1,b.屬性名2... FROM table_name1 a inner join table_name2 b on a.id = b.id where a.屬性名 滿足某些條件;

預置條件:uid:1 cid:2
select score from exame where uid=1 and cid=2;
select a.uid,a.name,a.age,a.sex from student a where a.uid=1;
select c.score from exame c where c.uid=1 and c.cid=2;

連接兩張表查詢

// on a.uid=c.uid 區分大表 和 小表,按照數據量來區分,小表永遠是整表掃描,然后去大表搜索 // 從student小表中取出所有的a.uid,然后拿著這些uid去exame大表中搜索 // 對于inner join內連接,過濾條件寫在where的后面和on連接條件里面,效果是一樣的

select a.uid,a.name,a.age,a.sex,c.score from student a
inner join exame c on a.uid=c.uid where c.uid=1 and c.cid=2;

select b.cid,b.cname,b.credit from course b where b.cid=2;

?

select a.uid,a.name,a.age,a.sex,b.cid,b.cname,b.credit,c.score
from exame c
inner join student a on c.uid=a.uid
inner join course b on c.cid=b.cid
where c.uid=1 and c.cid=2;

select a.uid,a.name,a.age,a.sex,b.cid,b.cname,b.credit,c.score
from exame c
inner join student a on c.uid=a.uid
inner join course b on c.cid=b.cid
where c.cid=2 and c.score>=90.0;

select b.cid,b.cname,b.credit,count(*)
from exame c
inner join course b on c.cid=b.cid
where c.score>=90.0
group by c.cid
having c.cid=2;//分組以后的過濾

select b.cid,b.cname,b.credit,count(*) cnt
from exame c
inner join course b on c.cid=b.cid
where c.score>=90.0
group by c.cid
order by cnt;

外連接查詢

左連接查詢

SELECT a.屬性名列表, b.屬性名列表 FROM table_name1 a LEFT [OUTER] JOIN table_name2 b on a.id = b.id;

// 把left這邊的表所有的數據顯示出來,在右表中不存在相應數據,則顯示NULL
select a.* from User a left outer join Orderlist b on a.uid=b.uid where
a.orderid is null;

?例子:

?

select a.*,b.* from student a left join exame b on a.uid=b.uid;

找出沒有考過試的

select a.*,b.* from student a left join exame b on a.uid=b.uid where b.cid is null;

內連接結果如下

左連接結果如下

?問題,為啥左連接沒有把左表全部信息顯示,左連接和內連接結果一樣

若把where條件放到連接條件on后面

原因分析:

先用b.cid把b表過濾下

?這個內連接和外連接毫無區別,是一樣的。所以外連接要把過濾條件寫到on中

外連接查不存在的場景,還帶有一定的限制條件,限制條件加到on的連接條件后面,where的過濾條件后面寫null判空。

右連接查詢

SELECT a.屬性名列表, b.屬性名列表 FROM table_name1 a LEFT [OUTER] JOIN table_name2 b on a.id = b.id;

// 把right這邊的表所有的數據顯示出來,在左表中不存在相應數據,則顯示NULL
select a.* from User a right outer join Orderlist b on a.uid=b.uid where
b.orderid is null;
select * from student where uid not in (select distinct uid from exame);

?select distinct uid from exame-》會產生一張中間表存儲結果供外面的sql來查詢

not in 對于索引的命中并不高

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21701.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21701.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21701.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

站點被篡改快照被劫持解決服務方法教程_一招制敵

站點被篡改快照被劫持解決服務方法教程_一招制敵 被篡改表現形式: 站點打不開或跳轉到別的網站。 攻擊者目的: 報復、勒索、賣防御產品(如DDOS防御產品)。 攻擊成本: 工具(如VPN購買)成本、人…

智能工廠生產設備實時監控技術的UI設計

智能工廠生產設備實時監控技術的UI設計

Flutter的Dart語法入門

文章目錄 前言1. 類型聲明2. 數據類型2.1 基本數據類型常量 2.2 String2.3 集合2.4 unicode 3. Dart函數特征3.1 可變參數列表和默認入參3.2 匿名函數3.3 typedef 4. Dart面向對象4.1 構造函數4.2 訪問權限4.3 類的繼承 參考資料附錄 前言 每個語言都有控制流語句就不寫測試代…

Go 語言的控制結構:條件與循環

Go 語言提供了豐富的控制結構,使得開發者可以編寫出具有復雜邏輯的程序。這些控制結構包括用于條件分支的 if-else 和 switch 語句,循環控制的 for 語句,以及用于控制循環執行流的 break 和 continue 關鍵字。此外,Go 語言還支持 …

約瑟夫游戲(編號+密碼)

編號為1、2、3、...、N的N個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。從指定編號為1的人開始,他的密碼為M的初始值,按順時針方向從1號自己開始順序報數,報到指定數M時停止報數,報M的人…

i18n-demo

一、demo 1、資源文件準備 resources下放各個語言文件,直接放resources下都行。我新建一個文件夾,

房地產vr全景展示交互視頻讓購房者更有參與感

在當今房地產市場中,購房者的需求日益多樣化和個性化。為滿足這一趨勢,我們創新性地將VR虛擬現實技術應用于樓盤宣傳,為購房者帶來前所未有的沉浸式購房體驗。 一、地理位置全景展示 通過實景拍攝與VR技術的結合,我們為購房者呈現…

day26-單元測試

1. 單元測試Junit 1.1 什么是單元測試?(掌握) 1.2 Junit的特點?(掌握) 1.3 基本用法:(掌握) 實際開發中單元測試的使用方式(掌握) public class …

C語言,排序

前言 排序,可以說是數據結構中必不可缺的一環。我們創造數據存儲它,要想知道數據之間的聯系,比較是必不可少的。不然,費勁心思得來的數據若是不能有更多的意義,那么拿到了又有什么用? 排序是計算機內經常進…

風險投資公司正在幫助小投資者購買Anthropic、OpenAI等熱門公司的股票

近年來,風險投資公司對于人工智能(AI)領域的公司,如Anthropic、Groq、OpenAI等,表現出了極高的投資熱情。這些公司因為它們在AI技術方面的創新而備受矚目。但是,對于很多小投資者來說,由于資金有…

[C#]使用C#部署yolov8的目標檢測tensorrt模型

【測試通過環境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述環境版本不一樣的需要重新編譯TensorRtExtern.dll,TensorRtExtern源碼地址:TensorRT-CShar…

期權的權利金怎么算的

期權權利金的計算涉及多個因素,包括敲定價格、到期時間以及整個期權合約的具體情況。期權的權利金具體的計算公式和因素可能因不同的期權合約和市場條件而有所不同,下文為大家介紹期權的權利金怎么算的 ?本文來自:期權醬 一、期權…

【LeetCode】二叉樹oj專題

如有不懂的地方,可查閱往期相關文章! 個人主頁:小八哥向前沖~ 所屬專欄:數據結構【c語言】 目錄 單值二叉樹 對稱二叉樹 計算二叉樹的深度 二叉樹的前序遍歷 相同二叉樹 另一棵樹的子樹 二叉樹的構建和遍歷 翻轉二叉樹 判…

spring boot 中的異步@Async

spring boot 開啟異步調用 1、啟動類上添加EnableAsync注解,表示啟動異步 2、在具體實現異步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

YOLOv3+mAP實現金魚檢測

YOLOv3mAP實現金魚檢測 Git源碼地址:傳送門 準備數據集 按幀數讀取視頻保存圖片 video2frame.py使用labelimg標注工具對圖片進行標注統一圖片大小為 416x416,并把標簽等信息寫成.xml文件 conver_point.py讀取縮放后的標簽圖片,轉為左上角右下…

如何快速部署上線項目

CSDN 的小伙伴們,大家好呀,我是蒼何。 今天在群里面看到有小伙伴反饋說,面試的時候一被問到簡歷中的項目還沒上線,就不繼續問了,感覺挺奇葩的,要知道就校招來說,項目本身大部分都是練手的項目&…

Linux基礎1-基本指令3

上篇文章我們說到了文件,pwd,touch,mkdir等知識。 Linux基礎1-基本指令2(你真的了解文件嗎?)-CSDN博客 本文繼續梳理其他基礎命令 1.本章重點 1.刪除一個空目錄命令rmdir 2.刪除一個文件指令rm(重要!) 3.man命令&am…

Lf工作流自定義html節點

1.定義js文件CustomCircle.js import { HtmlNode, HtmlNodeModel } from "logicflow/core"; class UmlModel extends HtmlNodeModel {setAttributes() {this.text.editable false; // 禁止節點文本編輯// 設置節點寬高和錨點const width 120;const height 70;thi…

做視頻號小店保證金要交多少?保證金提現條件是什么?

大家好,我是噴火龍。 做視頻號小店也是需要繳納保證金的,保證金分為類目保證金和浮動保證金。 先來說說類目保證金,類目保證金由視頻號小店主體資質類型和經營商品類目決定。 類目保證金有以下三點需要注意: 1. 如果你要申請新…

CentOS 7~9 救援模式恢復root密碼實戰指南

在管理Linux服務器時,忘記root密碼是一件棘手的事情,但幸運的是,CentOS提供了救援模式來幫助我們重置root密碼。本文將詳細介紹如何通過GRUB引導菜單進入緊急模式(或稱為救援模式),進而恢復root用戶的密碼。…