学会SQL语言的能干什么
一个方向 ETL工程师
ETL 英文名叫 Extract-Transform-Load 将数据从来源端经过抽取(extract)、转换(transform)、加载(load)⾄⽬的端的过程
将各种来源,比如服务器,数据库,文件。各种不同的数据结构,各个业务部门,内部外部 的杂乱无章的数据,通过一系列的SQL及规范经过加工
最后将结果汇总到显示需要的数据库的过程
掌握SQL加上相关行业业务经验的积累就能成为一个合格的ETL工程师
SQL 语句
SQL语言的分类
总结 分为创建语句,查询语句,增删改语句,控制用户权限的语句
查询
1.查询表中的所有列
SELECT * FROM 表名1 , 表名2
select * from student
练习:查询雇员表employee
2.简单的查询,查询表中的各个列
SELECT 列名1,列名2,... FROM 表名1 , 表名2,...
select student_no,student_name from student
练习:查询部门表department,列出各个字段
3.按条件查询
SELECT * FROM 表名1
where 列名1=某个值 and(or ) 列名2=某个值
select student_no,student_name from student where student_no=1
练习:查询部门表department id = 2 的记录
select student_no,student_name from student where student_no>1
练习:查询部门表department id >=1 的记录
select student_no,student_name,student_sex from student where student_no>1 and student_sex='女'
练习:查询部门表department id >1 的记录 并且部门名称=后勤部的记录
select student_no,student_name,student_sex from student where student_no>1 or student_sex='女'
练习:查询部门表department id >1 的记录 或者部门名称=贵州贵阳的记录
select student_no,student_name from student where not student_no=1
练习:查询部门表department id 不等于1 的记录
select student_no,student_name from student where student_no!=1
between 最小值 and 最大值
语法:select * from 表名 where 列名 between 最小值 and 最大值;
select * from student where student_no between 1 and 3;
练习:查询部门表department id 在2,4之间 的记录 用between
select * from student where student_no>1 and student_no<3;
select * from 表名 where 列名 is null;(判断这一列有空值)
select * from student where money is null;
in (取值范围)
语法:select * from 表名 where 列名 in (值1,值2,…)
select * from student where student_no in (1,3)
练习:查询部门表department id 在2,4之间 的记录 in
union 合并两个或多个select语句结果集(去重)
select student_name from student where student_name like '%民%'
union
select student_name from student where student_name like '%刚%'
union all合并两个或多个select语句结果集(不去重)
select student_name from student
union all
select student_name from student
select * from student where student_name like '%王%'
练习:查询部门表department dept_name 包含 部 这个字的记录
select * from student where student_name like '王%'
练习:查询部门表department dept_name 以 研字开头 的记录
为每一列指定别名 as
SELECT 列名1 as b.data
FROM 表名1 as b
select * from student a where a.student_no=1
练习:查询部门表department ,为部门表起个别名 , 为department中的dept_name 起名为 name
select count(*) from student
练习 计算部门表department的行数
实际应用,如下图,显示有多少条记录,就用到了count
select sum(money) from student
练习 计算部门表money 的总和
select avg(money) from student
练习 计算部门表money 的平均值
select max(money) from student
练习 计算部门表money 的最大值
select min(money) from student
练习 计算部门表money 的最小值min
分组
GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。
GROUP BY子句必须出现在FROM和WHERE子句之后。 在GROUP BY关键字之后是一个以逗号分隔的列或表达式的列表,这些是要用作为条件来对行进行分组。
按照student_sex分组
select student_sex from student a group by a.student_sex
GROUP BY经常与聚合函数一起使用,如SUM,AVG,MAX,MIN和COUNT。SELECT子句中使用聚合函数来计算有关每个分组的信息。
统计男,女生人数
select student_sex,count(*) from student a group by a.student_sex
练习统计员工表employee ,男女生的总人数
select a.sex,count(*) from employee a where 1=1 GROUP BY a.sex
练习
按班级分组,求平均成绩
select bj,avg(score) 平均成绩 from score_bj_student GROUP BY bj
排序 order by
按照student id倒序排列
select * from student a order by student_no desc
select * from student a order by student_no desc,money asc
练习: department 按money倒序排列
实际应用,按照ID倒序排列,ID是自增的,所以按照ID倒序排列以后,就能把新增的记录放在列表的最前边。
练习 学生成绩表score_bj_student 里 按班级分组,求平均成绩,并按平均成绩倒序排列
第一步分组
select bj,avg(score) 平均成绩 from score_bj_student group by bj
第二步排序
select bj,avg(score) 平均成绩 from score_bj_student GROUP BY bj order by 平均成绩 desc
HAVING
可使用HAVING子句过滤GROUP BY子句返回的分组
统计性别大于1的数据
select student_sex,count(*) from student a group by a.student_sex having count(*)>1
练习: 员工表employee 按性别分组,计算分组结果数量>1的记录
练习 score_bj_student 找出平均成绩大于80分的班级
第一步分组
select bj,avg(score) 平均成绩 from score_bj_student GROUP BY bj
第二部使用having
select bj,avg(score) 平均成绩 from score_bj_student GROUP BY bj HAVING 平均成绩>80
limit关键字的用法
LIMIT [offset,] rows offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。
1.m代表从m+1条记录行开始检索,n代表取出n条数据。(m可设为0)
SELECT * FROM 表名 limit m,n
如:SELECT * FROM student limit 8,5;
表示:从第7条记录行开始算,取出5条数据
2.若只给出m,则表示从第1条记录行开始算一共取出m条
如:SELECT * FROM student limit 6;
主要用于分页
练习
找出平均成绩大于80的前三名班级
select bj,avg(score) 平均成绩 from score_bj_student GROUP BY bj HAVING 平均成绩>80 order by 平均成绩 desc LIMIT 3