mysql之連接查詢、聯合查詢、子查詢

来源:https://www.cnblogs.com/progor/archive/2018/04/11/8796283.html
-Advertisement-
Play Games

本文內容: 連接查詢 聯合查詢 子查詢 from子查詢 where子查詢 exists子查詢 首發日期:2018-04-11 連接查詢: 連接查詢就是將多個表聯合起來查詢,連接查詢方式有內連接、外連接、自然連接、交叉連接。連接查詢使得可以同時查看多張表中數據。 內連接:有條件連接,多個表之間依據指定... ...



本文內容:

  • 連接查詢
  • 聯合查詢
  • 子查詢
    • from子查詢
    • where子查詢
    • exists子查詢

 

首發日期:2018-04-11


連接查詢:

 

  • 連接查詢就是將多個表聯合起來查詢,連接查詢方式有內連接、外連接、自然連接、交叉連接。連接查詢使得可以同時查看多張表中數據。
    • 內連接:有條件連接,多個表之間依據指定條件連接,匹配結果是保留符合匹配結果的記錄。
    • 外連接:與內連接不同的是不管匹配符不符合都保留,根據外連接連接方式來決定保留哪張表,比如保留左表的話,那麼左表無法匹配右表時,保留左表數據,然後置右表欄位數據為null.
    • 自然連接:有條件連接,自動依據“同名欄位”連接(多個同名欄位就都作為條件)。
    • 交叉連接cross join:無條件連接,將每一條記錄與另外一個表的每一條記錄連接(笛卡爾積),結果是欄位數等於原來欄位數之和,記錄數等於之前各個表記錄數之乘積。

 

 

-- 實驗表結構
create table student(
id int,
name varchar(15),
gender varchar(15),
cid int
);
create table class(
cid int,
cname varchar(15)
);
drop table student,class;
-- 實驗表數據:
insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4); --這裡特意創建了一個class中沒有的4
insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");--這裡特意創建了一個student中沒有的5
select * from student;
select * from class;

imageimage

 

 

內連接:

  • 從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,保留匹配成功的記錄,並將兩份記錄拼接。
  • 語法:select 欄位列表 from 左表 [inner] join 右表 on 左表.欄位 = 右表.欄位;
    • 不使用on條件的時候,結果與交叉連接相同
    -- 內連接
    -- select * from student inner join class; --結果與交叉連接相同
    select * from student  join class on student.cid = class.cid;
    select * from student inner join class on student.cid = class.cid;
    image

 

 

 

外連接:

  • 與內連接不同的是主表記錄不管匹配符不符合都保留,方式有左外連接、右外連接,左外連接是保留左表,右外連接是保留右表
  • 語法:
    • 左外連接:select 欄位列表 from 左表 left join 右表 on 左表.欄位 = 右表.欄位;
    • 右外連接:select 欄位列表 from 左表 right join 右表 on 左表.欄位 = 右表.欄位;
    select * from student left join class on student.cid = class.cid;
    image
    select * from student right join class on student.cid = class.cid;
    image

 

 

 

自然連接:

  • 自動匹配連接條件,系統以欄位名字作為匹配模式(同名欄位就作為條件,多個同名欄位就都作為條件)
    • 自然內連接:類似內連接,但不提供連接條件。
    • 自然外連接:類似外連接,但不提供連接條件。
  • 語法:
    • 自然內連接:select 欄位列表 from 表名 natural join 表名;
    • 自然外連接:select 欄位列表 from 表名 natural left\right join 表名;
    select * from student natural join class;
    image
    select * from student natural left join class;
    image

 

 

 

交叉連接:

  • 將每一條記錄與另外一個表的每一條記錄連接
  • 語法:
    • select 欄位列表 from 表名 cross join 表名;
    • select 欄位列表 from 表名 ,表名;
    select * from student cross join class;
    select * from student,class;
    image

 

 

 

補充:

  • 在多個表中,為了區分每個表,以及簡便使用,可以使用表別名。
    • select * from student inner join class on student.cid = class.cid;-- 原本結果
      select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- 使用表別名
  • 可以多重連接。
  • 外連接可以模擬自然連接,只需要將連接條件on 左表.欄位 = 右表.欄位變成"using 欄位名"即可。

 


聯合查詢:

 

  • 聯合查詢是將多個查詢結果在記錄上進行拼接。(相當於將其他表的查詢記錄結果連接到第一個表的後面)【因為是拼接,所以多個查詢結果的欄位數必須相同】【拼接不在意數據類型,比如第一個表的第一個欄位是int,但後面的表中的varchar依然可以拼接到第一列中】
  • 語法:select語句 union select語句…;
  • select name,gender from student
    union 
    select * from class;
    -- 因為class就兩個欄位,所以第一個只選出兩個欄位
    image

 

 

補充:

  • union可以有選項,加在union 後面,all選項是不對相同去重,distinct是去重。
  • 聯合查詢一般用來處理同一表中以不同方法顯示不同數據。(比如,想將學生各科成績表中的兩科(這裡假設為python 跟linux)同時查詢出來)
  • union和order by同時使用報錯時
    • 如果你想針對聯合查詢中的某個查詢結果排序,需要將這個select語句用括弧括起來。【另外,由於聯合查詢的拼接機制,需要在order by 後面加上limit子句才行,limit的數量可以是一個很大的值。】
    • 如果是針對最終的聯合查詢結果,就在最後一個select語句中使用order by 【建議給最後一個欄位加上括弧,再加ordery by,使用情況是有同名欄位】

 


子查詢:

 

  • 子查詢是嵌套在查詢語句中的查詢。
  • 子查詢按照出現的位置可以分為三類:
    • from子查詢:子查詢跟在from之後的;一般用在“先查出二維表,再處理”的情況。
      • 比如:
        -- 這是一個無意義的例子。僅為舉例使用
        select cid,cname from (select * from class where cname="python") as c;
    • where子查詢:子查詢跟在where條件中;一般用在“先查詢出指定條件再查詢”的情況
      • 比如:
        select * from student where cid=(select cid from class where cname="python");
    • exist子查詢:子查詢在exist語句裡面;一般用作“存在才做”的情況
      • 比如:
        -- 這是一個如果學生沒有選擇cid=1的課,那麼不輸出對應課程信息的例子
        select * from class where exists(select * from  student where cid=1) and cid=1;
    • 事實上,有些人認為union之後跟著的也是子查詢,不過這裡不把這些當作子查詢,只把上面幾個與“查詢”非常緊密相關的當作子查詢。

 

 

補充:

  • 事實上,還可以根據結果來分類子查詢:
    • 標量子查詢,子查詢得到的結果是一行一列,情況一般發生於where子查詢只查詢出一行一列的情況。
    • 列子查詢,子查詢得到的結果是一列多行,情況一般發生於where子查詢查詢出一列多行的情況。
    • 行子查詢,子查詢得到的結果是多列一行(或者多行多列) ,情況一般發生在where子查詢查詢出多列一行的情況。
    • 表子查詢,子查詢得到的結果是多行多列 ,情況一般發生在from子查詢中
  • where子查詢中有時候還使用一些其他關鍵字,如any,all,some,但對=來說,=基本可以實現他們的功能了。

 

 

 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Swap分區的拓展和縮小 分為兩種方法: 一, 用磁碟直接掛在 步驟如下: 使用fdisk來創建交換分區(假設 /dev/sdb2 是創建的交換分區) 使用 mkswap 命令來設置交換分區: # mkswap /dev/sdb2 啟用交換分區: # swapon /dev/sdb2 寫入/etc/ ...
  • revit二次開發中遇到的問題 RevitAPIUI.dll 只能 Native Library 中執行; 脫離了Native Library,API是跑不起來的 。 檢查程式流程:登錄,配置,啟動revit。 在啟動revit之前不能執行RevitAPI.dll和RevitAPIUI.dll的相關 ...
  • 本文內容: 什麼是外鍵 外鍵的增加 外鍵的修改和刪除 外鍵的約束模式 首發日期:2018-04-12 什麼是外鍵: 外鍵就是表中存在一個欄位指向另外一個表的主鍵,那麼這個欄位就可以稱為外鍵。 一張表可以有多個外鍵。 外鍵用於約束表與表之間的關係,可以說外鍵是表之間的映射關係,這個關係可以幫助我們處理... ...
  • (註:sql對大小寫不敏感,附:命令行操作:cd 目錄名 可進入文件,cd .. 可返回上級木目錄) a) Select * from 表名(顯示表內所有數據) b) Select 屬性 from 表名 where 符合某條件(如id=’1’) c) Delete from 表名 where 屬性= ...
  • 在SQL Server日常的函數、存儲過程和SQL語句中,經常會用到不同數據類型的轉換。在SQL Server有兩種數據轉換類型:一種是顯性數據轉換;另一種是隱性數據轉換。下麵分別對這兩種數據類型轉換進行簡要的說明: 1 顯式轉換 顯示轉換是將某種數據類型的表達式顯式轉換為另一種數據類型。常用的是C ...
  • 資料庫 表 發生變化,需要把2.0的表數據 同步到3.0庫中去; -- 同步數據存儲過程執行 -- 更新留言舊表數據到新表數據中 /*DEFINER:Vector*/ drop procedure if exists p_for_feedback_message; create procedure ...
  • 最近在梳理資料庫程式連接信息,這裡對腳本做個總結,希望對需要的同仁有所幫助 一、Oracle連接信息統計 sys_context函數使用方法以及含義如下: 二、SQLServer連接信息統計 三、MySQL連接信息統計 四、PG連接信息統計 ...
  • 轉自:http://www.maomao365.com/?p=4942 下文主要講述:重覆數據只獲取一條的方法 row_number函數在資料庫中的功能是為每一行 按照一定的規則生成一個編號,我們常常利用這一屬性,對錶進行分頁操作,下文我們將講述採用 row_number函數刪除表中重覆數據行 ...
一周排行
    -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# ...