修改部分
修改数据标准语法
update student set sex=‘女’ where sname=‘luck’;
可以一次性修改多行数据
update student set sex=‘女’ where cid>101;
修改数据在原有基础上的更改
update student set birth=birth+10 where cid=102;
可以对控制做出设置
update student set birth=‘1997-8-1’ where sid=6;
将sid=6的数据修改为null
update student set birth=null where sid =6;
设置和条件都是同一个,也可以
update student set cid=null where cid=103
将cid为空的数据改成生日+1天
update student set birth=birth+1 where cid is null
可以对多个数据做修改
update student set birth=birth+1,cid=103 where sid=8
删除部分
删除数据用delete,删除表用drop
delete from student where sid =7;
查询语法
1.简单查询
select 要显示的字段(列) from 表;
2.查询某个列的数据
select sid,sname,sex from student;
3.查询时使用常量
select sid,sname,‘你好’ from studen;
4.拼数据
selent concat(sid,sname),concat(sname,‘你好’) from student;
5.if
selent sname,ifnull(birth,‘2020-1-4’),if(cid>101,404,101) from student;
6.查询时支持对字段使用表达式
select sname,birth,current_date-birth as age from student;
select sid,mod(sid,2)from student;
7.查询生日都在哪些时间(去重复)
select distinct sex,birth,from student;
8.排序order by(ASC(正序),DESC(倒序))
select * from student order by birth desc;
多个排序
select * from exam order by score desc,sid asc;
9.指定返回几行数据
select * from student limit 0,5(从第一行显示5行数据)
10.like 关键字 模糊查询
%a% | 中间含a |
---|---|
a% | 以a开头 |
%a | 以a结尾 |
_a | a前面有一个字符 |
a_ | a后面有一个字符 |
%% | 查询全部 |
where表达式
筛选条件
select (字段,列)from 表 where 条件;
NULL值需要用到is null / is not null
不等于查询 > < >= <=
多条件连接 and or
where 条件 and 条件 | 全部满足有记录 |
---|---|
where 条件 or 条件 | 满足其一即可 |
SQL注入
select * from shop where username=‘qianli’ or ‘a’=‘a’ and password=MD5(任意)
$name qianli’ or ‘a’=‘a’
- 防范方法:输入时去掉单引号
简单查询
在某个区间内between and
成绩在60到80之间
select * from exam where score>=60 and score<=80
select distinct sid from exam where between 76 and 80
在某个集合中
select * from exam where score in (76,80,90)
select * from exam where (course,score) in ((‘语文’,80),(‘数学’,90),(‘英语’,76))
分组查询
- 函数
- 聚合函数 count min max sum avg
- 分组 group by
按sid查询每个学生的平均分
select sid,avg(score) from exam group by sid
求男生和女生各有多少人
select sex,count(sname) from student group by sex
查询每个班级各有多少学生
select cid,count(sname) from student group by cid
查询每个城市的男生女生各多少人
select city,sex,count(sid) from student group by city,sex
分组表达式是一个要在分组之后才能够统计出来的,这时候一定要用到having
如果是对普通字段进行处理,则可以where语句来完成,而且建议where完成 - 二次筛选 having
查询有同班同学的班级
select cid,count(sid) from student group by cid having count(cid) >=1
查询每个班级有多少人
select cid,count(sid) from student group by cid having cid is not null - count统计数量,max和min求最大数和最小数,sum和avg是求和以及平均值
名字长度为5的学生信息
select * from student where length(sname)=5 - count(字段)
select count(sid) from student
select count(distinct cid) from student; - 统计行数
select count(*) from student
select max(score),min(score) from exam
多表联合查询
select e.,s. from exam e ,student s where e.sid=s.sid
-
每个人每门考试的成绩是多少
select s.sid,s.sname,e.course,e.score from exam e,student s where e.sid=s,sid and e.score<60 -
查询每个分数等级有多少个学生
select sl,count(distinct sid),group_concat(distinct sid) from exam e join slevel s on e.score between s.minscore and s.maxscore group by sl
-
查询每门科目最低分数学生的学号,姓名,科目和分数
select s.**,a.* from student s join (select course,min(score) mis,max(sid) mid from exam group by course) a on s.sid=a.mid
三表连接
select e.,s. from exam e join studeng s on e.sid=s.sid join classroom c on s.cid=c.classid
自身表连接
select a.**,b.* from family family a join family b on a.fid=b.pid
子查询
查询语句中包含查询语句
- 查询年龄最小的女生
select * from student where birth=(select max(birth) from student where sex =‘女’)
- 查询总分最低的人是谁
select * from student s join (
select sid,sum(score) sc from exam group by sid having sc=(select min(sc) from
(select sid,sum(score) sc from exam group by sid) a)) b on s.sid=b.sid
- 查询分数是最低分的学生信息
select * from student s where sid in(
select distinct sid from exam where score=(
select max(score) from exam))
- 查询每个城市年龄最小的学生信息
select * from student where (city,birth) in(
select city,max(birth) from student group by city)
外连接
左右连接属于外连接
- 左连接:以左边为基准表,右边表去连接左边表,右边没有对应的数据,以空显示
select s.*,e.** from student s left join exam e on s.sid=e.sid
- 右连接:同理,与左连接相反
select s.*,e.** from student s right join exam e on s.sid=e.sid
- 左右表也可互换,灵活运用为主
- 非等值连接
select st.* e.**,s.* from exam e join slevl s on e.score between s.minscore and s.maxscore join student st on e.sid =st.sid;
UNION ALL 将结果不去重复,简单的上下相加
select sid from student union all select fid from family
总结:
- 简单的单表查询
- where子句
- 分组(count max min avg sum)
分组表达式,分组语句的语法和注意事项
一次筛选和二次筛选的含义和使用 - 多表连查
等值连接 | |
---|---|
自身表连接 | |
外连接 | |
非等值连接 | |
分组和多表的综合使用 |
- 子查询
from子句中,把查询看成一张表,但是要设别名
where子句中
子查询 | 用法 |
---|---|
单列单行 | = |
单列多行 | IN |
多列多行 | 注意列的对应 |
delete和truncate的区别
delete | 可以删除部分数据 ,一行一行删除 |
---|---|
truncate | 不能删除部分,成页的删除 |