Mysql if - join 实践
Mysql实践浅记
1.这里描述if条件在where子句中使用与在select子句中使用的差别
2.描述left join和join使用时的差别
准备
表结构
CREATE TABLE `bank_card_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '物理主键',
`date_record` date NOT NULL COMMENT '统计日期',
`cust_no` varchar(64) NOT NULL COMMENT '客户号',
`cust_name` varchar(100) DEFAULT NULL COMMENT '客户姓名',
`card_no` varchar(100) NOT NULL COMMENT '银行卡号',
PRIMARY KEY (`id`),
KEY `idx_date_rec` (`date_record`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `customer_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '物理主键',
`date_record` date NOT NULL COMMENT '统计日期',
`cust_no` varchar(64) NOT NULL COMMENT '客户号',
`name` varchar(100) NOT NULL COMMENT '姓名',
`sex` char(1) NOT NULL COMMENT '性别',
`mobile` varchar(15) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`),
KEY `idx_date_rec` (`date_record`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
初始化数据:
insert into `bank_card_info`(date_record,cust_no,card_no) values (current_date(),'AAABBB0','card_no_0'), (current_date(),'AAABBB0','card_no_1'),(current_date(),'AAABBB1','card_no_3'), (current_date(),'AAABBB0','card_no_4');
insert into `customer_info` (date_record,cust_no,name,sex) values (current_date(),'AAABBB0','张三',1),(current_date(),'AAABBB1','张四',0);
insert into `customer_info` (date_record,cust_no,name,sex) select date_record,cust_no,name,sex from `customer_info`;
if 用例记录
select 子句中使用if条件
- 转义性别
select name,if(sex=1,'男','女') from `customer_info`;
小结:select子句中的if条件会根据结果集映射出对应的数据
where子句中使用if条件
select * from `customer_info` where if(sex=1,name='张三',name='张四');
这里是无法实现
sex!=1 and name=‘张四’
的逻辑,效果同下列语句
select * from `customer_info` where sex=1 and name='张三';
小结:where子句中的if条件会根据表达是否为ture进行and计算
join 用例描述
inner join
select a.id,a.cust_no,b.name from `customer_info` b join `bank_card_info` a on a.cust_no = b.cust_no;
left join
添加一条数据
insert into `customer_info` (date_record,cust_no,name,sex) values (current_date(),'AAABBB3','张五',1);
- 基础形式
select a.id,a.cust_no,b.name from `customer_info` b left join `bank_card_info` a on a.cust_no = b.cust_no;
- 添加 and 条件
select a.id,a.cust_no,b.name from `customer_info` b left join `bank_card_info` a on a.cust_no = b.cust_no and b.name='张四';
小结:这里 张三 的数据条数有点打破逻辑,一般的理解应该是有6条对应张三的数据,貌似这里根据id主键做了过滤;
不过这里主要想要描述的是当left join 有 and 条件时,可能会导致临时表中不符合条件的字表的数据呈现为null
完整数据集如下: