【MySQL】入门 Day2之数据查询语言

数据查询语言



数据查询语言

查询语言是数据库管理系统最重要的功能,不仅能返回数据,还能对数据进行筛选来确定所需要数据展现的样子。

1.单表查询

1.1 全表查询

全表查询:select * from 表名;(查询表中的所有信息,“*”标示查询表中所有字段)

select * 
from emp;

1.2 查询指定列

查询指定列:select 字段1[,字段2,…] from 表名;(仅查询临时结果,不会修改原表)

-- 查询指定列:查询emp表中ename,job,sal
select ename,job,sal 
from emp;

1.3 别名的设置

别名的设置:select 字段名 as 列别名 from 原表名 [as ]表别名;

-- 设置别名:查询每位员工调整后的薪资(基本工资+1000)   as可以省略
select * ,sal +1000 as 调薪 
from emp; 
-- 练习:查询每位员工的年薪(基本工资*12):empid,ename,年薪
select empid, ename , sal * 12 as 年薪 
from emp;

1.4 查询不重复的记录

查询不重复的记录:select distinct 字段名 from 表名

-- 查询不重复的数据:查询emp表中有哪些部门
select distinct deptno 
from emp;
-- 多字段去重,查询emp表中有哪些部门和职位
select distinct deptno,job 
from emp;

1.5 条件查询

条件查询:select 字段1[,字段2,…] from 表名 where 查询条件;

-- 查询基本工资大于等于2000小于等于3000的员工信息
select * 
from emp 
where sal 
between 2000 and 3000;
--between and 只能用于闭区间

1.6 空值查询

空值查询:select 字段1[,字段2,…] from 表名 where 空值字段 is[ not] null;

-- 查询mgr为空的记录
select * 
from emp 
where mgr is null;

1.7 模糊查询

模糊查询: select 字段1[,字段2,…] from 表名 where 字符串字段[ not] like 通配符;
百分号(%)通配符:匹配多个字符
下划线(_)通配符:匹配一个字符
模糊查询只能用于字符串类型的字段

-- 查询姓名以a开头的员工信息
select * 
from emp 
where ename like 'a%';
-- 查询姓名中第二个字符为a的员工信息
select * 
from emp 
where ename like '_a%';

1.8 查询结果排序

查询结果排序:select 字段1[,字段2,…] from 表名 order by 字段1[ 排序方向,字段2 排序方向,…];
多字段排序时,先按第一个字段排序,第一个字段值相同时再按第二个字段排序,若两个字段都相同,则按照默认顺序。
指定排序方向:asc升序,desc降序(没有指定排序方向时,默认是asc升序)
desc 位于表名前面表示查看表结构

-- 查询结果排序
select * 
from emp 
order by sal desc;-- 单字段排序:查询所有员工信息按sal降序显示

select * 
from emp
order by deptno asc,sal desc;-- 多字段排序:查询所有员工信息按deptno升序、sal降序显示

1.9 限制查询结果数量

限制查询结果数量:select 字段1[,字段2,…] from 表名 limit [偏移量,] 行数;
limit接受一个或两个数字参数,参数必须是一个整数常量
第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目,如果只给定一个参数,表示返回最大的记录行数目
初始记录行的偏移量是0(而不是1)

-- 限制查询结果数量
select * 
from emp
order by sal desc
limit 5;-- 查询基本工资最高的前5位员工

select * 
from emp
order by sal desc
limit 5,5;-- 查询基本工资第6到10名的员工

1.11 分组查询

聚合运算:利用聚合函数对表中的数值型数据进行计算,常用聚合函数:
avg() 求列的平均数 count() 列的行数(若有重复也计数) max() 列中最大值 min() 列中最小值 sum() 求和(聚合函数会自动忽略空值)
维度:用来分组的分类字段,包括无序分类字段(姓名、性别、血型等)和有序分类字段(学历、职称、 舱位等)
度量:用来聚合运算的数值字段(年龄、数量、金额等)

分组聚合就是指按照某一维度来进行分组,按照某一度量数值进行聚合

  • 分组查询:select 字段1[,字段2,…] from 表名[ where 查询条件] group by 分组字段1[,分组字段2,…];将查询结果按照一个或多个字段进行分组,字段值相同的为一组,对每个组进行聚合计算
-- 分组查询
select count(*)  员工总数,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资,sum(sal) 工资总和
from emp;-- 查询emp表中员工总数、最高工资、最低工资、平均工资及工资总和
select deptno,avg(sal) as 平均工资
from emp
group by deptno;-- 查询各部门的平均工资

1.12 分组后筛选

分组后筛选:select 字段1[,字段2,…] from 表名[ where 查询条件][ group by 分组字段1[,分组字段2,…]] having 筛选条件;

-- 分组后筛选
select deptno,job,avg(sal) 平均工资
from emp
group by deptno,job
having job = 'clerk';-- 查询各部门clerk的平均工资
  • where与having的区别:
    where子句作用于表,having子句作用于组。
    where条件查询的作用域是针对数据表进行筛选,而having条件查询则是对分组结果进行过滤。
    where在分组和聚合计算之前筛选行,而having 在分组和聚合之后筛选分组的行,因此where子句不能包含聚合函数。

2. 多表查询

关系型数据库都是通过多个表进行存储,因此需要通过不同表中具有相同意义的关键字段(关键字段指连接两表的同一字段),将多个表进行连接,查询不同表中的字段信息
拆分表目的:节省空间,避免数据冗余,提高查询效率

2.1 横向连接

连接方式

  • 内连接和外连接(左连接和右连接)
    多表连接的结果通过三个属性决定
  • 方向性:在外连接中写在前边的表为左表、写在后边的表为右表
  • 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分
  • 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表
    进行表连接之前要判读表之间关系是一对一,一对多还是多对多

左连接
结果中除了包括满足连接条件的行外,还包括左表的所有行。
select 字段1[,…] from 表1 left join 表2 on 表1.key=表2.key;

在这里插入图片描述

右连接
结果中除了包括满足连接条件的行外,还包括右表的所有行。
select 字段1[,…] from 表1 right join 表2 on 表1.key=表2.key;

在这里插入图片描述

内连接(连接的两张表共有的行)
按照连接条件合并两个表,返回满足条件的行。
select 字段1[,…] from 表1[ inner] join 表2 on 表1.key=表2.key;

在这里插入图片描述

全连接
连接左右两表共有的、左表有右表没有、右表有左表没有

在这里插入图片描述

select * from t1 inner join t2 on t1.key1=t2.key2;-- 内连接(inner可以省略)
select * from t1 left join t2 on t1.key1=t2.key2;-- 左连接(关键字左边是主表)
select * from t1 right join t2 on t1.key1=t2.key2;-- 右连接(关键字右边是主表)

2.2 纵向合并

满足以下条件即可纵向合并:
1、两张表必须拥有相同数量的字段
2、两张表字段的顺序必须相同
3、两张表对应字段的数据类型必须一致
※字段名可以不相同,选取主数据集的字段名
在这里插入图片描述

被合并的结果集的列数、顺序和数据类型必须完全一致
union去重:select 字段1[,字段2,…] from 表名 union select 字段1[,字段2,…] from 表名;
union all不去重: select 字段1[,字段2,…] from 表名 union all select 字段1[,字段2,…] from 表名;

-- union去重
select * from t1
union
select * from t2;--去除重复数据连接两表(t1,t2)剩余所有数据
-- union all不去重
select * from t1
union all
select * from t2;--连接两表(t1,t2)所有数据

总结

在数据分析过程中主要处理的就是数据表,而这些都是必须掌握的,很多内容都比较相似,对比其他编程语言难度并不大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值