聯合查詢(多表查詢)

  • 多表查詢是對多張表的數據取笛卡爾積(關聯查詢可以對關聯表使用別名)

在這里插入圖片描述

  • 數據準備
insert into classes(name, `desc`) values
('計算機系2019級1班', '學習了計算機原理、C和Java語言、數據結構和算法'),
('中文系2019級3班','學習了中國傳統文學'),
('自動化2019級5班','學習了機械自動化');
insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋風李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素貞',null,1),
('00031','許仙','xuxian@qq.com',1),
('00054','不想畢業',null,1),
('51234','好好說話','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外學中文','foreigner@qq.com',2);
insert into course(name) values
('Java'),('中國傳統文化'),('計算機原理'),('語文'),('高階數學'),('英文')
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),
-- tellme
(80, 7, 2),(92, 7, 6);

classes

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

student

在這里插入圖片描述

course

在這里插入圖片描述

score

在這里插入圖片描述

  • 內連接(表示兩個表都存在的結果)
select 字段 from 表1 別名1 [inner] join 表2 別名2 on 連接條件 and 其他條件;
select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;

案列:查詢每個同學姓名 課程名字 分數

//方法一
select student.name,course.name,score from student,course,score where student.id = score.student_id and score.course_id = course.id;

在這里插入圖片描述

--方法二select student.name,course.name,score from student join score on student.id = score.student_id join course on score.course_id = course.id;

在這里插入圖片描述

  • 外連接

外連接分為左外連接和右外連接。如果聯合查詢,左側的表完全顯示我們就說是左外連接(如果這個記錄在右表中沒有匹配,就把對應的列填成NULL) ;右側的表完全顯示我們就說是右外連接。

-- 左外連接,表1完全顯示
select 字段名  from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯示
select 字段 from 表名1 right join 表名2 on 連接條件;
--案列
select * from score sco right join student stu on stu.id=sco.student_id;

在這里插入圖片描述

  • 自連接

自連接是指在同一張表連接自身進行查詢

select ... from 表1,表1 where 條件
select ... from 表1 join 表1 on 條件-案列
顯示所有“計算機原理”成績比“Java”成績高的成績信息
-起別名,因為兩個表的名字是一樣的
select * from  score as s1,score as s2;
-篩選出java和計算機組成原理的分數
select * from  score as s1,score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id =1;
-進行結果查詢select * from  score as s1,score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id =1 and s1.score > s2.score;

在這里插入圖片描述

  • 子查詢(簡單sql拼成復雜sql)

  • 子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢

  • 單行子查詢:返回一行記錄的子查詢

查詢與“不想畢業” 同學的同班同學:
select * from student where classes_id=(select classes_id from student where
name='不想畢業');

在這里插入圖片描述

  • 多行子查詢:返回多行記錄的子查詢
查詢“語文”或“英文”課程的成績信息
-- 使用IN
select * from score where course_id in (select id from course where
name='語文' or name='英文');
-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='語文' and name!='英文');可以使用多列包含:
-- 插入重復的分數:score, student_id, course_id列重復
insert into score(score, student_id, course_id) values
-- 黑旋風李逵
(70.5, 1, 1),(98.5, 1, 3),
-- 菩提老祖
(60, 2, 1);
-- 查詢重復的分數
SELECT* 
FROMscore 
WHERE( score, student_id, course_id ) IN ( SELECT score, student_id, 
course_id FROM score GROUP BY score, student_id, course_id HAVING
count( 0 ) > 1 );[NOT] EXISTS關鍵字:-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou 
where (name='語文' or name='英文') and cou.id = sco.course_id);
-- 使用 NOT EXISTS
select * from score sco where not exists (select sco.id from course cou 
where (name!='語文' and name!='英文') and cou.id = sco.course_id);
  • 在from子句中使用子查詢:子查詢語句出現在from子句中。這里要用到數據查詢的技巧,把一個子查詢當做一個臨時表使用。
查詢所有比“中文系2019級3班”平均分高的成績信息:
-- 獲取“中文系2019級3班”的平均分,將其看作臨時表
SELECTavg( sco.score ) score 
FROMscore scoJOIN student stu ON sco.student_id = stu.idJOIN classes cls ON stu.classes_id = cls.id
WHEREcls.NAME = '中文系2019級3班';查詢成績表中,比以上臨時表平均分高的成績:SELECT* 
FROMscore sco,(SELECTavg( sco.score ) score FROMscore scoJOIN student stu ON sco.student_id = stu.idJOIN classes cls ON stu.classes_id = cls.idWHEREcls.NAME = '中文系2019級3班') tmp 
WHEREsco.score > tmp.score;
  • 合并查詢

  • 在實際應用中,為了合并多個select的執行結果,可以使用集合操作符 union,union all。使用UNION和UNION ALL時,前后查詢的結果集中,字段需要一致。

  • union

    該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。

    案例:查詢id小于3,或者名字為“英文”的課程:
    select * from course where id<3
    union
    select * from course where name='英文';
    -- 或者使用or來實現
    select * from course where id<3 or name='英文';
    
  • union all

  • 該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行

查詢id小于3,或者名字為“Java”的課程
-- 可以看到結果集中出現重復數據Java
select * from course where id<3
union all
select * from course where name='英文';

在這里插入圖片描述

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

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

相關文章

土地規劃與文化遺產保護:在發展浪潮中守護歷史的脈絡

在這個日新月異的時代&#xff0c;城市化進程如火如荼&#xff0c;土地規劃作為引導城市發展方向的關鍵&#xff0c;承載著平衡發展與保護的重任。在追求現代化的同時&#xff0c;保護文化遺產不僅是對過去的尊重&#xff0c;更是對未來負責。本文旨在深入探討如何在土地規劃實…

uniapp----- 判斷小程序版本有沒有更新

const updateManager uni.getUpdateManager();// 當向小程序后臺請求完新版本信息&#xff0c;會進行回調updateManager.onCheckForUpdate(function (res) {console.log(是否有新版本, res.hasUpdate);});// 當新版本下載完成&#xff0c;會進行回調updateManager.onUpdateRea…

為了SourceInsight從Linux回到Windows

什么是SourceInsight 現在上網搜索這個軟件&#xff0c;大多數說他是一個代碼閱讀軟件&#xff1b;但是在官方的說法里面&#xff0c;這是一款支持多語言的編輯器。大概長這樣&#xff1a; 看起來十分老舊是吧&#xff0c;但是他其實他已經是第四代了哈哈哈。其實這個軟件是我…

字典樹模板+位運算

P3879 [TJOI2010] 閱讀理解 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) trie樹板子題&#xff0c;稍微有一丟丟不一樣&#xff0c;套用字典樹模板稍加修改就能過 手搓字典樹代碼&#xff1a; char ch[1010][26], cnt[1010], idx; void insert(string s)//插入 {int p 0…

高校搭建AIGC新媒體實驗室,創新新聞教育教學模式

高校作為人才培養的重要陣地&#xff0c;必須緊跟時代步伐&#xff0c;不斷創新教育教學模式&#xff0c;提升跨界融合育人水平&#xff0c;通過AIGC新媒體實驗室探索創新人才培養模式。AIGC新媒體實驗室不僅能夠高效賦能高校宣傳媒體矩陣&#xff0c;也可以助力教學實踐與AIGC…

ISA95-Part3-通訊協議的解析與開發指南

在 MES/MOM 系統中實現 ISA-95 標準的通信協議部分,通常涉及以下幾個關鍵步驟和應用場景: 一、關鍵步驟和應用場景: 1. ~協議選擇~: - MES/MOM 系統需選擇符合 ISA-95 標準的通信協議,常用的有 OPC UA(OLE for Process Control Unified Architecture)、XML、以及基于 H…

5分鐘讀懂GPS-RTK實時動態技術,建議收藏!

由于”智慧工地“理念的興起和發展&#xff0c;目前越來越多的企業將信息技術手段融合于施工現場安全管理&#xff0c;構建智能化的安全監管模式。基于此&#xff0c;藍牙LORA融合定位技術、UWB超寬帶定位技術、GPS-RTK定位技術等信息技術也越來越頻繁出現在大眾視野。然而&…

記錄通過Cloudflare部署屬于自己的docker鏡像源

引言 由于最近國內無法正常拉取docker鏡像&#xff0c;然而找了幾個能用的docker鏡像源發現拉取回來的docker鏡像不是最新的版本&#xff0c;部署到Cloudflare里Workers 和 Pages&#xff0c;拉取docker 鏡像成功&#xff0c;故記錄部署過程。 部署服務 登錄Cloudflare后&…

Android Gradle開發與應用(一): Gradle基礎

Gradle是一種基于Groovy語言的構建工具&#xff0c;用于自動化構建、測試和部署Android應用程序。它提供了一種靈活和可擴展的方式來管理項目的構建過程&#xff0c;并且可以輕松地集成到Android開發工作流程中。 本文將介紹Gradle的基礎知識&#xff0c;包括Gradle的安裝和配…

軟設之面向對象開發流程

面向對象開發流程分為 1.面向對象分析 2.面向對象設計 3.面向對象程序設計 4.面向對象測試 其中 面向對象分析包括 認定對象 組織對象 對象間的互相租用 基于對象的操作 識別類及對象&#xff1a; 識別類及對象 定義屬性 定義服務 識別關系 識別包 面向對象程…

C++ 智能指針內存泄漏問題

shared_ptr相互嵌套導致循環引用 代碼示例 #include <iostream> #include <memory> using namespace std;class B;class A { public:std::shared_ptr<B> b_ptr;~A() { std::cout << "A destroyed\n"; } };class B { public:std::shared_pt…

數據結構 1.1 數據結構的基本概念

本章總覽&#xff1a; 一.什么是數據 1.數據 數據是信息的載體&#xff0c;是描述客觀事物屬性的數、字符及所有能輸入到計算機中并被計算機程 序識別和處理的符號的集合。數據是計算機程序加工的原料。 早期計算機只能處理純數值的問題&#xff0c;如世界第一題計算機ENI…

轉讓北京文化傳媒公司帶營業性演出經紀許可證

影視文化傳播倡導將健康的影視文化有效傳播給觀眾&#xff0c;從而構建觀眾與電影制作者的良 性溝通與互動&#xff0c;是溝通電影制作者與電影受眾的重要橋梁。影視文化泛指以電影&#xff0c;電視方式所進行的全部文化創造&#xff0c;即體現為電影&#xff0c;電視全部的存在…

Java-List集合堆內存溢出

Java-List集合堆內存溢出 情況一情況二對照分析對照規定堆內存 情況一 往List<Object>的集合中不斷插入元素&#xff0c;集合底層的數組會不斷擴容&#xff0c;從0 -> 10 -> 10 10>>1…。最終出現堆內存溢出&#xff0c;是在擴容數組大小的時候。這里的過程…

【應屆應知應會】SQL常用知識點50道

SueWakeup 個人主頁&#xff1a;SueWakeup 系列專欄&#xff1a;借他一雙眼&#xff0c;愿這盛世如先生所愿 個性簽名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陸離 本文封面由 凌七七~? 友情提供 目錄 數據庫的概念 (什么是數據庫) RDBMS NOSQL 數據庫的分類 …

Qt涂鴉板

Qt版本&#xff1a;Qt6 具體代碼&#xff1a; 頭文件 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent n…

0145__contain_of的原理與實現

contain_of的原理與實現_contain of-CSDN博客

從零開始!Jupyter Notebook的安裝教程

引言 Jupyter Notebook作為一種交互式的開發環境&#xff0c;已經成為數據科學和機器學習領域中不可或缺的工具之一。它能夠將代碼、文本、圖像和數據結合在一個靈活的文檔中&#xff0c;使得數據分析和可視化變得更加直觀和高效。 本文將詳細介紹Jupyter Notebook的安裝過程…

深入理解 Git `git add -p` 命令中的交互選項

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

500mA、低壓差、低噪聲、超快、無需旁路電容的CMOS LDO穩壓器RT9013

一般描述 RT9013 SOT23-5封裝的外觀和絲印 RT9013 是一款高性能的 500mA LDO 穩壓器&#xff0c;具有極高的 PSRR 和超低壓差。非常適合具有苛刻性能和空間要求的便攜式射頻和無線應用。 RT9013的靜態電流低至25μA&#xff0c;進一步延長了電池的使用壽命。RT9013 也適用于低…