关系型数据库(七)SQL

学会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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值