无法在 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 他们全部。
我目前正在学习 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 他们全部。