Mysql - 查詢之關聯查詢

来源:http://www.cnblogs.com/elvinle/archive/2016/12/26/6214894.html
-Advertisement-
Play Games

查詢這塊是重中之重, 關係到系統反應時間. 項目做到後期, 都是要做性能測試和性能優化的, 優化的時候, 資料庫這塊是一個大頭. sql格式: select 列名/* from 表名 where 條件 group by 列 having 條件 order by 列 asc/desc; 這裡牽涉到一個 ...


查詢這塊是重中之重, 關係到系統反應時間. 項目做到後期, 都是要做性能測試和性能優化的, 優化的時候, 資料庫這塊是一個大頭.

sql格式: select 列名/* from 表名 where 條件 group by 列 having 條件 order by 列 asc/desc;

這裡牽涉到一個查詢執行順序的問題. 

單表查詢執行順序: 

select sex, count(Sex) as count from tch_teacher where id > 15 group by Sex having count > 5 order by Sex asc limit 1;

1-> from 表 : 首先拿到表tch_teacher

2-> where 條件 : 根據where後面的條件篩選一遍數據集合A

3-> group by 分組 : 對篩選出的數據A, 根據group by後面的列進行分組, 得到數據集B

4-> having 篩選 : 對數據集B進行進一步篩選, 得到數據集C

5-> select 數據 : 這裡有四步

                         第一步 : 根據select後面的列名, 去數據集C中取數據. 得到數據集D

                         第二步 : 對數據集D中的數據進行去重操作(這一步是建立在 sql中有distinct 情況下), 得到數據集E

                         第三步 : 對數據集E進行排序操作, 得到數據集F

                         第四步 : 對數據集F進行截取數據操作, 得到最終的數據集(執行 limit 10 操作)

 在多表的時候, 只是第1步有了變化, 多了一個連表操作, 別的沒啥變化.

 

一、連表查詢

1. 交叉連接 -- 笛卡爾乘積  cross join

select * from tch_teacher cross join tch_contact

這種連接方式, 沒見人用過.  如果tch_teacher,tch_contact表各有10條數據, 那麼連接的結果, 就是 10 x 10 = 100 條數據. 

在mysql 中, cross join 後面是可以跟 on 和 where 的, 加上之後, 其實跟 inner join 是一樣的

 

2. 內連接 -- inner join 

內連接在不加on的情況下, 也是去求笛卡爾乘積. 不加on的用法並不推薦使用, 容易造成記憶體溢出的情況. 加on的時候, 在連表的時候, 就會對數據進行篩選, 以此來縮減有效數據範圍

select * from tch_teacher inner join tch_contact 

 

從上面的sql和圖片來看, inner join 的時候, 可以不加on, 也能得到一個結果, 而且這個結果和交叉連接的結果是一樣的. 

 這裡還有另外兩種寫法:

select * from tch_teacher,tch_contact

select * from tch_teacher join tch_contact

得到的結果是一樣的. 

 

3. 外連接 -- left/right join on 

這裡我特意加了一個on在上面, 因為不加on是會報錯的.

left join 稱之為左連接, 連接以左側表數據為準, 當右表沒有數據與之匹配的時候, 則會用null填補

right join 稱之為右連接, 與 left join 相反, 這個是以右表為準

先看下效果吧

select * from tch_teacher left join tch_contact on tch_teacher.Id = tch_contact.TId;

select * from tch_teacher right join tch_contact on tch_teacher.Id = tch_contact.TId;

其實這裡還有一個full join , 不過mysql裡面的full join, 著實有些讓人無語, 反正我沒這麼用過, 略過不表了.

這裡我做了一個小測試, 這裡的數據, tch_contact的tid值, 我取的是0~100000之間的隨機數

select * from tch_teacher inner join tch_contact on tch_teacher.Id = tch_contact.TId ;

select * from tch_teacher LEFT join tch_contact on tch_teacher.Id = tch_contact.TId ;
tch_teacher tch_contact inner join(s) 結果 left join(s) 結果
十萬 十萬 0.499 99999 0.526 137017
十萬+5000 十萬 0.345 99999 0.565 142017
十萬-5000 十萬 0.472 94949 0.534 130124

這裡面的值, 是我反覆運行之後, 在一些離散值裡面, 取得比較靠近中心點的值.

 

4. 自己連自己

mysql裡面, 有一個比較好用的功能, 就是自己連自己. 我再tch_teacher表裡面加入一列, CreateBy,  存放的是這個表的Id值

select a.*, b.Name as CreateByName from tch_teacher a
left join tch_teacher b on a.createby = b.id

能得到以下結果:

 

 二、union查詢

除了把幾個表通過內部關係拼成一個表結果, 還可以, 把多個表的查詢表結果拼成一個表結果. 所使用的方法就是union.

這裡要註意的是, 列的順序. 如果害怕列的順序不一致不好排查, 可以把表結果的列名都重命名為相同的.

select Id, Sex, BId, `No`, Name, CreateDate from tch_teacher

union

select 0 as Id, Sex, BId, `No`, Name, CreateDate from tch_teacher_temp

union是會對最後的表結果進行去重操作的, 如果我不想去重, 只想快速得到拼接的結果, 可以使用 union all 來拼接. 

 

參考:

Mysql架構總覽


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

-Advertisement-
Play Games
更多相關文章
  • 用戶反饋是小程式開發必要的一個功能,但是和自己核心業務沒關係,主要是產品運營方便收集用戶的對產品的反饋。HotApp推出了用戶反饋的組件,方便大家直接集成使用 源碼下載地址: https://github.com/hotapp8/hotapp-fedback (1)零代碼接入用戶反饋功能 界面仿微信 ...
  • 昨天的(今天凌晨)的博文《Android中Fragment和ViewPager那點事兒》中,我們通過使用Fragment和ViewPager模仿實現了微信的佈局框架。今天我們來通過使用ListView實現其中聯繫人一欄的基本視圖,效果如下: 要實現上圖的效果,我們要用到兩個知識點: 1、這裡我們使用 ...
  • listview經常結合下來刷新和上拉載入更多使用,本文總結了三種常用到的方案分別作出說明。 ...
  • 概述 本篇文章會從源碼(基於Android 6.0)角度分析Android中View的繪製流程,側重於對整體流程的分析,對一些難以理解的點加以重點闡述,目的是把View繪製的整個流程把握好,而對於特定實現細節則可以日後再對相應源碼進行研讀。在進行實際的分析之前,我們先來看下麵這張圖: 我們來對上圖做 ...
  • 鎖終端 輸入: <1>cd /Applications/Xcode.app 回車 結果顯示: Xcode.app 輸入: <2>sudo chown -hR root:wheel Contents 回車 結果顯示: WARNING: Improper use of the sudo command ...
  • 經過努力終於發現了最新的 解決cocoaPods安裝的辦法: taobao Gems 源已停止維護,現由 ruby-china 提供鏡像服務 第一步:安裝rvm, 不管需不需要升級ruby,rvm可以讓你擁有多個版本的Ruby,並且可以在多個版本之間自由切換。如果已經安裝過跳到第2步(rvm -v ...
  • 在之前的博文《Android中使用ViewPager實現屏幕頁面切換和引導頁效果實現》和《Android中Fragment的兩種創建方式》以及《Android中Fragment與Activity之間的交互(兩種實現方式)》中我們介紹了ViewPager以及Fragment各自的使用場景以及不同的實現 ...
  • 一、概述 運行時變更就是設備在運行時發生變化(例如屏幕旋轉、鍵盤可用性及語言)。發生這些變化,Android會重啟Activity,這時就需要保存activity的狀態及與activity相關的任務,以便恢復activity的狀態。 為此,google提供了三種解決方案: 下麵會逐一介紹三種情況,其 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...