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';