首頁 > 軟體

MySQL 語句執行順序舉例解析

2022-06-02 14:06:29

1、SQL資料舉例

舉例:有10個使用者,輸出在訂單表中下單數最多的5個人的名字。

my_user 表資料

my_order資料

my_order,uid對應my_user表的id:

測試資料生成

寫一個儲存過程,隨機插入10000條資料:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test_loop`( )  
 BEGIN  
 DECLARE  
     i INT DEFAULT 1;  
 WHILE  
     i < 10000 DO  
     INSERT INTO my_order ( oid, uid )  
 VALUES  
     (  
     CONCAT( 'o_', DATE_FORMAT( now( ), '%Y%m%d%h%i%s' ), FLOOR(1000 + RAND( )*(9999-1000) )),  
     FLOOR( 1 + RAND( ) * 10 )   
     );  
 SET i = i + 1;  
 END WHILE;  
 END

查詢語句:

SELECT
	u.id,
	u.`name`,
	count( o.uid ) count_num 
FROM
	my_user u
	JOIN my_order o ON u.id = o.uid 
GROUP BY
	o.uid 
HAVING
	COUNT( o.uid ) 
ORDER BY
	COUNT( o.uid ) DESC 
	LIMIT 5;

查詢結果(以自己資料為準):

統計所有的使用者訂單數:

SELECT
	u.id,
	u.`name`,
	count( o.uid ) count_num 
FROM
	my_user u
	JOIN my_order o ON u.id = o.uid 
GROUP BY
	o.uid 
HAVING
	COUNT( o.uid ) 
ORDER BY
	COUNT( o.uid ) DESC

結果如下:

該sql 主要考察 group by 和 having 的使用,然後 order by 和 desc 排序。

2、SQL的執行順序

  • FORM: 對FROM左邊的表和右邊的表計算笛卡爾積,產生虛表VT1。
  • ON: 對虛表VT1進行ON過濾,只有那些符合的行才會被記錄在虛表VT2中。
  • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那麼保留表中未匹配的行就會作為外部行新增到虛擬表VT2中,產生虛擬表VT3。
  • WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄才會被插入到虛擬表VT4中。
  • GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5。
  • HAVING: 對虛擬表VT5應用having過濾,只有符合的記錄才會被 插入到虛擬表VT6中。
  • SELECT: 執行select操作,選擇指定的列,插入到虛擬表VT7中。
  • DISTINCT: 對VT7中的記錄進行去重。產生虛擬表VT8.
  • ORDER BY: 將虛擬表VT8中的記錄按照進行排序操作,產生虛擬表VT9.
  • LIMIT:取出指定行的記錄,產生虛擬表VT10, 並將結果返回。

到此這篇關於MySQL 語句執行順序舉例解析的文章就介紹到這了,更多相關MySQL 語句執行順序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com