MySql 内连接,外连接查询方式区别
生活随笔
收集整理的這篇文章主要介紹了
MySql 内连接,外连接查询方式区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySql 內連接,外連接查詢方式
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, '問題四', '描述四');- 建如上數據庫,初始化測試數據。
- 內連接會查詢出answer_test表和question_test表中交集部分的數據如下
- 以左表為基準查右表的數據: 也就是左表的數據全查詢出,并且會查詢出右表中符合要求的數據,不存在的數據補null
- 和左外相反,以右表為基準查左表數據,右表的數據會全查詢出,并且查詢出左表中符合條件的數據,
- mysql關聯查詢執行的策略是比較簡單的,mysql對任何關聯查詢執行嵌套循環關聯操作,即:mysql先在一個表中循環取出單條數據,然后在嵌套循環到關聯表中尋找匹配的行,一次找下去,一直到找到所有表中匹配的行為止。然后更具各個表匹配出的行,返回查詢中需要的各個列,如果mysql在最后一個關聯表無法找到更多的行,他將返回上一層關聯表,看能否找到更多的匹配數據,一次類推執行。
- 按照這種方式,mysql查找第一個表的記錄,再嵌套查詢下一個關聯表,然后回溯到上一個表,這正如其名——“嵌套循環關聯”??匆幌孪旅娴睦?#xff1a;
- 假設mysql按照查詢中表順序進行關聯操作,我們可以用偽代碼標識這個過程。
- 我們用表格的形式來表示關聯查詢過程,從左到右
| column1=4,column3=1 | column3=1,column2=1 | column1=4,column3=1 |
| column3=1,column2=2 | column1=4,column3=2 | |
| column3=1,column2=3 | column1=4,column3=3 | |
| column1=6,column3=2 | column3=2,column2=1 | column1=6,column3=1 |
| column3=2,column2=2 | column1=6,column3=2 | |
| column3=2,column2=3 | column1=6,column3=3 |
- t1中匹配到的第一行,4和1, 接著會去關聯表中查找關聯數據,得到一二三條,第二臺數據類似。
- 如上sql,mysql優化器最重要的一個部分就是關聯查詢的優化,他決定了多個表關聯時候的順序,通常多表關聯的時候,可以有多重關聯的順序,來獲取相同的結果,關聯查詢優化器通過評估不同的順序時候的執行成本來選擇一個最小代價的關聯順序。
- 按照上面的案例中執行順序,mysql先user表,通過user_company的user_id得到company_id,通過company表主鍵對應的記錄,我們執行mysql的explain得出結果如下:
- 我們修改join順序在來執行以下sql
- mysql會將查詢盡可能往第二中方式去靠近,對比如上兩個,第一種查詢中第一個表q掃碼出45447條記錄,第二種掃出61條數據,如果我們第一層查詢返回更少的數據記錄,然后在鏡像嵌套循環查詢,這種情況我們嵌套循環和回溯操作的次數會變得更少。
- 通過這個例子我們也可以得出在關聯查詢時候講數據流較少的表放在關聯查詢的首表的原因也是如此。而mysql重新定義關聯順序也是優化器的一個重要功能,他嘗試在順序查詢中選擇一個成本最小的來生產執行計劃樹。
總結
以上是生活随笔為你收集整理的MySql 内连接,外连接查询方式区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艾灸丰胸灸哪个部位
- 下一篇: 面部针灸祛斑效果好吗