Mysql7種join連接及mysql一些知識點

Join圖:

 

Sql如下:
1)左外連接,以左邊的表爲主,左連接即左邊的表獨有+左邊表和右邊表共有數據 
SELECT * FROM dept t
LEFT JOIN emp t2 
ON t.`id_dept` = t2.`id_dept`;

 

2)右外連接,以右表的表爲主,右連接即右邊表獨有+右邊和左邊共有數據

SELECT * FROM dept t

RIGHT JOIN emp t2 

ON t.`id_dept` = t2.`id_dept`;

 

3)內連接,也叫自然連接同時也叫全等連接,即左邊表和右邊表共有數據的查詢

SELECT * FROM dept t

INNER JOIN emp t2

ON t.`id_dept` = t2.`id_dept`;


4)左連接,即查詢左邊表的獨有數據
SELECT * FROM dept t
LEFT JOIN emp t2 
ON t.`id_dept` = t2.`id_dept` 
WHERE t2.`id_dept` IS NULL;

 

 

5)右連接,即查詢右邊表獨有數據
SELECT * FROM dept t
RIGHT JOIN emp t2 
ON t.`id_dept` = t2.`id_dept` 
WHERE t.`id_dept` IS NULL;

 

6)全連接,即左邊表數據+右邊表數據+左邊表和右邊表共有數據查詢

SELECT * FROM dept t

LEFT JOIN emp t2

ON t.`id_dept` = t2.`id_dept`

UNION

SELECT * FROM dept t

RIGHT JOIN emp t2

ON t.`id_dept` = t2.`id_dept`;

UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。

UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的數據類型。

同時,每條 SELECT 語句中的列的順序必須相同.

 

7)全外連接,即左右表的共有數據之外的數據查詢

SELECT * FROM dept t

FULL OUTER emp t2

ON t.`id_dept` = t2.`id_dept`

WHERE t.`id_dept` IS NULL

OR t2.`id_dept` IS NULL;  --mysql不支持這種連接的語法

SELECT * FROM dept t

LEFT JOIN emp t2

ON t.`id_dept` = t2.`id_dept`

WHERE t2.`id_dept` IS NULL

UNION

SELECT * FROM dept t

RIGHT JOIN emp t2

ON t.`id_dept` = t2.`id_dept`

WHERE t.`id_dept` IS NULL;

 

oracle 的sql如下:

------------------自然連接  把一張表當兩張表用
select  e1.ename ,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno ) ; 


select ename,dname from emp join dept on (emp.deptno=dept.deptno);
---等值連接的簡潔寫法:
select ename ,dname from emp join dept using (deptno);

---外連接:
--左外連接
select  e1.ename ,e2.ename from emp e1 left  join emp e2 on (e1.mgr = 

e2.empno ) ;
select e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno(+);

--右外連接:
select  e1.ename ,e2.ename from emp e1 right  join emp e2 on (e1.mgr = 


e2.empno ) ;
select  e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr(+) = e2.empno;
 

-- 複合索引 順序, col1 col2 col3
EXPLAIN select * from t_demo v where v.col1 = '3456dasf' and v.col2 = '1234';  -- 走索引 type:ref


EXPLAIN select * from t_demo v where v.col2 = '1234' and v.col1 = '3456dasf' ;  -- 走索引 type:ref


EXPLAIN select * from t_demo v where v.col1 = '3456dasf' and v.area_col4 = 'dsafdsafdsa'; -- 走索引 type:ref

EXPLAIN select * from t_demo v where v.col4 = 'dsafdsafdsa' and v.col1 = '3456dasf';  -- 走索引 type:ref

EXPLAIN select * from t_demo v where v.col4 = 'dsafdsafdsa' and v.col2 = 'gfhfdhg';  -- 不走索引 type:all

EXPLAIN  select * from t_demo v where v.col4 = 'dsafdsafdsa' and v.col5 = 'gfdd' and v.col3 = '18HB0820504'; -- 不走索引 type:all

EXPLAIN select * from t_demo v where v.col4 = 'dsafdsafdsa' and v.col1 = '3456dasf'; -- 走索引 type:ref

EXPLAIN select * from t_demo v where v.col4 = 'dsafdsafdsa' and v.col2 = '3456dasf' and v.col1 = '3456dasf' ; -- 走索引 type:ref

總結:

mysql 複合索引當中,MySQL聯合索引最左原則

即,複合中的三個字段,如果查詢條件當中沒有 最左的字段作爲查詢條件,不走索引

如果有最靠左的兩個字段,則走兩個字段的索引

如果三個字段,只有最左和最右的,則只走一個最左字段的索引

反之都不走索引

4)type

4.1)訪問類型排序

4.2)顯示查詢使用了何種類型

從最好的到最差的依次是:

System->const->eq_ref->ref->range->index->All

一般來說,得保證查詢至少達到range級別,最好達到ref

 

數據庫備份:

-- 備份全部數據庫的數據(-t)
mysqldump -uroot -p123456 -P3306 -A -t > 0103.sql
-- 備份單個數據庫的數據和結構(dbname 爲數據庫名)
mysqldump -uroot -p123456 -P3306 dbname > dbname_20190819.sql

-- 備份單個數據庫結構(dbname 爲數據庫名,-d)
mysqldump -uroot -p123456 -P3306 dbname -d > 0105.sql

-- 備份單個數據庫數據(sakila 爲數據庫名,-t)
mysqldump -uroot -p123456 -P3306 sakila -t > 0106.sql

-- 備份多個表的結構和數據 (table1,table2爲表名)
mysqldump -uroot -p123456 -P3306 sakila table1 table2 > 0107.sql

-- 一次備份多個數據庫
mysqldump -uroot -p123456 --databases db1 db2 > 0108.sql


show global variables like 'max_allowed_packet';

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章