연산자>( 다른 쿼리 문)"."/> <연산자>( 다른 쿼리 문)".">
mysql에서 하위 쿼리는 다른 쿼리 문 내에 쿼리 문을 중첩하는 것을 의미합니다. SELECT, UPDATE 및 DELETE 문에서 WHERE 절을 사용하여 구현할 수 있습니다. WHERE 절의 구문 형식은 "WHERE e4e2d677a97e5fdc033eda2caac96828 <입니다. ;연산자> (다른 쿼리문)".
(추천 튜토리얼: 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 = 'Java'); +-------+ | 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 = 'Java'; +----+ | 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 = 'Java'); +--------+ | 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 = 'Python'); +------+ | name | +------+ | Jane | +------+ 1 row in set (0.00 sec)
결과에 따르면 Python 강좌를 수강하는 유일한 학생은 Jane입니다.
예제 4
tb_course 테이블과 tb_students_info 테이블에서 Python 강좌를 수강하지 않은 학생의 이름을 조회하려면 a8093152e673feb7aba1828c43532094 연산자를 사용하세요.
mysql> SELECT name FROM tb_students_info -> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python'); +--------+ | 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!