1、查询至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数

/*1、查询至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数列:d.deptno, d.dname, d.loc, 部门人数  (要查询部门人数需要使用分组)表:dept d, emp e条件:e.deptno = d.deptno
*/
SELECT *        -- 查询部门表
FROM dept;SELECT deptno, COUNT(*)       -- 根据分组查询员工表部门人数
FROM emp
GROUP BY deptno;-- 先将单独的两部分内容分别查询出来,在使用内链接把他们联合起来
-- 第一步:先分析有那些列,需要查询那些表,条件有什么
-- 第二步:将要查询的信息在子表中分别查询出来、
-- 第三步:将查询的信息链接在一起
-- 第四步:筛选出要使用的信息SELECT d.*, z1.ent as '部门人数'   -- 在SELECT中不能直接只用 z1.COUNT(*) 要使用别名
FROM dept d, (SELECT deptno, COUNT(*) ent   FROM emp GROUP BY deptno) z1    -- 在from中添加子查询(内连接)
WHERE d.deptno = z1.deptno;                    -- 去笛卡尔积   -- 使用了内连接40部门没有员工,所以没有显示在结果中

2、列出所有员工的姓名及其直接上级的名字

/*2、列出所有员工的姓名及其直接上级的名字列:员工姓名、上级姓名表:emp e, emp m   -- 一个表重复查询两次 一个表示员工 一个表示 经理条件:e.empno = m.mgr
*/SELECT e.ename, m.ename
FROM emp e, emp m
WHERE e.mgr = m.empno;    -- 在表中曾阿牛没有对应的领导,如果想显示他就必须使用左外链接
-- SELECT e.ename, m.ename -- 可以使用ifnull将null值修改为指定信息
SELECT e.ename as '员工', IFNULL(m.ename,'BOSS') as '领导'
FROM emp e LEFT JOIN emp m
ON e.mgr = m.empno

3、列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称

/*3、列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称列:e.empno e.ename d.dname表:emp e, emp m, dept d条件:e.hiredate < m.hiredate思路:1、先进行单表查询(不查询部门名称),只查询部门编号列:e.empno, e.ename, e.deptno表:emp e, emp m;条件:去笛卡尔积(e.mgr = m.empno), e.hiredate < m.hiredateSELECT e.empno, e.ename, e.deptno -- , e.hiredate, m.ename, m.hiredateFROM emp e, emp mWHERE e.mgr = m.empno AND e.hiredate < m.hiredate;
*/ SELECT e.empno, e.ename, d.dname
FROM emp e, emp m, dept d
WHERE e.mgr = m.empno AND e.hiredate < m.hiredate AND e.deptno = d.deptno;

4、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

/*5、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门列:*表:emp e, dept d条件:e.deptno = d.deptno先查出部门名称和员工信息SELECT * FROM emp e, dept dWHERE e.deptno = d.deptno然后在查询没有员工的部门(右外连接)
*/SELECT *
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno

6、列出最低薪金大于15000的各种工作以及从事此工作的员工人数

/*6、列出最低薪金大于15000的各种工作以及从事此工作的员工人数列:job count(*)表:emp e条件:min(sal)>15000分组:job分组后查询用HAVING
*/
SELECT job, COUNT(*)
FROM emp e
GROUP BY job
HAVING MIN(sal) > 15000

7、列出在销售部工作的员工的姓名,假定不知道销售部的部门编号

/*7、列出在销售部工作的员工的姓名,假定不知道销售部的部门编号列:e.ename表:emp条件:e.deptno={SELECT deptno FROM dept WHERE dnam='销售部'}  -- 设置子查询
*/SELECT *
FROM emp e
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='销售部')

8、列出薪资高于公司工资平均薪金的所有员工信息,所在部门名称,上级领导,工资等级

/*8、列出薪资高于公司工资平均薪金的所有员工信息,所在部门名称,上级领导,工资等级-- 分别查询三张表中的信息SELECT * FROM emp;SELECT * FROM dept;SELECT * FROM salgrade;列:*表:emp e条件:sal>(查询出公司的平均工资)       -- 子查询8.1 列出薪资高于公司工资平均薪金的所有员工信息SELECT *FROM emp eWHERE e.sal>(SELECT AVG(sal) FROM emp) 8.2 加上:部门名称SELECT e.*, d.dnameFROM emp e, dept d  -- 这样查询会少一条张三的信息。因为他没有部门,所以要才用左连接的方式WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno = d.deptno8.4加上:上级领导SELECT e.*, d.dname, m.enameFROM emp e, dept d, emp m  -- 这样查询会少两条信息,张三没有部门,曾阿牛没有上级领导WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno = d.deptno AND e.mgr = m.empno8.5加上:工资等级SELECT e.*, d.dname, m.ename, s.gradeFROM emp e, dept d, emp m, salgrade sWHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno = d.deptno AND e.mgr = m.empno AND e.sal BETWEEN s.losal AND s.hisal  -- 工资只要在losal和hisal范围内就好查出等级8.6 使用左外链接查询缺省数据SELECT e.*, d.dname, m.ename, s.gradeFROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptnoLEFT OUTER JOIN emp m ON e.mgr = m.empnoLEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisalWHERE e.sal>(SELECT AVG(sal) FROM emp)
*/
SELECT e.*, d.dname, m.ename, s.grade
FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptnoLEFT OUTER JOIN emp m ON e.mgr = m.empnoLEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
WHERE e.sal>(SELECT AVG(sal) FROM emp)

9、列出与庞统从事相同工作的所有员工及部门名称

/*9、列出与庞统从事相同工作的所有员工及部门名称列:e.*. d.dname表:emp e, dept d条件:job=(查询出庞统的工作)  -- 注意:去笛卡尔
*/SELECT e.*, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno AND job=(SELECT job FROM emp WHERE ename='庞统' )

10、列出薪金高于在部门30工作的所有员工的薪资的员工姓名和薪金、部门名称

/*10、列出薪金高于在部门30工作的所有员工的薪资的员工姓名和薪金、部门名称。列:e.ename, e.sal, d.dname表:emp e, dept d条件:sal > all (30部门薪金)
*/SELECT e.ename, e.sal, d.dname
FROM  emp e, dept d
WHERE e.deptno = d.deptno AND sal > ALL(SELECT sal FROM emp WHERE deptno=30)

11、 查出年份、利润、年增长比

/*
11、 查出年份、利润、年增长比11.1 -- 在同一行中的数据才能进行计算,所以一个要查询两次,然后在去笛卡尔积SELECT * FROM tb_year y1, tb_year y2     -- 注意第一年的数据没有关联关系,所以无法查询,要使用左外链接查询WHERE y1.year = y2.year+1;11.2 左外链接查询SELECT * FROM tb_year y1 LEFT OUTER JOIN tb_year y2ON y1.year = y2.year+1;11.3 计算年增长比-- 使用 ifnull 修改 null 数据显示类型,使用 concat 添加%号,使用 as 添加别名SELECT y1.*, IFNULL(CONCAT((y1.zz- y2.zz)/y2.zz*100,'%'), '0%')  AS '增长比'FROM tb_year y1 LEFT OUTER JOIN tb_year y2ON y1.year = y2.year+1;
*/
SELECT y1.*, IFNULL(CONCAT((y1.zz- y2.zz)/y2.zz*100,'%'), '0%')  AS '增长比'
FROM tb_year y1 LEFT OUTER JOIN tb_year y2
ON y1.year = y2.year+1;

数据源:mysql5.0.0

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(11) NOT NULL,`dname` varchar(50) default NULL,`loc` varchar(50) default NULL,PRIMARY KEY  (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', '教研部', '北京');
INSERT INTO `dept` VALUES ('20', '学工部', '上海');
INSERT INTO `dept` VALUES ('30', '销售部', '广州');
INSERT INTO `dept` VALUES ('40', '财务部', '武汉');-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`empno` int(11) NOT NULL,`ename` varchar(50) default NULL,`job` varchar(50) default NULL,`mgr` int(11) default NULL,`hiredate` date default NULL,`sal` decimal(7,2) default NULL,`COMM` decimal(7,2) default NULL,`deptno` int(11) default NULL,PRIMARY KEY  (`empno`),KEY `fk_emp` (`mgr`),CONSTRAINT `fk_emp` FOREIGN KEY (`mgr`) REFERENCES `emp` (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('1001', '甘宁', '文员', '1013', '2000-12-17', '8000.00', null, '20');
INSERT INTO `emp` VALUES ('1002', '黛绮丝', '销售员', '1006', '2001-02-20', '16000.00', '3000.00', '30');
INSERT INTO `emp` VALUES ('1003', '殷天正', '销售员', '1006', '2001-02-22', '12500.00', '5000.00', '30');
INSERT INTO `emp` VALUES ('1004', '刘备', '经理', '1009', '2001-04-02', '29750.00', null, '20');
INSERT INTO `emp` VALUES ('1005', '谢逊', '销售员', '1006', '2001-09-28', '12500.00', '14000.00', '30');
INSERT INTO `emp` VALUES ('1006', '关羽', '经理', '1009', '2001-05-01', '28500.00', null, '30');
INSERT INTO `emp` VALUES ('1007', '张飞', '经理', '1009', '2001-09-01', '24500.00', null, '10');
INSERT INTO `emp` VALUES ('1008', '诸葛亮', '分析师', '1004', '2007-09-01', '30000.00', null, '20');
INSERT INTO `emp` VALUES ('1009', '曾阿牛', '董事长', null, '2001-11-17', '50000.00', null, '10');
INSERT INTO `emp` VALUES ('1010', '韦一笑', '销售员', '1006', '2001-09-08', '15000.00', '0.00', '30');
INSERT INTO `emp` VALUES ('1011', '周泰', '文员', '1008', '2007-05-28', '11000.00', null, '20');
INSERT INTO `emp` VALUES ('1012', '程普', '文员', '1006', '2001-12-03', '9500.00', null, '30');
INSERT INTO `emp` VALUES ('1013', '庞统', '分析师', '1004', '2001-12-09', '30000.00', null, '20');
INSERT INTO `emp` VALUES ('1014', '黄盖', '文员', '1007', '2002-01-23', '13000.00', null, '10');
INSERT INTO `emp` VALUES ('1015', '张三', '保洁员', '1009', '1999-09-09', '80000.00', '90000.00', '50');-- ----------------------------
-- Table structure for salgrade
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`grade` int(11) NOT NULL,`losal` int(11) default NULL,`hisal` int(11) default NULL,PRIMARY KEY  (`grade`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of salgrade
-- ----------------------------
INSERT INTO `salgrade` VALUES ('1', '7000', '12000');
INSERT INTO `salgrade` VALUES ('2', '12010', '14000');
INSERT INTO `salgrade` VALUES ('3', '14010', '20000');
INSERT INTO `salgrade` VALUES ('4', '20010', '30000');
INSERT INTO `salgrade` VALUES ('5', '30010', '99990');-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu` (`sid` int(11) NOT NULL,`sname` varchar(50) default NULL,`age` int(11) default NULL,`gender` varchar(10) default NULL,`province` varchar(50) default NULL,`tuition` int(11) default NULL,PRIMARY KEY  (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO `stu` VALUES ('1', '王永', '23', '男', '北京', '1500');
INSERT INTO `stu` VALUES ('2', '张雷', '25', '男', '辽宁', '2500');
INSERT INTO `stu` VALUES ('3', '李强', '22', '男', '山东', '3500');
INSERT INTO `stu` VALUES ('4', '宋永合', '18', '男', '成都', '4500');
INSERT INTO `stu` VALUES ('5', '宋永合', '20', '女', '湖北', '1000');-- ----------------------------
-- Table structure for tb_year
-- ----------------------------
DROP TABLE IF EXISTS `tb_year`;
CREATE TABLE `tb_year` (`year` int(11) default NULL,`zz` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_year
-- ----------------------------
INSERT INTO `tb_year` VALUES ('2010', '100');
INSERT INTO `tb_year` VALUES ('2011', '150');
INSERT INTO `tb_year` VALUES ('2012', '250');
INSERT INTO `tb_year` VALUES ('2013', '800');
INSERT INTO `tb_year` VALUES ('2014', '1000');

mysql多表联合查询练习题相关推荐

  1. mysql教程详解之多表联合查询,MYSQL教程mysql多表联合查询返回一张表的内容实现代码...

    搜索热词 <MysqL教程MysqL多表联合查询返回一张表的内容实现代码>要点: 本文介绍了MysqL教程MysqL多表联合查询返回一张表的内容实现代码,希望对您有用.如果有疑问,可以联系 ...

  2. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  3. MySQL 多表联合查询有何讲究?

    今天我们来聊聊微信中的多表联合查询,应该是小表驱动大表还是大表驱动小表? 1. in VS exists 在正式分析之前,我们先来看两个关键字 in 和 exists. 假设我现在有两张表:员工表和部 ...

  4. MySQL多表联合查询

    阅读目录 部门.员工表数据 内连接 inner join 外连接 outer join 左外连接 右外连接 自连接 联合查询 交叉连接 cross join 笛卡尔积 子查询 标量子查询 列子查询 行 ...

  5. MYSQL多表联合查询排序

    主要思想:先联合查询数据,再对查询结果按照某标签进行排序 code: String sql = "SELECT * FROM (SELECT task.idTask,task.task_na ...

  6. Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: [sql] view plaincopy print? S ...

  7. mysql 多表联合查询怎么一行显示_使用 explain 优化你的 mysql 性能

    本文是关于在学习<高性能 Mysql>附录 D 中关于 Explain 如何获取执行计划信息相关总结.MySQL 提供了一个 EXPLAIN 命令,它可以对 SELECT 语句进行分析,获 ...

  8. mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例

    1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...

  9. mysql 多表 查询慢_详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOI ...

最新文章

  1. ASPNET 页面编码
  2. docker 标记和推送镜像
  3. Visual Studio 竖向选择功能
  4. host 和TNS设置
  5. Socket常见错误代码与描述
  6. MySQL:定时任务被拒绝
  7. edpluse怎么运行c语言,[JSP]小菜也来学Editplus+Tomcat配置jsp运行环境
  8. 计算机d盘不显示容量,电脑D盘可用空间小,可是看不到文件
  9. mfc实验报告心得体会_mfc实验报告.doc
  10. crontab日常使用梳理
  11. Android中转到定义怎么,Android中添加自己的模块 【转】
  12. crt连接中兴服务器,利用SecureCRT实现中兴C220自动登录
  13. a服务器读取b服务器文件乱码,java 读取oracle中文乱码
  14. 百度网盘文件管理助手 – 多账号多开浏览器
  15. iphone麦克风_如何从iPhone或iPad上的蓝牙麦克风录制音频
  16. Kotlin Sealed Class
  17. 【全局面包屑导航】依据路由动态生成面包屑导航
  18. AB ? Angelababy ? 噢不,拒绝老板拍板决策的神器 !用数据说话的决策实验平台 —— AbTest !
  19. Ubuntu 22 安装gcc7 g++7
  20. C#使用post方式调用接口获取Token及调用网页地址

热门文章

  1. maven 打的jar包很小
  2. 09岁末看安全行业群雄争霸(转)
  3. Python爬取新浪新闻评论的url查找方法
  4. android 高德地图设置不能旋转_高德正在内测的公交实时查询APP
  5. DEDECMS网站搬家到服务器上后台登陆验证码不显示问题
  6. 【项目分享~写给应届生的一篇文章】基于Web企业招聘网站 ~~ 登录注册设计2
  7. iOS开发画虚线的方法
  8. 重磅丨十四五国家信息规划:部署了10项重大任务,10项优先行动(附PDF原文)...
  9. c语言郑莉第四版答案,C语言程序设计(郑莉)课后习题答案
  10. C++虚函数表解析 (Lawliet 修改+注释版)(附有部分网友的重要评论)