MySQL-EXISTS
时间:2020-02-23 14:41:01 来源:igfitidea点击:
在本教程中,我们将学习MySQL中的EXISTS运算符。
EXISTS运算符
我们使用EXISTS运算符检查子查询中是否存在任何记录。
如果子查询中至少有一条记录可用,则此运算符将返回TRUE。
否则,我们将得到FALSE。
EXISTS语法
SELECT column_name FROM table_name WHERE EXISTS ( SELECT some_column_name FROM some_table_name WHERE some_condition )
示例表
在本教程中,我们将使用"员工"和"评论"表。
表:员工
mysql> SELECT * FROM employee; +------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+ | employeeid | firstname | lastname | email | score | birthday | lastmodified | created | +------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+ | e01 | | | @example.com | 7 | 1900-01-01 | 2016-02-04 06:08:10 | 2016-01-01 01:01:01 | | e02 | John | Doe | [email protected] | 8 | 1900-02-03 | 2016-02-04 06:08:10 | 2016-01-01 01:01:04 | | e03 | Jane | Doe | [email protected] | 9 | 1900-05-20 | 2016-02-04 06:08:10 | 2016-01-01 01:01:04 | | e04 | Tin | Tin | [email protected] | 6 | 1900-10-20 | 2016-02-04 06:08:10 | 2016-01-01 01:02:03 | | e05 | Bob | Coder | [email protected] | 7 | 1900-08-20 | 2016-02-04 06:08:10 | 2016-01-01 01:02:10 | +------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+ 5 rows in set (0.00 sec)
表:评论
mysql> SELECT * FROM comments; +-----------+------------+---------------------+---------------------+---------------------+ | commentid | employeeid | commentbody | lastmodified | created | +-----------+------------+---------------------+---------------------+---------------------+ | 1 | e03 | Awesome | 2016-01-01 02:03:04 | 2016-01-01 02:03:04 | | 2 | e03 | Hello World | 2016-01-02 01:02:03 | 2016-01-02 01:02:03 | | 3 | e01 | Happy | 2016-01-02 01:04:03 | 2016-01-02 01:04:03 | | 4 | e04 | This is my comment. | 2016-01-01 02:03:04 | 2016-01-01 02:03:04 | | 5 | e01 | Keep coding.... | 2016-04-04 03:02:01 | 2016-05-04 03:02:01 | +-----------+------------+---------------------+---------------------+---------------------+ 5 rows in set (0.00 sec)
例子1
在此示例中,我们将显示所有至少评论过一次的员工的详细信息。
假设我们要显示进行评论的员工的员工编号,名字和姓氏。
因此,要解决此问题,我们的子查询将找到被评论的员工,如下所示。
mysql> SELECT c.employeeid FROM comments c WHERE c.employeeid = e.employeeid;
其中," c"是注释表的别名," e"是雇员表的别名。
现在,我们将列出所有至少评论过一次的员工的详细信息。
mysql> SELECT e.employeeid, e.firstname, e.lastname FROM employee e WHERE EXISTS( SELECT c.employeeid FROM comments c WHERE c.employeeid = e.employeeid); +------------+-----------+----------+ | employeeid | firstname | lastname | +------------+-----------+----------+ | e01 | | | | e03 | Jane | Doe | | e04 | Tin | Tin | +------------+-----------+----------+ 3 rows in set (0.00 sec)
因此,我们可以看到有3名员工至少发表了一次评论。
示例2
在下面的示例中,我们将列出所有至少评论过两次的员工的详细信息。
因此,要解决此问题,我们必须使用聚合函数COUNT来查找员工发布的评论总数。
而且,我们还必须按employeeid将结果分组。
下面列出了子查询以列出所有评论至少两次的雇员编号。
mysql> SELECT c.employeeid FROM comments c WHERE c.employeeid = e.employeeid GROUP BY c.employeeid HAVING COUNT(c.employeeid) >= 2;
其中,c是注释表的别名,e是雇员表的别名。
现在,我们将列出所有发表至少两次评论的员工。
mysql> SELECT e.employeeid, e.firstname, e.lastname, (SELECT COUNT(c.commentid) FROM comments c WHERE c.employeeid = e.employeeid) AS 'total_comment' FROM employee e WHERE EXISTS( SELECT c.employeeid FROM comments c WHERE c.employeeid = e.employeeid GROUP BY c.employeeid HAVING COUNT(c.employeeid) >= 2); +------------+-----------+----------+---------------+ | employeeid | firstname | lastname | total_comment | +------------+-----------+----------+---------------+ | e01 | | | 2 | | e03 | Jane | Doe | 2 | +------------+-----------+----------+---------------+ 2 rows in set (0.00 sec)
因此,有两名员工至少发表了2次评论。