標籤:
在mysql資料庫中,主要包括的字句有select子句、from子句、where子句、group by子句、order by子句、having子句。當資料庫管理系統執行一條SQL語句時,以上的子句執行順序為1、執行from子句,將from子句中的表作為中間表;2、如果有where子句,則根據其中的過濾條件,從中間表中去掉不滿足過濾條件的行;3、根據group by子句中指定的分組列,對中間表中的資料進行分組;4、為每個組計算select子句彙總函式的值,並為每組產生查詢結果中的一行;5、如果有having子句,則根據having子句的過濾條件,分組計算彙總計算的結果再次過濾;6、如果有order by子句,則根據order by子句中的列,對結果進行排序。在上面所學的6個語句中,where和having都是過濾條件,但可以看到,他們有執行時間的先後不同,同時還有having是對彙總計算的結果再次過濾,而where則是對原資料表進行過濾。
當我們在一個表中使用查詢語句,往往會有各種各樣的條件。比如,已知有emp員工表,要“查詢表中每個部門(depno)中工資(sal)最高的人的資訊”。那麼我們可以寫select * from emp where (sal,depno) in (select max(sal),depno from emp group by depno)。這整句話就是一個子查詢的例子,外面的select語句是要查詢的內容,裡面的select語句是所要求的條件。這裡是使用where條件先執行,我們再來看一個例子要“查詢比20部門人數多得部門",SQL語句為select deptno from emp group by deptno having count(*) >(select count(*) from emp where deptno=20); 這裡我們為什麼用having而不用where呢,是因為有一個執行的順序問題,where作為過濾條件要先於分組group by執行,但彙總函式count(*)要後於group by執行,這顯然就發生了矛盾,而having的出現就完美地解決了這個問題。
mysql查詢語句