數據庫Mysql_聯合查詢

或許自己的不完美才是最完美的地方,那些讓自己感到不安的瑕疵,最終都會變成自己的特色。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?----------陳長生.


1.介紹

1.1.為什么要進行聯合查詢

? ? ? ? 在數據設計的時候,由于范式的需求,會被分為多個表,但是當我們要查詢數據時,單單一張表的內容是完全不夠的,可能需要查詢的數據覆蓋多個表,那么我們就需要對表進行聯合查詢,也就是將多個表連接在一個表中。

1.2.如何實現聯合查詢

select * from 表1,表2;

select * from student,class;

將所有參與的表取他們的笛卡爾積,并將結果呈現在一張臨時表中。

但是查詢出來的結果有重復的值,我們需要對該表進行過濾

????????可以看到,一個學生表中唐三藏的class_id對應多個班級表中的class_id,意思為原本屬于1班的唐三藏現在屬于1,2,3班,這種結果是不正確的,那我們在查詢的時候就要聲明一個班級只有一個唐三藏,其余學生也是一樣,在MySql中我們稱之為連接條件。

select * from student,class where student.class_id=class.class_id;

這樣才是正確的結果

練習數據:

# 課程表

drop table if exists course;
create table if not exists course(
? course_id bigint primary key auto_increment,
? name varchar(20),
? student_id bigint?
);

# 分數表

drop table if exists score;
create table if not exists score(
? score double,
? student_id bigint,
? course_id bigint?
);

# 班級表

drop table if exists class;
create table if not exists class(
? class_id bigint primary key auto_increment, ?
? name varchar(20),
? student_id bigint
); ?

# 學生表

drop table if exists student;
create table if not exists student(
? id bigint primary key auto_increment,
? name varchar(20),
? sno bigint,
? age int,
? gender int,
? enroll_date varchar(20),
? class_id bigint
);


# 課程表
insert into course (name)values ('Java'), ('C++'), ('MySQL'), ('操作系統'), ('計算機網絡'), ('數據結構');
# 班級表
insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
# 學生表
insert into student (name, sno, age, gender, enroll_date, class_id) values?
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孫悟空', '100002', 18, 1, '1986-09-01', 1),
('豬悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟凈', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想畢業', '200004', 18, 1, '2000-09-01', 2);
# 成績表
insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

2.內連接

1.select * from 表1 別名1,表2 別名2 where 連接條件 and 連接條件;(常用*)

2.select * from 表1 別名1,join 表2?別名2 on 連接條件 and 連接條件;?

2.1.查找武松的信息

select * from student s,class c where s.class_id=c.class_id and s.name='武松';

?select * from student s join class c on s.class_id=c.class_id and s.name='武松';

2.2.查詢所有同學每門課的成績以及同學的個人信息

select * from student s, score sc, course c?
where
s.id=sc.student_id
and
c.course_id=sc.course_id;

2.3.查詢所有同學的總成績以及同學的個人信息

select s.name,sum(sc.score) from student s,score sc?
where
s.id=sc.student_id
group by s.id;

3.外連接

外連接分別為左連接,右連接,全連接(MySql不支持全連接,所以這邊就不講了)

左連接:以左表為基礎,將右表的數據插入左表中,若左表中有右表沒有的數據,則插入的數據顯示為NULL。

左連接:以右表為基礎,將左表的數據插入右表中,若右表中有左表沒有的數據,則插入的數據顯示為NULL。

全連接:左表與右表的結合

注:不管是左表還是右表,MySql在執行的過程中都會轉換為左連接,所以我們一般使用左連接

-- 左連接

select * from 左表 left join 右表 on 連接條件;

-- 右連接

select * from 左表 left join 右表 on 連接條件;

3.1.查詢沒有參加考試的同學信息

select * from student s(左表)?
left join
score sc (右表)
on?
s.id=sc.student_id(連接條件)?
where?
sc.score is null(判斷條件);

3.2.查詢沒有學?的班級

select * from class c(左表)?
left join?
student s(右表)
on?
s.class_id=c.class_id(連接條件)?
where
s.id is nul(判斷條件)l;

4.自連接

自連接就是自己與自己取笛卡爾積,可以把行轉換為列,并在查詢時過濾,就可以實現行與行之間的比較(MySql本身不支持行與行之間的比較,但是我們可以使用自連接實現)

select * from 表1 別名1,表1 別名2;

4.1.顯示所有"MySQL"成績?"JAVA"成績?的成績信息

select?s1.* from?
score s1,
score s2,
course c1,
course c2

(將成績表與課程表進行自連接)

where?
s1.student_id=s2.student_id
and?
s1.course_id=c1.course_id
and?
s2.course_id=c2.course_id

(過濾)
and?
c1.name='MySQL'
and?
c2.name='JAVA'
and?
s1.score>s2.score;

(根據題目要求進行條件判斷)

5.子查詢

子查詢也叫嵌套查詢,可以把一個查詢的結果給另外一個查詢語句當作條件

select * from 表名? where 條件=(select 條件 from 表名 ...);

5.1.單行子查詢

5.1.1.查詢與"不想畢業"同學的同班同學

-- 正常查詢 (先查找不想畢業所在班級再通過班級找到同班同學)

select class_id from student where name='不想畢業' ;
select name from student where class_id=2;

-- 單行子查詢(查詢名字后,直接通過子查詢判斷class_id條件)

select name from student ?

where

class_id=(select class_id from student where name='不想畢業' );

5.2.多行子查詢

嵌套查詢可以返回多行數據 ,使用in關鍵詞

select * from 表名? where 條件? in(select 條件 from 表名 ...);

5.2.1.查詢"MySQL"或"Java"課程的成績信息

--正常查詢

select course_id from course where name ='MySQL' or name='Java';
select * from score where course_id=1 or course_id=3 ;

--多行子查詢

select * from score

where

course_id

in

(select course_id from course where name='MySQL' or name='Java'(多行數據));

5.3.多列子查詢

5.3.1.查詢重復錄?的分數

先插入數據

insert into score values (70.5,1,1);

insert into score values (98.5,1,3);

insert into score values (99,3,5);

-- 多列子查詢

select * from score where?
(score,student_id,course_id)
?in
? (select?
?score,student_id,course_id?
?from score
?group by?
?score,student_id,course_id?
?having count(*)>1);

5.4.在from子句中使用子查詢

5.4.1.查詢所有比"Java001班"平均分?的成績信息

-- 先查平均分成績

select avg(sc.score) score from student st, class c , score sc
where
st.class_id=c.class_id
and?
c.name='JAVA001班'
and?
st.id=sc.student_id;

--再查大于平均分

select * from score s,(select avg(sc.score) score from student st, class c , score sc
where
st.class_id=c.class_id
and?
c.name='JAVA001班'
and?
st.id=sc.student_id) temp
where?
s.score>temp.score;

6.合并查詢

????????合并查詢分為 union 與union all,也就是將兩張表的數據合并為一張存在臨時表中,當前提是兩張表的列信息一樣。

6.1.union(去重)

select * from 表1 別名1?union select * from 表2?別名2;

6.2.union all(不去重)

select * from 表1 別名1?union all select * from 表2?別名2;

7.插入查詢結果

????????將一張表的數據插入到另一張表中,當前提是兩個表的列信息一樣。????????

insert into 新表(列..)select ...

7.1.將student表中C++001班的學?復制到student1表中

-- 先創建新學生表(與原本的學生表列信息相同)

?create table new_student like student;

--復制

insert into?
new_student (name,sno,gender,enroll_date,class_id)
select?
s.name,s.sno,s.gender,s.enroll_date,s.class_id?
from?
student s,class c?
where?
s.class_id=c.class_id?
and?
c.name='C++001班' ;

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

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

相關文章

(37)VTK C++開發示例 ---紋理地球

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容👉內容導航 👈👉VTK開發 👈 1. 概述 將圖片紋理貼到球體上,實現3D地球的效果。 該代碼使用了 VTK (Visualization Toolkit) 庫來創建一個紋理…

VMware-centOS7安裝redis分布式集群

1.部署redis包 1.1 在usr/local文件夾里創建文件夾 mkdir software 1.2 進入文件夾 cd /usr/local/software/ 下載redis wget http://download.redis.io/releases/redis-6.2.6.tar.gz解壓 tar zxvf redis-6.2.6.tar.gz重命名文件夾 mv redis-6.2.6 redis安裝gcc編譯器 yum i…

【RocketMQ Broker 相關源碼】- broker 啟動源碼(2)

文章目錄 1. 前言2. 創建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加載 ConsumeQueue 文件3.3 創建 StoreCheckpoint3.4 indexService.load 加載 IndexFile 文件3.5 recover 文件恢復3.6 延時消息服務加載 4. registerProcesso…

認識含鹽褶皺和沖斷帶中的前造山運動蒸發巖變形

主要觀察結果的示意圖模型,并提出了三疊紀前造山蒸發巖變形的演化模型。(a) 蒸發巖的初始平緩隆起,在鹽枕和鹽背斜頂部有滑塌褶皺和同沉積伸展斷層。(b) 底辟形成,主動刺穿和拖動折疊長底辟&…

數據庫MySQL學習——day8(復習與鞏固基礎知識)

文章目錄 1. 數據庫基礎概念復習2. 常用SQL命令復習2.1 SELECT 查詢數據2.2 INSERT 插入數據2.3 UPDATE 更新數據2.4 DELETE 刪除數據 3. 表操作復習3.1 創建表3.2 修改表3.3 刪除表 4. 實踐任務4.1 創建樣例數據庫和表4.2 插入和更新數據4.3 使用WHERE、ORDER BY、LIMIT進行查…

TS 字面量類型

str是string類型l str2是常量,類型是字面量類型 用途:配合聯合類型確定更嚴謹精確的可選值利恩

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】1.3 客戶端工具選擇(psql/PGAdmin/DBeaver)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 1.3 客戶端工具選擇(psql/PGAdmin/DBeaver)1.3.1 工具定位與適用場景1.3.2 深度解析三大工具1.3.2.1 psql:命令行的終極掌控核心特性基礎操作示例優缺點分析1.3.2.2 PGAdmin:PostgreSQL 專屬管理平臺…

2023年第十四屆藍橋杯省賽B組Java題解【 簡潔易懂】

2023年第十四屆藍橋杯省賽B組Java 題解 比賽整體情況說明 第十四屆藍橋杯大賽省賽B組Java賽道共有10道題目,題型分布如下: 題目類型題量難度分布考察重點結果填空題53簡單 2中等基礎算法、數學邏輯、字符串處理編程大題52中等 3困難動態規劃、圖論、…

深度學習中的數據增強:提升食物圖像分類模型性能的關鍵策略

深度學習中的數據增強:提升食物圖像分類模型性能的關鍵策略 在深度學習領域,數據是模型訓練的基石,數據的數量和質量直接影響著模型的性能表現。然而,在實際項目中,獲取大量高質量的數據往往面臨諸多困難,…

jakarta.mail(javax.mail)包中關于SMTP協議支持的屬性參數配置

一、程序屬性配置 NO.NameTypeDescription1mail.smtp.userStringSMTP的默認用戶名。2mail.smtp.hostString要連接的SMTP服務器。3mail.smtp.portint如果 connect()方法未明確指定一個,則要連接的SMTP服務器端口。默認為25。4mail.smtp.connectiontimeoutint套接字連…

《解鎖SCSS算術運算:構建靈動樣式的奧秘》

SCSS作為CSS預處理器,算術運算功能猶如一顆璀璨明珠,賦予我們動態計算樣式屬性值的強大能力,讓網頁樣式不再是一成不變的刻板呈現,而是能夠根據各種條件和需求靈動變化。 在SCSS的世界里,算術運算絕非孤立的存在&…

Java 入門篇

文章目錄 一、注釋1、單行注釋2、多行注釋3、文檔注釋 二、字面量注意 三、變量四、標識符 一、注釋 1、單行注釋 // 同 C992、多行注釋 /* 同 C89和 C99 等 */3、文檔注釋 /** 文檔注釋,其內容是可以提取到一個程序說明文檔中去的*/二、字面量 同 C 常量 注意…

PowerShell安裝Chocolatey

文章目錄 環境背景安裝參考 環境 Windows 11 專業版PowerShell 7.5.1.NET Framework 4.0Chocolatey v2.4.3 背景 Chocolatey是Windows上的包管理工具,有點類似于Linux的 yum 和 apt 命令。比如,PowerShell里默認沒有 grep 命令,則可以通過…

將Airtable導入NocoDB

將Airtable導入NocoDB 0. 前提條件1. 詳細步驟 NocoDB提供了一種簡化流程,可在幾分鐘內將您的Airtable數據庫無縫轉移到各種數據庫管理系統,包括MySQL、Postgres和SQLite。此功能特別適合希望將Airtable數據庫遷移到更強大且可擴展的數據庫管理系統中的用…

微軟發布了最新的開源推理模型套件“Phi-4-Reasoning

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

Elasticsearch入門速通01:核心概念與選型指南

一、Elasticsearch 是什么? 一句話定義: 開源分布式搜索引擎,擅長處理海量數據的實時存儲、搜索與分析,是ELK技術棧(ElasticsearchKibanaBeatsLogstash)的核心組件。 核心能力: 近實時搜索&…

【angular19】入門基礎教程(三):關于angular里面的響應式數據入門使用

三個框架,都有響應式數據的概念。在angular里面有專門的叫法,響應式數據叫信號,英文名signal。其他兩個框架式沒有專門的名字的,統稱為動態數據。這點可以說,angular還是太細了,細節值得點贊!! …

GitHub Actions 和 GitLab CI/CD 流水線設計

以下是關于 GitHub Actions 和 GitLab CI/CD 流水線設計 的基本知識總結: 一、核心概念對比 維度GitHub ActionsGitLab CI/CD配置方式YAML 文件(.github/workflows/*.yml).gitlab-ci.yml執行環境GitHub 托管 Runner / 自托管GitLab 共享 Runner / 自托管市場生態Actions Mar…

【網絡編程】HTTP(超文本傳輸協議)詳解

🦄個人主頁:修修修也 🎏所屬專欄:網絡編程 ??操作環境:Visual Studio 2022 目錄 📌HTTP定義 📌HTTP工作原理 1.客戶端發起請求: 2.服務器處理請求: 3.客戶端處理響應: 📌HTTP關鍵特性 🎏HTTP請求方法 &am…

Centos小白之在CentOS8.5中安裝Rabbitmq 3.10.8

注意事項 安裝以及運行等其他操作,要使用root賬號進行,否則會遇到很多麻煩的事情。 使用命令行進行遠程登錄 ssh root192.168.0.167 安裝make 執行安裝命令 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel這里有可能會…