mysql join 联合查询_mysql各种join连接查询

最近项目用到了几次sql join查询 来满足银行变态的需求;正好晚上自学时,看到了相关视频,所以记录下相关知识,下次再用时,根据如下图片,便可知道 怎么写sql;

注意点: 在join操作中的 on ... where ...  应该放哪些条件;目前理解 on 后放2表关联部分;where后放最终数据筛选部分;

1.下图为各种join操作的图表解释及sql语句

1b3d7ac3283a8b2bed002b98af8318a5.png

2.自测

建表:分别为 分数表(sc),及学生表(student);关系为 student.student_id=sc.id ;语句如下:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------

-- Table structure forsc-- ----------------------------DROP TABLE IF EXISTS `sc`;

CREATE TABLE `sc` (

`id` int(11) NOT NULL,

`score` int(255) NULL DEFAULT NULL,

PRIMARY KEY (`id`) USING BTREE

) ENGINE= InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT =Compact;-- ----------------------------

--Records of sc-- ----------------------------INSERT INTO `sc` VALUES (10, 40);

INSERT INTO `sc` VALUES (11, 20);

INSERT INTO `sc` VALUES (12, 30);

SET FOREIGN_KEY_CHECKS= 1;

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

`id` int(11) NOT NULL,

`student_id` int(11) NULL DEFAULT NULL,

`name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

PRIMARY KEY (`id`) USING BTREE

) ENGINE= InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT =Compact;-- ----------------------------

--Records of student-- ----------------------------INSERT INTO `student` VALUES (0,12, 'b');

INSERT INTO `student` VALUES (1, 11, 'a');

INSERT INTO `student` VALUES (3, 13, 'c');

SET FOREIGN_KEY_CHECKS= 1;

建表数据结果如下:

4fb4c113d2c9ceecc105ecf16ab2b132.png

a9571f6544643039eceaa9462def79ae.png

可以根据图表中的sql 语句进行相关join查询测试;

3.简单测试2个结果:

测试第一个join 语句如下:

select student.student_id,sc.score from student LEFT JOIN sc on student.student_id=sc.id

结果为:

366997538248e06d2984a142a162e158.png

测试第二个join 语句如下:

select student.student_id,sc.score from student LEFT JOIN sc on student.student_id=sc.id WHERE sc.id is null

结果为:

2db533ca2c4ec113ff23e56756e07ba0.png;解析:在 第一个语句的基础上加上 WHERE sc.id is null ;只保留sc.id 为 nul的数据,而这个数据 只有 student 和 sc 非交集部分才有;

重点为  mysql 没有 full outer join 或者 full join;导致 要想完成 图中的 6,7部分,必须使用 图中1和4 或 1和5 的 union 来实现;

测试第6个join 语句如下:

select student.student_id,sc.score from student left JOIN sc on student.student_id=sc.id

UNION

select student.student_id,sc.scorefrom student RIGHT JOIN sc on student.student_id=sc.id

结果为:

1c3b235ab7d58500e5046afd0e1398ee.png

测试第7个join 语句如下:

select student.student_id,sc.score from student left JOIN sc on student.student_id=sc.id WHERE sc.id isnull

UNION

select student.student_id,sc.scorefrom student RIGHT JOIN sc on student.student_id=sc.id WHERE student.student_id is null

结果为:

fcca8dc8aa9df33e952948bc92d2093e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值