mysql的多表联合查询

文章目录

  • mysql的多表联合查询
  • 创建环境
    • 什么是多表联合查询
    • 交叉连接(CROSS JOIN)
      • 笛卡尔积
      • 交叉连接
    • 内连接
    • 外连接
      • 左连接
      • 右连接
    • 分组查询
      • GROUP BY单独使用
      • group by 与group_concat()
      • group by 与聚合函数
      • group by 与 with rollup
    • 子查询

创建环境

1.建立数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zbc                |
| zuoye              |
+--------------------+
6 rows in set (0.00 sec)

2.进入数据库建立两个表

学生信息表
mysql> create table students(id int not null primary key auto_increment,name varchar(500),age tinyint,sex varchar(4),height float,course_id int) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.01 sec)mysql> insert students(name,age,sex,height,course_id) values('Dany',25,'男',160,1),-> ('Green',23,'男',158,2),-> ('Henry',23,'女',185,1),-> ('Jane',22,'男',162,3),-> ('Jim',24,'女',175,2),-> ('John',21,'女',172,4),-> ('Lily',22,'男',165,4),-> ('Susan',23,'男',170,5),-> ('Thomas',22,'女',178,5),-> ('Tom',23,'女',165,5);
Query OK, 10 rows affected (0.05 sec)
Records: 10  Duplicates: 0  Warnings: 0mysql> select * from students;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | Dany   |   25 | 男   |    160 |         1 |
|  2 | Green  |   23 | 男   |    158 |         2 |
|  3 | Henry  |   23 | 女   |    185 |         1 |
|  4 | Jane   |   22 | 男   |    162 |         3 |
|  5 | Jim    |   24 | 女   |    175 |         2 |
|  6 | John   |   21 | 女   |    172 |         4 |
|  7 | Lily   |   22 | 男   |    165 |         4 |
|  8 | Susan  |   23 | 男   |    170 |         5 |
|  9 | Thomas |   22 | 女   |    178 |         5 |
| 10 | Tom    |   23 | 女   |    165 |         5 |
+----+--------+------+------+--------+-----------+
10 rows in set (0.00 sec)mysql>
课程信息表
mysql> create table course(id int not null primary key auto_increment,course_name varchar(50));
Query OK, 0 rows affected (0.01 sec)mysql> insert course(course_name) value('Java'),('MySQL'),('Python'),('Go'),('C++');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0mysql> show tables;
+-----------------+
| Tables_in_zuoye |
+-----------------+
| course          |
| students        |
+-----------------+
2 rows in set (0.00 sec)mysql>

效果

mysql> select * from students;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | Dany   |   25 | 男   |    160 |         1 |
|  2 | Green  |   23 | 男   |    158 |         2 |
|  3 | Henry  |   23 | 女   |    185 |         1 |
|  4 | Jane   |   22 | 男   |    162 |         3 |
|  5 | Jim    |   24 | 女   |    175 |         2 |
|  6 | John   |   21 | 女   |    172 |         4 |
|  7 | Lily   |   22 | 男   |    165 |         4 |
|  8 | Susan  |   23 | 男   |    170 |         5 |
|  9 | Thomas |   22 | 女   |    178 |         5 |
| 10 | Tom    |   23 | 女   |    165 |         5 |
+----+--------+------+------+--------+-----------+
10 rows in set (0.00 sec)mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | Java        |
|  2 | MySQL       |
|  3 | Python      |
|  4 | Go          |
|  5 | C++         |
+----+-------------+
5 rows in set (0.00 sec)mysql>

什么是多表联合查询

前面所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。
在 MySQL 中,多表查询主要有交叉连接、内连接、外连接、分组查询与子查询等5种。

交叉连接(CROSS JOIN)

笛卡尔积

交叉连接(CROSS JOIN):有两种,显式的和隐式的2种,一般用来返回连接表的笛卡尔积。
笛卡尔积(Cartesian product)是指两个集合 X 和 Y 的乘积。
例如,有 A 和 B 两个集合,它们的值如下:

A = {1,2}
B = {3,4,5}

集合 A×B 和 B×A 的结果集分别表示为:

A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };
以上 A×B 和 B×A 的结果就叫做两个集合的笛卡尔积

并且,从以上结果我们可以看出:

  • 两个集合相乘,不满足交换率,即 A×B≠B×A。
  • A 集合和 B 集合的笛卡尔积是 A 集合的元素个数 × B 集合的元素个数。

多表查询遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。在实际应用中,应避免使用笛卡尔积,因为笛卡尔积中容易存在大量的不合理数据,简单来说就是容易导致查询结果重复、混乱。

交叉连接

叉连接的语法格式如下:

SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句];

SELECT <字段名> FROM <表1>, <表2> [WHERE子句];

语法说明如下:

  • 字段名:需要查询的字段名称。
  • <表1><表2>:需要交叉连接的表名。 (”,“是表示隐式)
  • WHERE 子句:用来设置交叉连接的查询条件。

注意:多个表交叉连接时,在 FROM 后连续使用 CROSS JOIN 或,即可。以上两种语法的返回结果是相同的,但是第一种语法才是官方建议的标准写法。

当连接的表之间没有关系时,我们会省略掉 WHERE 子句,这时返回结果就是两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘。需要注意的是,如果每个表有 1000 行,那么返回结果的数量就有 1000×1000 = 1000000 行,数据量是非常巨大的。

例1使用 CROSS JOIN 查询出两张表中的笛卡尔积:

mysql> select * from students cross join course;
+----+--------+------+------+--------+-----------+----+-------------+
| id | name   | age  | sex  | height | course_id | id | course_name |
+----+--------+------+------+--------+-----------+----+-------------+
|  1 | Dany   |   25 | 男   |    160 |         1 |  1 | Java        |
|  1 | Dany   |   25 | 男   |    160 |         1 |  2 | MySQL       |
|  1 | Dany   |   25 | 男   |    160 |         1 |  3 | Python      |
|  1 | Dany   |   25 | 男   |    160 |         1 |  4 | Go          |
|  1 | Dany   |   25 | 男   |    160 |         1 |  5 | C++         |
|  2 | Green  |   23 | 男   |    158 |         2 |  1 | Java        |
|  2 | Green  |   23 | 男   |    158 |         2 |  2 | MySQL       |
|  2 | Green  |   23 | 男   |    158 |         2 |  3 | Python      |
|  2 | Green  |   23 | 男   |    158 |         2 |  4 | Go          |
|  2 | Green  |   23 | 男   |    158 |         2 |  5 | C++         |
|  3 | Henry  |   23 | 女   |    185 |         1 |  1 | Java        |
|  3 | Henry  |   23 | 女   |    185 |         1 |  2 | MySQL       |
|  3 | Henry  |   23 | 女   |    185 |         1 |  3 | Python      |
|  3 | Henry  |   23 | 女   |    185 |         1 |  4 | Go          |
|  3 | Henry  |   23 | 女   |    185 |         1 |  5 | C++         |
|  4 | Jane   |   22 | 男   |    162 |         3 |  1 | Java        |
|  4 | Jane   |   22 | 男   |    162 |         3 |  2 | MySQL       |
|  4 | Jane   |   22 | 男   |    162 |         3 |  3 | Python      |
|  4 | Jane   |   22 | 男   |    162 |         3 |  4 | Go          |
|  4 | Jane   |   22 | 男   |    162 |         3 |  5 | C++         |
|  5 | Jim    |   24 | 女   |    175 |         2 |  1 | Java        |
|  5 | Jim    |   24 | 女   |    175 |         2 |  2 | MySQL       |
|  5 | Jim    |   24 | 女   |    175 |         2 |  3 | Python      |
|  5 | Jim    |   24 | 女   |    175 |         2 |  4 | Go          |
|  5 | Jim    |   24 | 女   |    175 |         2 |  5 | C++         |
|  6 | John   |   21 | 女   |    172 |         4 |  1 | Java        |
|  6 | John   |   21 | 女   |    172 |         4 |  2 | MySQL       |
|  6 | John   |   21 | 女   |    172 |         4 |  3 | Python      |
|  6 | John   |   21 | 女   |    172 |         4 |  4 | Go          |
|  6 | John   |   21 | 女   |    172 |         4 |  5 | C++         |
|  7 | Lily   |   22 | 男   |    165 |         4 |  1 | Java        |
|  7 | Lily   |   22 | 男   |    165 |         4 |  2 | MySQL       |
|  7 | Lily   |   22 | 男   |    165 |         4 |  3 | Python      |
|  7 | Lily   |   22 | 男   |    165 |         4 |  4 | Go          |
|  7 | Lily   |   22 | 男   |    165 |         4 |  5 | C++         |
|  8 | Susan  |   23 | 男   |    170 |         5 |  1 | Java        |
|  8 | Susan  |   23 | 男   |    170 |         5 |  2 | MySQL       |
|  8 | Susan  |   23 | 男   |    170 |         5 |  3 | Python      |
|  8 | Susan  |   23 | 男   |    170 |         5 |  4 | Go          |
|  8 | Susan  |   23 | 男   |    170 |         5 |  5 | C++         |
|  9 | Thomas |   22 | 女   |    178 |         5 |  1 | Java        |
|  9 | Thomas |   22 | 女   |    178 |         5 |  2 | MySQL       |
|  9 | Thomas |   22 | 女   |    178 |         5 |  3 | Python      |
|  9 | Thomas |   22 | 女   |    178 |         5 |  4 | Go          |
|  9 | Thomas |   22 | 女   |    178 |         5 |  5 | C++         |
| 10 | Tom    |   23 | 女   |    165 |         5 |  1 | Java        |
| 10 | Tom    |   23 | 女   |    165 |         5 |  2 | MySQL       |
| 10 | Tom    |   23 | 女   |    165 |         5 |  3 | Python      |
| 10 | Tom    |   23 | 女   |    165 |         5 |  4 | Go          |
| 10 | Tom    |   23 | 女   |    165 |         5 |  5 | C++         |
+----+--------+------+------+--------+-----------+----+-------------+
50 rows in set (0.00 sec)mysql>

例2查询course 表中的 id 字段和 students表中的 course_id 字段相等的内容;

mysql> select * from students  join course where students.course_id = course.id;
+----+--------+------+------+--------+-----------+----+-------------+
| id | name   | age  | sex  | height | course_id | id | course_name |
+----+--------+------+------+--------+-----------+----+-------------+
|  1 | Dany   |   25 | 男   |    160 |         1 |  1 | Java        |
|  2 | Green  |   23 | 男   |    158 |         2 |  2 | MySQL       |
|  3 | Henry  |   23 | 女   |    185 |         1 |  1 | Java        |
|  4 | Jane   |   22 | 男   |    162 |         3 |  3 | Python      |
|  5 | Jim    |   24 | 女   |    175 |         2 |  2 | MySQL       |
|  6 | John   |   21 | 女   |    172 |         4 |  4 | Go          |
|  7 | Lily   |   22 | 男   |    165 |         4 |  4 | Go          |
|  8 | Susan  |   23 | 男   |    170 |         5 |  5 | C++         |
|  9 | Thomas |   22 | 女   |    178 |         5 |  5 | C++         |
| 10 | Tom    |   23 | 女   |    165 |         5 |  5 | C++         |
+----+--------+------+------+--------+-----------+----+-------------+
10 rows in set (0.00 sec)mysql>

内连接

内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。

内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。

内连接的语法格式如下:

SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句];

语法说明如下。

  • 字段名:需要查询的字段名称。
  • <表1><表2>:需要内连接的表名。
  • INNER JOIN :内连接中可以省略
  • INNER 关键字,只用关键字 JOIN。
  • ON 子句:用来设置内连接的连接条件。

INNER JOIN 也可以使用 WHERE 子句指定连接条件,但是 INNER JOIN … ON 语法是官方的标准写法,而且 WHERE 子句在某些时候会影响查询的性能。

多个表内连接时,在 FROM 后连续使用 INNER JOIN 或 JOIN 即可。

内连接可以查询两个或两个以上的表。为了更好的理解,暂时只讲解两个表的连接查询。

例 1
在students 表和 course 表之间,使用内连接查询学生姓名和相对应的课程名称:

mysql> select s.name,c.course_name from students s inner join course c on s.course_id=c.id;
+--------+-------------+
| name   | course_name |
+--------+-------------+
| Dany   | Java        |
| Green  | MySQL       |
| Henry  | Java        |
| Jane   | Python      |
| Jim    | MySQL       |
| John   | Go          |
| Lily   | Go          |
| Susan  | C++         |
| Thomas | C++         |
| Tom    | C++         |
+--------+-------------+
10 rows in set (0.00 sec)mysql>

在这里的查询语句中,两个表之间的关系通过 INNER JOIN指定,连接的条件使用ON子句给出。

注意:当对多个表进行查询时,要在 SELECT 语句后面指定字段是来源于哪一张表。因此,在多表查询时,SELECT 语句后面的写法是表名.列名。另外,如果表名非常长的话,也可以给表设置别名,这样就可以直接在 SELECT 语句后面写上表的别名.列名。

外连接

内连接的查询结果都是符合连接条件的记录,而外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。

外连接可以分为左外连接和右外连接2种,下面根据实例分别介绍左外连接和右外连接。

左连接

左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

左连接的语法格式如下:

SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>;

语法说明如下:

  • 字段名:需要查询的字段名称。
  • <表1><表2>:需要左连接的表名。
  • LEFT OUTER JOIN:左连接中可以省略 OUTER 关键字,只使用关键字 LEFT JOIN。
  • ON 子句:用来设置左连接的连接条件,不能省略。

例 1
在进行左连接查询之前,我们先查看 course 和 students两张表中的数据:

在course中插入一条信息
mysql> insert into course (course_name) value ('HTML');
Query OK, 1 row affected (0.00 sec)mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
|  1 | Java        |
|  2 | MySQL       |
|  3 | Python      |
|  4 | Go          |
|  5 | C++         |
|  6 | HTML        |
+----+-------------+
6 rows in set (0.00 sec)向表students中加入一条信息
mysql> insert students(name,age,sex,height,course_id) values('LiMing',22,'男',180,7);
Query OK, 1 row affected (0.01 sec)mysql> select * from students;
+----+--------+------+------+--------+-----------+
| id | name   | age  | sex  | height | course_id |
+----+--------+------+------+--------+-----------+
|  1 | Dany   |   25 | 男   |    160 |         1 |
|  2 | Green  |   23 | 男   |    158 |         2 |
|  3 | Henry  |   23 | 女   |    185 |         1 |
|  4 | Jane   |   22 | 男   |    162 |         3 |
|  5 | Jim    |   24 | 女   |    175 |         2 |
|  6 | John   |   21 | 女   |    172 |         4 |
|  7 | Lily   |   22 | 男   |    165 |         4 |
|  8 | Susan  |   23 | 男   |    170 |         5 |
|  9 | Thomas |   22 | 女   |    178 |         5 |
| 10 | Tom    |   23 | 女   |    165 |         5 |
| 11 | LiMing |   22 | 男   |    180 |         7 |
+----+--------+------+------+--------+-----------+
11 rows in set (0.00 sec)mysql> 解题
mysql> select s.name,c.course_name from students s left outer join course c on s.course_id = c.id;
+--------+-------------+
| name   | course_name |
+--------+-------------+
| Dany   | Java        |
| Green  | MySQL       |
| Henry  | Java        |
| Jane   | Python      |
| Jim    | MySQL       |
| John   | Go          |
| Lily   | Go          |
| Susan  | C++         |
| Thomas | C++         |
| Tom    | C++         |
| LiMing | NULL        |
+--------+-------------+
11 rows in set (0.00 sec)mysql>

可以看到,运行结果显示了 11 条记录,name 为 LiMing 的学生目前没有课程,因为对应的 course 表中没有该学生的课程信息,所以该条记录只取出了students 表中相应的值,而从course 表中取出的值为 NULL。

右连接

右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

右连接的语法格式如下:

SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>;

语法说明如下:

  • 字段名:需要查询的字段名称。
  • <表1><表2>:需要右连接的表名。
  • RIGHT OUTER JOIN:右连接中可以省略 OUTER 关键字,只使用关键字 RIGHT JOIN。
  • ON 子句:用来设置右连接的连接条件,不能省略。

与左连接相反,右连接以"表2"为基表,"表1"为参考表。右连接查询时,可以查询出"表2"中的所有记录和"表1"中匹配连接条件的记录。如果"表2"的某行在"表1"中没有匹配行,那么在返回结果中,"表1"的字段值均为空值(NULL)。

例 2
在students 表和course 表中查询所有课程,包括没有学生的课程:

mysql> select s.name,c.course_name from students s right outer join course c on s.coursse_id = c.id;
+--------+-------------+
| name   | course_name |
+--------+-------------+
| Dany   | Java        |
| Green  | MySQL       |
| Henry  | Java        |
| Jane   | Python      |
| Jim    | MySQL       |
| John   | Go          |
| Lily   | Go          |
| Susan  | C++         |
| Thomas | C++         |
| Tom    | C++         |
| NULL   | HTML        |
+--------+-------------+
11 rows in set (0.00 sec)mysql>

分组查询

在 MySQL 中,GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。

使用 GROUP BY 关键字的语法格式如下:

GROUP BY <字段名>

其中,"字段名"表示需要分组的字段名称,多个字段时用逗号隔开。

GROUP BY单独使用

单独使用 GROUP BY 关键字时,查询结果会只显示每个分组的第一条记录。

下面根据students 表中的 sex 字段进行分组查询,SQL 语句和运行结果如下:


mysql>set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';              如果报ERROR 1055 (42000)这条错误,输入这条命令解决
Query OK, 0 rows affected (0.00 sec)mysql> SELECT name,sex FROM students GROUP BY sex;
+-------+------+
| name  | sex  |
+-------+------+
| Henry | 女   |
| Dany  | 男   |
+-------+------+
2 rows in set (0.00 sec)mysql>

由结果可以看到,查询结果分为两组,sex 字段值为"女"的是一组,值为"男"的是一组,且每组的学生姓名都显示出来了。

group by 与group_concat()

GROUP BY 关键字可以和 GROUP_CONCAT() 函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。

下面根据 students表中的 sex 字段进行分组查询,使用 GROUP_CONCAT() 函数将每个分组的 name 字段的值都显示出来:

mysql> select sex,group_concat(name) from students group by sex;
+------+-----------------------------------+
| sex  | group_concat(name)                |
+------+-----------------------------------+
| 女   | Henry,Jim,John,Thomas,Tom         |
| 男   | Dany,Green,Jane,Lily,Susan,LiMing |
+------+-----------------------------------+
2 rows in set (0.00 sec)mysql>

由结果可以看到,查询结果分为两组,sex 字段值为"女"的是一组,值为"男"的是一组,且每组的学生姓名都显示出来了。

下面根据students 表中的 age 和 sex 字段进行分组查询:

mysql> select age,sex,group_concat(name) from students group by age,sex;
+------+------+--------------------+
| age  | sex  | group_concat(name) |
+------+------+--------------------+
|   21 | 女   | John               |
|   22 | 女   | Thomas             |
|   22 | 男   | Jane,Lily,LiMing   |
|   23 | 女   | Henry,Tom          |
|   23 | 男   | Green,Susan        |
|   24 | 女   | Jim                |
|   25 | 男   | Dany               |
+------+------+--------------------+
7 rows in set (0.00 sec)mysql>

上面实例在分组过程中,先按照 age 字段进行分组,当 age 字段值相等时,再把 age 字段值相等的记录按照 sex 字段进行分组。

多个字段分组查询时,会先按照第一个字段进行分组。如果第一个字段中有相同的值,MySQL 才会按照第二个字段进行分组。如果第一个字段中的数据都是唯一的,那么 MySQL 将不再对第二个字段进行分组。

group by 与聚合函数

在数据统计时,GROUP BY 关键字经常和聚合函数一起使用。

聚合函数包括 COUNT(),SUM(),AVG(),MAX() 和 MIN()。其中,COUNT() 用来统计记录的条数;SUM() 用来计算字段值的总和;AVG() 用来计算字段值的平均值;MAX() 用来查询字段的最大值;MIN() 用来查询字段的最小值。

下面根据 students 表的 sex 字段进行分组查询,使用 COUNT() 函数计算每一组的记录数:

mysql> select sex,count(sex) from students group by sex;
+------+------------+
| sex  | count(sex) |
+------+------------+
| 女   |          5 |
| 男   |          6 |
+------+------------+
2 rows in set (0.00 sec)mysql>

结果显示,sex 字段值为"女"的记录是一组,有 5 条记录;sex 字段值为"男"的记录是一组,有 5 条记录。

group by 与 with rollup

WITH POLLUP 关键字用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,即统计记录数量。

下面根据 students 表中的 sex 字段进行分组查询,并使用 WITH ROLLUP 显示记录的总和

mysql> select sex,group_concat(name) from students group by sex with rollup;
+------+-------------------------------------------------------------+
| sex  | group_concat(name)                                          |
+------+-------------------------------------------------------------+
| 女   | Henry,Jim,John,Thomas,Tom                                   |
| 男   | Dany,Green,Jane,Lily,Susan,LiMing                           |
| NULL | Henry,Jim,John,Thomas,Tom,Dany,Green,Jane,Lily,Susan,LiMing |
+------+-------------------------------------------------------------+
3 rows in set (0.00 sec)mysql> 

查询结果显示,GROUP_CONCAT(name) 显示了每个分组的 name 字段值。同时,最后一条记录的 GROUP_CONCAT(name) 字段的值刚好是上面分组 name 字段值的总和。

子查询

子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERE 子句中。

子查询在 WHERE 中的语法格式如下:

WHERE <表达式> <操作符> (子查询)

其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
1)IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。

mysql> select name from students where course_id in (select id from course where course_name='Java');
+-------+
| name  |
+-------+
| Dany  |
| Henry |
+-------+
2 rows in set (0.00 sec)mysql> mysql> select name from students where course_id not in (select id from course where course_name='Java');
+--------+
| name   |
+--------+
| Green  |
| Jane   |
| Jim    |
| John   |
| Lily   |
| Susan  |
| Thomas |
| Tom    |
| LiMing |
+--------+
9 rows in set (0.00 sec)mysql>

2)EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。

mysql> select name from students where exists (select id from course where course_name='Java');
+--------+
| name   |
+--------+
| Dany   |
| Green  |
| Henry  |
| Jane   |
| Jim    |
| John   |
| Lily   |
| Susan  |
| Thomas |
| Tom    |
| LiMing |
+--------+
11 rows in set (0.00 sec)mysql> mysql> select name from students where  not exists (select id from course where course_name='Java');
Empty set (0.00 sec)mysql> 

子查询的功能也可以通过表连接完成,但是子查询会使 SQL 语句更容易阅读和编写。

一般来说,表连接(内连接和外连接等)都可以用子查询替换,但反过来却不一定,有的子查询不能用表连接来替换。子查询比较灵活、方便、形式多样,适合作为查询的筛选条件,而表连接更适合于查看连接表的数据。

mysql的多表联合查询相关推荐

  1. mysql中多表联合查询语句_mysql中的多表联合查询语句是什么

    mysql中的多表联合查询语句是:[select 语句1 union [union 选项] select 语句2 union [union 选项] select 语句n].多表联合查询结果是将多个se ...

  2. mysql之多表联合查询并输入数据来自哪张表

    比如联合查询3个表,表名分别叫a,b,c select 'a' tbname,a.* from a union all select 'b' tbname,b.* from b union all s ...

  3. 【MySQL】多表联合查询、连接查询、子查询

    文章目录 [1]连接查询 内连接查询 外连接查询 左连接 右连接 [2]联合查询 [3]子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键 ...

  4. thinkphp mysql sum_thinkphp多表联合查询计算总和sum

    原标题:TP5 数据查询一对多计算总和SUM TP5查询语句 (1)查询语句 Db::table('student') ->alias('st') ->join(['fraction' = ...

  5. 第四篇:Mysql查询-多表联合查询-及子查询

    mysql查询语句 多表联合查询 几子查询 1,单表查询:select * from 表名; eg:  select * from t1; 2,按条件查询: select 字段1,字段2,字段n... ...

  6. mysql教程详解之多表联合查询,MYSQL教程mysql多表联合查询返回一张表的内容实现代码...

    搜索热词 <MysqL教程MysqL多表联合查询返回一张表的内容实现代码>要点: 本文介绍了MysqL教程MysqL多表联合查询返回一张表的内容实现代码,希望对您有用.如果有疑问,可以联系 ...

  7. mysql多表查询分页面_mysql多表联合查询分点经验给大家

    你的位置: 问答吧 -> MySQL -> 问题详情 mysql多表联合查询分点经验给大家 我在工作中天天研究zen cart的程序,那个叫人痛苦,最近比较痛苦的是经常碰见mysql多表联 ...

  8. mysql同张表关联多次查询_MySQL多次单表查询和多表联合查询

    Tip:不建议执行三张表以上的多表联合查询 对数据量不大的应用来说,多表联合查询开发高效,但是多表联合查询在表数据量大,并且没有索引的时候,如果进行笛卡儿积,那数据量会非常大,sql执行效率会非常低 ...

  9. mysql联合查询查询语句_mysql多表联合查询语句是什么

    mysql多表联合查询语句是:使用select语句,union关键词,语法为[select 语句1 union [union 选项] select 语句2 union [union 选项] selec ...

最新文章

  1. IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...
  2. 如何防止我的模型过拟合?这篇文章给出了6大必备方法
  3. 如何在微信小程序中使用iconfont
  4. 021_html文本格式化标签
  5. HDU-4277USACO ORZ深搜+set去重
  6. Oracle 20c 新特性:强制大小写敏感密码文件 Force Password File Case Sensitive
  7. js-sdk探索之微信网页分享
  8. pycharm 中 pep8 检查开启.
  9. 利用ISCSI存储技术构建IP存储网络(实战篇)
  10. 中国诚信全球垫底?讲讲《Science》现在的论文有多不靠谱
  11. iOS与JS交互之UIWebView协议拦截
  12. javascript弹窗和基本数据类型
  13. 第09章节-Python3.5-Django目录详解 8
  14. OpenStack安装CentOS镜像:Device eth0 does not seem to be present, delaying initialization
  15. 解决Win10无操作两分钟进入睡眠问题
  16. 【数学】通俗解释布丰投针实验过程、蒙特卡洛方法及python仿真代码
  17. 【PytorchLearning】构建自己的数据集
  18. 为什么我会这么多技术,还这么难找工作
  19. 当大叔爱上小萝莉我就爱上了正则表达式(一)
  20. 5、数码相框之使用多种方法支持多输入

热门文章

  1. 植物大战 快速 排序——纯C
  2. 使用Fastai开发和部署图像分类器应用
  3. 十年小米测试工程师感悟——写给还在迷茫中的测试朋友!
  4. chrome的vimium和stylist ----还有 change colors
  5. 安全性归约(安全性定义 - 1)
  6. 保姆级Spring+Mybatis整合的简单增删改查功能实现
  7. G-Biosciences 固定化蛋白A,树脂的特征和应用
  8. 链路技术(HCNA)——链路聚合
  9. Memory Fence
  10. base64 编码及解码