**

很多同学,知道sql的语法,可是真的给你需求来了,就是写不出代码,那么就只有多练习练习了。主要是思路,思维。语法忘记不要怕,一百度就出来了,真正的是你的思维,想法,这很重要,你有想法和思路了,做什么就有出路了。

**
1.查找最晚入职员工的所有信息

第一种方法:利用答案板子上的姓名,找出结果

select * from employees where last_name='Kalloufi';

第二种方法:利用子查询的方法,找出最大日期的日子

select * from employees
where hire_date =
(select max(hire_date) from employees)

第三种方法:利用倒序排序直接找出最大日期的日子

SELECT * FROM employees ORDER BY hire_date DESC LIMIT 0,1;

LIMIT m,n : 表示从第m+1条开始,取n条数据;
LIMIT n : 表示从第0条开始,取n条数据,是limit(0,n)的缩写。
本题limit 0,1 表示从第(0+1)条数据开始,取一条数据,即取出最晚入职员工。

2.查找入职员工时间排名倒数第三的员工所有信息

第一种方法:把时间进行倒序排序,然后找到第三个

select *from employees order by hire_date desc limit 2,1;

第二种方法:

select * from employees
where hire_date = (select distinct hire_date from employees order by hire_date desc limit 2,1
)

(1)首先需要加distinct去重。
假设 5-23(入职最晚日期)入职的有a,b,c 3人;
5-22(入职第二晚日期)入职的有d,e 2人;
5-21(入职倒数第三晚)入职的有f,g,h 3人;
5-21前入职的若干…
若 不加distinct去重,那么按照日期倒序,limit 2,1(从倒数第2行开始,取一条数据)的查询结果为 5-23
加了distinct去重,会按入职日期进行分组,多个相同入职日期会分为一组,这样limit 2,1的结果即为 5-21。
(2)外层的where条件中根据子查询查出的倒数第三晚入职的日期,就能查询出符合条件的员工信息。

3.查找当前薪水详情以及部门编号dept_no

这里的坑主要在于两个表的逻辑关系,题目要求是薪水情况以及部门编号,再结合输出情况dept_no 被放到了最后一列,可见是主表是“salaries”。这里顺序错了就会提示:您的代码无法通过所有用例
第一种方法:

select s.*,d.dept_no from salaries as s join dept_manager as d
on s.emp_no=d.emp_no where s.to_date='9999-01-01' and d.to_date='9999-01-01';

第二种方法:

SELECT s.*, d.dept_no FROM salaries AS s ,  dept_manager AS d
WHERE s.to_date='9999-01-01'
AND d.to_date='9999-01-01'
AND s.emp_no=d.emp_no;

4.查找所有已经分配部门的员工的last_name和first_name以及dept_no


解析:
employees表中顺序输出的,所以使用内连接查询时,必须将employees表放在前面。
select last_name,first_name,dept_no from employees,dept_emp where dept_emp.emp_no = employees.emp_no;

select e.last_name,e.first_name,dm.dept_no from dept_emp as dm inner join employees as e
on e.emp_no = dm.emp_no

5.查找所有员工的last_name和first_name以及对应部门编号dept_no

1.首先呢,先找出对应的数据表,这里所查询的数据,需要用的这两个表中的数据字段
2.两个表相关联的条件
3.最后写出需要查询的具体内容

select e.last_name,e.first_name,de.dept_no#最后写出需要查询的具体内容
from employees as e left join dept_emp as de#首先呢,先找出对应的数据表,这里所查询的数据,需要用的这两个表中的数据字段
on e.emp_no = de.emp_no#两个表相关联的条件

注意:

  • INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
  • LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
  • RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。

注意
on与where有什么区别,两个表连接时用on,在使用left jion时,on和where条件的区别如下:

  • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

6.查找所有员工入职时候的薪水情况

1、由于测试数据中,salaries.emp_no 不唯一(因为号码为 emp_no 的员***有多次涨薪的可能,所以在 salaries 中对应的记录不止一条),employees.emp_no 唯一,即 salaries 的数据会多于 employees,因此需先找到 employees.emp_no 在 salaries 表中对应的记录salaries.emp_no,则有限制条件 e.emp_no = s.emp_no
2、根据题意注意到 salaries.from_date 和 employees.hire_date 的值应该要相等,因此有限制条件 e.hire_date = s.from_date
3、根据题意要按照 emp_no 值逆序排列,因此最后要加上 ORDER BY e.emp_no DESC
4、为了代码良好的可读性,运用了 Alias 别名语句,将 employees 简化为 e,salaries 简化为s,即 employees AS e 与 salaries AS s,其中 AS 可以省略

第一种方法:利用 INNER JOIN 连接两张表

SELECT e.emp_no, s.salary
FROM employees AS e, salaries AS s
WHERE e.emp_no = s.emp_no AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC;

第二种方法:直接用逗号并列查询两张表

SELECT e.emp_no, s.salary FROM employees AS e, salaries AS s
WHERE e.emp_no = s.emp_no AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC

7.查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
解析:
首先找到是哪个表进行查询
其次找到分组的条件
然后写select要查询的字段名称
然后找到条件用having做筛选就行了

select emp_no ,count(emp_no) as t from salaries group by emp_no having t > 15;

此题应注意以下四点:
1、用COUNT()函数和GROUP BY语句可以统计同一emp_no值的记录条数
2、根据题意,输出的涨幅次数为t,故用AS语句将COUNT(emp_no)的值转换为t
3、由于COUNT()函数不可用于WHERE语句中,故使用HAVING语句来限定t>15的条件
4、最后存在一个理解误区,涨幅超过15次,salaries中相应的记录数应该超过16(从第2条记录开始算作第1次涨幅),不过题目为了简单起见,将第1条记录当作第1次涨幅,所以令t>15即可
/** 注意: 严格来说,下一条salary高于本条才算涨幅,但本题只要出现了一条记录就算一次涨幅,salary相同可以理解为涨幅为0,salary变少理解为涨幅为负 **/
8.找出所有员工当前薪水salary情况

第一种写法:

select distinct salary from salaries where to_date='9999-01-01' order by salary desc;

第二种写法:

select salary from salaries where to_date='9999-01-01' group by salary order by salary desc

对于distinct与group by的使用: 1、当对系统的性能高并数据量大时使用group by 2、当对系统的性能不高时使用数据量少时两者皆可 3、尽量使用group by

9.获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=‘9999-01-01’

第一种方法:

select d.dept_no ,d.emp_no,s.salary from dept_manager as d join salaries as s
on d.emp_no = s.emp_no where s.to_date='9999-01-01'
and d.to_date='9999-01-01';

第二种方法:

SELECT d.dept_no, d.emp_no, s.salary
FROM salaries AS s INNER JOIN dept_manager AS d
ON d.emp_no = s.emp_no
AND d.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'

解题思路:
1、先用INNER JOIN连接两张表,限制条件是两张表的emp_no相同,即d.emp_no = s.emp_no,并且将salaries用别名s代替,dept_manager用别名d代替
2、根据题意,要获取当前manager的当前salary情况,再加上限制条件d.to_date = ‘9999-01-01’ AND s.to_date = '9999-01-01’即可(因为同一emp_no在salaries表中对应多条涨薪记录,而当s.to_date = '9999-01-01’时是该员工当前的薪水记录)
10.获取所有非manager的员工emp_no


第一种方法:

select emp_no from employees where emp_no not in (select emp_no from dept_manager);

第二种方法:


select e.emp_no
from employees as e
left join
dept_manager as dm
on dm.emp_no = e.emp_no
where dm.emp_no is null

解析:
1.首先是两个表
2.连接条件为left join
3.取空值

11.获取所有员工当前的manager

1、用 INNER JOIN 连接两张表,因为要输出自己的经理,得知自己与经理的部门要相同,故有限制条件 de.dept_no = dm.dept_no
2、再用 WHERE 限制当前员工与当前经理的条件,即 dm.to_date 等于 ‘9999-01-01’ 、de.to_date 等于 ‘9999-01-01’ 、 de.emp_no 不等于 dm.emp_no
3、为了增强代码可读性,将 dept_emp 用别名 de 代替,dept_manager 用 dm 代替,最后根据题意将 de.emp_no 用别名 manager_no 代替后输出

select de.emp_no,
dm.emp_no as manager_no
from dept_emp as de
inner join
dept_manager as dm
on de.dept_no = dm.dept_no
where de.to_date='9999-01-01' and dm.to_date='9999-01-01' and de.emp_no <> dm.emp_no

12.获取所有部门中当前员工薪水最高的相关信息

此题思路如下:
1、先用INNER JOIN连接两张表,限制条件是两张表的emp_no相同,即d.emp_no = s.emp_no;
2、选取每个员工当前的工资水平,用d.to_date = ‘9999-01-01’ AND s.to_date = '9999-01-01’作条件限制,因为此表中每条最新记录的 to_date 都用 9999-01-01 表示;
3、用GROUP BY d.dept_no将每个部门分为一组,用MAX()函数选取每组中工资最高者;
4、将salaries用s代替,dept_emp用d代替,最后将MAX(s.salary)用salary代替后输出

select d.dept_no,
s.emp_no,
max(s.salary) as salary
from dept_emp as d
inner join
salaries as s
on d.emp_no = s.emp_no
where d.to_date='9999-01-01' and s.to_date='9999-01-01'
group by d.dept_no

13.从titles表获取按照title进行分组

解析思路
1.找到表
2.找分组
3.select查询
4.having筛选

select title,count(title) as t from titles group by title having t >= 2;

此题应注意以下三点:
1、先用GROUP BY title将表格以title分组,再用COUNT(DISTINCT emp_no)可以统计同一title值且不包含重复emp_no值的记录条数
2、根据题意,输出每个title的个数为t,故用AS语句将COUNT(DISTINCT emp_no)的值转换为t
3、由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>=2的条件
14.从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。

此题应注意以下三点:
1、先用GROUP BY title将表格以title分组,再用COUNT(DISTINCT emp_no)可以统计同一title值且不包含重复emp_no值的记录条数
2、根据题意,输出每个title的个数为t,故用AS语句将COUNT(DISTINCT emp_no)的值转换为t
3、由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>=2的条件

select title ,count(distinct emp_no) as t from titles group by title having t>=2;

15.查找employees表

三点需要注意:
1、员工号为奇数,则emp_no取余应为1
2、last_name不为Mary,用‘!=’表示
3.根据hire_date逆序排列,用desc

select *
from employees
where emp_no%2=1 and last_name!='Mary'
order by hire_date desc 

mysq的查询练习题以及分析方法相关推荐

  1. mysql慢查询开启及分析方法

    最近服务维护的公司的DB服务器,总是会出现问题,感觉需要优化一下了,登陆上去,发现慢查询日志都没有开,真是惭愧, 故果断加上慢查询日志,经过分析sql记录,发现问题很多,开发人员很多没有对sql优化, ...

  2. php mysql or_mysql条件查询and or使用方法及优先级实例分析

    本文实例讲述了mysql条件查询and or使用方法及优先级.分享给大家供大家参考,具体如下: mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使 ...

  3. 深入理解linux文件系统( 理解inode与block,理解硬链接软链接,掌握恢复误删文件及其分析方法,掌握用户日志及其查询命令 )

    文章目录 深入理解linux文件系统 前言 inode与block详解 inode和bolck概述 1:数据(block)块: 2:元信息 : inode(索引节点) inodu的内容 Linux系统 ...

  4. mysql 查询慢 分析_MySQL优化:定位慢查询的两种方法以及使用explain分析SQL

    一条SQL查询语句在经过MySQL查询优化器处理后会生成一个所谓的执行计划,这个执行计划展示了具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等. 本章的内容就 ...

  5. mysql慢查询分析工具和分析方法

    1.mysql慢查询分析工具 1.参考文档: http://www.ttlsa.com/mysql/analyse-slow-query-log-using-anemometer/ http://is ...

  6. 分析mysql慢查询_mysql慢查询的分析方法_MySQL

    本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询.想起来有几个十分设置的方法,有几个参数的名称死活回忆不起来了,于是重新整 ...

  7. java三维滑雪,第六章 三维数据空间分析方法.ppt

    第六章 三维数据空间分析方法 * * * * 可视性分析 * * 自然邻域法插值 基本思路: 利用输入点及邻近栅格单元进行插值生成栅格表面. 方法: 利用输入数据点(样本点)为节点,建立Delauna ...

  8. 苍狼敏捷需求用例分析方法简介并讲义下载

    作者:张克强    作者微博:张克强-敏捷307 用例分析方法已经有不短的历史,发展出了多种用例分析方法.笔者花费了大量时间,对用例分析的各个方面进行实践和分析,得到如下系列文章: 需求用例分析之一: ...

  9. 性能测试需求调研分析方法

    一.测试背景和目的 在需求调研开始,测试人员需要明确的测试目的,那么首先得清楚项目本身情况,针对不同的项目情况也会有不同的目的,根据项目情况一般可以分为以下六种情况: 1.完全新建系统 完全新建系统意 ...

最新文章

  1. linux cut性能,Linux cut
  2. Uipath 学习栏目基础教学:9、Excel 的基本操作之读写 Excel
  3. Unity 2018.3地形功能更新介绍
  4. 【Todo】各种语言里面的for循环 loop
  5. [Python3]Python面向对象的程序设计
  6. [Python] 制作启动uiautomator2 的web版 uiautomatorviewer2 批处理启动
  7. 【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)
  8. word上的花线是什么_微型断路器为什么叫空气开关,学问一大堆,该怎么接
  9. 《图解HTTP》学习笔记
  10. c语言考试常考大题,C语言题库经典题 考试常考题.doc
  11. 进程的描述和进程的创建
  12. SQL分割字符串详解
  13. Three.js的人物动画与交互
  14. java实现手机邮箱格式验证
  15. 论中国人工智能发展史
  16. 笔记本电脑如何用c语言开无线网卡,教你如何用无线网卡做wifi热点(适用笔记本)...
  17. c语言程序乔奎,迂回
  18. [18调剂]中国科学院深圳先进技术研究院“视频信号处理”课题组招聘
  19. RocketMQ如何维持心跳
  20. Java操作sqlite3数据库心得(一)

热门文章

  1. 未来stem课程的发展之路
  2. ARM与x86之2--Atom的前生今世
  3. 生命是可贵的,也是脆弱的
  4. 《程序员面试金典(第6版)》面试题 16.13. 平分正方形(直线的斜截式方程,C++)
  5. [知识小节]Windbg常用指令(笔记本)
  6. 14张Python思维导图 别小看这几张图片,它可是涵盖了所有Python知识点
  7. pic16单片机c语言中断返回指令,Pic16f877 中断控制电路
  8. 湖南大学计算机技术考研分数最低,湖南大学,2021年考研参加复试最低标准线,你达到了?...
  9. 【JavaScript】——input元素的oninput事件和onchange事件
  10. [论文笔记]如何通过加package cap有效减少GPU的droop noise