Query는 MySQL에서 가장 자주 사용되는 작업이며 DELETE 및 UPDATE를 구축하는 기반이기도 합니다. 쿼리 처리는 논리적 쿼리와 물리적 쿼리로 나눌 수 있습니다. 오늘은 여러분께 논리적 쿼리를 자세히 소개하겠습니다. 도움이 되셨으면 좋겠습니다!
MySQL에서는 쿼리가 DELETE와 UPDATE를 구축하는 기반이 되는데, 삭제하거나 업데이트하려면 먼저 이러한 레코드를 찾아야 하므로 쿼리 처리에서는 SELECT가 특히 중요하기 때문입니다. 논리적 쿼리와 물리적 쿼리가 있는데, 논리적 쿼리는 SELECT 문을 실행할 때 어떤 종류의 결과가 생성되어야 하는지를 나타내고, 물리적 쿼리는 MySQL이 이 결과를 어떻게 얻는지 나타냅니다. [관련 권장사항: mysql 동영상 튜토리얼]
이 장에서는 논리 쿼리에 대해 설명합니다.
SQL 문에서는 FROM 문이 먼저 처리되고, LIMIT 문이 마지막에 실행됩니다. GROUP BY, ORDER BY 등 모든 문을 사용하면 아래와 같이 대략 10단계로 나눌 수 있습니다. 작업은 가상 테이블을 생성합니다.
(7) select (8)distinct<select_list>
(1) from <left table>
(3) <join_type> join <right_table>
(2) on<条件>
(4) where <条件>
(5) group by<字段list>
(6) having<条件>
(9) order by<字段>
(10) limit
로그인 후 복사
실제 사례를 통해 분석해 보겠습니다. 먼저 사용자와 주문이라는 두 개의 테이블을 만듭니다.
insert user values(1,"张三","内蒙");
insert user values(2,"李四","内蒙");
insert user values(3,"王五","北京");
insert user values(4,"迪迦","西藏");
insert user values(5,"金甲战士","内蒙");
insert orders values(10001,1);
insert orders values(10002,1);
insert orders values(10003,4);
insert orders values(10004,1);
insert orders values(10005,1);
insert orders values(10006,4);
insert orders values(10007,2);
로그인 후 복사
자, 이제 주문량이 3개 미만인 내몽골 사용자를 쿼리해 보겠습니다. SQL은 다음과 같습니다.
mysql> select userName,count(orders.orderId) as total from user
left join orders on user.userId = orders.userId
where city="内蒙"
group by user.userId
having count(orders.orderId)<3
order by total desc;
+--------------+-------+
| userName | total |
+--------------+-------+
| 李四 | 1 |
| 金甲战士 | 0 |
+--------------+-------+
2 rows in set (0.00 sec)
로그인 후 복사
데이터와 SQL이 있는데 구체적인 프로세스를 분석해보겠습니다.
1. 데카르트 곱
가장 먼저 해야 할 일은 FROM 문 전후에 두 테이블의 데카르트 곱을 수행하는 것입니다. 예를 들어 집합 A={a, b} 및 집합 B={0, 1, 2}라고 가정하면 두 집합의 데카르트 곱은 {(a, 0), (a, 1), ( a , 2), (b, 0), (b, 1), (b, 2)}.
따라서 위의 데이터에 대응하여 최종적으로 35행의 데이터를 포함하는 가상 테이블 VT1이 생성됩니다. ㅋㅋㅋ 0 1