日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql 内连接,外连接查询方式区别

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql 内连接,外连接查询方式区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySql 內(nèi)連接,外連接查詢方式

CREATE TABLE `question_test` (`q_id` int(11) DEFAULT NULL,`q_name` varchar(10) DEFAULT NULL,`q_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8CREATE TABLE `answer_test` (`a_id` int(11) DEFAULT NULL,`a_name` varchar(10) DEFAULT NULL,`a_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (2, '回答二', '答案二'); INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (3, '回答三', '答案三'); INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (5, '回答五', '答案五'); INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (6, '回答六', '答案六');INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (1, '問題一', '描述一'); INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (2, '問題二', '描述二'); INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (3, '問題三', '描述三'); INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (4, '問題四', '描述四');
  • 建如上數(shù)據(jù)庫,初始化測試數(shù)據(jù)。
  • 內(nèi)連接
    • 內(nèi)連接會查詢出answer_test表和question_test表中交集部分的數(shù)據(jù)如下

  • 左外連接
    • 以左表為基準查右表的數(shù)據(jù): 也就是左表的數(shù)據(jù)全查詢出,并且會查詢出右表中符合要求的數(shù)據(jù),不存在的數(shù)據(jù)補null

  • 右外連接
    • 和左外相反,以右表為基準查左表數(shù)據(jù),右表的數(shù)據(jù)會全查詢出,并且查詢出左表中符合條件的數(shù)據(jù),

  • mysql如何執(zhí)行關聯(lián)查詢以及優(yōu)化
    • mysql關聯(lián)查詢執(zhí)行的策略是比較簡單的,mysql對任何關聯(lián)查詢執(zhí)行嵌套循環(huán)關聯(lián)操作,即:mysql先在一個表中循環(huán)取出單條數(shù)據(jù),然后在嵌套循環(huán)到關聯(lián)表中尋找匹配的行,一次找下去,一直到找到所有表中匹配的行為止。然后更具各個表匹配出的行,返回查詢中需要的各個列,如果mysql在最后一個關聯(lián)表無法找到更多的行,他將返回上一層關聯(lián)表,看能否找到更多的匹配數(shù)據(jù),一次類推執(zhí)行。
    • 按照這種方式,mysql查找第一個表的記錄,再嵌套查詢下一個關聯(lián)表,然后回溯到上一個表,這正如其名——“嵌套循環(huán)關聯(lián)”??匆幌孪旅娴睦?#xff1a;
    SELECTt1.column1,t2.column2 FROMtb1 t1 INNER JOIN tb2 t2 ON t1.column3 = t2.column3 WHEREt1.column1 IN (4, 6) outer_iter = iterator over t1 WHERE column3 IN (4, 6) outer_row = outer_iter.next WHILE outer_row inner_iter = iterator over t2 WHERE column3 = outer_row.column3inner_row = inner_iter.nextWHILE inner_row output [ outer_row.column1,inner_row.column2 ] inner_row = inner_iter.nextEND outer_row = outer_iter.next END
    • 假設mysql按照查詢中表順序進行關聯(lián)操作,我們可以用偽代碼標識這個過程。
    • 我們用表格的形式來表示關聯(lián)查詢過程,從左到右
    t1t2結果行
    column1=4,column3=1column3=1,column2=1column1=4,column3=1
    column3=1,column2=2column1=4,column3=2
    column3=1,column2=3column1=4,column3=3
    column1=6,column3=2column3=2,column2=1column1=6,column3=1
    column3=2,column2=2column1=6,column3=2
    column3=2,column2=3column1=6,column3=3
    • t1中匹配到的第一行,4和1, 接著會去關聯(lián)表中查找關聯(lián)數(shù)據(jù),得到一二三條,第二臺數(shù)據(jù)類似。
  • 關聯(lián)查詢的優(yōu)化:
  • EXPLAIN select * from QuestionAnswerContentDetailVerify q STRAIGHT_JOIN Questions a ON q.questionID = a.questionID where a.questionType != 4
    • 如上sql,mysql優(yōu)化器最重要的一個部分就是關聯(lián)查詢的優(yōu)化,他決定了多個表關聯(lián)時候的順序,通常多表關聯(lián)的時候,可以有多重關聯(lián)的順序,來獲取相同的結果,關聯(lián)查詢優(yōu)化器通過評估不同的順序時候的執(zhí)行成本來選擇一個最小代價的關聯(lián)順序。
    • 按照上面的案例中執(zhí)行順序,mysql先user表,通過user_company的user_id得到company_id,通過company表主鍵對應的記錄,我們執(zhí)行mysql的explain得出結果如下:

    • 我們修改join順序在來執(zhí)行以下sql
    EXPLAIN select * from Questions a STRAIGHT_JOIN QuestionAnswerContentDetailVerify q ON q.questionID = a.questionID where a.questionType != 4

    • mysql會將查詢盡可能往第二中方式去靠近,對比如上兩個,第一種查詢中第一個表q掃碼出45447條記錄,第二種掃出61條數(shù)據(jù),如果我們第一層查詢返回更少的數(shù)據(jù)記錄,然后在鏡像嵌套循環(huán)查詢,這種情況我們嵌套循環(huán)和回溯操作的次數(shù)會變得更少。
    • 通過這個例子我們也可以得出在關聯(lián)查詢時候講數(shù)據(jù)流較少的表放在關聯(lián)查詢的首表的原因也是如此。而mysql重新定義關聯(lián)順序也是優(yōu)化器的一個重要功能,他嘗試在順序查詢中選擇一個成本最小的來生產(chǎn)執(zhí)行計劃樹。

    總結

    以上是生活随笔為你收集整理的MySql 内连接,外连接查询方式区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。