mysql 将一个表的数据复制到另一个表中

> insert into mix (No, Name, physics_Grade) select p_No, Name, Grade from physics;

出现报错:Field 'biology_Grade' doesn't have a default value
原因是设置mix表时将biology_Grade设为非空,
>alter table mix modify biology_Grade int null;
+----+---------+---------------------+-----------------------------+
| No | Name | physics_Grade |      biology_Grade       |
+----+---------+--------------------+-----------------------------+
|  1  | 陈        |            70         |            NULL               |
|  2  | 李        |            60         |          NULL                 |
|  3  | 张        |            63         |          NULL                 |
|  4  | 王        |            81         |          NULL                 |
|  5  | 何        |            77         |          NULL                 |
+----+---------+--------------------+-----------------------------+
复制一次后结果如上

删除字段为null的字段

> delete from tablename where fieldname is null;(用的是is 而不是“=”)

在复制biology表的Grade字段到mix表中的biology_Grade的时候,出现的结果如下,与预想结果并不一致(直接插入到最下面去了)。
+---------+---------+--------------------+---------------------------+
|    No   | Name | physics_Grade |      biology_Grade    |
|+-------+---------+---------------------+----------------------------+
|   1      |     陈   |            70           |          NULL              |
|   2      |     李   |            60           |          NULL              |

|   3      |     张   |            63           |          NULL              |
|   4      |     王   |            81           |          NULL              |
|   5      |     何   |            77           |          NULL              |
| NULL | NULL |          NULL        |            65                 |
| NULL | NULL |          NULL        |            59                 |
| NULL | NULL |          NULL        |            82                 |
| NULL | NULL |          NULL        |            68                 |
| NULL | NULL |          NULL        |            60                 |
+--------+--------+----------------------+--------------------------+
百度了很久,终于在一位博主的博客中找到了解决方法, 使用inner join(联表更新)来复制列数据。
> update mix mix inner join biology on mix.No = biology.b_No set mix.biology_Grade = biology.Grade;
即 要复制的目标表格A,A中目的字段field_A,要复制的数据源表格B,B中数据源字段field_B,用来连接表的A表中的字段No和B表中的字段No。
> update A A inner join B on A.No = B.No set A.field_A = B.field_B;
完成结果如下:
+------+------+-----------------------+--------------------+
| No   | Name | physics_Grade | biology_Grade |
+------+------+-----------------------+--------------------+
|    1   |  陈   |            70            |            65          |
|    2   |  李   |            60            |            59          |
|    3   |  张   |            63            |            82          |
|    4   |  王   |            81            |            68          |
|    5   |  何   |            77            |            60          |
+------+------+-----------------------+--------------------+

查询物理成绩和生物成绩的平均值中大于70的学生的学号(用 having来进行筛选)
> select No, (physics_Grade + biology_Grade) / 2 as avg from mix  having avg > 70;
结果如下:
+------+-----------+
| No   | avg     |
+------+-----------+
|    3   | 72.5000 |
|    4   | 74.5000 |
+------+-----------+

你可能感兴趣的:(mysql)