MYSQL查询DQL的实例和注解

首先需要四张表(来自某教学视频):
1.员工信息表
员工信息表
2.部门信息表
部门信息表
3.工资等级表
工资等级表
4.年份收入表
年份收入表

SELECT * FROM dept;
SELECT * FROM emp;
SELECT * FROM salgrade;
SELECT * FROM tb_year;
//*查出至少有一个人的部门编号,部门名称,部门位置,部门人数
要统计部门人数,必然要对emp表以部门进行分组
由于,部门编号,部门名称,部门位置与部门人数来自两张表,所以需要用到内连接
*//
SELECT *
FROM dept d INNER JOIN (SELECT deptno,COUNT(*) FROM emp GROUP BY deptno ) z1
ON d.deptno=z1.deptno;
//*列出所有员工和其上级的名字
所有员工和上级都来自表emp,先对emp自己做笛卡尔积,只要mgr和empno对应,那么上级的名字和员工的名字就对应了
由于存在员工无上级领导的情况,因此需要用到左外链接
*//
SELECT e1.ename,e2.ename
FROM emp e1 LEFT OUTER JOIN emp e2
ON e1.mgr=e2.empno;
//*列出受雇日期早于其直接上级领导的所有员工的编号,姓名,部门名称
由于员工编号,姓名,部门来自两张表,因此需要用到内连接
由于需要知道上级领导的受雇日期,因此需要emp自己做笛卡尔积
受雇日期比领导早,增加条件e1.hiredate<e2.hiredate
然后再和dept表做内连接
这个例子启示我们,内连接内连接内连接,3。。3P?
*//
SELECT e1.empno,e1.ename,d.dname
FROM emp e1 INNER JOIN emp e2 INNER JOIN dept d
ON e1.mgr=e2.empno AND e1.hiredate<e2.hiredate AND e1.deptno=d.deptno;
//*列出部门名称和这些部门员工的详细信息,同时列出那些没有员工的部门
信息来自两张表,同时列出没有员工的部门
典型的右外连接
*//
SELECT e.* ,d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
//*列出最低工资大于15000的各种工作,和该工作的人数
首先所有信息来自一张表,不需要连接
各种工作,因此需要根据job分组,分组后条件:最低工资大于15000。
*//
SELECT job,COUNT(*)
FROM emp
GROUP BY job
HAVING MIN(sal)>15000;
//*不知道部门编号,但要知道销售部的各个员工的信息
得到结果的信息来自一张表
首先需要根据部门名称来找到部门编号
然后通过部门编号来做条件
注意只有在多表查询时条件是ON,单表查询的条件是WHERE
*//
SELECT *
FROM emp e 
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='销售部');
//*列出薪金高于平均工资的的所有员工信息,所在部门,上级领导,工资等级
所有员工信息,所在部门,上级领导,工资等级来自四张表
首先需要知道所有员工的平均工资(SELECT AVG(sal) FROM emp)
并且四张表之间是左外链接的关系,这样就涉及到左外连接左外连接左外连接的
问题了,和内连接内连接内连接的格式不一样
*//
SELECT e1.*,d.dname,e2.ename 领导,s.grade
FROM emp e1 LEFT OUTER JOIN dept d ON e1.deptno=d.deptno
     LEFT OUTER JOIN emp e2 ON  e1.mgr=e2.empno
     LEFT OUTER JOIN salgrade s ON e1.sal BETWEEN s.losal AND s.hisal
WHERE e1.sal>(SELECT AVG(sal) FROM emp);
//*列出所有和庞统同一个工作的所有员工和部门名称
首先需要查询出庞统的工作(SELECT job FROM emp WHERE ename='庞统)
然后将emp和dept两张表做内连接
这里有个小细节,容易出错,就是FROM后面如果只有一张表,那么用简称,
比如e.ename就会出现语法错误,只能用ename。
*//
SELECT *
FROM emp e INNER JOIN dept d
ON e.deptno=d.deptno AND e.job=(SELECT job FROM emp WHERE ename='庞统'); 
//*列出薪金高于所有部门30的员工的薪金的员工的姓名,薪金部门名称
首先需要知道部门30的所有员工的最高薪金SELECT MAX(sal) FROM emp;
信息来自两张表,需要做内连接
*//
SELECT e.ename,e.sal,d.dname
FROM emp e INNER JOIN dept d
ON e.deptno=d.deptno AND e.sal>(SELECT MAX(sal)FROM emp WHERE deptno='30');
//*列出增长比*
首先表tb_year和自己做左外连接,条件是y1.year=y2.year+1;
然后注意CONCAT,ISNULL等用法
*//
SELECT y1.*,IFNULL(CONCAT((y1.income-y2.income)/y2.income*100,'%'),'0%') 增长比
FROM tb_year y1 LEFT OUTER JOIN tb_year y2
ON y1.year=y2.year+1;

猜你喜欢

转载自blog.csdn.net/weixin_43330321/article/details/82933197