• MySQL之day4


    1.视图, 就是保存好的select 语句

    1.   创建视图
      1.    create view <视图名> (<视图列>, ....) as select 语句..... 
        mysql> create view prdtsum (product_type,cnt_product)
            -> as
            -> select product_type,count(*)
            -> from product
            -> group by product_type;
        Query OK, 0 rows affected (0.74 sec)
        
        mysql> select * from prdtsum;
        +--------------+-------------+
        | product_type | cnt_product |
        +--------------+-------------+
        | 衣服         |           2 |
        | 办公用品     |           2 |
        | 厨房用品     |           4 |
        | 家具         |           3 |
        +--------------+-------------+
        4 rows in set (0.10 sec)

         注意:  不可以使用 order by

    2.   多重视图
      mysql> create view prdtsumjim (product_type,cnt_product)
          -> as
          -> select product_type,cnt_product
          -> from prdtsum
          -> where product_type='衣服';
      Query OK, 0 rows affected (0.42 sec)
      
      mysql> select * from prdtsumjim
          -> ;
      +--------------+-------------+
      | product_type | cnt_product |
      +--------------+-------------+
      | 衣服         |           2 |
      +--------------+-------------+
      1 row in set (0.03 sec)
    3.   插入insert 数据 into view 
      mysql> create view prdtjim (product_id,product_name,product_type,sale_price,purchase_price,regist_date,co)
          -> as
          -> select * from product
          -> ;
      Query OK, 0 rows affected (0.37 sec)
      
      mysql> select * from prdtjim;
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | product_id | product_name | product_type | sale_price | purchase_price | regist_date | co   |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20  | NULL |
      | 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  | NULL |
      | 0003       | 运行T恤      | 衣服         |       4000 |           2800 | NULL        | NULL |
      | 0004       | 菜刀         | 厨房用品     |      30000 |           1400 | 2009-09-20  | NULL |
      | 0005       | 高压锅       | 厨房用品     |      68000 |           2500 | 2009-01-15  | NULL |
      | 0006       | 叉子         | 厨房用品     |       5000 |           NULL | 2009-09-20  | NULL |
      | 0007       | 砧板         | 厨房用品     |       8800 |            395 | 2008-04-28  | NULL |
      | 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  | NULL |
      | 0009       | 电视机       | 家具         |       4000 |           3000 | 2019-07-04  | NULL |
      | 0010       | 电视机2      | 家具         |      40000 |           NULL | 2019-07-05  | NULL |
      | 0020       | 电视机4      | 家具         |       NULL |          40001 | 2019-07-05  | NULL |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      11 rows in set (0.00 sec)
      
      mysql> insert into prdtjim values ('0011','4k电视','家具',10000,3000,'2019-07-07',null)
          -> ;
      Query OK, 1 row affected (0.41 sec)
      
      mysql> select * from prdtjim;
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | product_id | product_name | product_type | sale_price | purchase_price | regist_date | co   |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20  | NULL |
      | 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  | NULL |
      | 0003       | 运行T恤      | 衣服         |       4000 |           2800 | NULL        | NULL |
      | 0004       | 菜刀         | 厨房用品     |      30000 |           1400 | 2009-09-20  | NULL |
      | 0005       | 高压锅       | 厨房用品     |      68000 |           2500 | 2009-01-15  | NULL |
      | 0006       | 叉子         | 厨房用品     |       5000 |           NULL | 2009-09-20  | NULL |
      | 0007       | 砧板         | 厨房用品     |       8800 |            395 | 2008-04-28  | NULL |
      | 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  | NULL |
      | 0009       | 电视机       | 家具         |       4000 |           3000 | 2019-07-04  | NULL |
      | 0010       | 电视机2      | 家具         |      40000 |           NULL | 2019-07-05  | NULL |
      | 0011       | 4k电视       | 家具         |      10000 |           3000 | 2019-07-07  | NULL |
      | 0020       | 电视机4      | 家具         |       NULL |          40001 | 2019-07-05  | NULL |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      12 rows in set (0.00 sec)
      mysql> select * from product;   --同步更新到 源表
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | product_id | product_name | product_type | sale_price | purchase_price | regist_date | co   |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20  | NULL |
      | 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  | NULL |
      | 0003       | 运行T恤      | 衣服         |       4000 |           2800 | NULL        | NULL |
      | 0004       | 菜刀         | 厨房用品     |      30000 |           1400 | 2009-09-20  | NULL |
      | 0005       | 高压锅       | 厨房用品     |      68000 |           2500 | 2009-01-15  | NULL |
      | 0006       | 叉子         | 厨房用品     |       5000 |           NULL | 2009-09-20  | NULL |
      | 0007       | 砧板         | 厨房用品     |       8800 |            395 | 2008-04-28  | NULL |
      | 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  | NULL |
      | 0009       | 电视机       | 家具         |       4000 |           3000 | 2019-07-04  | NULL |
      | 0010       | 电视机2      | 家具         |      40000 |           NULL | 2019-07-05  | NULL |
      | 0011       | 4k电视       | 家具         |      10000 |           3000 | 2019-07-07  | NULL |
      | 0020       | 电视机4      | 家具         |       NULL |          40001 | 2019-07-05  | NULL |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      12 rows in set (0.00 sec)

      insert 要使用 既没有聚合 有没有结合的select

    4.   drop 删除视图
      mysql> show tables;
      +----------------+
      | Tables_in_shop |
      +----------------+
      | prdtjim        |
      | prdtsum        |
      | prdtsumjim     |
      | product        |
      +----------------+
      4 rows in set (0.38 sec)
      
      mysql> drop view prdtsum;
      Query OK, 0 rows affected (0.38 sec)
      
      mysql> show tables;
      +----------------+
      | Tables_in_shop |
      +----------------+
      | prdtjim        |
      | prdtsumjim     |
      | product        |
      +----------------+
      3 rows in set (0.00 sec)
      
      mysql> select * from prdtsumjim;
      ERROR 1356 (HY000): View 'shop.prdtsumjim' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
      mysql> select * from prdtjim;
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | product_id | product_name | product_type | sale_price | purchase_price | regist_date | co   |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20  | NULL |
      | 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  | NULL |
      | 0003       | 运行T恤      | 衣服         |       4000 |           2800 | NULL        | NULL |
      | 0004       | 菜刀         | 厨房用品     |      30000 |           1400 | 2009-09-20  | NULL |
      | 0005       | 高压锅       | 厨房用品     |      68000 |           2500 | 2009-01-15  | NULL |
      | 0006       | 叉子         | 厨房用品     |       5000 |           NULL | 2009-09-20  | NULL |
      | 0007       | 砧板         | 厨房用品     |       8800 |            395 | 2008-04-28  | NULL |
      | 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  | NULL |
      | 0009       | 电视机       | 家具         |       4000 |           3000 | 2019-07-04  | NULL |
      | 0010       | 电视机2      | 家具         |      40000 |           NULL | 2019-07-05  | NULL |
      | 0011       | 4k电视       | 家具         |      10000 |           3000 | 2019-07-07  | NULL |
      | 0020       | 电视机4      | 家具         |       NULL |          40001 | 2019-07-05  | NULL |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      12 rows in set (0.00 sec)
      
      mysql> select * from product;
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | product_id | product_name | product_type | sale_price | purchase_price | regist_date | co   |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      | 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20  | NULL |
      | 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  | NULL |
      | 0003       | 运行T恤      | 衣服         |       4000 |           2800 | NULL        | NULL |
      | 0004       | 菜刀         | 厨房用品     |      30000 |           1400 | 2009-09-20  | NULL |
      | 0005       | 高压锅       | 厨房用品     |      68000 |           2500 | 2009-01-15  | NULL |
      | 0006       | 叉子         | 厨房用品     |       5000 |           NULL | 2009-09-20  | NULL |
      | 0007       | 砧板         | 厨房用品     |       8800 |            395 | 2008-04-28  | NULL |
      | 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  | NULL |
      | 0009       | 电视机       | 家具         |       4000 |           3000 | 2019-07-04  | NULL |
      | 0010       | 电视机2      | 家具         |      40000 |           NULL | 2019-07-05  | NULL |
      | 0011       | 4k电视       | 家具         |      10000 |           3000 | 2019-07-07  | NULL |
      | 0020       | 电视机4      | 家具         |       NULL |          40001 | 2019-07-05  | NULL |
      +------------+--------------+--------------+------------+----------------+-------------+------+
      12 rows in set (0.00 sec)
      View Code

      注意 : drop 时 有关联关系的view ,会受到影响

      ERROR 1356 (HY000): View 'shop.prdtsumjim' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

    2.子查询

      2.1 子查询,  嵌套 select 语句 

    mysql> select product_type,cn_product
        -> from( select *
                     from ( select product_type,count(*) as cn_product
        ->                  from product
        ->                  group by product_type) as prdtsum
        ->         where cn_product=4) as prdttype;
    +--------------+------------+
    | product_type | cn_product |
    +--------------+------------+
    | 厨房用品     |          4 |
    | 家具         |          4 |
    +--------------+------------+
    2 rows in set (0.00 sec)                                

      2.2 标量查询

        标量:   只能是一行一列的结果

        注意:  where 语句不能使用聚合语句  

    mysql> select product_name,sale_price
        -> from product
        -> where sale_price>avg(sale_price);
    ERROR 1111 (HY000): Invalid use of group function

    可以通过嵌套方式:  

    mysql> select product_name,sale_price
        -> from product
        -> where sale_price>( select avg(sale_price)   --必须返回一行一列
        ->                             from product);
    +--------------+------------+
    | product_name | sale_price |
    +--------------+------------+
    | 菜刀         |      30000 |
    | 高压锅       |      68000 |
    | 电视机2      |      40000 |
    +--------------+------------+
    3 rows in set (0.29 sec)
        

    在 group by 和having 语句中使用

    mysql> select product_type,avg(sale_price)
        -> from product
        -> group by product_type
        -> having avg(sale_price)>(select avg(sale_price) from product);
    +--------------+-----------------+
    | product_type | avg(sale_price) |
    +--------------+-----------------+
    | 厨房用品     |      27950.0000 |
    | 家具         |      18000.0000 |
    +--------------+-----------------+
    2 rows in set (0.31 sec)

    3.关联子查询

     关联子查询, 结合条件一定要写在 子查询中,  在细分组内进行比较,需要用到!!!!

    --按照type计算平均值, 取出售价大于所属type类型的平均值
    mysql> select product_type,product_name,sale_price -> from product as p1 -> where sale_price > (select avg(sale_price) ->             from product as p2 ->             where p1.product_type=p2.product_type ----关键结合语句 ->             group by product_type); +--------------+--------------+------------+ | product_type | product_name | sale_price | +--------------+--------------+------------+ | 办公用品 | 打孔器 | 500 | | 衣服 | 运行T恤 | 4000 | | 厨房用品 | 菜刀 | 30000 | | 厨房用品 | 高压锅 | 68000 | | 家具 | 电视机2 | 40000 | +--------------+--------------+------------+ 5 rows in set (0.01 sec)

     实例:  按照类型type计算平均值

    mysql> create view AvgPriceByType
        -> as
        -> select product_id,
        product_name,
        product_type,
        sale_price,
         (select avg(sale_price) from product p2
        -> where p2.product_type=p1.product_type
        -> group by product_type) as sale_price_avg
        -> from product as p1;
    Query OK, 0 rows affected (0.50 sec)
    mysql> select * from AvgPriceByType;
    +------------+--------------+--------------+------------+------------+
    | product_id | product_name | product_type | sale_price | sale_price_avg |
    +------------+--------------+--------------+------------+------------+
    | 0001       | T恤          | 衣服         |       1000 |  2500.0000 |
    | 0002       | 打孔器       | 办公用品     |        500 |   300.0000 |
    | 0003       | 运行T恤      | 衣服         |       4000 |  2500.0000 |
    | 0004       | 菜刀         | 厨房用品     |      30000 | 27950.0000 |
    | 0005       | 高压锅       | 厨房用品     |      68000 | 27950.0000 |
    | 0006       | 叉子         | 厨房用品     |       5000 | 27950.0000 |
    | 0007       | 砧板         | 厨房用品     |       8800 | 27950.0000 |
    | 0008       | 圆珠笔       | 办公用品     |        100 |   300.0000 |
    | 0009       | 电视机       | 家具         |       4000 | 18000.0000 |
    | 0010       | 电视机2      | 家具         |      40000 | 18000.0000 |
    | 0011       | 4k电视       | 家具         |      10000 | 18000.0000 |
    | 0020       | 电视机4      | 家具         |       NULL | 18000.0000 |
    +------------+--------------+--------------+------------+------------+
    12 rows in set (0.64 sec)            
    View Code

    附加: 

      查看 table 和view 

     1 mysql> describe prdtjim;
     2 +----------------+--------------+------+-----+---------+-------+
     3 | Field          | Type         | Null | Key | Default | Extra |
     4 +----------------+--------------+------+-----+---------+-------+
     5 | product_id     | char(4)      | NO   |     | NULL    |       |
     6 | product_name   | varchar(100) | NO   |     | NULL    |       |
     7 | product_type   | varchar(32)  | NO   |     | NULL    |       |
     8 | sale_price     | int(11)      | YES  |     | NULL    |       |
     9 | purchase_price | int(11)      | YES  |     | NULL    |       |
    10 | regist_date    | date         | YES  |     | NULL    |       |
    11 | co             | varchar(12)  | YES  |     | NULL    |       |
    12 +----------------+--------------+------+-----+---------+-------+
    13 7 rows in set (0.36 sec)
    14 
    15 mysql> describe product;
    16 +----------------+--------------+------+-----+---------+-------+
    17 | Field          | Type         | Null | Key | Default | Extra |
    18 +----------------+--------------+------+-----+---------+-------+
    19 | product_id     | char(4)      | NO   | PRI | NULL    |       |
    20 | product_name   | varchar(100) | NO   |     | NULL    |       |
    21 | product_type   | varchar(32)  | NO   |     | NULL    |       |
    22 | sale_price     | int(11)      | YES  |     | NULL    |       |
    23 | purchase_price | int(11)      | YES  |     | NULL    |       |
    24 | regist_date    | date         | YES  |     | NULL    |       |
    25 | co             | varchar(12)  | YES  |     | NULL    |       |
    26 +----------------+--------------+------+-----+---------+-------+
    27 7 rows in set (0.00 sec)
    28 
    29 mysql> show table status like 'prdtjim';
    30 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
    31 | Name    | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
    32 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
    33 | prdtjim | NULL   |    NULL | NULL       |    0 |              0 |           0 |               0 |            0 |         0 |           NULL | 2019-07-07 08:56:59 | NULL        | NULL       | NULL      |     NULL | NULL           | VIEW    |
    34 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
    35 1 row in set (0.42 sec)
    36 
    37 mysql> show table status like 'product';
    38 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
    39 | Name    | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
    40 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
    41 | product | InnoDB |      10 | Dynamic    |   11 |           1489 |       16384 |               0 |            0 |         0 |           NULL | 2019-07-04 20:55:20 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
    42 +---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
    43 1 row in set (0.38 sec)
    View Code
  • 相关阅读:
    第五周作业
    第四周编程总结
    第六周作业
    2019春第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业
    求最大值及其下标
    7-1
    第十周课程总结
    第九周课程总结&实验报告(七)
  • 原文地址:https://www.cnblogs.com/liuyuanq/p/11142092.html
Copyright © 2020-2023  润新知