mysql에서 하위 쿼리를 만드는 방법은 무엇입니까?

青灯夜游
풀어 주다: 2020-10-19 11:05:13
원래의
6141명이 탐색했습니다.

mysql에서 하위 쿼리는 다른 쿼리 문 내에 쿼리 문을 중첩하는 것을 의미합니다. SELECT, UPDATE 및 DELETE 문에서 WHERE 절을 사용하여 구현할 수 있습니다. WHERE 절의 구문 형식은 "WHERE < Expression> <입니다. ;연산자> (다른 쿼리문)".

mysql에서 하위 쿼리를 만드는 방법은 무엇입니까?

(추천 튜토리얼: mysql 동영상 튜토리얼)

Subquery는 MySQL에서 흔히 사용되는 쿼리 방식으로, 서브 쿼리를 통해 구현이 가능합니다. 하위 쿼리는 하나의 쿼리 문을 다른 쿼리 문 안에 중첩하는 것을 의미합니다. 하위 쿼리는 SELECT, UPDATE 및 DELETE 문에서 사용할 수 있으며 여러 수준에서 중첩될 수 있습니다. 실제 개발에서는 WHERE 절에 하위 쿼리가 나타나는 경우가 많습니다.

WHERE의 하위 쿼리 구문 형식은 다음과 같습니다.

WHERE <表达式> <操作符> (子查询语句)
로그인 후 복사

그 중 연산자는 IN, NOT IN, EXISTS, NOT EXISTS 등의 비교 연산자 및 키워드가 될 수 있습니다.

1) IN | NOT IN

표현식이 하위 쿼리에서 반환된 결과 집합의 값과 같으면 TRUE가 반환되고, 그렇지 않으면 NOT 키워드가 사용된 경우 반환 값은 정확히 다음과 같습니다. 그 반대.

2) EXISTS | NOT EXISTS

는 하위 쿼리의 결과 집합이 비어 있지 않은지 확인하는 데 사용되며, 그렇지 않으면 키워드 NOT인 경우 FALSE가 반환됩니다. 사용하면 값이 반환됩니다. 정반대입니다.

예제 1

서브 쿼리를 사용하여 tb_students_info 테이블과 tb_course 테이블에서 Java 강좌를 수강하는 학생의 이름을 쿼리합니다. SQL 문과 실행 결과는 다음과 같습니다.

mysql> SELECT name FROM tb_students_info 
    -> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = &#39;Java&#39;);
+-------+
| name  |
+-------+
| Dany  |
| Henry |
+-------+
2 rows in set (0.01 sec)
로그인 후 복사

결과에 따르면 Dany와 Henry만이 Java 강좌를 수강하고 있는 것으로 나타났습니다. 위의 쿼리 프로세스는 다음 두 단계로 나누어 동일한 효과를 얻을 수도 있습니다.

1) 먼저 내부 쿼리를 별도로 실행하여 tb_course 테이블에서 Java 강좌의 ID를 알아냅니다. SQL 문과 실행 결과는 다음과 같습니다.

mysql> SELECT id FROM tb_course 
    -> WHERE course_name = &#39;Java&#39;;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)
로그인 후 복사

Qualified id 필드의 값이 1인 것을 확인할 수 있습니다.

2) 그런 다음 외부 쿼리를 실행하여 tb_students_info 테이블에서course_id가 1인 학생의 이름을 쿼리합니다. SQL 문과 실행 결과는 다음과 같습니다.

mysql> SELECT name FROM tb_students_info 
    -> WHERE course_id IN (1);
+-------+
| name  |
+-------+
| Dany  |
| Henry |
+-------+
2 rows in set (0.00 sec)
로그인 후 복사

일반적으로 외부 SELECT 쿼리를 상위 쿼리라고 하며, 괄호 안에 포함된 쿼리를 하위 쿼리라고 합니다(하위 쿼리는 괄호 안에 배치해야 함). 위 예에서 MySQL이 SELECT 문을 처리할 때 실행 흐름은 먼저 하위 쿼리를 실행한 다음 상위 쿼리를 실행하는 것입니다.

예제 2

예제 1과 유사하게 SELECT 문에 NOT IN 키워드를 사용하여 Java 강좌를 수강하지 않은 학생의 이름을 쿼리해 보겠습니다. SQL 문과 실행 결과는 다음과 같습니다.

mysql> SELECT name FROM tb_students_info 
    -> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = &#39;Java&#39;);
+--------+
| name   |
+--------+
| Green  |
| Jane   |
| Jim    |
| John   |
| Lily   |
| Susan  |
| Thomas |
| Tom    |
| LiMing |
+--------+
9 rows in set (0.01 sec)
로그인 후 복사

실행 결과가 예시 1과 정반대임을 알 수 있습니다. Java 강좌를 공부하지 않은 학생들은 Dany와 Henry가 아닌 학생들입니다.

예제 3

tb_course 테이블과 tb_students_info 테이블에서 Python 강좌를 수강하는 모든 학생의 이름을 = 연산자를 사용하여 쿼리합니다. SQL 문과 실행 결과는 다음과 같습니다.

mysql> SELECT name FROM tb_students_info
    -> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = &#39;Python&#39;);
+------+
| name |
+------+
| Jane |
+------+
1 row in set (0.00 sec)
로그인 후 복사

결과에 따르면 Python 강좌를 수강하는 유일한 학생은 Jane입니다.

예제 4

tb_course 테이블과 tb_students_info 테이블에서 Python 강좌를 수강하지 않은 학생의 이름을 조회하려면 <> 연산자를 사용하세요.

mysql> SELECT name FROM tb_students_info
    -> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = &#39;Python&#39;);
+--------+
| name   |
+--------+
| Dany   |
| Green  |
| Henry  |
| Jim    |
| John   |
| Lily   |
| Susan  |
| Thomas |
| Tom    |
| LiMing |
+--------+
10 rows in set (0.00 sec)
로그인 후 복사

실행 결과가 예시 3과 정반대임을 알 수 있습니다. Python 강좌를 공부하지 않은 학생들은 Jane이 아닌 학생들입니다.

예제 5

tb_course 테이블에 id=1인 강좌가 존재하는지 질의한다. 존재한다면 tb_students_info 테이블의 레코드를 질의한다. SQL 문과 실행 결과는 다음과 같다.

mysql> SELECT * FROM tb_students_info
    -> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+--------+------+------+--------+-----------+
| 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.01 sec)
로그인 후 복사

결과를 보면 tb_course 테이블에 id=1인 레코드가 있으므로 EXISTS 표현식이 TRUE를 반환한 후 외부 쿼리문이 tb_students_info 테이블을 쿼리하여 모든 레코드를 반환하는 것을 볼 수 있습니다.

EXISTS 키워드는 다른 쿼리 조건과 함께 사용할 수 있으며, 조건식과 EXISTS 키워드는 AND, OR로 연결됩니다.

예제 6

tb_course 테이블에 id=1인 강좌가 존재하는지 질의한다. 존재한다면 tb_students_info 테이블에서 age 필드가 24보다 큰 레코드를 질의한다. SQL 문과 실행 결과는 다음과 같다. .

mysql> SELECT * FROM tb_students_info
    -> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+------+------+------+--------+-----------+
| id | name | age  | sex  | height | course_id |
+----+------+------+------+--------+-----------+
|  1 | Dany |   25 | 男   |    160 |         1 |
+----+------+------+------+--------+-----------+
1 row in set (0.01 sec)
로그인 후 복사

결과에 따르면 tb_students_info 테이블에서 레코드를 쿼리했으며 이 레코드의 age 필드 값은 25입니다. 내부 쿼리문은 tb_course 테이블에서 레코드를 검색하고 TRUE를 반환합니다. 외부 쿼리 문은 쿼리를 시작합니다. 질의 조건에 따라 tb_students_info 테이블에서 24세 이상인 레코드를 질의한다.

Extended

하위 쿼리 기능은 테이블 조인을 통해서도 완료할 수 있지만 하위 쿼리를 사용하면 SQL 문을 더 쉽게 읽고 쓸 수 있습니다.

일반적으로 테이블 조인(내부 조인, 외부 조인 등)은 하위 쿼리로 대체될 수 있지만, 그 반대가 반드시 테이블 조인으로 대체될 수는 없습니다. 하위 쿼리는 보다 유연하고 편리하며 형태가 다양하여 쿼리에 대한 필터 조건으로 적합한 반면, 테이블 조인은 연결된 테이블의 데이터를 보는 데 더 적합합니다.

위 내용은 mysql에서 하위 쿼리를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿