1.给所有字段添加值
insertinto person values(5,'李白',24,'155');2.部分字段添加值,值的顺序和前面字段的声明顺序必须一致
insertinto person(id,age,phone)values(1,27,'158');3.添加三条记录
insertinto person(id,age,phone)values(2,27,'157'),(3,25,'159'),(4,26,'156');4.表复制
①创建一个和person结构相同的表person1
createtable person1 select*from person where0=1;
②插入person表所有数据到person1
insertinto person1 select*from person where1=1;--where 0=1,这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表--where 1=1,这个条件始终为true,结果返回表中所有数据
修改数据
--将电话号码为159的姓名修改成杜甫update person set sname=‘杜甫’ where phone=‘159’;
删除数据
1.删除id=2的数据
insertinto person(id,sname,age)values(2,‘杜甫’,26);deletefrom person where id=2;-----------------------------------------------------------------2.delete、drop和truncate的区别
--删除整个表数据(一条一条的删) 不改变结构 会保留自增序列 不影响事务 --->可以进行条件删除deletefrom person1;--删除整个表的结构以及所有数据droptable person1;--直接清除所有数据(一次性删除) 不改变结构 不会保留自增序列 会结束事务 --->只能进行全表删除truncatetable person1;
在速度上,一般来说,drop>truncate>delete
DQL
关键字ALL和DISTINCT
1.ALL(默认) 所有的、全部
SELECTALL stuName,gradeId FROM student;--查询出所有数据 不去重2.DISTINCT 直接的、明显的
SELECTDISTINCT stuName,gender,gradeId FROM student;--查询出所有数据 去重
where查询条件
1.整体理解
SELECT*FROM student WHERE stuName ='张三';--select 是用来筛选列的--where 是用来筛选行的2.逻辑运算符的使用
SELECT*FROM student WHERE stuName ='张三'AND gender ='女';SELECT*FROM student WHERE gender ='女'OR gradeId =3;SELECT*FROM student WHERENOT gender ='女';3.比较运算符的使用
SELECT*FROM student WHERE gradeId >1;SELECT stuName FROM student WHERE address ISNULL;--查询地址为空 不能用=SELECT stuName FROM student WHERE address ISNOTNULL;4.between...and..的使用
SELECT stuName FROM student WHERE gradeId >=2AND gradeId <=3; 等价于 SELECT stuName FROM student WHERE gradeId BETWEEN2AND3;5.IN 的使用
SELECT*FROM student WHERE gradeId =1OR gradeId =3; 等价于 SELECT*FROM student WHERE gradeId IN(1,3);6.模糊查询
-- % 表示任意单个/多个字符-- _ 表示任意单个字符SELECT*FROM student WHERE stuName LIKE'张%';--查询姓为张的学生信息
联表查询
1.内连接可以理解为交集(常用)SELECT
stu.stuName,g.gradeName
FROM
student stu
INNERJOIN grade g
ON stu.gradeId = g.gradeId;--关联条件2.采用左连接 以左表为主 LEFTJOIN前面的就是左表
SELECT
stu.stuName,g.gradeName
FROM
student stu
LEFTJOIN grade g
ON stu.gradeId = g.gradeId;3.自连接 一张表拆分成两张表来看
SELECT
c1.categoryName,c2.categoryName
FROM
category c1,category c2
WHERE
c1.pid = c2.id
分页和排序
1.排序 ASC--->升序 DESC--->降序--需求:查询出学生姓名、课程名称、成绩 并且按照成绩进行降序排序SELECT
stu.stuName,sub.subjectName,r.result
FROM
result r,student stu,`subject` sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDERBY r.result DESC;--需求:在上方基础进行改动 要求按照成绩进行降序 且如果成绩相同按照时间降序SELECT
stu.stuName,sub.subjectName,r.result,r.examDate
FROM
result r,student stu,`subject` sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDERBY
r.result DESC, r.examDate DESC;2.分页
--第N页:limit (pageNo-1)*pageSzie,pageSzie 解释:[pageNo:页码,pageSize:单页面显示条数]--查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNERJOIN result r
ON r.studentno = s.studentno
INNERJOIN`subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'AND StudentResult>=80ORDERBY StudentResult DESCLIMIT0,10--0表示从第0个数据开始,10表示每页10条数据
子查询 ---->嵌套的查询
--查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名-- 方法一:使用联表查询SELECT s.studentno,studentname
FROM student s
INNERJOIN result r
ON s.`StudentNo`= r.`StudentNo`INNERJOIN`subject` sub
ON sub.`SubjectNo`= r.`SubjectNo`WHERE subjectname ='高等数学-2'AND StudentResult>=80-- 方法二:使用联表查询+子查询SELECT r.studentno,studentname FROM student s
INNERJOIN result r
ON s.`StudentNo`=r.`StudentNo`WHERE StudentResult>=80AND subjectno=(SELECT subjectno FROM`subject`WHERE subjectname ='高等数学-2')-- 方法三:使用子查询SELECT studentno,studentname FROM student WHERE studentno IN(SELECT studentno FROM result WHERE StudentResult>=80AND subjectno=(SELECT subjectno FROM`subject`WHERE subjectname ='高等数学-2'))
mysql常用函数
1.常用的字符串函数
SELECT CHAR_LENGTH('狂神说坚持就能成功');/*字符串长度*/SELECT CONCAT('我','爱','程序');/*合并字符串*/SELECT LOWER('KuangShen');/*小写*/SELECT UPPER('KuangShen');/*大写*/SELECTREPLACE('狂神说坚持就能成功','坚持','努力');/*替换字符串*/SELECT SUBSTR('狂神说坚持就能成功',4,6);/*截取字符串 开始和长度 索引从1开始*/SELECT REVERSE('狂神说坚持就能成功');/*反转
--查询姓周的同学,改成邹
SELECT REPLACE(studentname,'周','邹') AS 新名字
FROM student WHERE studentname LIKE '周%';
2.常用的数学函数
SELECT ABS(-8); /*绝对值*/SELECT CEILING(9.4);/*向上取整*/SELECT FLOOR(9.4);/*向下取整*/SELECT RAND();/*随机数,返回一个0-1之间的随机数*/SELECTROUND(20.5);/*四舍五入*/3.日期和时间函数
--获取当前时间SELECTNOW();SELECTCURRENT_DATE();SELECTCURRENT_TIME();--日期转换SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');--计算时间差额SELECT DATEDIFF(NOW(),'2019-05-25');4.常用的聚合/统计函数
SELECTMAX(gradeId)FROM grade;--求年级编号最大的SELECTAVG(result)FROM result WHERE subjectId =1;--求平均分SELECTSUM(result)FROM result WHERE subjectId =1;--求和SELECTCOUNT(stuId)FROM student;--统计字段出现次数 不统计字段为null的记录SELECTCOUNT(1)FROM student;--计算学生总人数 包含字段为null的记录5.md5数据加密函数
--对pwd这一列数据进行加密update testmd5 set pwd = md5(pwd);--单独对某个用户(如kuangshen)的密码加密INSERTINTO testmd5 VALUES(3,'kuangshen2','123456')update testmd5 set pwd = md5(pwd)where name ='kuangshen2';--插入新的数据自动加密INSERTINTO testmd5 VALUES(4,'kuangshen3',md5('123456'));--查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)SELECT*FROM testmd5 WHERE`name`='kuangshen'AND pwd=MD5('123456');