*ブログに戻る →ここ です。


GROUP BY句の出した値にさらに条件をつける場合に用いるのがHAVING句である。
HAVING句を使って平均値が2000以上の値だけを取得する free94

Saturday,August,3,2013

あらかに作成しておいたテーブルを使う(前回のfree92を用いる)。

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_marketsjp;
 sada_d        sada_name          sada_price  sada_category
 2013-08-02    Toyota                   6220  Car             *グループt(sada_name)20130802
 2013-08-02    Mazda                     400  Car             *グループm(sada_name)20130802
 2013-08-02    Honda                    3725  Car             *グループh(sada_name)20130802
 2013-08-02    Suzuki                   2400  Car               以下下につづく
 2013-08-02    Mitsubishi motors        1300  Car                     ↓
 2013-08-02    Daihatsu                 2200  Car                     ↓
 2013-08-02    Sony                     2000  Home electronics        ↓
 2013-08-02    Panasonic                 900  Home electronics        ↓
 2013-08-02    Sharp                     400  Home electronics
 2013-08-02    Dena                     2000  It
 2013-08-02    Rakuten                  1300  It
 2013-08-02    Gungho                 100000  It
 2013-01-05    Toyota                   4200  Car             *グループt(sada_name)20130105
 2013-01-05    Mazda                     180  Car             *グループm(sada_name)20130105
 2013-01-05    Honda                    3400  Car
 2013-01-05    Suzuki                   2400  Car
 2013-01-05    Mitsubishi motors         850  Car
 2013-01-05    Daihatsu                 1750  Car
 2013-01-05    Sony                     1000  Home electronics
 2013-01-05    Panasonic                 550  Home electronics
 2013-01-05    Sharp                     300  Home electronics
 2013-01-05    Dena                     3000  It
 2013-01-05    Rakuten                   700  It
 2013-01-05    Gungho                  10000  It
 2012-06-01    Toyota                   3000  Car             *グループt(sada_name)20120601
 2012-06-01    Mazda                     100  Car             *グループm(sada_name)20120601
 2012-06-01    Honda                    2500  Car
 2012-06-01    Suzuki                   1600  Car
 2012-06-01    Mitsubishi motors         800  Car
 2012-06-01    Daihatsu                 1300  Car
 2012-06-01    Sony                     1000  Home electronics
 2012-06-01    Panasonic                 550  Home electronics
 2012-06-01    Sharp                     400  Home electronics
 2012-06-01    Dena                     1500  It
 2012-06-01    Rakuten                   800  It
 2012-06-01    Gungho                      0  It

○GROUP BY区のメモ  *DESC降順 *ASC昇順
               ↓カラム名 ↓平均  ↓カラム名   ↓データベース名      ↓テーブル名 ↓グループ作る↓カラム名 *順番の指定が無い場合はASC昇順となる
mysql> select sada_name, AVG(sada_price) FROM sadachika_shop.sadachi_marketsjp GROUP BY sada_name;
sada_name     AVG(sada_price)
Daihatsu           1750.0000
Dena               2166.6667     *該当箇所2000以上
Gungho            36666.6667     *該当箇所2000以上
Honda              3208.3333     *該当箇所2000以上
Mazda               226.6667
Mitsubishi motors   983.3333
Panasonic           666.6669
Rakuten             933.3333
Sharp               366.6667
Sony               1333.3333
Suzuki             2133.3333     *該当箇所2000以上
Toyota             4473.3333     *該当箇所2000以上

アルファベット順
1,daihatsu
2,Dena
3,Gungho
4,honda
5,mazda
6,mitsubishi-motors
7,panasonic
8,rakuten 
9,Sharp
10,sony
11,suzuki
12,toyota

○昇順 GROUP BY区のメモ  *DESC降順 *ASC昇順
mysql> select sada_name, AVG(sada_price) FROM sadachika_shop.sadachi_marketsjp GROUP BY sada_name ASC;
                                                                                                   ↑ASC昇順
○降順
mysql> select sada_name, AVG(sada_price) FROM sadachika_shop.sadachi_marketsjp GROUP BY sada_name DESC;
                                                                                                   ↑DESC昇順

○○HAVING句を使って平均値が2000以上の値だけを取得する
               ↓カラム名↓平均↓カラム名              ↓データベース   ↓テーブル名
mysql> select sada_name, AVG(sada_price) FROM sadachika_shop.sadachi_marketsjp 
    -> GROUP BY sada_name ASC HAVING AVG(sada_price) > 2000;
         ↑グループを選ぶ ↑昇順 ↑条件を指定2000より大きい
sada_name     AVG(sada_price)
Dena               2166.6667     *該当箇所2000以上(2000+3000+1500)/3=2166.6666
Gungho            36666.6667     *該当箇所2000以上
Honda              3208.3333     *該当箇所2000以上
Suzuki             2133.3333     *該当箇所2000以上
Toyota             4473.3333     *該当箇所2000以上


○○いろいろ条件を付けて表示させる。自分的にはけっこう難易度は高度です。
○○テーブルの値を表示させる。
mysql> select sada_name, AVG(sada_price), sada_category FROM sadachika_shop.sadachi_marketsjp 
    -> GROUP BY sada_name ASC;                           *ASC昇順
sada_name            AVG(sada_price)  sada_category
Daihatsu           1750.0000          Car
Dena               2166.6667          It    
Gungho            36666.6667          It
Honda              3208.3333          Car
Mazda               226.6667          Car
Mitsubishi motors   983.3333          Car
Panasonic           666.6669          Home electronics
Rakuten             933.3333          It
Sharp               366.6667          Home electronics
Sony               1333.3333          Home electronics
Suzuki             2133.3333          Car
Toyota             4473.3333          Car

○条件No1  *DESC降順 *ASC昇順
mysql> select sada_name, AVG(sada_price), sada_category FROM sadachika_shop.sadachi_marketsjp 
    -> WHERE sada_category IN('Car', 'Home electronics','It') 
    -> GROUP BY sada_name ASC                            *ASC昇順
    -> HAVING AVG(sada_price) BETWEEN 200 AND 1000       *HAVING句はWHERE句と異なりGROUP BY句のデータに対し    *BETWEEN  min から maxまで表示させる
        ↑*HAVING句はWHERE句と異なりGROUP BY句によってグループ化が行われたデータに対して条件を指定して絞り込む
    -> ORDER BY AVG(sada_price) DESC LIMIT 12;
                                 ↑降順     ↑大きい方から下り
sada_name            AVG(sada_price)  sada_category
Mitsubishi motors   983.3333          Car
Rakuten             933.3333          It
Panasonic           666.6669          Home electronics
Sharp               366.6667          Home electronics
Mazda               226.6667          Car

○条件No2  *DESC降順 *ASC昇順
mysql> select sada_name, AVG(sada_price), sada_category FROM sadachika_shop.sadachi_marketsjp 
    -> WHERE sada_category IN('Home electronics','It') 
    -> GROUP BY sada_name ASC                            *ASC昇順
    -> HAVING AVG(sada_price) BETWEEN 200 AND 4000       *HAVING句はWHERE句と異なりGROUP BY句のデータに対し    *BETWEEN  min から maxまで表示させる
        ↑*HAVING句はWHERE句と異なりGROUP BY句によってグループ化が行われたデータに対して条件を指定して絞り込む
    -> ORDER BY AVG(sada_price) DESC LIMIT 12;
                                 ↑降順     ↑大きい方から下り
sada_name            AVG(sada_price)  sada_category
Dena               2166.6667          It
Sony               1333.3333          Home electronics
Rakuten             933.3333          It
Panasonic           666.6669          Home electronics
Sharp               366.6667          Home electronics


○条件No3  *DESC降順 *ASC昇順
mysql> select sada_name, AVG(sada_price), sada_category FROM sadachika_shop.sadachi_marketsjp 
    -> WHERE sada_category IN('Home electronics','It') 
    -> GROUP BY sada_name ASC                            *ASC昇順
    -> HAVING AVG(sada_price) BETWEEN 200 AND 4000       *HAVING句はWHERE句と異なりGROUP BY句のデータに対し    *BETWEEN  min から maxまで表示させる
        ↑*HAVING句はWHERE句と異なりGROUP BY句によってグループ化が行われたデータに対して条件を指定して絞り込む
    -> ORDER BY AVG(sada_price) DESC LIMIT 3;
                                 ↑降順     ↑大きい方から下り
sada_name            AVG(sada_price)  sada_category
Dena               2166.6667          It
Sony               1333.3333          Home electronics
Rakuten             933.3333          It

○条件No4  *DESC降順 *ASC昇順
mysql> select sada_name, AVG(sada_price), sada_category FROM sadachika_shop.sadachi_marketsjp 
    -> WHERE sada_category IN('Home electronics','It') 
    -> GROUP BY sada_name ASC                            *ASC昇順
    -> HAVING AVG(sada_price) BETWEEN 200 AND 4000       *HAVING句はWHERE句と異なりGROUP BY句のデータに対し    *BETWEEN  min から maxまで表示させる
        ↑*HAVING句はWHERE句と異なりGROUP BY句によってグループ化が行われたデータに対して条件を指定して絞り込む
    -> ORDER BY AVG(sada_price) ASC LIMIT 3;
                                 ↑昇順   ↑小さい方から
sada_name            AVG(sada_price)  sada_category
Sharp               366.6667          Home electronics
Panasonic           666.6669          Home electronics
Rakuten             933.3333          It

○○○この数字の順番に記入しないとエラーとなる
1SELECT
     [ALL | DISTINCT | DISTINCTROW ]
       [HIGH_PRIORITY]
       [STRAIGHT_JOIN]
       [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
       [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
     select_expr, ...
     [FROM table_references
     [WHERE where_condition]                                     *位置指定だよね
2    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]                           *ASCを指定した場合は昇順, DESCを指定した場合は降順;
3    [HAVING where_condition]
4    [ORDER BY {col_name | expr | position}
5      [ASC | DESC], ...]                                        *ASCを指定した場合は昇順, DESCを指定した場合は降順;
6    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
     [PROCEDURE procedure_name(argument_list)]
     [INTO OUTFILE 'file_name' export_options
       | INTO DUMPFILE 'file_name'
       | INTO @var_name [, @var_name]]
     [FOR UPDATE | LOCK IN SHARE MODE]]


○WHERE句メモ
mysql> select * FROM sadachika_copy.sadachi_copyproducts WHERE 
sada_copyid >= 2 and sada_copyid <=12 
and sada_category IN('食べ物', '飲み物')        *IN 該当する項目を表示させる
*以外のパターン                    and sada_category NOT IN('食べ物', '飲み物')    *NOT IN 以外を表示させる
and sada_price BETWEEN 70 and 220               *BETWEEN  min から maxまで表示させる
and sada_releasedate BETWEEN 20120601 and 20130101;

○WHERE句メモ
○「sada_id」カラムの値が'5< X <9'のデータだけを取得します。
mysql> select * from sadachika_shop.sadachi_products where sada_id >= 6 and sada_id <= 8;



* 参考にしたサイトは→ こちら です。

これは赤色の文字例です。

これは青色の文字例です。