mysql多表合并


文章目录

  • mysql多表合并
  • 建立两张表
  • 根据主键,把一个表的字段赋值到另一张表
  • 拓展
  • 在使用WHERE条件语句时,可以通过判断字段值是否为空从而筛选有效信息
  • mysql筛选出一个表中有而另一个表中没有的数据


应用场景:

通常一张表上有主键以及其他的字段,但有时因为业务变更,一张表中缺乏某一个字段,但是我们需要的这一个字段在另一张表上,所以现在可以使用多表合并

建立两张表

Shell1

userid

username

age

gender

101

李华

2001-09-12


102

小梅

2002-07-23


103

陈皮

2004-11-09


CREATE TABLE Shell1(
	userid INT NOT NULL,
	username VARCHAR(20),
	age DATE,
	gender VARCHAR(10)
);

#插入数据
INSERT INTO Shell1(userid,username,age,gender) VALUES
	('101','李华','2001-09-12','男'),
	('102','小梅','2002-07-23','女'),
	('103','陈皮','2004-11-09','男');

Shell2

userid

username

age

gender

hobby

101

李华

(NULL)


唱歌跳舞

102

小梅

(NULL)


弹钢琴

103

陈皮

(NULL)


街舞

104

张三

(NULL)


弹吉他

CREATE TABLE Shell2(
	userid INT NOT NULL,
	username VARCHAR(20),
	age DATE DEFAULT NULL,
	gender VARCHAR(10),
	hobby VARCHAR(50) 
);

#插入数据
INSERT INTO Shell2(userid,username,gender,hobby) VALUES
	('101','李华','男','唱歌跳舞'),
	('102','小梅','女','弹钢琴'),
	('103','陈皮','男','街舞'),
	('104','张三','男','弹吉他');

根据两张表可看出,表2信息比表1全面,但信息有所差缺,所以现在需要结合形成一张新的表

根据主键,把一个表的字段赋值到另一张表

需求:

根据useridShell1Shell2关联起来,把Shell1age字段填充到Shell2表中

具体操作

update Shell1,Shell2
set Shell2.age = Shell1.age
where Shell2.userid = Shell1.userid

#注解:
	update Shell1,Shell2  选中需要操作的两张表
	set 表.字段 = 表.字段
	where 关联条件

MYSQL 联合两个数据表 mysql两个表数据合并_mysql


由图可看到,表1表2所有关联的信息已更新填充,而userid为104的age字段并没有更新,原因是在Shell1中并没有对应的字段值

思考?

Shell1表中并没有Hobby字段,是否可以将Shell2表中的hoby复制过去

##假设方案成立
update Shell1,Shell2
set Shell1.hobby = Shell2.hobby
where Shell2.userid = Shell1.userid

MYSQL 联合两个数据表 mysql两个表数据合并_MYSQL 联合两个数据表_02


显而易见是不可以的,报错信息是:显示未知列“Shell1.hobby”

Shell1没有此字段,那如何解决呢?

##为Shell1表新增字段
alter table Shell1 Add column hobby varchar(50) not null default 0 first;

##注解:
default 0 first     把字段添加在第一个位置

#我选择放在最后

MYSQL 联合两个数据表 mysql两个表数据合并_sql_03


新增字段成功,现在可以复制Shell2表的字段值

MYSQL 联合两个数据表 mysql两个表数据合并_数据库_04

MYSQL 联合两个数据表 mysql两个表数据合并_数据库_05

拓展

在使用WHERE条件语句时,可以通过判断字段值是否为空从而筛选有效信息

##现在需要筛选出字段不为空的字段有效信息
SELECT
	`个人客户`.`销售顾问`,`个人客户`.`客户名称`,`个人客户`.`省份`,`个人客户`.`市`
FROM
	`个人客户`
WHERE `销售顾问` is not null;

##使用 is not null;便可筛选出不为空字段

##筛选出为空字段值
SELECT
	`个人客户`.`销售顾问`,`个人客户`.`客户名称`,`个人客户`.`省份`,`个人客户`.`市`
FROM
	`个人客户`
WHERE `销售顾问` is null;

mysql筛选出一个表中有而另一个表中没有的数据

查询未填“分组填写名单”但“选课名单”里有学号的人

SELECT * FROM `选课名单` 
WHERE 
    NOT  EXISTS  ( 
        SELECT `学号` 
        FROM `分组填写名单` 
        WHERE `选课名单`.`学号` = `分组填写名单`.`学号` );