MySQL優化之7種表連接(一)

Mysql優化之7種表連接從此不怕寫SQL

1. 引言

作爲一個開發人員需要掌握數據庫的哪些東西? 在開發中涉及到數據庫,基本上只用到了sql語句,如何寫sql以及對其進行優化就比較重要,那些mysql的厚本書籍針對的是DBA,我們只需要學習其中的sql就可以了,但是隨着行業發展現在越來越多的企業需要我們成長爲一個全棧式工程師,所以在面試中,經常會被問道sql優化的解決方案?你們的項目中如何對mysql進行調優的?等等,如果你還沒有掌握優化相關的知識這個系列的博客我們一起來看看。

2. MySQL優化必須掌握的點

	1. Mysql的執行順序,這個是寫sql的核心,在項目開發過程彙總很多錯誤就是因爲對其不瞭解;
	2. 7種連接不怕寫sql
	3. Mysql的索引相關的概念
	4. explain關鍵字的使用
	5. 如何進行多表查詢,優化,這個是很重要的部分。

3. SQL的書寫順序

我們在操作數據庫時一般使用sql語句,我們手寫的sql語句一般爲:

select distinct 
	fields
from
	left_table join_type
join 
	right_table 
on join_condition
where
	 where_condition
group by group_fields
having having_condition
order by order_by_condition
limit limit_number

這是sql語句的書寫順序,這個sql的書寫順序可以重點關注一下。

4. SQL的執行順序

	from left_table
	on join_condition
	join_type join right_table
	where where_condition
	group by group_by_list
	having having_condition
	select distinct fields
	order by order_by_condition
	limit limit_number

5. 7種表連接方式

---部門表
DROP TABLE IF EXISTS `t_dept`;
CREATE TABLE `t_dept` (
  `id` varchar(40) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
---員工表
DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp` (
  `id` varchar(40) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `deptid` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `deptid` (`deptid`),
  CONSTRAINT `deptid` FOREIGN KEY (`deptid`) REFERENCES `t_dept` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--插入部門數據
BEGIN;
INSERT INTO `t_dept` VALUES ('1', '研發部');
INSERT INTO `t_dept` VALUES ('2', '教學部');
INSERT INTO `t_dept` VALUES ('3', '小賣部');
INSERT INTO `t_dept` VALUES ('4', '高粱部');
COMMIT;
--插入員工數據
BEGIN;
INSERT INTO `t_emp` VALUES ('1', '張三', 23, '1');
INSERT INTO `t_emp` VALUES ('2', '李四', 25, '2');
INSERT INTO `t_emp` VALUES ('3', '王五', 27, '1');
INSERT INTO `t_emp` VALUES ('4', '小黑', 43, NULL);
COMMIT;

1. 查詢共有數據

在這裏插入圖片描述

select * from t_emp e
inner join t_dept d
on e.deptid = d.id

2. 查詢左表數據爲主

在這裏插入圖片描述

select * from t_emp e
LEFT join t_dept d
on e.deptid = d.id

3. 右表數據爲主

在這裏插入圖片描述

select * from t_emp e
right join t_dept d
on e.deptid = d.id

4. 查詢左表數據中與右表沒有關係的數據

在這裏插入圖片描述

select * from t_emp e
left join t_dept d
on e.deptid = d.id
where e.deptid is null

5. 查詢右表數據中與左表沒有關係的數據

在這裏插入圖片描述

select * from t_emp e
right join t_dept d
on e.deptid = d.id
where e.id is null

6. 全連接

在這裏插入圖片描述

select * from t_emp e
left join t_dept d
on e.deptid = d.id
UNION
select * from t_emp e
right join t_dept d
on e.deptid = d.id

7. 查詢兩張表中沒有關係的數據之和

在這裏插入圖片描述

select * from t_emp e
left join t_dept d
on e.deptid = d.id where e.deptid is null
UNION
select * from t_emp e
right join t_dept d
on e.deptid = d.id where e.id is null

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