mysql查詢注意 mysql中sql查詢使用注意

2021-10-19 19:39:52 字數 4658 閱讀 1040

1.注意desc關鍵字僅適用於在它前面的列名(birth);不影響species列的排序順序。

select name, species, birth from petorder by species, birth desc; ---desc只影響birth.先按照species公升序列排序,species值相同的再按照birth降序排序

2.日期計算

mysql提供了幾個函式,可以用來計算日期,例如,計算年齡或提取日期部分。

要想確定每個寵物有多大,可以計算當前日期的年和出生日期之間的差。如果當前日期的日曆年比出生日期早,則減去一年。以下查詢顯示了每個寵物的出生日期、當前日期和年齡數值的年數字。

mysql> select name, birth, curdate(),

-> (year(curdate())-year(birth))

-> - (right(curdate(),5)

-> as age

-> from pet;

| name     | birth      | curdate()  | age  |

| fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| claws    | 1994-03-17 | 2003-08-19 |    9 |

| buffy    | 1989-05-13 | 2003-08-19 |   14 |

| fang     | 1990-08-27 | 2003-08-19 |   12 |

| bowser   | 1989-08-31 | 2003-08-19 |   13 |

| chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| whistler | 1997-12-09 | 2003-08-19 |    5 |

| slim     | 1996-04-29 | 2003-08-19 |    7 |

| puffball | 1999-03-30 | 2003-08-19 |    4 |

此處,year()提取日期的年部分,right()提取日期的mm-dd (日曆年)部分的最右面5個字元。比較mm-dd值的表示式部分的值一般為1或0,如果curdate()的年比birth的年早,則年份應減去1。整個表示式有些難懂,使用alias (age)來使輸出的列標記更有意義。

儘管查詢可行,如果以某個順序排列行,則能更容易地瀏覽結果。新增order by name子句按照名字對輸出進行排序則能夠實現。

mysql> select name, birth, curdate(),

-> (year(curdate())-year(birth))

-> - (right(curdate(),5)

-> as age

-> from pet order by name;

| name     | birth      | curdate()  | age  |

| bowser   | 1989-08-31 | 2003-08-19 |   13 |

| buffy    | 1989-05-13 | 2003-08-19 |   14 |

| chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| claws    | 1994-03-17 | 2003-08-19 |    9 |

| fang     | 1990-08-27 | 2003-08-19 |   12 |

| fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| puffball | 1999-03-30 | 2003-08-19 |    4 |

| slim     | 1996-04-29 | 2003-08-19 |    7 |

| whistler | 1997-12-09 | 2003-08-19 |    5 |

為了按age而非name排序輸出,只要再使用乙個order by子句:

mysql> select name, birth, curdate(),

-> (year(curdate())-year(birth))

-> - (right(curdate(),5)

-> as age

-> from pet order by age;

| name     | birth      | curdate()  | age  |

| chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| puffball | 1999-03-30 | 2003-08-19 |    4 |

| whistler | 1997-12-09 | 2003-08-19 |    5 |

| slim     | 1996-04-29 | 2003-08-19 |    7 |

| claws    | 1994-03-17 | 2003-08-19 |    9 |

| fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| fang     | 1990-08-27 | 2003-08-19 |   12 |

| bowser   | 1989-08-31 | 2003-08-19 |   13 |

| buffy    | 1989-05-13 | 2003-08-19 |   14 |

可以使用乙個類似的查詢來確定已經死亡動物的死亡年齡。你通過檢查death值是否是null來確定是哪些動物,然後,對於那些非null值的動物,需要計算出death和birth值之間的差:

mysql> select name, birth, death,

-> (year(death)-year(birth)) - (right(death,5)

-> as age

-> from pet where death is not null order by age;

| name   | birth      | death      | age  |

| bowser | 1989-08-31 | 1995-07-29 |    5 |

查詢使用death is not null而非death != null,因為null是特殊的值,不能使用普通比較符來比較,以後會給出解釋。參見3.3.4.6節,「null值操作」。

如果你想要知道哪個動物下個月過生日,怎麼辦?對於這類計算,年和天是無關的,你只需要提取birth列的月份部分。mysql提供幾個日期部分的提取函式,例如year( )、month( )和dayofmonth( )。在這裡month()是適合的函式。為了看它怎樣工作,執行乙個簡單的查詢,顯示birth和month(birth)的值:

mysql> select name, birth, month(birth) from pet;

| name     | birth      | month(birth) |

| fluffy   | 1993-02-04 |            2 |

| claws    | 1994-03-17 |            3 |

| buffy    | 1989-05-13 |            5 |

| fang     | 1990-08-27 |            8 |

| bowser   | 1989-08-31 |            8 |

| chirpy   | 1998-09-11 |            9 |

| whistler | 1997-12-09 |           12 |

| slim     | 1996-04-29 |            4 |

| puffball | 1999-03-30 |            3 |

找出下個月生日的動物也是容易的。假定當前月是4月,那麼月值是4,你可以找在5月出生的動物 (5月),方法是:

mysql> select name, birth from pet where month(birth) = 5;

| name  | birth      |

| buffy | 1989-05-13 |

如果當前月份是12月,就有點複雜了。你不能只把1加到月份數(12)上並尋找在13月出生的動物,因為沒有這樣的月份。相反,你應尋找在1月出生的動物(1月) 。

你甚至可以編寫查詢,不管當前月份是什麼它都能工作。採用這種方法不必在查詢中使用乙個特定的月份,date_add( )允許在乙個給定的日期上加上時間間隔。如果在now( )值上加上乙個月,然後用month()提取月份,結果產生生日所在月份:

mysql> select name, birth from pet

-> where month(birth) = month(date_add(curdate(),interval 1 month));

mysql> select name, birth from pet

-> where month(birth) = mod(month(curdate()), 12) + 1;

注意,month返回在1和12之間的乙個數字,且mod(something,12)返回在0和11之間的乙個數字,因此必須在mod( )以後加1,否則我們將從11月( 11 )跳到1月(1)。

mysql 查詢注意點

具體的優化方法 exist和in 如果主查詢的資料集大,使用in,select tname from teacher where tid in x,y,z 如果子查詢的資料集大,使用exist,select tname from teacher where exist select from tea...

mysql 注意 mysql 注意點

mysql 優化 每個innodb 表都要有乙個主鍵 限制表上索引的數量,避免建立重複和冗餘索引 注意合理選擇復合索引鍵值的順序 優先選擇符合儲存需要的最小的資料型別 varchar n 中的n 代表的是字元數,而不是位元組數 使用utf8 儲存漢字 varchar 255 765 個位元組 過大的...

mysql多表查詢注意事項 MySQL的多表查詢

一 表的加法 例如 將course和course1兩張表合併 兩張表的資料分別如圖所示 course表的資料course1表的資料 用union合併兩張表 course course1 去重 用union all合併兩張表course course1 不去重 注意 字段順序應保持一致。二,多表聯結 ...