数据库 - 高级查询

导入SQL文件:

  • window系统

window把文件放在d/E/F盘根目录

  • 关键字: source
  • 格式: source 文件路径;

案例分析:

source d:/emp.sql; 
  • 导入步骤

提示:先查看数据库中是否有该数据库,如果有先删除

  1. 找到要导入的SQL文件
  2. 右键文件,选择属性
  3. 复制文件的位置(路径)
  4. 在MySQL窗口中,先输入source关键词,
  5. 然后右键粘贴,手动输入文件名,分号结束
  • Linux系统

linux系统放在桌面
source /home/soft01/桌面/emp.sql;

关键字查询 (IN)

  • IN:在...里面; 包含了......

过滤条件不连续,没有规则的情况下

  • 书写格式:
select 字段1,字段2,字段3..... from 表名 where 字段名  in(?,?,?,?....);
  • 案例分析:

查询emp中员工编号是1,3,6,9,11的员工信息(编号,名字,工资)

select empno,ename,sal from emp where empno in (1,3,6,9,11);

select empno,ename,sal from emp where ename in("唐僧","刘备","观音");

关键字查询(between..and)

  • between..and : 在....之间

  • 查询数值在某个区间内的数据,并且包含头部和尾部的数据

  • 书写格式:

select 字段1,字段2,字段3..... from 表名 where 字段名 between 值1 and 值2;
  • 案例演示:

查询工资在2000到3000之间的员工姓名和工资

select ename,sal from emp where sal between 2000 and 3000;

关键字查询(is null 和 is not null)

  • 查询值为null的数据,或值不为null 的数据

值为null不能用 = ,要用 is ; 不等于用 is not

  • 书写格式:

    1. is null

select 字段1,字段2,字段3..... from 表名 where 字段名 is null;

2. is not null

select 字段1,字段2,字段3..... from 表名 where 字段名 is not null;
  • 案例分析
  1. 查询没有领导的员工信息
select * from emp where mgr is null;
  1. 查询有领导的员工姓名及工资
select ename,sal from emp where mgr is not null;

去重查询(distinct)

  • 将查询到的字段结果去除其中重复的数据
  • 书写格式:
select distinct 字段1,字段2,字段3..... from 表名;
  • 案例分析
  1. 查询员工表中所有不同的职位
select distinct job from emp;
  1. 查询员工表中出现哪几个不同部门编号
select distinct deptno from emp;
  • 注意:
    • 关键字distinct后面跟一个或多个字段的话,说明是去重多个字段组合而成的重复数据
    • 当使用去重查询distinct的时候,在关键字distinct前面不能书写字段,不符合语法要求
  1. 查询员工表中不同部门名字和工作
select  distinct ename,job from emp;

比较运算符查询

> 、 <、 >=、 <=、 !=和<> 、 =

案例分析:

  1. 查询工资大于3000块钱的员工姓名和工资
select ename,sal from emp where sal>3000;
  1. 查询不是程序员的员工姓名和工作 (两种写法)
  • 写法1:
select ename,job from emp where job != "程序员";
  • 写法2:
select ename,job from emp where job <> "程序员";

关键字查询(and、or)

  • and类似于Java中的&&

  • or类似于Java中||

  • 案例分析

  1. 查询1号部门中工资大于2000的员工信息

    deptno = 1

    sal >2000

    and / &&

select * from emp where deptno=1 and sal>2000;
  1. 查询2号部门员工或工资高于2000的员工姓名,工资,部门编号

    deptno =2

    sal > 2000

    or / ||

select ename,sal,deptno from emp where deptno=2 or sal>2000;
  1. 查询有领导并且工资大于1500的员工姓名,工资,领导编号

    mgr is not null

    sal > 1500

    &&

select ename,sal,mgr from emp where mgr is not null and sal>1500;

模糊查询(like)

  • 匹配与指定内容相似的数据
  • 通配符: %,_
    • % : 代表0个或多个字符
    • _ : 代表1个字符
  • 举例:
  1. 以X开头的:x%
  2. 以x结尾的:%x
  3. 包含x的:%x%
  4. 第二个字符是x 的:_x%
  5. 倒数第三个是x的:%x__
  6. 以x 开头倒数第二个是y的:x%y_
  • 书写格式:
select 字段1,字段2,字段3..... from 表名 where 字段名 like 通配符;
  • 案例练习:
  1. 查询员工表中姓孙的员工信息
select * from emp where ename like "孙%";

2.工作中包含销售的员工姓名和工作

select ename,job from emp where job like "%销售%";

3.查询名字以僧结尾的员工姓名

select ename from emp where ename like "%僧";

排序查询(order by)

  • 将查询到的数据按照升序或降序的形式展示出来

  • 书写格式:

select 字段1,字段2,字段3.... from 表名 [where 条件] order by 字段名 [asc]/desc;

desc :降序

asc : 升序

提示:排序查询默认的排序方式是升序,所以升序的关键字asc可以省略

  • 案例练习:

1.查询每个员工的姓名和工资 ,要求按照工资进行降序排列

select ename,sal from emp order by sal desc;

2.查询1号部门的员工信息,按照工资升序排序

select * from emp where deptno=1 order by sal;

分页查询(limit)

  • 限制查询结果的条目

书写格式:

select 字段1,字段2,字段3.. from 表名 [where 条件] [order by 字段 ] limit 参数;

select 字段1,字段2,字段3.... from 表名 limit 跳过的条数,请求条数;
  • 案例练习:

1.查询工资前三名的员工姓名和工资

顺序:1.查询表格全部数据 ; 2.进行排序;3.分页

select ename,sal from emp order by sal desc limit 3;

2.查询工资升序第二页的五条数据(跳过前五条数据, 再查询5条)

select * from emp order by sal limit 5,5;

3.查询工资升序第三页的两条数据 (每页两条数据)

select * from emp order by sal limit 4,2;

4.查询工资在1000到5000之间降序,第3页的3条数据

select 
    *
from
    emp
where 
    sal between 1000 and 5000
order by 
    sal desc 
limit 6 , 3;
    

数值计算

  • +、—、*、/、%

1.查询每个员工的姓名,工资和年终奖(5个月工资)

select ename,sal,sal*5 from emp;

2.查询每个员工的姓名,工资和涨薪500块之后的工资

select ename ,sal,sal+500 from emp;

别名(as)

  • 在查询时,临时为字段或表格起一个新的名字
  • 关键字 as 是可以省略掉的
  • 字符串类型的别名双引号可以去掉
  • 案例分析:
select ename as "姓名", hiredate as "入职时间",sal as "工资" from emp;

1.关键字 as 是可以省略掉的
select ename  "姓名", hiredate  "入职时间",sal  "工资" from emp;

2.字符串类型的别名双引号可以去掉
select ename 姓名, hiredate 入职时间,sal 工资 from emp;

3.临时产生一个新字段,并取别名
select ename ,sal,sal+500 as "newSal" from emp;

聚合函数查询

对查询到的多条数据进行统计;包括以下几种内容:

  • 最大值:max(字段名)

  • 最小值:min()

  • 平均值:avg()

  • 总和:sum()

  • 总数:count() ; count(字段)要注意如果值有null那么不会进行计算

  • 案例练习:

1.查询1号部门的平均工资

select avg(sal) as "平均工资"  from emp where deptno = 1;

2.查询2号部门的最高工资

select max(sal) "最高工资" from emp where deptno=2;

3.查询销售的最低工资

select min(sal) "最小工资" from emp where job like "%销售%" ;

4.查询3号部门的工资总和

select sum(sal) "工资总和" from emp where deptno=3;

5.查询工资高于2000的员工人数

select count(sal) "工资高于2000的人数" from emp where sal > 2000;

分组查询(group by)

  • 可以按照某个字段或多个字段中的值进行分组,字段值相同的为一组

  • 书写格式:

select 字段1,字段2,字段3.. from 表名 [where 条件 ....] group by 字段;
例如:
select deptno from emp group by deptno;
  • 案例练习:

1.查询每个部门的平均工资

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

2.查询每个部门的最高工资

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

3.查询每种工作的最低工资

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

4.查询每种工作的人数

select job,count(*) from emp group by job;

5.查询每个部门工资大于1500的员工人数

select deptno,count(*) from emp where sal>1500 group by deptno;

6.查询1号部门和2号部门的最低工资

select deptno,min(sal) from emp where deptno in (1,2) group by deptno;

having

  • 需要和group by 结合使用
  • where后面只写普通字段的条件 id =1
  • having后面只写聚合函数条件 max(sal)> 3000
  • 案例分析

1.查询每个部门的平均工资,要求平均工资大于2000

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

2.查询每个部门的平均工资,只查询工资在1000-3000之间的员工,并且过滤掉平均工资低于2000的部门

select deptno ,avg(sal) a from emp 
where sal between 1000 and 3000 
group by deptno  
having a > 2000;

各个关键字的顺序

select ... from 表名 where ... group by ... having .. order by ... limit.. 

分析题目的步骤:

  1. 确定查询的字段信息
  2. 确定表格
  3. 确定条件(单个,多个)
  4. 确定多个条件关系

关键字适用范围:

IN,between..and,is null 和 is not null ,and, or,比较运算符

都适用于更新语句(update)、删除语句(delete)

子查询(嵌套查询)

  • 子查询是指在一个查询语句中嵌套了另一个查询语句内部的查询。
  • 在执行过程中,首先执行子查询中的语句,然后将返回的结果作为外层的过滤条件

案例分析:

1.查询工资高于1号部门平均工资的员工信息

1.查询1号部门的平均工资
select avg(sal) from emp where deptno=1;  --> avg
2.查询员工信息
select * from emp;
3.查询工资高于avg的员工
select * from emp where sal > avg;
4.最终整合结果
select * from emp where sal >(select avg(sal) from emp where deptno=1);

2.查询工资最高的员工信息

1.工资最高的员工
select max(sal) from emp  -->5000
2.员工的信息
select * from emp;
3.整合
select * from emp where sal= (select max(sal) from emp);

select * from emp where sal= 5000;

3.查询工资高于2号部门最低工资的员工信息

1.2号部门最低工资 (子查询)
select min(sal) from emp where deptno=2
2.整合
select * from emp where sal > (select min(sal) from emp where deptno=2);

4.查询和孙悟空相同工作的其他员工信息

1.查询孙悟空的工作
select job from emp where ename="孙悟空";
2.查询员工信息
select * from emp;
3.整合
select * from emp 
where job= (select job from emp where ename="孙悟空") 
and ename != "孙悟空";

5.查询白骨精的部门信息(需要用部门表)

1.白骨精的所在部门的部门号
select deptno from emp where ename="白骨精";
2.查询所有的部门信息
select * from dept;
3.整合
select * from dept 
where deptno=(select deptno from emp where ename="白骨精");

6.查询所有员工的部门信息(想办法过滤掉4号部门,因为4号部门没有员工)

1.有员工的部门号
select distinct deptno from emp;
2.查询所有部门
select * from dept where deptno in (select distinct deptno from emp);

综合练习

  1. 查询没有上级领导的员工编号empno,姓名,工资
  2. 查询有奖金的员工姓名和奖金
  3. 查询名字中包含精的员工姓名和工资
  4. 查询名字中第二个字是八的员工信息
  5. 查询1号部门工资大于2000的员工信息
  6. 查询2号部门或者工资低于1500的员工信息
  7. 查询工资为3000,1500,5000的员工信息按照工资升序排序
  8. 查询3号部门的工资总和
  9. 查询每个部门工资大于1000的员工人数,按照人数升序排序
  10. 查询每种工作中有领导的员工人数按照人数降序排序
  11. 查询所有员工信息,按照部门编号升序排序,如果部门编号一致则工资降序
  12. 查询有领导的员工,每个部门的编号和最高工资
  13. 查询有领导的员工,按照工资升序排序,第3页的2条数据
  14. 查询每个部门的工资总和,只查询有上级领导的员工并且要求工资总和大于5400,最后按照工资总和降序排序,只查询结果中的第一条数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容