首页 > 试题广场 >

Mysql(版本8.0.25)中表student_table

[单选题]
Mysql(版本8.0.25)中表student_table(id,name,birth,sex),插入如下记录:
('1004' , '张三' ,'2000-08-06' , '男');
('1009' , '李四', '2000-01-01', '男');
('1010' , '李四', '2001-01-01', '男');
('1006' , '王五', '2000-08-06' , '女');
('1008' , '张三', '2002-12-01', '女');
('1012' , '张三', '2001-12-01', '女');
('1011' , '李四', '2002-08-06' , '女');
('1013' , '赵六' ,'2000-09-06' , '男');
现有SQL:
select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1 
full join 
(select * from student_table where sex = '女')t2 
on  t1.name = t2.name ; 
如下SQL中与上述SQL实现的语义和结果一致的是()?
  • select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    right join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    and t1.name is null
    union all
    select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    left join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name;
  • select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    right join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    where t1.name is null
    union all
    select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    left join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name;
  • select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    right join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    union all
    select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    left join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    where t2.name is null ;
  • select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    right join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    union all
    select t1.*,t2.*
    from (
    select * from student_table where sex = '男' ) t1
    left join
    (select * from student_table where sex = '女')t2
    on t1.name = t2.name
    and t2.name is null;
full join是全外联接,包括男女重合的部分、男独有的部分以及女独有的部分,从加入的数据可以看出,是4个信息相同的男女,和单独的一个男,单独的一个女。
单独的两个数据在对应的男或者女中,找不到信息相同的异性,所以在对应的位置全填null。
从选项中判断,union all 和union不同,union可以排重而union  all只是单纯地累计
A是左边本来是全保留女部分然后男部分按条件填充,没有就填null,但是最后一句 t1.name=null意思就是说在保证男名字全为null的情况下,还要保留女的所有信息,所以得到4条女信息+男全空信息的表格  union all   右边是男全保留,按姓名相等匹配女信息,得到4条男信息+女信息,以及一条男信息+女空信息,最终得到4条男信息+女信息、4条女信息+男全空信息、一条男信息+女空信息

类比其他选项
B是左边where t1.name=null,只输出一条女信息+男空信息 union all  右边4条男女信息+1条男信息+女空信息
C是左边4条男女信息,一条女信息+男空信息 union all  右边是一条男信息+女空信息
D是左边4条男女信息,一条女信息+男空信息 union all  右边是5个男信息+女空信息

结果光从数据来看,BC得到的数据值都一样,但是得到的顺序却略有差别,其实我还想写下去,但是人有点麻了,要不算了吧🤪

继续吧,从B选项来看,后半部分的leftjoin是以男信息为主导去匹配女信息,所以会是一种男信息匹配完全再进行下一个男信息,
而C选项的上半部分是以女信息为主导去匹配对应的男信息,匹配完全再进行下一个女信息
所以如图结果

但是!!!!!!!
题目是一个MySQL不接受的full join,所以到底是先leftjoin union rightjoin,还是反过来?决定着题干到底是先匹配张三男,还是先匹配张三女,所以我觉得BC都可以选!(从答案来看好像是按照以男信息为主导的匹配,我昏辣)
😵
编辑于 2022-03-26 16:02:22 回复(5)
全外连接=左外连接 union 右外连接
发表于 2022-02-06 09:21:57 回复(1)
b为啥不对
发表于 2022-01-28 22:39:21 回复(4)
我也选的是B选项,感觉B和C的结果是一样的,其实不然。在Mysql当中,union或者union all组合的查询中任意一个如果要“单独进行过滤”的话需要将过滤的条件语句“包装”进入查询中,也就是要将该查询变成一个子查询的形式才行,否则报错,这也就是B选项为什么报错了,因为where语句是暴露在外面的。
发表于 2022-12-01 10:23:08 回复(0)
正确答案是B啊   C你个头你们运行了吗
发表于 2021-12-12 20:17:44 回复(0)
8.0不支持full join吧
发表于 2021-12-12 11:49:30 回复(2)
FULL JOIN运行结果和C选项相同
| t1.id | t1.name | t1.birth   | t1.sex | t2.id | t2.name | t2.birth   | t2.sex |
|-------|---------|------------|--------|-------|---------|------------|--------|
| 1004  | 张三     | 2000-08-06 | 男     | 1008  | 张三    | 2002-12-01 | 女     |
| 1004  | 张三     | 2000-08-06 | 男     | 1012  | 张三    | 2001-12-01 | 女     |
| 1009  | 李四     | 2000-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1010  | 李四     | 2001-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| NULL  | NULL    | NULL       | NULL   | 1006  | 王五    | 2000-08-06 | 女     |
| 1013  | 赵六 	  |2000-09-06  |男	|NULL	|NULL	  |NULL	      |NULL    |
B选项运行结果,和FULL JOIN返回行相同,但顺序不同
| t1.id | t1.name | t1.birth   | t1.sex | t2.id | t2.name | t2.birth   | t2.sex |
|-------|---------|------------|--------|-------|---------|------------|--------|
| NULL  | NULL    | NULL       | NULL   | 1006  | 王五    | 2000-08-06 | 女     |
| 1004  | 张三     | 2000-08-06 | 男     | 1008  | 张三    | 2002-12-01 | 女     |
| 1004  | 张三     | 2000-08-06 | 男     | 1012  | 张三    | 2001-12-01 | 女     |
| 1009  | 李四     | 2000-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1010  | 李四     | 2001-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1013  | 赵六 	  |2000-09-06   |男     |NULL   |NULL	 |NULL	      |NULL    |

A 选项运行结果
`on t1.name = t2.name and t1.name is null` 导致RIGHT JOIN没有任何匹配行,返回女表全部行

| NULL  | NULL    | NULL       | NULL   | 1006  | 王五    | 2000-08-06 | 女     |
| NULL  | NULL    | NULL       | NULL   | 1008  | 张三    | 2002-12-01 | 女     |
| NULL  | NULL    | NULL       | NULL   | 1012  | 张三    | 2001-12-01 | 女     |
| NULL  | NULL    | NULL       | NULL   | 1011  | 李四    | 2002-08-06 | 女     |
| 1004  | 张三    | 2000-08-06 | 男     | 1008  | 张三    | 2002-12-01 | 女     |
| 1004  | 张三    | 2000-08-06 | 男     | 1012  | 张三    | 2001-12-01 | 女     |
| 1009  | 李四    | 2000-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1010  | 李四    | 2001-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1013  | 赵六    |2000-09-06  |男      |NULL   |NULL    |NULL         |NULL    |

D选项运行结果
`on t1.name = t2.name and t2.name is null` 导致LEFT JOIN没有任何匹配行,返回男表全部行
| NULL  | NULL    | NULL       | NULL   | 1006  | 王五    | 2000-08-06 | 女     |
| 1004  | 张三    | 2000-08-06 | 男     | 1008  | 张三    | 2002-12-01 | 女     |
| 1004  | 张三    | 2000-08-06 | 男     | 1012  | 张三    | 2001-12-01 | 女     |
| 1009  | 李四    | 2000-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1010  | 李四    | 2001-01-01 | 男     | 1011  | 李四    | 2002-08-06 | 女     |
| 1004  | 张三    | 2000-08-06 | 男     |NULL   |NULL    |NULL         |NULL    |
| 1009  | 李四    | 2000-01-01 | 男     |NULL   |NULL    |NULL         |NULL    |
| 1010  | 李四    | 2001-01-01 | 男     |NULL   |NULL    |NULL         |NULL    |
| 1013  | 赵六    |2000-09-06  |男      |NULL   |NULL    |NULL         |NULL    |






发表于 2023-06-05 09:04:48 回复(0)
此题B、C 均正确、
若将A、D选项 and t*.name is null 改成 where t*.name is null  则ABCD四个选项都将正确。
但是Mysql(版本8.0.25) 有貌似不支持 full join ; 姑且选BC 吧 --伪代码
--等价写法 1
t1 left join t2  on t1.name = t2.name
union 
t1 right joub t2 on t1.name = t2.name

t1 先左连接 t2  → t1再右连接 t2 →  最后用 union(默认去重)连接

--等价写法2
t1 先左连接 t2  → t1再右连接 t2  最后用 union all 连接
或者
t1 先右连接 t2  → t1再左连接 t2  最后用 union all 连接

(注:因 union all 不会去除重复记录,所以需过滤重复的记录)
至于,过滤条件如何写:要点如下:
1、左连接会把左表信息完全匹配出来。若 where 条件加在左连接查询位置,则需要过滤 右表.name is null
2、右连接会把右表信息完全匹配出来。若 where 条件加在右连接查询位置,则需要过滤 左表.name is null

t1 left join t2  on t1.name = t2.name
union all 
t1 right join t2 on t1.name = t2.name where t1.name is null

--等价写法2.1
t1 left join t2  on t1.name = t2.name
union all 
t1 right join t2 on t1.name = t2.name where t1.name is null

--等价写法 2.2
t1 left join t2  on t1.name = t2.name where t2.name is null
union all 
t1 right join t2 on t1.name = t2.name 

--等价写法 2.3
t1 right join t2  on t1.name = t2.name where t1.name is null
union all 
t1 left join t2 on t1.name = t2.name 

--等价写法 2.4
t1 right join t2  on t1.name = t2.name 
union all 
t1 left join t2 on t1.name = t2.name where t2.name is null
发表于 2023-03-30 11:02:21 回复(0)
B和C不是一样吗?
发表于 2022-03-14 16:09:56 回复(0)

select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1 
full join 
(select * from student_table where sex = '女')t2 
on  t1.name = t2.name ; 
1. t1:
('1004' , '张三' ,'2000-08-06' , '男');
('1009' , '李四', '2000-01-01', '男');
('1010' , '李四', '2001-01-01', '男');
('1013' , '赵六' ,'2000-09-06' , '男');
2. t2:
('1006' , '王五', '2000-08-06' , '女');
('1008' , '张三', '2002-12-01', '女');
('1012' , '张三', '2001-12-01', '女');
('1011' , '李四', '2002-08-06' , '女');
3. full join on  t1.name = t2.name:
('1004' , '张三' ,'2000-08-06' , '男');  ('1008' , '张三', '2002-12-01', '女');
('1004' , '张三' ,'2000-08-06' , '男');  ('1012' , '张三', '2001-12-01', '女');
                                                        ('1006' , '王五', '2000-08-06' , '女');
('1009' , '李四', '2000-01-01', '男');('1011' , '李四', '2002-08-06' , '女');
('1010' , '李四', '2001-01-01', '男');('1011' , '李四', '2002-08-06' , '女');
('1013' , '赵六' ,'2000-09-06' , '男');

发表于 2022-01-09 11:10:10 回复(0)
b结果顺序不对
发表于 2024-04-13 02:25:42 回复(0)
我试了一下B和C都可以的
发表于 2023-09-16 14:00:38 回复(0)
在Mysql当中,union或者union all组合的查询中任意一个如果要“单独进行过滤”的话需要将过滤的条件语句“包装”进入查询中,也就是要将该查询变成一个子查询的形式才行,否则报错,这也就是B选项为什么报错了,因为where语句是暴露在外面的。
发表于 2023-05-16 19:42:32 回复(0)
有点无语,上面做了个一样的,问的是有几行?结果是报错因为版本不支持。。。
发表于 2023-04-24 21:33:19 回复(0)
不理解,
MySQL  没有全连接;
SQL server 中 B、C结果一样;
求解。
发表于 2022-11-11 15:52:44 回复(0)
mysql啥时候支持fulljoin 了啊,,,,
发表于 2022-09-27 13:52:43 回复(0)
b是对的吧,我看问文氏图没毛病呀
发表于 2022-07-09 23:55:47 回复(0)
前面才做过,不能full join…
发表于 2022-06-13 21:40:02 回复(0)
b按男同学排序,c按女同学排序,union执行了排序算法
发表于 2022-05-12 15:39:29 回复(0)
不是说MYSQL不支持FULL JOIN 吗??😥
发表于 2022-04-21 09:27:14 回复(0)