-- 修改学生名字 UPDATE `student` SET `name`='狂神'WHERE id=1; -- 不指定条件的情况下会修改表中所有记录的数据 UPDATE student SET `name`='1号' -- 修改多个属性,逗号隔开 UPDATE student SET `name`='狂神',email=NULLWHERE id =6; -- 语法: -- UPDATE 表名 SET column_name=value,[column_name=value,...] WHERE [条件];
条件:where子句 运算符 id等于某个值,大于某个值,在某个区间修改 ……
UPDATE student SET name=’狂神’,email=’123’ WHERE id BETWEEN 2 AND 5;
操作符会返回 布尔值
操作符
含义
范围
结果
=
等于
5=6
false
<>或!=
不等于
5<>6或5!=6
true
>
大于
5>6
false
<
小于
5<6
true
>=
大于等于
5>=6
false
<=
小于等于
5<=6
true
between…and…
在某个范围内,双闭合区间
[2,5]
and
&& 和
5>1 and 1>2
false
or
|| 或
5>1 or 1>2
true
1 2
-- 通过多个条件定位数据 UPDATE student SET `name`='长江7号'WHERE `name`='狂神'AND sex='女'
注意:
column_name 是数据库的列,尽量带上``
筛选的条件,如果没有指定,则会修改所有的列
value是一个具体的值,也可以是一个变量
多个变量的属性之间使用英文逗号隔开
1 2 3 4
-- CURRENT_TIME 当前时间 (变量) UPDATE student SET birthday=CURRENT_TIMEWHERE id=1 -- or UPDATE student SET birthday='xxxx-xx-xx'WHERE id=1
删除
delete 命令
语法:delete from 表名 [where 条件]
1 2 3 4
-- 删除指定数据D ELETE FROM student WHERE id =1; -- 删除数据没有条件(避免这样写,会全部清空表) DELETEFROM student;
-- =========联表查询 join========== SELECT*FROM student SELECT*FROMresult -- 查询参加了考试的同学(学号,姓名,科目编号,分数) /* 思路 1.分析需求,分析查询的字段来自哪些表(连接查询) 2.确定使用哪种连接查询?7种 3.确定交叉点(这两个表哪个数据是相同的) 4.判断的条件:学生表中studentno = 成绩表中studentno(这里用别名会方便很多) */ -- join on 连接查询 -- where 等值查询 -- inner join SELECT s.studentno,studentname,subjectno,studentresult FROM student AS s INNERJOINresultAS r WHERE s.studentno = r.studentn -- right join SELECT s.`studentno`,`studentname`,`studentname`,`studentresult` FROM `student` s RIGHTJOIN `result` r ON r.`studentno` = s.`studentno` -- left join SELECT s.`studentno`,`studentname`,`studentname`,`studentresult` FROM `student` s LEFTJOIN `result` r ON r.`studentno` = s.`studentno`
-- 查询缺考的同学 先查出所有同学再通过条件筛选出缺考的学生 SELECT s.studentno,studentname,subjectno,studentresult FROM student s LEFTJOINresult r ON s.studentno=r.studentno WHERE `studentresult` ISNULL; -- 思考题(查询参加考试的同学的信息:学号,学生姓名,科目名,分数)(三表查询) /*思路 1.分析需求,分析查询的字段来自哪些表,student,result,subject(连接查询) 2.确定使用左连接找出参加考试同学的信息,然后再通过交集连接把课程名打印出来 3.确定交叉点 studentno,subjectno */ SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s RIGHTJOIN `result` r ON r.`studentno` = s.`studentno` INNERJOIN `subject` sub ON sub.`subjectno` = r.`subjectno`
SELECT s.`studentno`,`studentname`,`gradename`,`studentresult` FROM `student` s LEFTJOIN `result` r ON r.`studentno` = s.`studentno` INNERJOIN `grade` sub ON sub.`gradeid` = s.`gradeid`
1 2 3 4 5 6
-- 查询数据 select ... -- 从哪几个表中查 from 表名XXX join 连接的表XXX on 交叉的条件 -- 假设存在一种多张表查询,一步一步来,先查询两张表然后再慢慢增加查询 -- from a inner join b -- from a left join b -- from a right join b
-- 查询父子信息:把一张表看成两个一模一样的表 SELECT a.`categoryName` 父栏目,b.`categoryName` 子栏目 FROM `category` a, `category` b WHERE a.`categoryid` = b.`pid`
查询练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
-- 查询学员所属的年级(学员,学生的姓名,年级名称) SELECT `studentno`,`studentname`,`gradename` FROM student s INNERJOIN grade g ON s.gradeid=g.gradeid -- 查询科目所属的年级(科目名称,年级名称) SELECT `subjectname`,`gradename` FROM `subject` sub INNERJOIN grade g ON sub.gradeid=g.gradeid -- 查询了参加高等数学-1 考试的同学信息(学号,学生姓名,科目名,分数) SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM student s INNERJOINresult r ON s.studentno=r.studentno INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname`='高等数学-1'
分页和排序
排序
1 2 3 4 5 6 7 8 9 10 11 12
-- =======分页 limit和排序 order by========= -- 排序:升序ASC,降序DESC -- 语法:order by 通过哪个字段进行排序,怎么排(asc,desc) -- 查询的结果根据成绩排序 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM student s INNERJOINresult r ON s.studentno=r.studentno INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname`='高等数学-1' ORDERBY `studentresult` ASC
-- ===========where========= -- 1.查询 高等数学-1 的所有的考试结果(学号,科目编号,成绩)按成绩降序排列 -- 方式一:使用联表查询 SELECT `studentno`,r.`subjectno`,`studentresult` FROM `result` r INNERJOIN `subject` sub ON r.subjectno=sub.subjectno WHERE `subjectname`='高等数学-1' ORDERBY `studentresult` DESC
-- 方式二:使用子查询(由里及外) -- 查询所有学生的学号等信息,然后通过子查询再筛选出高等数学-1的学生信息 SELECT studentno,`subjectno`,`studentresult` FROMresult WHERE `subjectno`=( -- 查询高等数学-1的科目编号 SELECT `subjectno` FROM `subject` WHERE `subjectname`='高等数学-1' ) ORDERBY `studentresult` DESC
-- 练习: -- 1.分数不小于60分的学生的学号和姓名(使用联表方式) SELECTDISTINCT s.studentno,studentname FROM student s INNERJOINresult r ON s.studentno=r.studentno WHERE studentresult >=60 /* -- 2.在这个基础上增加一个科目,高等数学-2 SELECT DISTINCT s.studentno,studentname FROM student s INNER JOIN result r ON s.studentno=r.studentno WHERE studentresult >= 60 AND studentname='高等数学-2' -- 错误,因为还要再联一个subject表才行,所以用子查询会方便很多 */
-- 3.正确方式,加一个联表(联了三个表)效率较子查询来说要低一些 SELECTDISTINCT s.studentno,studentname FROM student s INNERJOINresult r ON s.studentno=r.studentno INNERJOIN `subject` sub ON r.subjectno=sub.subjectno WHERE studentresult >=60AND subjectname='高等数学-2'
-- 4.子查询方式。在这个基础上增加一个科目,高等数学-2 -- 子查询 查询高等数学-2的编号 SELECTDISTINCT s.`studentno`,`studentname` FROM `student` s INNERJOIN `result` r ON s.`studentno` = r.`studentno` WHERE `studentresult` >60AND subjectno = ( SELECT subjectno FROM `subject` WHERE `subjectname` ='高等数学-1' ) -- 5.通过子查询再简化,把联表操作去掉 -- 再次改造(由里及外) SELECT studentno , studentname FROM student WHERE studentno IN( SELECT studentno FROMresultWHERE studentresult >60AND subjectno = ( SELECT subjectno FROM `subject` WHERE `subjectname` ='高等数学-1' ) ) -- 练习:查询java-2 前5名同学的成绩的信息(学号,姓名,分数) 使用子查询 SELECT s.`studentno`,`studentname`,`studentresult` FROM student s INNERJOINresult r ON s.studentno=r.studentno WHERE r.subjectno = ( SELECT subjectno FROM `subject` WHERE subjectname='java-2' ) ORDERBY `studentresult` DESC LIMIT 0,5 /* SELECT studentno ,studentname, FROM student WHERE studentno IN( SELECT studentno,studentresult FROM result WHERE subjectno = ( SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-1' ) )*/
分组和过滤
1 2 3 4 5 6 7 8 9
-- 查询不同课程的平均分,最高分,最低分,并且平均分大于80 -- 核心(根据不同的课程分组) SELECT `subjectname` ,AVG(`studentresult`) 平均分,MAX(`studentresult`) 最高分,MIN(`studentresult`) 最低分 FROMresult r INNERJOIN `subject` sub ON r.`subjectno` = sub.`subjectno` GROUPBY `subjectname` HAVING 平均分 >80 -- having 用于分组后过滤
-- 查询用户9999数据,当没有索引的时候(总耗时:0.573 sec) SELECT*FROM app_user WHERE `name`='用户9999'; EXPLAIN SELECT*FROM app_user WHERE `name`='用户9999'; -- 添加索引 命名格式:id_表名_字段名 -- CREATE INDEX 索引名 ON 表(字段) CREATE INDEX id_app_user_name ON app_user(`name`); -- 查询用户9999数据,当有索引的时候(总耗时:0.001 sec) SELECT*FROM app_user WHERE `name`='用户9999'; EXPLAIN SELECT*FROM app_user WHERE `name`='用户9999';