无法在 MariaDB 中执行两个特定查询的联合

Not able to perform Union of two specific queries in MariaDB

我目前正在学习 DBMS。我的问题是找到 class 中年龄最大和最小的学生以及他们的年龄和出生日期。 table里面没有Age字段,我得用DOB来计算。我可以为年长的或最小的孩子做这件事。但是,当我尝试使用 UNION 合并两者时,出现错误。

这是我 运行 两个查询分开时的输出。

MariaDB [SocietyDB]> select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB limit 1;
+---------+-------+--------+------------+---------+------+
| RollNo  | SName | Course | DOB        | Contact | Age  |
+---------+-------+--------+------------+---------+------+
| AC-1202 | Aditi | BSc CS | 2001-02-23 | NULL    |   20 |
+---------+-------+--------+------------+---------+------+
1 row in set (0.001 sec)

MariaDB [SocietyDB]> select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB desc limit 1;
+---------+------------+--------+------------+---------+------+
| RollNo  | SName      | Course | DOB        | Contact | Age  |
+---------+------------+--------+------------+---------+------+
| AC-1205 | Aditya Raj | BSc CS | 2003-10-14 | NULL    |   18 |
+---------+------------+--------+------------+---------+------+
1 row in set (0.001 sec)

现在,这是我对这两个查询进行联合操作时遇到的错误。

MariaDB [SocietyDB]> select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB limit 1
    -> union
    -> select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB desc limit 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'union
select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order...' at line 2

这是另一个尝试,但是,它也给了我错误。我完全不懂。

MariaDB [SocietyDB]> select *, timestampdiff(year, DOB, curdate()) 'Age' from STUDENT order by DOB limit 1 union select *, timestampdiff(year, DOB, curdate()) from STUDENT order by DOB desc limit 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'union select *, timestampdiff(year, DOB, curdate()) from STUDENT order by DOB...' at line 1

我知道我应该使用 max 和 min 函数来查找最年长和最小的学生,但是,它也给我错误。

请帮助我,因为我目前正在学习 DBMS。

编辑:

这是我用于此查询的 STUDENT table。

MariaDB [SocietyDB]> select * from STUDENT;
+---------+------------+----------+------------+---------+
| RollNo  | SName      | Course   | DOB        | Contact |
+---------+------------+----------+------------+---------+
| AC-1201 | Abhishek   | BSc CS   | 2002-01-14 | NULL    |
| AC-1202 | Aditi      | BSc CS   | 2001-02-23 | NULL    |
| AC-1203 | Aditya Jha | BSc CS   | 2002-02-12 | NULL    |
| AC-1204 | Aditya Kr  | BSc CS   | 2001-12-23 | NULL    |
| AC-1205 | Aditya Raj | BSc CS   | 2003-10-14 | NULL    |
| AC-1206 | Aman       | BSc CS   | 2002-10-01 | NULL    |
| AC-1207 | Amartya    | BSc CS   | 2003-03-12 | NULL    |
| XC-1254 | Shahnwaz   | BSc Chem | 2003-04-03 | NULL    |
| ZC-1234 | Raj Khatri | BSc Chem | 2001-03-30 | NULL    |
+---------+------------+----------+------------+---------+
9 rows in set (0.001 sec)

MariaDB [SocietyDB]> desc STUDENT;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| RollNo  | char(7)     | NO   | PRI | NULL    |       |
| SName   | varchar(20) | NO   |     | NULL    |       |
| Course  | varchar(10) | NO   |     | NULL    |       |
| DOB     | date        | YES  |     | NULL    |       |
| Contact | char(10)    | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.002 sec)

编辑 2:

我根据评论区@P.Salmon的提示修改了查询。现在,查询正在运行。但是,这不是完美的解决方案。这只是一个可行的解决方案。 如果有人有更好的解决方案,请 post 提出。它将有助于更详细地了解 DBMS。

MariaDB [SocietyDB]> select *, timestampdiff(year, DOB, curdate()) 'Age' from STUDENT where DOB = (select DOB from STUDENT order by DOB limit 1) union select *, timestampdiff(year, DOB, curdate()) from STUDENT where DOB = (select DOB from STUDENT  order by DOB desc limit 1);
+---------+------------+--------+------------+---------+------+
| RollNo  | SName      | Course | DOB        | Contact | Age  |
+---------+------------+--------+------------+---------+------+
| AC-1202 | Aditi      | BSc CS | 2001-02-23 | NULL    |   20 |
| AC-1205 | Aditya Raj | BSc CS | 2003-10-14 | NULL    |   18 |
+---------+------------+--------+------------+---------+------+
2 rows in set (0.002 sec)

您最初的合并尝试非常接近。您只需要在要联合的两个查询周围放置括号,这样 order by 子句就可以与内部查询正确关联。

(select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB asc limit 1)
union all
(select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT order by DOB desc limit 1)

如果你想处理同一个 Dob 的多个学生,那么 -

(select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT where DOB = (select max(DOB) from STUDENT))
union all
(select *, timestampdiff(year, DOB, curdate()) as Age from STUDENT where DOB = (select min(DOB) from STUDENT))
order by DOB desc;

如果有多个学生,都具有相同的 Dob,并且都是 class 中年龄最大或最小的学生,它将 return 他们全部。