집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 데이터 쿼리 하위 쿼리
서브 쿼리는 하나의 쿼리 문이 다른 쿼리 문 안에 중첩되어 있는 쿼리를 의미합니다. 하위 쿼리는 select 절에서 먼저 계산되며 하위 쿼리 결과는 다른 외부 쿼리의 필터 조건으로 사용됩니다. 쿼리는 하나의 테이블을 기반으로 할 수도 있고 여러 테이블을 기반으로 할 수도 있습니다.
하위 쿼리에서 일반적으로 사용되는 연산자에는 any(some), all, in, presents 등이 있습니다. 하위 쿼리는 select, update 및 delete 문에 추가할 수 있으며 여러 수준에서 중첩될 수 있습니다. 비교 연산자는 "<", "<=", ">", ">=" 및 "!="와 같은 하위 쿼리에도 사용할 수 있습니다.
(1) 임의 및 일부 키워드가 포함된 하위 쿼리
(2) 모든 키워드가 포함된 하위 쿼리
(3) 존재 키워드가 포함된 하위 쿼리
(4) in 키워드가 포함된 하위 쿼리
(5) 비교 연산자가 포함된 하위 쿼리
(무료 학습 권장사항: mysql 비디오 튜토리얼)
any 및 some 키워드는 조건 중 하나라도 충족됨을 나타내는 동의어이므로 다음을 생성할 수 있습니다. 하위 쿼리의 반환 값 목록을 비교하는 표현식입니다. 내부 하위 쿼리의 비교 조건이 충족되면 결과가 외부 쿼리의 조건으로 반환됩니다.
다음은 두 테이블 tbl1과 tbl2를 정의하고 두 테이블에 데이터를 삽입합니다.
mysql> create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql> create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql> insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4 Duplicates: 0 Warnings: 0mysql> insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4 Duplicates: 0 Warnings: 0
모든 키워드 뒤에는 비교 연산자가 옵니다. 이는 하위 쿼리에서 반환된 위치와 비교할 때 true인 경우 true가 됨을 나타냅니다. 반환되었습니다.
【예제】tbl2 테이블의 num2 열을 모두 반환하고 tbl1의 num1 값을 그것과 비교하여 num2의 값보다 크면 정규화된 결과입니다.
mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+| 13 || 27 |+------+2 rows in set (0.00 sec)
[예제] tbl2 테이블의 num2 열에 있는 모든 값보다 큰 tbl1 테이블의 값을 반환합니다. SQL 문은 다음과 같습니다.
mysql> select num1 from tbl1 where num1 > all(select num2 from tbl2);+------+| num1 |+------+| 27 |+------+1 row in set (0.00 sec)
[예시 1] s_id=107인 공급자가 공급자 테이블에 존재하는지 질의하고, 존재한다면 과일 테이블의 레코드를 질의한다.
mysql> select * from fruits -> where exists -> (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| 12 | 104 | lemon | 6.40 || a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbabay | 3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)
결과에서 알 수 있다. 내부 쿼리 결과는 공급자 테이블에 s_id=107의 레코드가 있음을 나타냅니다. 따라서 존재 표현식은 true를 반환합니다. 외부 쿼리 문이 true를 받은 후 테이블 과일을 쿼리하고 모든 레코드를 반환합니다.
[예제 2] 공급자 테이블에 s_id=107인 공급자가 있는지 쿼리합니다. 존재하는 경우 과일 테이블에서 f_price가 10.20보다 큰 레코드를 쿼리합니다.
mysql> select * from fruits -> where f_price > 10.20 and exists -> (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1 | 102 | orange | 11.20 || m1 | 106 | mango | 15.70 || m3 | 105 | xxtt | 11.60 || t1 | 102 | banana | 10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)
할 수 있습니다. 내부 쿼리 테이블 이름을 참조하세요. 공급자 테이블에 s_id=107의 레코드가 있으므로 존재 표현식은 true를 받은 후 true를 반환하고, 외부 쿼리 문은 쿼리 조건 f_price>10.20에 따라 과일 테이블을 쿼리하고 반환됩니다. 결과는 f_price가 10.20보다 큰 4개의 레코드입니다.
[예제 3] s_id = 107인 공급자가 공급자 테이블에 있는지 쿼리하고, 존재하지 않으면 과일 테이블의 레코드를 쿼리하면 다음과 같습니다.
mysql> select * from fruits -> where not exists -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)
내부 쿼리가 false를 반환하면 외부 표현식이 false를 받으면 과일 테이블의 레코드가 더 이상 쿼리되지 않습니다.
참고: 존재 및 존재하지 않음에 대한 결과는 해당 행의 내용이 아닌 행 반환 여부에만 의존하므로 이 하위 쿼리 입력 목록은 일반적으로 관련이 없습니다.
[예제 1] orderitems 테이블에서 f_id c0으로 주문 번호를 조회하고, 해당 주문 번호를 기준으로 주문 번호로 고객 c_id를 조회하는 SQL 문은 다음과 같습니다.
mysql> select c_id from orders where o_num in -> (select o_num from orderitems where f_id = 'c0');+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
위 문은 약어입니다.
mysql> select o_num from orderitems where f_id = 'c0';+-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql> select c_id from orders where o_num in (30003,30005);+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
다음은 in과 반대되는 not in 키워드입니다.
[예제 2]는 예 1과 유사하지만 select 문에서 not in 키워드를 사용합니다. SQL 문은 다음과 같습니다.
mysql> select c_id from orders where o_num not in -> (select o_num from orderitems where f_id ='c0');+-------+| c_id |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)
3개의 테이블이 반환된 것을 볼 수 있습니다. 주문 내역을 보면 c_id가 10001인 고객이 두 개 이상의 주문을 받은 것을 알 수 있습니다.
mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date | c_id |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)
결과에서는 제외됩니다. 주문 번호는 동일하지만 여전히 동일한 고객을 선택할 수 있습니다.
하위 쿼리의 기능은 조인 쿼리를 통해서도 수행할 수 있지만 하위 쿼리를 사용하면 MySQL 코드를 더 쉽게 읽고 쓸 수 있습니다.
【例1】在suppliers表中查询s_city等于"Tianjin"的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:
mysql> select s_id,f_name from fruits -> where s_id = -> (select s1.s_id from suppliers as s1 where s1.s_city = 'Tianjin');+------+------------+| s_id | f_name |+------+------------+| 101 | apple || 101 | blackberry || 101 | cherry |+------+------------+3 rows in set (0.00 sec)
【例2】在suppliers表中查询s_city等于"Tianjin"的供应商,s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下:
mysql> select s_id , f_name from fruits -> where s_id <> -> (select s1.s_id from suppliers as s1 where s1.s_city ='Tianjin');+------+---------+| s_id | f_name |+------+---------+| 104 | lemon || 103 | apricot || 104 | berry || 107 | xxxx || 102 | orange || 105 | melon || 106 | mango || 105 | xbabay || 105 | xxtt || 103 | coconut || 102 | banana || 102 | grape || 107 | xbabay |+------+---------+13 rows in set (0.00 sec)
更多相关免费学习推荐:mysql教程(视频)
위 내용은 MySQL 데이터 쿼리 하위 쿼리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!