MySQL之连接
? ? ?在文章MySQL之子查詢?https://blog.csdn.net/rhx_qiuzhi/article/details/79875308 中定義了三張表,分別是goods表,goods_cates和table_goods_brand三張表具有如下的關聯關系
MySQL在SELECT語句、多表更新、多表刪除語句中支持JOIN操作,其語法結構為:
table_reference {[INNER|CROSS]JOIN | {LEFT|RIGHT}[OUTER]JOIN}table_reference ON conditional_expr表在使用的時候可以給表起一個別名:
table_reference table_name[[AS] alias] | table_subquery [AS] alias數據表可以使用table_name AS alias或者table_name alias_name賦予數據表別名,table_subquery可以作為子查詢使用在FROM子句中,這樣的子查詢必須為其賦予別名。
MySQL中連接類型有有三種:
1、JOIN,CROSS JOIN??和 INNER JOIN是等價的,為內連接,使用較多
2、LEFT [OUTER] JOIN 左外連接
3、RIGHT [OUTER] JOIN 右外連接
1、內連接INNER JOIN
? ? ? 一般會使用ON關鍵字來設定連接條件,也可以是使用WHERE來代替,通常使用ON關鍵字來設定連接條件,使用WHERE關鍵字進行結果記錄的過濾。那什么是內連接呢?
? ? ? ?
顯示左表和右表中交集的部分
root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods INNER JOIN goods_cates-> ON goods.cate_id = goods_cates.cate_id ;注意這里只有8條記錄,而原來在goods中共有9條記錄,使用命令查看
root@localhost test>select * from goods\G;? ? ?由于cate_id和表goods_cates表中cate_id關聯,但是goods_cates表中并沒有id為12的索引,那在上圖中為什么沒有Laserjet Pro P16呢,因為它不符合連接條件,剛才在goods_cates中增加的route ,switch等記錄,因為在goods沒有使用,因此沒有顯示出來,所以也不會呈現出來。
2、左外連接LEFT [OUTER] JOIN
顯示左表的全部記錄以及右表符合連接條件的記錄
? ? ??root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods LEFT JOIN goods_cates-> ON goods.cate_id = goods_cates.cate_id ;
但是發現上表中第9條記錄的cate_name顯示為NULL,左外連接顯示的是左表的全部,和右表符合連接條件的,如果右表沒有符合連接條件的,顯示為空NULL,因為goods中分類為12,但是12在goods_cates中不存在.
3、右外連接RIGHT [OUTER] JOIN
顯示右表的全部記錄以及左表符合連接條件的記錄? ??
root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods RIGHT JOIN goods_cates-> ON goods.cate_id = goods_cates.cate_id ;4、多表連接
root@localhost test>SELECT goods_id goods_name,cate_name,brand_name,goods_price FROM goods-> AS g-> INNER JOIN goods_cates AS c ON g.cate_id = c.cate_id-> INNER JOIN table_goods_brands AS b ON g.brand_id = b.brand_id\G;連接可以看成是外鍵的逆向操作,外鍵是將多張表分別存儲顯示,而連接是將多張表連接在一下顯示。關于連接有以下幾點:
1、A LEFT JOIN B join_condition 數據表B的結果依賴于數據表A
2、數據表A的結果集根據左連接條件依賴于所有數據表(B除外)
3、左外連接條件決定如何檢索數據表B(在沒有指定WHERE連接條件的情況下)
4、如果數據表A的某條記錄符合WHERE條件,但是在數據表B中不存在符合連接條件的記錄,將生成一個所有列為空的額外的B行
5、如果使用內連接查找的記錄在連接數據表中不存在,并且在WHERE子句中嘗試一下操作:col_name???IS NULL 時,如果col_name被定義為NOT NULL,MySQL將在找到符合連接條件的記錄后停止搜索更多的行
總結
- 上一篇: MySQL之子查询
- 下一篇: MySQL之无限级分类表设计