insertinto students values(190701,'刘盼盼','女','2020-3-8 10:50:21','宜春',190.6); insertinto students values(190702,'王小红','男','2010-3-8 10:21:21','菏泽',140.6); insertinto students values(190703,'刘春香','女','2006-3-8 9:50:21','廊坊',null);
selectdistinct 列名 from 表名 selectdistinct ssex from students;
修改 限制
update 表名 set 列名=新值 where 条件 update students set saddress='黄浦'where sno=190703;
where限制查询
select 列名 from 表名 where 条件 select saddress from students where sno=190701;
limit用来查询指定范围的记录
select*from 表名 limit 开始值,长度; 案例1 查询前两条 select*from students limit 0,2; select*from students limit 0,2; select*from students limit 2; select*from students limit 2,2;
– 为空is null 和不为空 is not null
select*from 表名 where 列名 isnull;--为空的 select*from 表名 where 列名 isnotnull; ---不为空的
select*from course where ccredit isnull; select*from course where ccredit isnotnull;
逻辑运算<、>、=、!=
查询学分大于4的
select*from course where ccredit>=4;
查询学分不等于5
select*from course where ccredit!=5;
between and查询一个范围 包含开始和结束(闭区间) 不包含开始和结束(开区间)
select*from 表名 where 列名 between 值 and 值 ; select*from course where ccredit between3and5;
in 表示数学的一个集合
查询学分在4 5 6 之间的 包含括号里的
select*from 表名 where 列名 in(值1,值2.....) select*from course where ccredit in(3,5,6);
查询学分不在4 5 6 之间的 不包含括号里的
select*from 表名 where 列名 notin(值1,值2.....) select*from course where ccredit notin(3,5,6);
like用于字符串匹配 %所有 _一个字符
select*from students where saddress like'宜%'; select*from students where saddress like'_春'; 找出王**like'王__' 有2个_ _ select*from students where sname like'王__'; 找出不是2020年开头的 notlike select*from students where sbirthday notlike'2020%';
聚合函数
聚合函数 用于数据的汇总 比如 求和 最大 最小 平均 统计
sum求和
selectsum(列名) from 表名 selectsum(sheight) from students;
max最大值
selectmax(列名) from 表名 selectmax(sheight) from students;
min最小值
selectmin(列名) from 表名 selectmin(sheight) from students;
平均值
selectavg(列名) from 表名 selectavg(sheight) from students;
统计人数
selectcount(*) from 表名 --统计身高大于大于150的人数 selectcount(*) from students where sheight>=150;
连接查询 union 同显示 不需要加分号 union合并查询的结果
查出上海和北京的 select*from students where saddress like'黄%' UNION select*from students where saddress like'宜%'
修改 update
无条件
update 表名 set 列名=新值
有条件
update 表名 set 列名=新值 where 条件
2、把计算机系学生的Department改为信息学院
update test1 set Department='信息学院'where Department='计算机系';
select*from students where saddress='宜春'orderby sheight desc ; select*from students where saddress like'北京%'orderby sheight desc;
having 聚合函数过滤 后面必须是聚合函数
having字句:
where不能和聚合函数一起使用。
where只能过滤分组之前的数据
having:过滤分组之后的数据。
语法: select 分组字段,聚合函数 from 表 group
by 分组字段 having 聚合函数的过滤
如
–查询每门功课的平均分,要求显示平均分在60分以上的(包括60分).
–(解题思路:根据科目名称进行分组,通过where条件筛选出平均分大于等于60分的科目)
select ExamSubject,avg(ExamResult)as 平均分 from StudentExam groupby ExamSubject havingavg(ExamResult)>=60
– group by 用来分组 必须它与聚合函数 (max min avg sum count )结合起来
– 按出生地统计人数
select*from students groupby saddress; select saddress,count(*) from students groupby saddress; select saddress,count(*) from students where saddress isnotnullgroupby saddress;
– 按出生地分组并且人数在2人以上 having是对分组结果的过滤 必须是聚合函数
select saddress,count(*) from students groupby saddress havingcount(*)>=2;
外连接
—外连接
use StudentDb select*from ClassInfo select*from StudentInfo insertinto StudentInfo values(11,'013','王大财',65,'男','46711477148','2009-8-7','北京',3)
–外连接—左连接(找出所有学生信息,包括没有班级)左边表为基准 left join
select a.*,b.classnumber from StudentInfo as a leftjoin ClassInfo as b on a.SClassID=b.ClassID
外连接—右连接(找出所有学生信息,包括没有班级)右边表为基准 right join
select a.*,b.classnumber from StudentInfo as a rightjoin ClassInfo as b on a.SClassID=b.ClassID
全连接 两表为基准 full join
select a.*,b.classnumber from StudentInfo as a fulljoin ClassInfo as b on a.SClassID=b.ClassID
查询学生的学号 姓名 系 课程 以及成绩 select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a innerjoin test2 as b on a.No=b.No;
连接查询找出大于等于75分的学生的No、Name、Grade、Courses并且降序 select a.NO,a.Name,b.Grade,b.Courses from test1 as a innerjoin test2 as b on a.No=b.No where b.Grade>=75orderby Grade desc;
内连接
select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a innerjoin test2 as b on a.No=b.No;
左连接 左边为基准 select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a leftjoin test2 as b on a.No=b.No;
右连接 右边为基准 select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a rightjoin test2 as b on a.No=b.No;
全连接
两表为基准 Sql没有全连接 可以用union实现全连接 select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a leftjoin test2 as b on a.No=b.No; union select a.No,a.Name,a.Department,b.Courses,b.Grade from test1 as a rightjoin test2 as b on a.No=b.No;
子查询
– 找出和张可同一个部门的人 先查出张可的部门编号 然后在去查询
– 利用子查询
select*from emp where deptno=14; select*from emp where deptno=(select deptno from emp where cname='张可');
– 找出工资大于部门平均工资的人员
selectavg(sal) from emp groupby deptno; select a.*from emp as a,(select deptno, avg(sal) as pj from emp groupby deptno) as b where a.deptno=b.deptno and a.sal>=b.pj
(select deptno, avg(sal) as pj from emp group by deptno)//求出每个部门的平均工资 把平均工资去当一个表 取别名 avg(sal)as pj 取别名 平均工资
一表为不存在时 条件用where 表1的相同字段=表2的相同字段 and 表1的每个人的工资>表2每次算出的平均工资
表视图
创建视图表 视图名 v_开头 createview 视图名 [(视图字段列表)] asselect 语句 创建视图列: createview v_avgsalary as select*from dt_pay where Salary>(selectavg(Salary) from dt_pay);
– 视图是一个虚拟的表 来自于基本表table
– 创建视图表 工资大于平均工资的人员信息
select*from dt_pay where Salary>(selectavg(Salary) from dt_pay);
createview v_avgsalary as select*from dt_pay where Salary>(selectavg(Salary) from dt_pay);
select*from question where find_in_set(question_id,(select exam_question_ids from exam where exam_id=1));
随机查询10条
SELECT*FROM question WHERE question_bookid=1ORDERBY RAND() LIMIT 10
多表查询 分组在排序
select b.*,count(*)as lablecount from article as a INNERJOIN articlelable as b on a.articlelableid=b.articlelableid GROUPBY a.articlelableid ORDERBY lablecount desc
得到所有数据中的不同年份
SELECT date_format(b.createtime, '%Y') asyearfrom article b GROUPBYyearORDERBYyearDESC;
就会得到不同的年份
查询某个年份下的所有内容
也可以用like
SELECT*from article b where date_format(b.createtime, '%Y') ='2021';
终端提示ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@‘localhost’
把localhost改成 %
一定条件多个或者
select*from article as a INNERJOIN articletype as b on a.articletypeid=b.articletypeid where state=0and (articletitle like'%切换%'or articlecontext like'%切换%') orderby a.createtime desc
只截取某个字段的一部分修改
UPDATE 表 SET 字段A=INSERT(字段A, 起始位置, 几个, 替换内容)
查找重复数据
select employee_name,count(*) from employee groupby employee_name havingcount(employee_name)>1;
统计重复数据
SELECTCOUNT(*) as repetitions, last_name, first_name FROM person_tbl GROUPBY last_name, first_name HAVING repetitions >1;