MySQL 連接查詢


一.什么是連接查詢

1.連接查詢是一種非常常見的數據庫操作,在兩張(或者多張)表中進行匹配.

2.以mysql為例,支持Cross join(交叉連接), inner join(內連接), outer join(外連接),等其他連接.

 二、數據准備(創建emp員工表和dept部門表並插入數據)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`  (
  `id` int(11) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `dept_id`(`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (1, '劉備', 3);
INSERT INTO `emp` VALUES (2, '關羽', 3);
INSERT INTO `emp` VALUES (3, '張飛', 3);
INSERT INTO `emp` VALUES (4, '張角', 2);
INSERT INTO `emp` VALUES (5, '張寶', 2);
INSERT INTO `emp` VALUES (6, '張梁', 2);
INSERT INTO `emp` VALUES (7, '曹操', 1);
INSERT INTO `emp` VALUES (8, '曹丕', 1);
INSERT INTO `emp` VALUES (9, '曹植', 1);
INSERT INTO `emp` VALUES (10, '曹沖', 1);
INSERT INTO `emp` VALUES (11, '孫權', 0);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `id` int(11) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '人力資源部');
INSERT INTO `dept` VALUES (2, '財務部');
INSERT INTO `dept` VALUES (3, '后勤部');
INSERT INTO `dept` VALUES (4, '法務部');

SET FOREIGN_KEY_CHECKS = 1;

三、連接實戰

select * from dept;
select * from emp;
-- 交叉連接 
select * from dept,emp; -- 44條數據 笛卡爾積 a表的長度 * b表的長度
select * from dept cross join emp;  -- 笛卡爾積在查詢的時候沒有太大的意義,在數學上表示所有可能性
-- 內連接是查詢出滿足條件的數據
--  inner join 隱式內連接
select * from emp as a,dept as b where a.dept_id=b.id;
-- 顯式內連接 
select * from emp as a join dept as b on a.dept_id = b.id;
-- outer join 外連接(包含左外連接和右外連接)
-- 左外連接(以左表為主表,右表為從表)
-- 主表全部顯示,從表只有匹配到才顯示,如果沒有匹配到就顯示null
select * from emp a left join dept b on a.dept_id=b.id;
-- 右外連接(以右表為主表,左表為從表)
select * from emp a right join dept b on a.dept_id=b.id;

四、例題(A表示emp表,B表示dept表)

select * from emp as a join dept as b on a.dept_id = b.id;  -- 顯式內連接

select * from emp as a left join dept as b on a.dept_id = b.id;

select * from emp as a right join dept as b on a.dept_id = b.id;

   A表的非交集數據

select * from emp as a left join dept as b on a.dept_id = b.id where b.id is null;

B 表的非交集數據

select * from emp as a right join dept as b on a.dept_id = b.id where a.id is null;

-- union 全連接
select * from emp as a left join dept as b on a.dept_id = b.id
union -- union 自動去重
select * from emp as a right join dept as b on a.dept_id = b.id;

select * from emp as a left join dept as b on a.dept_id = b.id
union all -- union all 不會自動去重
select * from emp as a right join dept as b on a.dept_id = b.id;

擴展:oracle里面有full join,但是在mysql中沒有full join。我們可以使用union來達到目的。

select * from emp as a left join dept as b on a.dept_id = b.id where b.id is null
union
select * from emp as a right join dept as b on a.dept_id = b.id where a.dept_id is null;

五、擴展:where 和 on 的區別?

  (1) 篩選的順序 on 優先於 where ;

  (2) 語意 on 是兩張表的連接條件(外鍵關聯), where會把前面的結果集進行篩選(可以篩選所有字段條件)

六 、擴展: full jion 全連接(oracle里面有full join,但是在mysql中沒有full join。我們可以使用union來達到目的。)

-- full join 的用法
select a.id,a.name,a.dept_id,b.id,b.name from emp as a full join dept as b on a.dept_id = b.id;

七、總結 : SQL連接查詢,檸檬班公開課學習后總結! 不足之處后續補充!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM