mysql子查询同一张表

在MySQL中,子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以是一个独立的查询语句,也可以嵌套在另一个查询语句中。本文将介绍如何在同一张表中使用子查询进行数据查询和操作,以及如何使用子查询实现更复杂的数据处理。

子查询的基本用法

子查询可以用于各种查询场景,例如在一个表中查询符合某个条件的数据,或者在一个表中查询与另一个表的关联数据。下面我们以一个名为students的表为例,来演示子查询的基本用法。

创建表

首先,我们需要创建一个名为students的表,用于存储学生的信息。表结构如下所示:

Field Type
id INT(11)
name VARCHAR(100)
age INT(2)
gender VARCHAR(10)
class VARCHAR(50)

我们可以使用以下SQL语句创建该表:

CREATE TABLE students (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  age INT(2) NOT NULL,
  gender VARCHAR(10) NOT NULL,
  class VARCHAR(50) NOT NULL
);
插入数据

接下来,我们向students表中插入一些测试数据,以便后续演示子查询的用法。下面是插入数据的SQL语句:

INSERT INTO students (name, age, gender, class)
VALUES ('Alice', 18, 'female', 'A'),
       ('Bob', 19, 'male', 'B'),
       ('Cindy', 17, 'female', 'A'),
       ('David', 18, 'male', 'B'),
       ('Emily', 19, 'female', 'A');

现在,students表中有了5条学生信息的记录。

基本查询

现在,我们可以开始使用子查询进行基本的数据查询了。下面是一些常见的子查询示例:

查询满足条件的数据

假设我们要查询年龄大于18岁的学生,可以使用如下子查询语句:

SELECT name
FROM students
WHERE age > (SELECT AVG(age) FROM students);

上述子查询语句中,(SELECT AVG(age) FROM students)是一个独立的查询语句,用于计算students表中所有学生年龄的平均值。然后,主查询根据子查询的结果选择符合条件的学生姓名。该语句将返回年龄大于平均年龄的学生姓名。

查询关联数据

假设我们还有一个名为scores的表,用于存储学生的考试成绩。scores表与students表关联,通过学生的id进行关联。scores表的结构如下所示:

Field Type
id INT(11)
student_id INT(11)
subject VARCHAR(100)
score INT(3)

我们可以使用以下SQL语句创建该表:

CREATE TABLE scores (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  student_id INT(11) NOT NULL,
  subject VARCHAR(100) NOT NULL,
  score INT(3) NOT NULL,
  FOREIGN KEY (student_id) REFERENCES students(id)
);

现在,我们向scores表中插入一些测试数据,以便后续演示子查询的用法。下面是插入数据的SQL语句:

INSERT INTO scores (student_id, subject, score)
VALUES (1, 'Math', 90),
       (1, 'English', 80),
       (2, 'Math', 95),
       (2, 'English', 85),
       (3, 'Math', 88),
       (3, 'English', 78),
       (4, 'Math', 92),
       (4, 'English', 82),
       (5, 'Math', 87),
       (5, 'English', 77);

假设我们要查询每个学生的数学成绩,并将其与所有学生的平均数进行比较。可以使用如下子查询语句: