UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
列值更新
案例
更新值为具体值 原先的值 将孙悟空同学的数学成绩变更为 80 分
mysql> update exam_result set math=80;//这个语句是将所有人的数学成绩变为80
mysql> update exam_result set math=80 where name='孙悟空';//进行where条件筛选
一次更新多个列
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
mysql> update exam_result set math=60 ,chinese=70 where name='曹孟德';
更新值为原值基础上变更
将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
数据更新,不支持 math += 30 这种语法
原本排名
update exam_result set math=math+30 order by chinese+math+english limit 3;
执行后变化了
将所有同学的语文成绩更新为原来的 2 倍
**注意:更新全表的语句慎用!**没有 WHERE 子句,则更新全表
mysql> update exam_result set chinese=chinese*2;
set左侧是列名右侧是表达式或者常数 ;
Delete(删除)
删除数据
语法:DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...] 删除孙悟空同学的考试成绩
查看原数据:mysql> select * from exam_result where name='孙悟空';
删除数据:mysql> delete from exam_result where name='孙悟空';
查看删除结果:mysql> select * from exam_result where name='孙悟空'; 删除总分最低的人
查看原数据最低的人:mysql> select name,chinese+math+english total from exam_result order by total limit 1; 删除操作:mysql> delete from exam_result order by chinese+math+english limit 1; 查看删除操作:宋公明不存在了
创新表:mysql> create table no_duplicate_table like duplicate_table;
你也可以重新create结构;不过用like方便因为是结构相似的表;新表插入数据:mysql> insert into no_duplicate_table select distinct * from duplicate_table;
重命名:mysql> rename table duplicate_table to old_duplicate_table,no_duplicate_table to duplicate_table; /var/lib/mysql 是 Linux 系统中 MySQL 数据库默认的数据存储目录 。可以到配置文件cd /var/lib/mysql 中找到文件,在cd你所用的数据库可以看到你所建的表;
使用当前数据库:mysql> use scott; 查表:mysql> show tables;成功导入表
emp员工表 dept部门表 salgrade工资等级表
显示员工平均工资和最高工资:mysql> select avg(sal),max(sal) from emp;
**按照部门显示平均工资和最高工资:**mysql> select avg(sal),max(sal) from emp group by deptno;
**显示每个部门的平均工资和最高工资:**mysql> select deptno,avg(sal),max(sal) from emp group by deptno; 分组是指定列名(group by table_name)表示分组列是它,实际分组是使用这一列不同行的数据进行聚合统计分组(把这一列的一组分为多个组,进行组内统计)
**显示每个部门的每种岗位的平均工资和最低工资:**mysql> select avg(sal),min(sal),job, deptno from emp group by deptno, job;//用逗号来隔离不同分组条件
mysql> select avg(sal),deptno from emp group by deptno having avg(sal)<2000; having的作用是你分完组了也聚合完了我再根据聚合统计的结果刷选;
having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。
先执行select avg(sal),deptno from emp group by deptno后执行having avg(sal)<2000; mysql> select max(mgr),avg(sal),min(sal),job, deptno from emp where ename!='SMITH' group by deptno, job having avg(sal)<2000;
where是对具体的任意列进行条件筛选;
having是对我们分组聚合之后的结果进行条件刷选;
他们俩的应用场景是不同的,如果他俩在一块,先where后having;
执行顺序:1.告诉我你从那个表里拿数据from emp 2.告诉我拿数据的筛选条件是什么 where ename!='SMITH' 3. 按照对应的组进行分组 group by deptno, job 4. 按照分组后的进行聚合统计以及重命名 5. 进行结果having筛选 注意的是from左边的列必须在from右边分组出现,否则不成功
比如:mysql> select ename,avg(sal),min(sal),job, deptno from emp group by deptno, job;//ename不属于分组条件所以无法分组
错误:ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'scott.emp.ename' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
错误:select mgr,avg(sal),min(sal),job, deptno from emp group by deptno, job;
正确:select max(mgr),avg(sal),min(sal),job, deptno from emp group by deptno, job; 所以只有在分组条件中出现的列才能在select后面,或者直接聚合函数也行
不要单纯的认为只有磁盘上表结构导入到MySQL,真实存在的表才叫表;