DQL查询数据

查询语句结构

在这里插入图片描述
中括号代表可选,大括号代表至少有一条

//Example:
select * from tablename;
mysql> select stu_name as ‘学生姓名’,gender as ‘性别’,address ‘地址’,email ‘邮箱’ from student;
mysql> select s.stu_name as ‘学生姓名’,s.gender as ‘性别’,s.address ‘地址’,s.email ‘邮箱’ from student s;
mysql> select 1+1;

select [distinct] {*|column_name [as 别名] [,…]}
from table_name [as 别名];

连接

在这里插入图片描述

  1. 内连接:两个表符合关联条件的数据才进行展示
    select a.,b. from a [inner] join b on a.id=b.id;
    select a.,b. from a,b where a.id=b.id;//笛卡尔积
  2. 外连接:主表的数据全部展示,附表只展示符合关联条件的数据
    左外连接:以left join的左边的表为主表,关联右表的数据
    右外连接:以right join的右边的表为主表,关联左表的数据
  3. 全连接:
    MySQL是没有全连接的,使用union
    union:联合并去重
    union all:联合不去重
    左外连接
    union
    右外连接
  4. 自连接:自己关联自己
mysql> select GradeName,stu_name from grade inner join student on GradeID=grade_id where GradeName=‘大四’;
±----------±----------+
| GradeName | stu_name |
±----------±----------+
| 大四 | 黄药师 |
| 大四 | 洪七公 |
| 大四 | 欧阳锋 |
| 大四 | 老顽童 |
±----------±----------+
4 rows in set (0.00 sec)

很是消耗内存 4*7=28 笛卡尔积 在这个基础上进行一个筛选

用join的情况会在4条和7条一次比较是否相等,完成了数据量的减少,再来where条件,把过滤分成了两部做

显示所有学生姓名,所有学科名称,及对应的成绩

Distinct关键字

在这里插入图片描述
distinct不能放在某一个字段前面,要放在所有字段前面

在这里插入图片描述

like模糊查询:

在where子句中,使用like关键字进行模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符

条件查询

语法格式
select 字段,字段。。
from 表名
where 条件

select ename from emp where sal = 5000;
#字符串使用单引号括起来
select sal from emp where ename =‘SMITH’;
select ename,sal from emp where sal>3000;
select ename,sal from emp where sal<>3000;
select ename,sal from emp where sal between 1100 and 3000;

select ename,job from emp where job=‘SALESMAN’ or job=‘MANAGER’;
select ename,job from emp where job in(‘SAKESNAB’,‘MANAGER’);
#in后面的每一项都是具体的值,不是区间
select ename,job from emp where sal in(1000,5000);
#模糊查询like?找出名字当中含有O的,(在模糊查询当中,必须掌握两个特殊符号,一个是%一个是_ )
#%代表任意多个字符,_代表任意一个字符
select ename from emp where ename like ‘%o%’;

按照工资升序找出员工名字和薪资
select ename,sal from emp order by sal;//升序
asc表示升序 desc表示降序
select ename,sal from emp order by sal asc;//升序
select ename,sal from emp order by sal desc;//降序
按照工资的降序排列,当工资相同的时候再按照名字的升序排
select ename,sal from emp order by sal desc;
select ename,sal from emp order by sal desc,ename asc;
多个字段同时排序 越靠前的字段起的主导作用越大,只有当前面的字段无法完成排序的时候,才会启用后面的字段
select ename,sal from emp order by 1; 按照第一列排序,不要这么做
select ename,sal from emp order by sal;
找出工作岗位是salesman的员工,并且要求按照薪资的降序排列
select ename,job,sal from emp where job=‘salesman’ ordey by sal desc;
先执行from 再执行where 再查找 最后排序输出
select 字段 3
from 表名 1
where 条件 2
order by … 4
order by是最后执行的
分组函数:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
记住:所有的分组函数都是对某一组数据进行操作的

找出工资总和?
select sum(sal) from emp;
找出最高工资?
select max(sal) from emp;
找出最低工资?
select min(sal) from emp;
找出平均工资?
selevt avg(sal) from emp;
找出总人数?
select count(*) from emp;
select count(ename) from emp;
分组函数一共五个,分组函数还有另一个名字,多行处理函数
多行处理函数的特点:输入多行,最终输出的结果一行

分组函数自动忽略空null
select count(comm) from emp;

单行处理函数:

输入一行,输出一行。
计算每个员工的年薪?
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
有空参加的运算,结果都为空 800+null=null没有值
重点:所有数据库都是这样规定的,只要有null参与的运算结果一定是null
ifnull(可能为null的数据,被当作什么处理):属于单行处理函数
select ename,ifnull(comm,0) from emp;
select sum(comm) from emp; 证明忽略空了,对comm求和,结果不是null
where comm in not null 不需要额外添加这个过滤条件,自动忽略
找出工资高于平均工资的员工?
select ename,sal from emp where sal>avg(sal);//错误
思考以上的信息:无效的使用了分组函数
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中,why?
怎么解释?
因为group by是在where执行结束之后才执行的,分组函数必须在分完组之后才能用
第一步:找出平均工资
select ename,sal from emp where sal>(select avg(sal) from emp);
select语句嵌套select语句,子查询

count()和count(具体的某个字段),他们的区别是什么
count()统计的是总记录条数
count(具体的某个字段)这个字段当中不为空的字段条数

分组函数也能组合起来用
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

group by和having

group by 按照某个字段或者某些字段进行分组
having:having是对分组之后的数据进行再次过滤
案例:找出每个工作岗位的最高薪资
select max(sal) from emp group by job; 通过这个字段进行分组
注意:分组函数一般都会和group by联合使用,这也是为什么它被成为分组函数的原因
并且任何一个分组函数都是在group by 语句执行结束之后才会执行的

select 6
from 1
where 2
group by 3
having 4
order by 5

select avg(sal) from emp group by;//实际上有一个缺省的默认的group by就是把整张表当作一组
当一条SQL语句有group by的时候,只允许select出现参加分组的字段,以及分组函数
否则语法错误,数据没有意义
当一条SQL语句没有group by的话,整张表的数据会自成一组
每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
多个字段能不能联合起来一块分组?
案例:找出各个部门不同工作岗位的最高薪资
select deptno,job,sal from emp;

//两个字段联合分组:
select
deptno,job,max(sal)
from
emp
group by
deptno,job;

找出每个部门的最高薪资,要求显示薪资大于2900的数据

//第一步:找出每个部门的最高薪资
select max(sal) from emp group by deptno;

//第二步:找出薪资大于2900的
select max(sal) from emp group by deptno having max(sal)>2900;//这种方式效率低
select max(sal) from emp where sal>2900 group by deptno;//效率较高,建议可以使用where过滤的尽量使用where

//找出每个部门的平均薪资,要求显示薪资大于2000的
select avg(sal) from emp group by deptno having avg(sal)>2000;
//where后不能使用分组函数,只能用having过滤,having是group by的搭档,只是对分完组的数据不满意课再次过滤

17.总结一个完整的dql语句怎么写?
select 5
from 1
where 2
group by 3
having 4
order by 6

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值