插头插座[[437763]]插头插座
今天咱们来讲讲SQL方面的常识点,格外是对于绝大无数的数据分析师而言,SQL亦然时常会被口试问到的实质。
首页-盛 盈宏壁纸有限公司现在咱们有底下这4张表格
学生表 教育表 得益表 课程表咱们先在Navicat当中创建表格何况插入数据,在Navicat当中创建表格并不难,点击新建表,然后输入字段名,何况功令好相应的数据类型即可,点击保存
然后咱们向表中插入数据,语法如下
insert into 表名(字段名1, 字段名2, 字段名3,.....) values('val1', 'val2', 'val3', ......);
举例咱们在学生表当中插入以下的数据
insert into student(学号,姓名,出身日历,性别) values('0001' , '张三' , '1991-05-01' , '男'); insert into student(学号,姓名,出身日历,性别) values('0002' , '李四' , '1990-04-21' , '男');
output
将其他数据插入到其他的表格当中亦然雷同的敬爱,这里就不作念赘述了
苟简查询举例查找学生名字以“小”起头的名单,不错这样作念
select * from student where 姓名 like '小%'
output
学号 姓名 出身日历 性别 0003 小红 1994-10-21 女 0004 小王 1996-07-20 男 0005 小张 1999-04-15 男 0006 小好意思 1997-04-05 女 0007 小丽 1995-07-10 女
这里的%默示大肆字符串,举例'小%'则默示姓“小”的学生信息,而'%小'默示的是以“小”字完毕的学生姓名,而'%小%'代表的是学生姓名中带有“小”这个要道字
关联词假如咱们仅仅思要复返前边几行的数据的话,就不错使用limit要道字
select * from student where 姓名 like '小%' limit 3;
output
学号 姓名 出身日历 性别 0003 小红 1994-10-21 女 0004 小王 1996-07-20 男 0005 小张 1999-04-15 男分组汇总查询
咱们思要看一下报名插足“英语”课的学生有几东说念主,咱们知说念“英语”课程对应的课程号是0003,是以用count()函数才调来计较次数即可
select count(*) as 学生东说念主数 from score where 课程号 = '0003';
output
学生东说念主数 6
但要是咱们思要查询一下每一门课程的最低、最高分以及平平分,不错通过group by要道字来延迟,按照“课程号”进行分组汇总
select 课程号, min(得益) as 最低分, max(得益) as 最高分, avg(得益) as 平平分 from score group by 课程号
output
课程号 最低分 最高分 平平分 0001 80 88 84.0000 0002 66 90 80.2500 0003 69 97 84.1667 0004 75 78 76.5000 0005 97 99 98.0000
鉴于上头的成果,咱们也不错使用order by要道字来进行排序,把柄“平平分”这一列
select 课程号, min(得益) as 最低分,左云县代化棉类有限公司 max(得益) as 最高分, 赤坎区岩同锁具有限公司 avg(得益) as 平平分 from score group by 课程号 order by 平平分
output
课程号 最低分 最高分 平平分 0004 75 78 76.5000 0002 66 90 80.2500 0001 80 88 84.0000 0003 69 97 84.1667 0005 97 99 98.0000
默许的排序口头是升序排序, 威海来威玩具有限公司另外咱们也不错尝试通过性别来进行分组查询
select count(*) as 不同性别的学生数目 from student group by 性别;
output
不同性别的学生数目 4 3带有条目的分组查询
假定咱们盘算查询平平分大于80分的学生, 上海鑫美野营用品有限公司领先咱们要计较每个学生的平均得益, 大同区目化锁具有限公司然后再此的基础之上挑出80分以上的部分,是以不错group by 学号
select 学号, avg(得益) as 平均得益 from score group by 学号 having avg(得益) > 80;
output
学号 平均得益 0001 91 0003 81.66666666666667 0004 81.33333333333333 0005 91.5 0006 91
同理,咱们也不错把柄“课程号”来进行分组,group by 课程号,然后挑选出举例平平分大于70分的部分
select 课程号, avg(得益) as 平均得益 from score group by 课程号 having avg(得益) > 70;
output
课程号 平均得益 0001 84 0002 80.25 0003 84.16666666666667 0004 76.5 0005 98
上头提到的order by默许排序的口头是升序,咱们也不错建造成降序来排序
select 课程号, avg(得益) as 平均得益 from score group by 课程号 having avg(得益) > 70 order by avg(得益) desc;
output
课程号 平均得益 0005 98 0003 84.16666666666667 0001 84 0002 80.25 0004 76.5
此次咱们再添加一个字段最高分,通过max()才调来进行统计,同期对平平分与最高分进行排序,当平平分调换的技巧,就以最高分来进行排序
select 课程号, avg(得益) as 平均得益, max(得益) as 最高分 from score group by 课程号 having avg(得益) > 70 order by avg(得益), max(得益);
output
课程号 平均得益 最高分 0004 76.5 78 0002 80.25 90 0001 84 88 0003 84.1666667 97 0005 98 99
咱们在order by背面再放一个字段默示当以字段1排序的技巧遭遇调换的情况下,就以字段2来进行排序。
咱们再来换一个字段,插头插座看一下选课零散两门的学生有哪些,咱们领先是group by 学号,然后对“课程号”进行计数,挑选出欢快条目的部分
select 学号, count(课程号) as 选课的数目 from score group by 学号 having count(课程号) > 2;
output
学号 选课的数目 0001 3 0003 3 0004 3
底下咱们来处置一个复杂的查询,找出分数王人在80分以上至少两门课程的学生,列出他们的学号以及平平分,咱们先来筛选出分数王人在80分以上的学生
select 学号 from score where 得益 > 80
然后咱们计较出他们的平平分
select 学号, avg(得益) as 平均得益 from score where 得益 > 80 group by 学号;
output
学号 平均得益 0001 91 0003 85 0004 97 0005 91.5 0006 91
终末再加上截止条目,“至少是两门课程”
select 学号, avg(得益) as 平均得益 from score where 得益 > 80 group by 学号 having count(课程号) >= 2;
output
学号 平均得益 0001 91 0005 91.5 0006 91汇总排序
咱们来看一下,对每位学生的总得益进行统计何况进行排序是如何来作念的,咱们用sum()才调来统计每个学生的总得益
select 学号, sum(得益) from score group by 学号;
然后咱们用order by要道字来进行排序
select 学号, sum(得益) as 总分 from score group by 学号 order by sum(得益);
output
学号 总分 0007 75 0002 141 0006 182 0005 183 0004 244 0003 245 0001 273
然后咱们再添加一个截止条目,举例挑选出总分在200分以上的数据,不错通过having要道词来延迟
select 学号, sum(得益) as 总分 from score group by 学号 having sum(得益) > 200 order by sum(得益);
output
学号 总分 0004 244 0003 245 0001 273嵌套式查询
有技巧咱们需要写多层的SQL查询语句,一层的查询有技巧澄莹不够用,举例咱们思要查询出统共课程的得益王人是高于80分的学生学号与姓名,咱们一层一层来分析,领先咱们筛选出统共课程王人高于80分学生的学号与得益
select 学号, min(得益) as 最低分 from score group by 学号 having min(得益) > 80;
output
学号 最低分 0001 88 0005 84 0006 85
再得到了学号以及得益了之后,咱们将学号这一列索要出来,去student这张表当中去寻找欢快条目的
select 学号,姓名 from student where 学号 in (select 学号 from score group by 学号 having min(得益) > 80);
output
学号 姓名 0001 张三 0005 小张 0006 小好意思
芜俚来说,嵌套式的查询是触及到了多张表格的连合,举例咱们思要查询出选课的数目小于3门课程的学生姓名与学号,领先咱们先筛选出选课数目小于3门课程的学生学号
select 学号, count(课程号) as 选课数目 from score group by 学号 having count(课程号) <= 2;
output
学号 选课数目 0002 2 0005 2 0006 2 0007 1
虽然咱们其实惟有“学号”这一列,然后咱们在此基础之上再进行查询
select 学号,姓名 from student where 学号 in (select 学号 from score group by 学号 having count(课程号) <= 2);
output
学号 姓名 0002 李四 0005 小张 0006 小好意思 0007 小丽日历函数
底下咱们来演练一下日历函数的使用,举例咱们思得到现时的日历,不错用curdate()才调
select curdate();
output
curdate() 2021-11-16
如果盘算得到现时的时刻,则不错用now()才调
select now();
output
now() 2021-11-16 22:37:41
由于篇幅的截止,这里就未几说了,咱们来看一下具体推行当中的操作,咱们筛选出出身年份在1994年的学生有哪些,不错这样来操作
select * from student where year(出身日历) = 1994;
output
学号 姓名 出身日历 性别 0003 小红 1994-10-21 女
同理咱们来筛选出当月过寿辰的同学
select * from student where month(出身日历) = month(now());跨表查询
有技巧咱们在进行数据查询的技巧需要用到多张表格,将多张表格衔尾起来进行操作,举例列出统共学生的姓名、选课的数目以及总分得益,咱们就需要用到多张表格了,咱们不错先尝试着贯穿student和score这两张表
select * from student left join score on student.`学号` = score.`学号`;
output
学号 姓名 出身日历 性别 学号(1) 课程号 得益 0001 张三 1991-05-01 男 0001 0001 88 0001 张三 1991-05-01 男 0001 0002 90 0001 张三 1991-05-01 男 0001 0003 95 0002 李四 1990-04-21 男 0002 0002 66 0002 李四 1990-04-21 男 0002 0003 75 0003 小红 1994-10-21 女 0003 0001 80 0003 小红 1994-10-21 女 0003 0002 80 0003 小红 1994-10-21 女 0003 0003 85 0004 小王 1996-07-20 男 0004 0003 69 0004 小王 1996-07-20 男 0004 0004 78 0004 小王 1996-07-20 男 0004 0005 97 .....
然后再此基础之上,咱们保留需要的这几个字段
select 姓名, count(课程号) as 选课的数目, sum(得益) as 总得益 from student left join score on student.`学号` = score.`学号` group by student.`姓名`;
output
姓名 选课的数目 总得益 张三 3 273 李四 2 141 小红 3 245 小王 3 244 小张 2 183 小好意思 2 182 小丽 1 75
咱们也不错将总得益替换成平均得益,然后作念一个排序,取平平分最高的前三名
select 姓名, avg(得益) as 平平分 from student left join score on student.`学号` = score.`学号` group by student.`姓名` limit 3;
output
姓名 平平分 张三 91.0000 李四 70.5000 小红 81.6667
终末通过limit要道字来规则输出,上头的例子是两张表格的贯穿,咱们也不错尝试三张表格的贯穿,
select * from student inner join score on student.`学号` = score.`学号` inner join course on score.`课程号` = course.`课程号`;
output
学号 姓名 出身日历 性别 学号(1) 课程号 得益 课程号(1) 课程称号 教育号 0001 张三 1991-05-01 男 0001 0001 88 0001 语文 0002 0001 张三 1991-05-01 男 0001 0002 90 0002 数学 0001 0001 张三 1991-05-01 男 0001 0003 95 0003 英语 0003 0002 李四 1990-04-21 男 0002 0002 66 0002 数学 0001 0002 李四 1990-04-21 男 0002 0003 75 0003 英语 0003 ......
虽然咱们也不错四张表格来贯穿
select * from student inner join score on student.`学号` = score.`学号` inner join course on score.`课程号` = course.`课程号` inner join teacher on course.`教育号` = teacher.`教育号`;
要是咱们思查询学生姓名、选课的课程称号以及讲课的敦朴,不错这样来作念
select 姓名, 课程称号, 教育姓名 from student inner join score on student.`学号` = score.`学号` inner join course on score.`课程号` = course.`课程号` inner join teacher on course.`教育号` = teacher.`教育号`;
output
山东智德纺织有限公司姓名 课程称号 教育姓名 张三 语文 马敦朴 张三 数学 王敦朴 张三 英语 李四 数学 王敦朴 李四 英语 小红 语文 马敦朴 小红 数学 王敦朴 小红 英语 小王 英语 小王 物理 张敦朴 ........
虽然咱们也不错将“得益”这一要道字也给加上
select 姓名, 课程称号, 得益, 教育姓名 from student inner join score on student.`学号` = score.`学号` inner join course on score.`课程号` = course.`课程号` inner join teacher on course.`教育号` = teacher.`教育号`;
output
姓名 课程称号 得益 教育姓名 张三 语文 88 马敦朴 张三 数学 90 王敦朴 张三 英语 95 李四 数学 66 王敦朴 李四 英语 75 小红 语文 80 马敦朴 .......
咱们同期不错在背面添加一些筛选条目,举例咱们思要找出语文的得益在85分以上的同学学号以及姓名,就不错这样作念
select student.`学号`, 姓名, 得益 from student inner join score on student.`学号` = score.`学号` inner join course on score.`课程号` = course.`课程号` inner join teacher on course.`教育号` = teacher.`教育号` where 课程称号 = '语文' and 得益 > 85;
output
学号 姓名 得益 0001 张三 88
对于sql当中表格数据的贯穿,尤其是多张表格的贯穿。