MySQL增删改查
添加insert
格式: insert into 表名 ([字段1],[字段2],[字段3]…) values (‘值1’,‘值2’,‘值3’…);
插入多条记录:
insert into `student`(`name`,`age`) values ('李四','27'),('王五','17'),('赵六','37');
插入单挑记录:
insert into `student` values ('1','张三','18','1');
如果没有填写字段名,则会一一对应着添加记录,values后面必须根据表设计的字段一一填写,否则会添加失败
如果有填写字段名,则会按照字段名来添加记录,如果其他字段是非空的且没有默认值和非自增的,则会添加失败;如果是自增的,可以不填,会自动增加
修改update
**格式:**update 表名 set 字段=修改的值 [where 字段=判定]
update `student` set `name`='张杰' where `id`=1;
修改多个值:
update `student` set `name`='李娜',`age`='18' where `id`=2;
where判断 | |
---|---|
=,>,<,!= | 等于,大于,小于,不等于 |
between | 在某个范围内 |
and | 两者为真才是真 |
or | 只要一者为真就是真 |
删除delete和truncate
**格式:**delete from 表名 [where 字段名=判断]
truncate [table] 表名
delete from `student` where `id`='1';
truncate `student`
两者都能删除一个表的记录
但是truncate是DDL语句,作用是表的操作,不能删除某一条记录,只能全部清空。
delete是DML语句,操作表内的记录,可以删除某一条记录,也可以全部清空。
区别:
truncate是全部清空,包括自增量,如果清空了,会重新从1开始自增;
delete也可以全部清空,但是自增量不会重置,不会重新从1开始自增,还是按照当前的自增量自增。
注意:
如果引擎是innodb,因为自增量是存储在内存当中,即使是使用delete清空表,当重启mysql服务时,自增量也会重置
引擎是myisam的话,因为是存储在文件中,不会重置自增量
查询select
**格式:**select 字段 [as] [别名] from 表名 [where] [判断]
select `name`,`age` from `student`;
字段别名:
select `name` as 姓名,`age` as 年龄 from `student`;
记录连接:concat()
select concat('姓名:',`name`) as 新名字 from `student`;
去重 distinct
select distinct `id`,`result` from `result`;
给result数据加1
select `id`,`result`+1 from `result`;
模糊查询
like 搭配 %(代表一个或多个字符),_(代表一个字符)
select * from `student` where `name` like '张%';
in(值1,值2,值3…)在这个范围内,只要等于其中一个值就是真。**注意:**值必须是确定的一个值,不能是用%,_这样的字符去匹配的
select * from `student` where `name` in ('张_','李%');--这种是错误的
select * from `student` where `name` in ('张三','李四')--这种是正确的
如果要查姓张的和姓李的,可以用or 和 like搭配
select * from `student` where `name` like '张%' or `name` like '李%';
联表查询
三种联表 | 用法 |
---|---|
inner join | 以两个表的交集为基准判断id是否相等,只有两个表的id相等才会查出 |
left join | 以左表为基准判断id是否相等,即使右表没有与左表相等的id,也会查出所有左表的记录 |
right join | 以右表为基准判断id是否相等,即使左表没有与右表相等的id,也会查出所有右表的记录 |
以学生表和成绩表为例
学生表有全部的学生记录,成绩表有一次考试的记录
此时学生表中的id在成绩表都有出现,而成绩表中id有一个1001在学生表中没有出现
如果用inner join、left join 查出的效果一样
select s.`id`,`name`,`result`,`grade_id` from `student` as s left join `result` as r on s.id=r.id;
select s.`id`,`name`,`result`,`grade_id` from `student` as s inner join `result` as r on s.id=r.id;
但是用right join查,会发现成绩表中id为1001的都会保留,但是因为学生表中没有与成绩表中的id相同,会出现null
select s.`id`,`name`,`result`,`grade_id` from `student` as s right join `result` as r on s.id=r.id;
是因为right join是以右表也就是成绩表为基准,右表的所有记录都会保留下来,如果没有匹配到学生表的id就会为null。
多个表联表查询
- 先查两个表联表
select s.`id`,`name`,`result`,`grade_id` from `student` as s inner join `result` as r on s.id=r.id;
- 再用查出来的表与另一个表联表再查
select s.`id`,`name`,`result`,`grade_name` from `student` as s inner join `result` as r on s.id=r.id right
join `grade` as g on s.grade_id=g.id;
- 同一个表自连
category表
select p.`categoryName` as '父栏目' ,c.`categoryName` as '子栏目' from `category` as p inner join `category` as c on p.`categoryid`=c.`pid`;