目录
4).若update语句不带where条件,则该属性的所有行都受影响
3. 修改(Update)
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
update 表名 set 列名 = (表达式 – 根据这个表达式确定修改的行)
注释:null 是不能参与数学运算的。
1.) 修改—行—列
给 鹏递归 的数学加上 30分
2).修改一行多列
成绩表中 王娃鹏 同学的数学和英语成绩+5分
update stu2 set math = math + 5 , english = english + 5 where name = '王娃鹏';
注释:where表示首影响的行数
3).修改多行数 据where过滤出来的结果是多行
给数学成绩倒数前三名每人 减去 - 6 分 。
update stu2 set math = math - 6 order by math asc limit 3;
4).若update语句不带where条件,则该属性的所有行都受影响
删除(Delete)
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
delete from 表名 where 过滤条件
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '孙悟空';
-- 删除整张表数据
-- 准备测试表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (
id INT,
name VARCHAR(20)
);
-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
-- 删除整表数据
DELETE FROM for_delete;
1.)删除名字叫张大鹏的这一条学生记录
delete from stu2 where name = '张大鹏';
![](https://img-blog.csdnimg.cn/8e2f4e2e4db841129302199afe4ff659.png)
2).若此时不加where条件,则全表删除
select * from stu1; 为空了
上面两个表还在,drop是表直接就没了。
练习
----------------------------------------------
/* 1.使用SQL创建教师表并添加数据。 */
create table if not exists teachar1(
id int comment '编号',
usename varchar(20) comment '老师姓名',
age int comment '年龄',
sex varchar(10) comment '性别',
base int comment '基础工资',
ext int comment '代课工资'
);
insert into teachar1 values
(1, '孙悟空', 18, '男', 1000, 200),
(2, '猪八戒', 19, '男', 300, 100),
(3, '沙和尚', 19, '男', 1000, 150),
(4, '唐僧', 16, '男', 1000, 300);
/* 2.根据总工资(基础工资+代课工资)倒序(从大到小)。*/
select usename, base + ext as 总工资 from teachar1
order by 总工资 desc;
/* 3.查询基础工资在800-1500的所有老师。 */
select usename, base from teachar1
where base >= 800 and base <= 1500;
/* 4.查询老师列表,根据基础工资升序和代课工资倒序。*/
select usename, base, ext from teachar1
order by base asc , ext desc;
/* 5.查询代课工资最高的前3个人 */
select usename, ext from teachar1
order by ext desc limit 3;
/* 6.查询基础薪资总共有几档。*/
select distinct base from teachar1;
select count(distinct base) as 基础工资档位数 from teachar1;
datetime 日期类型
跟varchar 可变字符串的区别是 datetime是强类型的字符串,插入数据的时候格式必须按这个来
只有年月日,则时分秒为默认值0
如果不按照年月日的格式来输入就会报错
若只有时分秒,按照年月日插入了
注释:如果输入的数组超过合理范围就会报错,不会插入成功。
一般来会在插入时使用MySQL的函数now(); 这是最常用的操作
now(); 会返回系统当前时间,这样搭配使用。
表的约束以及设计(数据库三范式)
数据库约束: 对于某一列的值能添加哪些内容做了一定的限制
这种限制的手段就称为约束
咱们之前创建表,表的属性没有任何约束,想放啥就放啥,这是一个非常大的隐患。
举例:
如果你输入信息的时候,忘记输入一个人的名字,但mysql并不会提升报错,那当你要发放工资时,岂不是不知道这个是人谁?所以需要我们在输入数据的时候具有约束,及时提醒我们。
约束类型
注释:MySQL 8.0.16版本之后才 支持check约束
1).非空约束 not nul
若在某一属性定义时规定该属性not null,不能将空值存放在该属性中
在 添加属性的时候,后面加上 not null 即可
name varchar(20) not null comment 'name属性不能放空值'
注释:通过desc查看非空约束的字段
这里的 null 就变成了 no
测试:三种情况
第一种和第二种都没问题,当我们只想输入 编号时, 就报错了
约定了非空约束的列在插入时若没有插入则必须有默认值或者必须显示插入
如何在创建表之后添加非空约束呢?
表约束都属于表结构上的修改 alter + change
举例:在上面的基础上,将id属性添加为非空约束
alter table test1 change id id int not null;
注释:此时的表里不能存在id为null的值,不然会设置不成功,需要先删null值数据,或者给这行的id输入数据即可。
2. 唯一约束 unique
唯一约束指的是对应字段是惟一的,不能重复。
保证某列的每行必须有唯一的值。
注释:一个表的唯一约束可以有多个
举例:
create table stu_unique(
id int unique comment '此时id属性不能重复',
name varchar(20) not null comment '此时name属性不能为空'
);
插入两个正常的数据
当我们插入的数据,id重复时
报错信息就会提示你
查看表结构
特殊情况:唯—约束存放null的情况null不受唯一键的约束!
可以存在多个null
创建表之后想修改某个字段为唯一约束
alter table stu_tes add unique(name); /给name属性加上唯一约束
查看唯一约束 show keys from tb_name;
3)默认值约束default
规定了默认值的表,在插入数据时若没有指定该列,则使用默认值插入数据
特殊情况:当我们主动给数据传入 null 值时,不会触发默认值
4)主键约束(索引) primary key
primary key 也是一个索引
—张表只能有一个主键 primary key = unique + not null
主键约束的列值不能重复,不能为null。 相当于unique 和 not null 组合
注释:主键约束可以由多个列共同组成——联合主键
在创建表之后添加主键 => 当前表中没有主键约束
注释:因为一个表中,主键约束有且只有一个。
alter table tb_name add primary key(作为主键的属性);
alter table stu_primary add primary key(name); //name属性加上主键约束
删除表中主键
alter table tb_name drop primary key;
注释:not null 不是索引,所以需要 change 这样写 default 也不是索引
而 unique 和 primary key 都是索引 可以直接 add 约束类型(添加属性)
复合主键
alter table 表名称 add primary key(属性1,属性2...);
这样写后: id 和 name 为一体,不重复。只有 id 和 name 全都一致时才认为是 相同值。
在表的创建时,想设置复合主键: 在最后写