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全面,但信息有所差缺,所以现在需要结合形成一张新的表
根据主键,把一个表的字段赋值到另一张表
需求:
根据userid将Shell1和Shell2关联起来,把Shell1的age字段填充到Shell2表中
具体操作
update Shell1,Shell2
set Shell2.age = Shell1.age
where Shell2.userid = Shell1.userid
#注解:
update Shell1,Shell2 选中需要操作的两张表
set 表.字段 = 表.字段
where 关联条件
由图可看到,表1表2所有关联的信息已更新填充,而userid为104的age字段并没有更新,原因是在Shell1中并没有对应的字段值
思考?
Shell1表中并没有Hobby字段,是否可以将Shell2表中的hoby复制过去
##假设方案成立
update Shell1,Shell2
set Shell1.hobby = Shell2.hobby
where Shell2.userid = Shell1.userid
显而易见是不可以的,报错信息是:显示未知列“Shell1.hobby”
Shell1没有此字段,那如何解决呢?
##为Shell1表新增字段
alter table Shell1 Add column hobby varchar(50) not null default 0 first;
##注解:
default 0 first 把字段添加在第一个位置
#我选择放在最后
新增字段成功,现在可以复制Shell2表的字段值
拓展
在使用WHERE条件语句时,可以通过判断字段值是否为空从而筛选有效信息
##现在需要筛选出字段不为空的字段有效信息
SELECT
`个人客户`.`销售顾问`,`个人客户`.`客户名称`,`个人客户`.`省份`,`个人客户`.`市`
FROM
`个人客户`
WHERE `销售顾问` is not null;
##使用 is not null;便可筛选出不为空字段
##筛选出为空字段值
SELECT
`个人客户`.`销售顾问`,`个人客户`.`客户名称`,`个人客户`.`省份`,`个人客户`.`市`
FROM
`个人客户`
WHERE `销售顾问` is null;
mysql筛选出一个表中有而另一个表中没有的数据
查询未填“分组填写名单”但“选课名单”里有学号的人
SELECT * FROM `选课名单`
WHERE
NOT EXISTS (
SELECT `学号`
FROM `分组填写名单`
WHERE `选课名单`.`学号` = `分组填写名单`.`学号` );