-- 语法 -- UPDATE 表名 SET colunm_name = value where [条件] -- 修改姓名 UPDATE `student` SET `name`='zz'WHERE id =1; -- 不指定条件会改动所有表 UPDATE `student` SET `name`='zz' --修改多个属性 UPDATE `student` SET `name`='zz',`email`='123@qq.com'WHERE id =1;
条件: where 子句 运算符 id 等于 大于 再某个区间内修改
操作符
含义
范围
结果
=
等于
5=6
false
<> !=
不等于
5<>6
true
>
<
<=
>=
BETWEEN…AND..
再某个范围内
闭合区间
AND
OR
1 2
-- 多个条件定位数据 UPDATE `student` SET `name`='zz',`email`='123@qq.com'WHERE id =1AND `sex` ='女';
注意:
colnum_是数据库的列,尽量带上``
条件如果没有指定,则会修改所有的列
value是一个具体的值,也可以是一个变量(一般为时间)
1
UPDATE `student` SET `name`='zz',`email`='123@qq.com' `birthday` =CURRENT_TIMEWHERE id =1AND `sex` ='女';
3.5 删除
delete 命令
1 2 3 4 5 6
-- 语法 -- DELETE FROM 表名 [条件] -- 删除全部 DELETEFROM `student` -- 删除数据 DELETEFROM `student` WHERE id =1
-- 语法: SELECT 字段··· FROM 表 -- 查询全部的学生 SELECT 字段 FROM 表 SELECT*FROM student SELECT*FROMresult -- 查询指定字段 SELECT`studentno`,`studentname`FROM student -- 别名 给结果起个名字 AS 可以给字段起别名,也可以给表起别名 SELECT`studentno`AS 学号,`studentname`AS 学生姓名 FROM student AS s -- 函数 Concat(a,b) SELECT CONCAT('姓名:',studentName) AS 新名字 FROM student
有些时候列名字不是那么的见名知意,需要起别名 AS
去重distinct:去除SELECT查询出来的结果中重复的数据,只显示一条
1 2 3 4 5 6
-- 查询有哪些人参加了考试,成绩 SELECT*FROM `result` -- 查询有那些同学参加了考试 SELECT `studentno` FROM `result` -- 发现重复数据,去重 SELECTDISTINCT `studentno` FROM `result`
-- ===============联表查询====================== SELECT*FROM `student` SELECT*FROM `result` /* 1.分析需求,分析查询字段来自哪些表 2.确定使用哪种连接查询 7种 确定交叉点:两个表中那个数据是相同的 判断的条件:学生表的 studentno = 成绩表的studentno */ -- Inner Join SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM student AS s INNERJOINresultAS r WHERE s.`studentno` = r.`studentno`
-- Right Join SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM student AS s RIGHTJOINresult r ON s.`studentno` = r.`studentno`
-- Left Join SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM student AS s LEFTJOINresult r ON s.`studentno` = r.`studentno`
操作
描述
Inner join
如果表中至少有一个匹配,就返回行
left join
会从左边的表返回所有的值,即使右表没有匹配
right join
会从右表返回所有的值,即使左表没有匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- 查询参加了考试的同学的信息,学号,学生姓名,科目名,分数 /* 1.分析需求,分析查询字段来自哪些表 student result subject 2.确定使用哪种连接查询 7种 确定交叉点:两个表中那个数据是相同的 判断的条件:学生表的 studentno = 成绩表的studentno */ SELECT s.`studentno`,`studentname`,`studentresult`,`subjectname` FROM student s RIGHTJOIN `result` r ON r.`studentno`=s.`studentno` INNERJOIN `subject` sub ON r.`subjectno`= sub.`subjectno` -- 要查哪些数据 select -- 从哪几个表查 from 表 xxjoin 连接的表 on 交叉条件 -- 假设存在多张表查询,慢慢来,先查两张再增加
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表
categoryid
categoryname
2
新技术
3
软件开发
5
美术技术
pid
categoryid
categoryname
3
4
数据库
2
8
办公信息
3
6
web开发
5
7
美术设计
操作:查询父类对应的子类关系
父类
子类
信息技术
办公信息
软件开发
数据库
软件开发
web开发
美术技术
美术设计
1 2 3 4
-- 查询父子信息 SELECT a.`categoryname` AS'父',b.`categoryname` AS'子' FROM`category` a ,`category` b WHERE a.`categoryid` = b.`pid`
-- 查询学号,姓名,年纪 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 INNERJOIN `result` r ON s.`studentno`=r.`studentno` INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname`='高等数学-1'
4.5 分页和排序
排序 ASC DESC
1 2 3 4 5 6 7 8 9 10
-- 排序 升序 asc 降序 desc -- 根据结果成绩降序排序 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s >INNERJOIN `result` r ON s.`studentno`=r.`studentno` INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname`='高等数学-1' ORDERBY `studentresult` ASC
分页
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-- 分页 每页只显示5条数据 -- 语法:limit 起始值,每页大小 -- 网页应用 当前,总的页数,当前大小 -- 第一页 limit 0,5 -- 第二页 limit 5,5 -- 第三页 limit 10,5 -- 第N页 limit (n-1)*pagesize,pagesize -- 总页数 = 数据总数/数据大小 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNERJOIN `result` r ON s.`studentno`=r.`studentno` INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname`='高等数学-1' ORDERBY `studentresult` ASC LIMIT 0,5-- 起始值,页面大小
1 2 3 4 5 6 7 8 9 10 11 12
-- 思考 -- 查询JAVA第一学年,课程成绩排名前十,分数大学80的学生信息 -- (学号,姓名,课程名称,分数) SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNERJOIN `result` r ON s.`studentno`=r.`studentno` INNERJOIN `subject` sub ON sub.`subjectno`=r.`subjectno` WHERE `subjectname`='JAVA第一学年'AND `studentresult`>=80 ORDERBY `studentresult` DESC LIMIT 0,10
-- 查询数据库结构-1 所有的考试结果 学号 编号 成绩 降序 SELECT `studentno`,`subjectname`,`studentresult` FROM `result` r INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE `subjectname` ='数据库结构-1' ORDERBY `studentresult` DESC -- 使用子查询 SELECT `studentno`,`subjectno`,`studentresult` FROM `result` WHERE `studentno`IN(SELECT `subjectno` FROM `subject` WHERE `subjectname` ='数据库结构-1') -- 查询数据库结构-1 学生 学号 SELECT `subjectno` FROM `subject` WHERE `subjectname` ='数据库结构-1'
-- 分数不小于80分学生的学号和姓名 SELECTDISTINCT s.`studentno`,`studentname` FROM `student` s INNERJOIN `result` r ON s.`studentno`=r.`studentno` WHERE `studentresult` >=80 -- 在这个基础上增加一个,高等数学-2 SELECTDISTINCT s.`studentno`,`studentname` FROM `student` s INNERJOIN `result` r ON s.`studentno`=r.`studentno` WHERE `studentresult` >=80AND `subjectno` = ( SELECT `subjectno` FROM `subject` WHERE `subjectname` ='高等数学-2' )
-- 查询课程为高等数学-2 分数不小于80的同学的学号和姓名 SELECT s.`studentno`,`studentname` FROM `student` s INNERJOIN `result` r ON s.`studentno`=r.`studentno` INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` WHERE`subjectname`='高等数学-2'AND `studentresult` >=80
4.7 分组和过滤
1 2 3 4 5 6 7 8
-- 查询不同课程的平均分,最高分,最低分 -- 根据不同课程分组 SELECT `subjectname`,AVG(`studentresult`),MAX(`studentresult`),MIN(`studentresult`) FROM`result` r INNERJOIN `subject` sub ON r.`subjectno`=sub.`subjectno` GROUPBY r.`subjectno` HAVINGAVG(`studentreslt`)>80
SELECTCOUNT(`studentname`) FROM `student`-- COUNT(指定列) 会忽略null值 SELECTCOUNT(*) FROM `student` -- 不会忽略null 本质 计算行数 SELECTCOUNT(1) FROM `student` -- 不会忽略null本质 计算行数
SELECTSUM(`studentresult`) AS 总和 FROM `result` SELECTAVG(`studentresult`) AS 平均 FROM `result` SELECTMAX(`studentresult`) AS 最高 FROM `result` SELECTMIN(`studentresult`) AS 最低 FROM `result`
-- 插入100万数据. DELIMITER $$ -- 写函数之前必须要写,标志 CREATEFUNCTION mock_data () RETURNSINT BEGIN DECLARE num INTDEFAULT1000000; DECLARE i INTDEFAULT0; WHILE i<num DO INSERTINTO `app_user`(`name`,`email`,`phone`,`gender`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2)); SET i=i+1; END WHILE; RETURN i; END;
SELECT mock_data() -- 执行此函数 生成一百万条数据 SELECT*FROM `app_user` WHERE `name` ='用户9999'-- 1 sec EXPLAIN SELECT*FROM `app_user` WHERE `name` ='用户9999' -- id_表名_字段名 -- create index 索引名 on 表(字段) CREATE INDEX id_app_user_name ON `app_user`(`name`) EXPLAIN SELECT*FROM `app_user` WHERE `name` ='用户9999'-- 0.001sec
Statementstatement= connection.createStatement(); Stringsql="insert into user(...) values(...)"; intnum= statement.executeUpdate(sql); if (num > 0){ System.out.println("插入成功"); }
CRUD操作-delete
1 2 3 4 5 6
Statementstatement= connection.createStatement(); Stringsql="delete from user where id = 1"; intnum= statement.executeUpdate(sql); if (num > 0){ System.out.println("删除成功"); }
CRUD操作-update
1 2 3 4 5 6
Statementstatement= connection.createStatement(); Stringsql="update user set name = '' where name = ''"; intnum= statement.executeUpdate(sql); if (num > 0){ System.out.println("修改成功"); }
CRUD操作-read
1 2 3 4 5 6
Statementstatement= connection.createStatement(); Stringsql="select * from user where id = 1"; ResultSetrs= statement.executeQuery(sql); while (re.next){ }
Stringsql="INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)\n" + "VALUES('4','z','123456','123124@qq.com','1990-12-11')"; inti= st.executeUpdate(sql); if (i >0){ System.out.println("成功"); }
Stringsql1="update account set money = money - 100 where NAME = 'a'"; st = conn.prepareStatement(sql1); st.executeUpdate(); Stringsql2="update account set money = money + 100 where NAME = 'b'"; st = conn.prepareStatement(sql2); st.executeUpdate();