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
完整数据集如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 MySQL 中,您可以使用条件操作符(如 IF 或 CASE WHEN)将条件逻辑应用于 JOIN 操作。 例如,考虑以下两个表: ``` orders +----+---------+-------+ | id | user_id | total | +----+---------+-------+ | 1 | 100 | 50.00 | | 2 | 101 | 25.00 | | 3 | 100 | 75.00 | +----+---------+-------+ users +---------+--------+ | user_id | name | +---------+--------+ | 100 | Alice | | 101 | Bob | | 102 | Claire | +---------+--------+ ``` 如果您想要获取每个订单的用户名,可以使用以下查询: ``` SELECT orders.id, users.name FROM orders JOIN users ON orders.user_id = users.user_id ``` 这将返回以下结果: ``` +----+-------+ | id | name | +----+-------+ | 1 | Alice | | 2 | Bob | | 3 | Alice | +----+-------+ ``` 现在假设您想要在结果中包括一个新列,该列根据订单总计是否大于 $50 进行分类。您可以使用 IF 函数来实现此目的: ``` SELECT orders.id, users.name, IF(orders.total > 50, 'high', 'low') AS total_category FROM orders JOIN users ON orders.user_id = users.user_id ``` 这将返回以下结果: ``` +----+-------+----------------+ | id | name | total_category | +----+-------+----------------+ | 1 | Alice | high | | 2 | Bob | low | | 3 | Alice | high | +----+-------+----------------+ ``` 在此查询中,IF 函数将根据订单总计是否大于 $50 来分类每个订单。如果是,则将 total_category 列设置为 'high',否则设置为 'low'。 ### 回答2: MySQL中的JOIN如果语句用于将两个或多个表中的数据进行组合和联接。它根据指定的连接条件匹配每个表中的行,并返回满足条件的结果集。 如果我们需要根据某些条件进行表联接,我们可以使用IF语句来实现。具体做法是在JOIN ON子句中使用IF函数,并在函数中定义要使用的条件。 例如,假设我们有两个表,一个是"学生"表,另一个是"成绩"表。我们想要从这两个表中联接学生成绩,并只选择满足条件的学生。假设我们只选择分数大于80分的学生,可以使用以下语句: SELECT 学生.姓名, 成绩.分数 FROM 学生 JOIN 成绩 ON 学生.学号 = 成绩.学号 WHERE IF(成绩.分数 > 80, 1, 0) = 1; 在上面的例子中,我们使用IF函数来判断成绩是否大于80,如果是,则返回1,否则返回0。然后我们使用WHERE子句来过滤只保留值为1的记录。 这样,返回的结果集将只包含满足条件的学生姓名和分数。 总结来说,MySQL中的JOIN IF语句可以通过在JOIN ON子句中使用IF函数来联接表,并在函数中定义特定的条件。这种方法允许我们根据需要灵活地选择满足条件的记录。 ### 回答3: MySQLJOIN是用来将两个或多个表连接在一起,以便在查询中使用相关数据。而IF是MySQL中的条件语句,用于根据特定的条件执行不同的操作。 当我们需要根据条件来连接表时,可以使用JOIN IF语句。具体操作如下: 1. 首先使用SELECT语句选择需要的数据列以及需要连接的表。 2. 使用JOIN关键字来连接表,指定连接条件。 3. 然后使用IF语句来添加条件,根据特定条件执行不同的操作。 4. 最后使用WHERE子句来添加额外的条件,筛选满足条件的数据。 例如,我们有两个表:学生表(students)和班级表(classes),我们要查询所有学生的信息,同时根据学生的成绩等级进行分类显示。 可以使用以下SQL查询语句实现: SELECT students.name, students.grade, IF(students.grade >= 60, '及格', '不及格') AS 成绩等级, classes.class_name FROM students JOIN classes ON students.class_id = classes.class_id; 以上语句选择了学生表中的姓名和成绩列,以及班级表中的班级名称列。使用JOIN关键字连接两个表,指定连接条件为学生表的class_id列与班级表的class_id列相等。然后使用IF语句判断学生的成绩是否大于等于60,如果是,则成绩等级为“及格”,否则为“不及格”。最后使用WHERE子句可以在查询结果中添加额外的筛选条件。 通过以上操作,我们可以根据条件来进行表的连接和数据的查询,实现更加灵活和多样化的数据操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值