查询

这篇文章是来自于B站动力节点的MySQL视频 链接动力节点-MySQL_MySQL教程
不过这个视频可能不是很新了(因为用的是txt排版…)

下面是相关的表数据

mysql> desc dept; (部门表)
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2)      | NO   | PRI | NULL    |       |     部门编号
| DNAME  | varchar(14) | YES  |     | NULL    |       |     部门名称
| LOC    | varchar(13) | YES  |     | NULL    |       |     部门位置
+--------+-------------+------+-----+---------+-------+mysql> desc emp;(员工表)
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| EMPNO    | int(4)      | NO   | PRI | NULL    |       |   员工编号
| ENAME    | varchar(10) | YES  |     | NULL    |       |   员工姓名
| JOB      | varchar(9)  | YES  |     | NULL    |       |   工作岗位
| MGR      | int(4)      | YES  |     | NULL    |       |   上级领导编号
| HIREDATE | date        | YES  |     | NULL    |       |   入职日期
| SAL      | double(7,2) | YES  |     | NULL    |       |   月薪
| COMM     | double(7,2) | YES  |     | NULL    |       |   补助/津贴
| DEPTNO   | int(2)      | YES  |     | NULL    |       |   部门编号
+----------+-------------+------+-----+---------+-------+mysql> desc salgrade; (工资等级表)
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| GRADE | int(11) | YES  |     | NULL    |       |      等级
| LOSAL | int(11) | YES  |     | NULL    |       |      最低薪资
| HISAL | int(11) | YES  |     | NULL    |       |      最高薪资
+-------+---------+------+-----+---------+-------+

条件查询

找出工资在1100-3000的员工,包括1100,3000

select ename,sal from where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 300;//闭区间

可以用于字符串:

select ename from emp where ename between 'A' and 'C';//左闭右开

找出哪些人津贴为NULL或0:

select ename,sal,comn from emp where comn is null or comn = 0;//is not null;

注意:运算符的优先级不确定的时候加小括号:

找出薪资大于1000的并且部门编号是20或30部门的员工。

select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);

in等同于or:表示集合

找出工作岗位是MANAGER和SALESMAN的员工?

select ename,job from emp where job = 'SALEMAM' or job = 'MANAGER';
select ename,job from emp where job in ('SALEMAM','MANAGER');//in后面的值不是区间,是具体的值

not in :不在这几个值当中。

模糊查询like

  • %代表任意多个字符,_代表任意一个字符
select ename from emp where ename like '%O%';
select ename from emp where ename like '%\_%';//转义字符(含_的)
select ename from emp where ename like '%T';//名字中最后一个为T

排序order by

默认是升序asc,desc表示降序

select ename , sal from emp order by sal;
select ename , sal from emp order by 2;//按第二列排
select ename , sal from emp order by sal desc;

按照工资的降序排列,当工资相同的时候再按照名字的升序排列:

select ename,sal from emp order by sal desc , ename asc;//前面的占主导地位,前面相等再调用后面的。

例如:找出工作岗位是SALESMAN的员工,并要求按照薪资的降序排列。

select ename,job,sal
fromemp
wherejob = 'SALEMAN'
order by sal desc;

分组函数

多行处理函数;都是对“某一组”数据进行操作的。

  • count 计数

    • count(distinct job)–distinct(去重)
  • sum 求和
  • avg 平均
  • max
  • min

记住:所有的分组函数都是对“某一组”数据进行操作的

select sum(sal) from emp;==>忽略NULL
select count(*) from emp;//总人数ename
select sum(comm) from emp;
select sum(comm) from emp where comm is not null; // 不需要额外添加这个过滤条件。sum函数自动忽略NULL。
  • 分组函数自动忽略NULL
  • 数学计算含NULL,则结果为NULL
  • ifnull(可能为NULL 的数据,被当作什么处理) ,单行处理函数。
  • 分组函数还有另一个名字:多行处理函数
    多行处理函数的特点:输入多行,最终输出的结果是1行
//ifnull() 空处理函数ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
select ename ,ifnull(comn,0) as comn from emp;
//计算每个员工的年薪
select ename ,(sal+ifnull(comn,0))*12 as yearsal from emp;

找出工资大于平均工资的员工:

select ename,sal from emp where sal > avg(sal);//ERROR

//1.找出平均工资      2.找出高于平均工资的员工
select ename ,sal from emp where sal > (select avg(sal) from emp);//子查询

注意:SQL语句中的分组函数不可以直接使用在where子句当中

==>因为group by 是在where后面执行

//一个完整的SQL语句:
select      5..
from        1..
where       2..//无法用分组函数
group by    3    之后才能用分组函数..
having      4..
order by    6..

count(*)与count(某个字段)

  • count(*) :不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)

  • count(comn):表示统计comn字段中不为NULL的数据总数量。

group by 和 having

group by :按照某个字段或者某些字段进行分组。

having:对分组后的数据进行再次过滤。

案例:
找出每个工作岗位的最高薪资
select max(sal),job from emp group by job;

注意:

  1. 当一条语句中有group by 的话,select后面只能跟分组函数和参与分组的字段

  2. 分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。

  3. 并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。

  4. 当一条sql语句没有group by的话,整张表的数据会自成一组。

select ename ,max(sal),job from group by job;//ERROR

求每个工作岗位的平均薪资:

select job,avg(sal) from emp group by job;

找出每个部门不同工作岗位的最高薪资:(联合分组)

select deptno,job,max(sal) from emp group by deptno,job;

找出每个部门的最高的薪资,要求显示薪资大于2500的数据:分步写

select max(sal),depton from emp group by deptno having max(sal) > 2900;//效率低
select max(sal),depton from emp where sal > 2900 group by deptno;

建议能够使用where过滤的尽量用where

找出每个部门的平均薪资,要求显示薪资大于2500的数据(having对分组数据过滤)

select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;

总结一个完整的DQL语句怎么写?

select           5..
from            1   ..
where           2..
group by        3..
having          4..
order by        6..
// limit       7

关于查询结果集的去重?

select distinct job from emp; // distinct关键字去除重复job记录。

记住:distinct只能出现在所有字段的最前面。

统计岗位的数量?

select count(distinct job) from emp;

连接查询

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。

select e.ename,d.dname
fromemp e
join    //inner joindept d
one.deptno = d.deptno;

内连接之非等值连接

INNER JOIN 只会保留两个表都存在的数据(还记得之前的交集吗),这看起来意味着一些数据的丢失,在某些场景下会有问题.

最大的特点是:连接条件中的关系是非等量关系。

找出每个员工的工资等级,要求显示员工名、工资、工资等级。

select e.ename,e.sal,s.grade
fromemp e
join            // inner可以省略salgrade s
one.sal between s.losal and s.hisal;

自连接

最大的特点是:一张表看做两张表。自己连接自己

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。

员工的领导编号 = 领导的员工编号

select a.ename as '员工名',b.ename as '领导名'
fromemp a
inner joinemp b
ona.mgr = b.empno;

外连接

内连接:
假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
AB两张表没有主副之分,两张表是平等的。

外连接:
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接的分类?
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。

外连接最重要的特点是:主表的数据无条件的全部查询出来

找出哪个部门没有员工?

select d.*
fromemp e
right joindept d
one.deptno = d.deptno
wheree.empno is null;

三张表的连接查询


A
join
B
join
C
on

表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。

案例:找出每一个员工的部门名称以及工资等级:

select e.ename,d.dname,s.grade
fromemp e
joindept d
one.deptno = d.deptno
joinsalgrade s
one.sal between s.losal and s.hisal;
查询结果:
+--------+------------+-------+
| ename  | dname      | grade |
+--------+------------+-------+
| SMITH  | RESEARCH   |     1 |
| ALLEN  | SALES      |     3 |
| WARD   | SALES      |     2 |
| JONES  | RESEARCH   |     4 |
| MARTIN | SALES      |     2 |
| BLAKE  | SALES      |     4 |
| CLARK  | ACCOUNTING |     4 |
| SCOTT  | RESEARCH   |     4 |
| KING   | ACCOUNTING |     5 |
| TURNER | SALES      |     3 |
| ADAMS  | RESEARCH   |     1 |
| JAMES  | SALES      |     1 |
| FORD   | RESEARCH   |     4 |
| MILLER | ACCOUNTING |     2 |
+--------+------------+-------+

找出每一个员工的部门名称、工资等级、以及上级领导。<把上面的合起来>

select e.ename '员工',d.dname,s.grade,e1.ename '领导'
fromemp e
joindept d
one.deptno = d.deptno
joinsalgrade s
one.sal between s.losal and s.hisal
left joinemp e1
one.mgr = e1.empno;

子查询

1. where子句中使用子查询

案例:找出高于平均薪资的员工信息。

select * from emp where sal > (select avg(sal) from emp);

2. from后面嵌套子查询

找出每个部门平均薪水的等级。

第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;

第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal

select t.*,s.grade
from(select deptno,avg(sal) as avgsal from emp group by deptno) t
joinsalgrade s
ont.avgsal between s.losal and s.hisal;

找出每个部门平均的薪水等级。

第一步:找出每个员工的薪水等级。
select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
第二步:基于以上结果,继续按照deptno分组,求grade平均值。

select e.deptno,avg(s.grade)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group bye.deptno;

3. 在select后面嵌套子查询

案例:找出每个员工所在的部门名称,要求显示员工名和部门名。

select e.ename,d.dname
fromemp e
joindept d
one.deptno = d.deptno;
//总和
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;

union

(可以将查询结果集相加)

案例:找出工作岗位是SALESMAN和MANAGER的员工

select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';

limit

  1. limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)

  2. limit取结果集中的部分数据,这时它的作用。

  3. 语法机制:
    limit startIndex, length
    startIndex表示起始位置,从0开始,0表示第一条数据。
    length表示取几个

通用的标准分页sql

每页显示3条记录:
第1页:0, 3
第2页:3, 3
第3页:6, 3
第4页:9, 3
第5页:12, 3

每页显示pageSize条记录:

第pageNo页:(pageNo - 1) * pageSize, pageSize

pageSize是:是每页显示多少条记录
pageNo是:显示第几页

java代码{
int pageNo = 2; // 页码是2
int pageSize = 10; // 每页显示10条

limit (pageNo - 1) * pageSize, pageSize

}

SQL基础查询笔记【动力节点的视频】相关推荐

  1. sql基础查询笔记(仅作为个人笔记使用)

    尚硅谷029-027 基础查询 运算: +号:在sql中,加号仅用于运算符 字段运算:可以用:表名+*/数值的形式,如:month_salary * 12 as 'anual salary' 显示字段 ...

  2. JavaScript零基础入门--笔记动力节点最新老杜(九-完结)全套笔记精髓

    JSON         1.什么是JSON,有什么用?                     JavaScript Object Notation(JavaScript对象标记),简称JSON.( ...

  3. Ajax学习笔记-动力节点-王鹤老师

    Ajax学习笔记-动力节点-王鹤老师 视频教程来自:https://www.bilibili.com/video/BV15k4y167XM?spm_id_from=333.999.0.0 第一节 全局 ...

  4. 阿里云天池龙珠计划SQL入门与实践 | Task02 SQL基础查询与排序

    本文为阿里云天池学习<SQL入门与实践>第二讲学习笔记,同时该讲内容基于<SQL基础教程>第二章(查询基础)及第三章(聚合与排序). SQL基础查询与排序 一.SELECT语句 ...

  5. Task02:SQL基础查询与排序-天池龙珠计划SQL训练营

    Task02:SQL基础查询与排序 一.SELECT语句基础 1.1 从表中选取数据 SELECT语句 1.2从表中选取符合条件的数据 WHERE语句 1.3 相关法则 星号(*)代表全部列的意思. ...

  6. [Matlab]入门教程基础向笔记(B站视频)

    [Matlab]入门教程基础向笔记(B站视频) 快捷操作 clc:清除命令行窗口历史操作 用⬆(上箭头)表示快捷输入上一段代码 计算细节 矩阵相乘 A*B:表示现代中的相乘运算 A.B:表示各个数字分 ...

  7. mysql基础入门 day2 动力节点[老杜]课堂笔记

    day_2 本文原作者为动力节点教学总监杜老师老杜在其课老杜带你学_mysql 入门基础(mysql 基础视频+数据库实战)所写讲课笔记 该文档和其涉及资料见文档末链接 本人将其讲课笔记 txt 下载 ...

  8. SpringBoot集成Redis笔记-动力节点王鹤

    关于springboot集成redis,我做了笔记,分享给小伙伴们,视频看的动力节点王鹤老师讲的, 动力节点王鹤老师讲解的springboot教程,由浅入深,带你体验Spring Boot的极速开发过 ...

  9. 史上最全SpringBoot学习笔记-动力节点王鹤(2021最新版)

    SpringBoot 资料官方下载地址 动力节点springboot资料 视频观看地址 https://www.bilibili.com/video/BV1XQ4y1m7ex 第一章 JavaConf ...

最新文章

  1. 终于有人把云计算、物联网和大数据讲明白了!
  2. python imgaug 图片增强
  3. 柳传志大声对iphone说:这是在中国!
  4. 07-XML 文件注解开发
  5. Qt中定时器使用的两种方法
  6. 【mybatis mapper XML】List类型入参参数处理
  7. Java 算法 能量项链
  8. 百旺智能编码_百旺税控盘如何增加商品编码?
  9. js for in对象key排序
  10. fineReport10连接达梦数据库
  11. 学微积,用手机,人人“知识共享”学真知
  12. 一步拿下抖音+微信生态圈,让内容变现再次加速
  13. 3.4 Linux常用的转义字符
  14. 2018-8-30-router的自我反思与总结一
  15. MOT学习 - 卡尔曼滤波
  16. javaMail的使用以及trying to connect to host “1xxx@163.com“, port 25, isSSL false异常
  17. CorelDraw插件开发-Cdr插件-CPG插件-tlb文件位置-脚本插件
  18. Pytorch实现残差神经网络(ResNet)
  19. 图像变换之Census变换
  20. 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统

热门文章

  1. 我的js css武器库
  2. 微信小程序----折叠面板(MUI折叠面板)
  3. 我的产品经理入门之路
  4. python公司企业编码条形码二维码生成系统
  5. RFID资产管理系统高效解决资产管理出现的问题-新导智能
  6. Docker 企业级实战青铜段位-崔健敏-专题视频课程
  7. 员工关系专员岗位职责是什么?什么是员工关系专员?
  8. k8s 集群部署问题整理
  9. not Chrome binary file---没有谷歌二进制文件 Windows10出现的问题
  10. thinkphp5整合layuiadmin