SQL子查询– SQL中的嵌套查询

时间:2020-02-23 14:32:35  来源:igfitidea点击:

在现实世界中,有时候我们需要特定的数据集,但是我们没有获取数据集的确切细节。
在这种情况下,我们尝试从现有的可用信息集中获取信息。
为了实现这样的目标,我们使用SQL子查询。

SQL子查询

SQL子查询是嵌套在另一个查询中的查询。
大多数子查询与查询的WHERE子句一起使用。

SQL子查询规则

  • 子查询可以与不同的SQL子句一起使用,例如WHERE子句,HAVING子句和FROM子句。

  • 子查询也可以与SELECT,UPDATE,INSERT和DELETE语句一起使用。

  • 执行顺序从子查询开始,然后是主查询。

  • 子查询必须用括号括起来。

  • 即使主查询可以使用ORDER BY,也不能在子查询中使用ORDER BY命令。
    GROUP BY命令可用于执行与子查询中的ORDER BY相同的功能。

  • 当子查询与比较运算符一起使用时,它应位于比较运算符的右侧。

SQL子查询语法

SELECT column_name FROM table_name 
WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);

OPERATOR之后在圆括号内的查询是子查询,而在圆括号外的查询是主查询。

SQL子查询示例

让我们考虑以下两个表,以便更好地理解子查询。

学生

Roll NoNameAgeGender
1Amit12M
2John13M
3Diana14F
4Henry15M

ClassSectionRoll No
6A1
7A2
8A3
9B4

请在下面的MySQL查询中查找以创建表并插入数据。

CREATE TABLE `student` (
`RollNo` INT NOT NULL,
`Name` VARCHAR(45) NULL,
`Age` INT NULL,
`Gender` VARCHAR(45) NULL,
PRIMARY KEY (`RollNo`));

CREATE TABLE `class` (
`ClassNo` INT NOT NULL,
`Section` VARCHAR(45) NULL,
`RollNo` INT NULL,
PRIMARY KEY (`ClassNo`));

INSERT INTO `student` (`RollNo`, `Name`, `Age`, `Gender`)
VALUES
	(1, 'Amit', 12, 'M'),
	(2, 'John', 13, 'M'),
	(3, 'Diana', 14, 'F'),
  (4,'Henry', 15,'M');
	
	 INSERT INTO `class` (`ClassNo`, `Section`, `RollNo`)
VALUES
	(6, 'A', 1),
	(7, 'A', 2),
	(8, 'A', 3),
  (9,'B', 4);

让我们尝试研究一些使用SQL子查询的示例。

  • SQL子查询,用于获取" A"部分中所有学生的姓名
SELECT Name FROM student 
WHERE RollNo IN (SELECT RollNo FROM class WHERE section = 'A')
Name
Amit
John
Diana

带IN运算符的SQL SubQuery

  • 类大于7的SQL子查询
SELECT * FROM student 
WHERE RollNo IN (SELECT RollNo FROM class WHERE ClassNo>7)
RollNoNameAgeGender
3Diana14F
4Henry15M