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
原文地址:https://www.cnblogs.com/liuyuanq/p/11142092.html