MySQL - 子查询语句
- MySQL 子查询语句
- 带比较运算符的 MySQL 子查询
- 带 IN 或 NOT-IN 运算符的 MySQL 子查询
- 带 ANY、ALL 或 SOME 的子查询
- 行子查询
- 带 EXISTS 或 NOT EXISTS 的子查询
MySQL 子查询语句
您可以在查询中使用在 MySQL 中,这被称为子查询、内部查询或嵌套查询。通常,子查询嵌入在 where 子句中。
子查询用于返回将在主查询中用作条件的数据,以进一步限制要检索的数据。
子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句以及 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。
编写子查询时应遵循以下规则 -
- 子查询必须用括号括起来。
- 子查询中不能使用 ORDER BY 命令,我们可以改用 GROUP BY 子句。
- 如果子查询返回多行,则只能使用多值运算符,例如 IN。
- 子查询不能直接包含在集合中函数。
- BETWEEN 运算符不能与子查询一起使用。但是,BETWEEN 运算符可以在子查询中使用。
示例
假设我们创建了两个表,并使用以下查询填充它们 -
CREATE TABLE data1 (num INT);
现在,我们将"num"列的值作为 1 插入到 data1 表中 -
INSERT INTO data1 VALUES (1);
这是另一个名为 data2 的表 -
CREATE TABLE data2 (num INT);
让我们在 data2 表中插入一个值 -
INSERT INTO data2 VALUES (10252);
以下是嵌套查询的示例 -
SELECT (SELECT num FROM data2) FROM data1;
输出
以下是上述查询的输出 -
(SELECT num FROM data2) |
---|
10252 |
您可以使用 TABLE 代替 select 语句,并创建如下嵌套查询 -
SELECT (TABLE data2) FROM data1;
输出
上述查询生成以下输出 -
(TABLE data2) |
---|
10252 |
带比较运算符的MySQL子查询
最常用的子查询形式是带比较运算符的子查询。其语法如下:
non_subquery_operand compare_operator(子查询)
示例
假设我们使用如下所示的CREATE语句创建了一个名为EMP的表-
CREATE TABLE EMP ( ID INT, FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT );
现在,让我们使用 INSERT 语句在上面创建的表中插入值,如下所示 -
INSERT INTO EMP VALUES (1, 'Krishna', 'Sharma', 19, 'M', 2000), (2, 'Raj', 'Kandukuri', 20, 'M', 7000), (3, 'Ramya', 'Ramapriya', 25, 'F', 5000), (4, 'Alexandra', 'Botez', 26, 'F', 3000);
以下查询根据 FIRST_NAME 列排列并检索 EMP 表的内容 -
SELECT * FROM EMP WHERE ID IN (SELECT ID FROM EMP WHERE INCOME > 4000);
输出
上述 mysql 查询将生成如下所示的输出 -
ID | FIRST_NAME | LAST_NAME | AGE | SEX | INCOME |
---|---|---|---|---|---|
2 | Raj | Kandukuri | 20 | M | 7000 |
3 | Ramya | Ramapriya | 25 | F | 5000 |
使用 IN 或 NOT-IN 运算符的 MySQL 子查询
使用 IN 或 NOT-IN 子句,我们可以包含或排除来自另一个表的记录。
示例
假设我们使用 CREATE 语句创建了另一个名为 EMP2 的表,如下所示 -
CREATE TABLE EMP2 ( ID INT, FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, INCOME INT );
现在,让我们将四条记录插入到 EMP2 表中 -
INSERT INTO EMP2 VALUES (1, 'Krishna', 'Sharma', 19, 2000), (2, 'Raj', 'Kandukuri', 20, 7000), (3, 'Rahman', 'Ali', 25, 6000), (4, 'Sudha', 'Sastry', 29, 9000);
以下查询演示了此查询的用法 -
SELECT * FROM EMP2 WHERE FIRST_NAME NOT IN (SELECT FIRST_NAME FROM EMP);
输出
以下是上述查询的输出 -
ID | FIRST_NAME | LAST_NAME | AGE | INCOME |
---|---|---|---|---|
3 | Rahman | Ali | 25 | 6000 |
4 | Sudha | Sastry | 29 | 9000 |
带有 ANY、ALL 或 SOME 子查询
您可以使用 ALL、ANY 或 SOME 子句比较子查询返回的值。您需要在子查询之前使用这些子句。
示例
假设我们使用 CREATE 语句创建了一个名为 data1 的表,如下所示 -
CREATE TABLE data1 ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, INCOME INT );
现在,让我们在 data1 表中插入一些记录 -
INSERT INTO data1 VALUES ('Rahman', 'Ali', 25, 6000), ('Sudha', 'Sastry', 29, 9000);
假设我们已经创建了另一个名为 data2 的表,如下所示 -
CREATE TABLE data2 ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), INCOME INT );
现在,我们在 data2 表中插入两条记录 -
INSERT INTO data2 VALUES ('Krishna', 'Sharma', 9000), ('Raj', 'Kandukuri', 7000);
以下查询演示了此查询的用法 -
SELECT * FROM data1 WHERE INCOME > ANY (SELECT INCOME FROM data2);
输出
上述 mysql 查询生成以下输出 -
FIRST_NAME | LAST_NAME | AGE | INCOME |
---|---|---|---|
Sudha | Sastry | 29 | 9000 |
行子查询
如果您需要获取单行数据,则应使用行子查询。
示例
假设我们创建了一个名为 EMPLOYEE 的表,并在其中填充了如下所示的数据 -
CREATE TABLE EMPLOYEE( ID INT NOT NULL, FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT, CONTACT INT );
现在,让我们在 Employee 表中插入一些记录 -
INSERT INTO Employee VALUES (101, 'Ramya', 'Rama Priya', 27, 'F', 9000, 101), (102, 'Vinay', 'Bhattacharya', 20, 'M', 6000, 102);
如果我们创建了另一个表并将其填充为 -
CREATE TABLE CONTACT( ID INT NOT NULL, FIRST_NAME CHAR(20) NOT NULL, EMAIL CHAR(20) NOT NULL, PHONE LONG, CITY CHAR(20) );
现在,让我们尝试使用下面显示的 INSERT 语句将一些记录插入到 CONTACT 表中 -
INSERT INTO CONTACT VALUES (101, 'Ramya', 'ramya@mymail.com', 984801234, 'Hyderabad'), (102, 'Vinay', 'vinay@mymail.com', 984804321, 'Vishakhapatnam');
以下查询演示了此查询的用法 -
SELECT * FROM CONTACT WHERE ROW(ID, FIRST_NAME) = (SELECT ID, FIRST_NAME FROM EMPLOYEE WHERE id = 10);
带有 EXISTS 或 NOT EXISTS 的子查询
EXISTS 运算符是一个布尔运算符,返回 true 或 false。它与子查询一起使用,用于检查子查询中数据的存在性。如果子查询返回任何记录,则此运算符返回 true。否则,返回 false。
NOT EXISTS 运算符用于否定,当子查询未返回任何行时,返回 true。否则,返回 false。 EXISTS 和 NOT EXISTS 都用于相关子查询。以下示例更清楚地说明了这一点。假设我们有一张包含以下内容的表:customer 和 order:
CREATE TABLE CUSTOMER ( cust_id INT, name VARCHAR(20), occupation VARCHAR(20), age INT );
现在,我们在 CUSTOMER 表中插入三条记录 -
INSERT INTO CUSTOMER VALUES (101, 'Peter', 'Engineer', 32), (102, 'Joseph', 'Developer', 30), (103, 'Jhon', 'HR', 23);
假设我们已经使用如下所示的 CREATE 语句创建了另一个名为 ORDERS 的表 -
CREATE TABLE ORDERS( order_id INT, cust_id INT, prod_name VARCHAR(20), order_date VARCHAR(20) );
让我们尝试在其中插入一些记录 -
INSERT INTO ORDERS VALUES (1, 101, 'Laptop', 32), (2, 102, 'Desktop', 30), (3, 103, 'TV', 23);
以下查询演示了此查询的用法 -
SELECT name, career, age FROM customer C WHERE EXISTS (SELECT * FROM Orders O WHERE C.cust_id = O.cust_id);
输出
上述查询将产生以下输出 -
name | occupation | age |
---|---|---|
Peter | Engineer | 32 |
Joseph | Developer | 30 |
Jhon | HR | 23 |