zoukankan      html  css  js  c++  java
  • MySQL 数据库查询练习

    -- ----------------------------
    -- mysql练习sql脚本
    -- ----------------------------
    create database db10;            -- 创建db10数据库
    use db10;                        -- 切换到db10数据库
    create table dept(                -- 创建部门表
        deptno int primary key,        -- 部门编号
        deptname varchar(50),        -- 部门名称
        loc varchar(50)                -- 部门位置
    );
    create table emp(                -- 创建员工表
        empno int primary key,        -- 员工编号 primary key设置主键:值必须唯一且不能为空
        empname varchar(50),        -- 员工姓名
        job varchar(50),            -- 职位
        mgr int,                    -- 直属上级
        hiredate date,                -- 受雇日期
        sal int,                    -- 薪资
        comm int,                    -- 奖金
        deptno int,                    -- 所在部门编号
        foreign key(deptno) references dept(deptno)
    );
    -- ----------------------------
    -- Records of dept 部门表数据
    -- ----------------------------
    INSERT INTO `dept` VALUES ('10', '会计部', '北京');
    INSERT INTO `dept` VALUES ('20', '调查部', '杭州');
    INSERT INTO `dept` VALUES ('30', '销售部', '上海');
    INSERT INTO `dept` VALUES ('40', '营销部', '深圳');
    
    -- ----------------------------
    -- Records of emp 员工表数据
    -- ----------------------------
    INSERT INTO `emp` VALUES ('7369', '张无忌', '办事员', '7902', '1980-12-17', '800', null, '20');
    INSERT INTO `emp` VALUES ('7499', '曹操', '推销员', '7698', '1981-02-20', '1600', '300', '30');
    INSERT INTO `emp` VALUES ('7521', '杨志', '推销员', '7698', '1981-02-22', '1250', '500', '30');
    INSERT INTO `emp` VALUES ('7566', '朱元璋', '经理', '7839', '1981-04-02', '2975', null, '20');
    INSERT INTO `emp` VALUES ('7654', '殷天正', '推销员', '7698', '1981-09-28', '1250', '1400', '30');
    INSERT INTO `emp` VALUES ('7698', '张三丰', '经理', '7839', '1981-05-01', '2850', null, '30');
    INSERT INTO `emp` VALUES ('7782', '关羽', '经理', '7839', '1981-06-09', '2450', null, '10');
    INSERT INTO `emp` VALUES ('7788', '宋江', '分析员', '7566', '1987-04-19', '3000', null, '20');
    INSERT INTO `emp` VALUES ('7839', '韩少云', '董事长', null, '1981-11-17', '5000', null, '10');
    INSERT INTO `emp` VALUES ('7844', '孙二娘', '推销员', '7698', '1981-09-08', '1500', '0', '30');
    INSERT INTO `emp` VALUES ('7876', '张飞', '办事员', '7788', '1987-05-23', '1100', null, '20');
    INSERT INTO `emp` VALUES ('7900', '赵云', '办事员', '7698', '1981-12-03', '950', null, '30');
    INSERT INTO `emp` VALUES ('7902', '诸葛亮', '分析员', '7566', '1981-12-03', '3000', null, '20');
    INSERT INTO `emp` VALUES ('7934', '夏侯惇', '办事员', '7782', '1982-01-23', '1300', null, '10');

    要求:

    -- 1.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
    
    -- 2.列出薪资比关羽高的所有员工。
    
    -- 3.列出所有员工的姓名及其直接上级的姓名。
    
    -- 4.列出最低薪资大于1500的各种职位及从事此职位的员工人数。
    
    -- 5.列出在销售部职位的员工的姓名,假定不知道销售部的部门编号。
    
    -- 6.列出与曹操从事相同职位的所有员工及部门名称。
    
    -- 7.列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。
    
    -- 8.列出在每个部门职位的员工数量、平均工资。
    
    -- 9.查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。
    
    -- 10.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
    
    -- 11.列出所有职员的姓名及其部门名称,部门的人数。

    答案:

    +----------+-------+---------+--------+------+------------+------+------+--------+
    | deptname | empno | empname | job    | mgr  | hiredate   | sal  | comm | deptno |
    +----------+-------+---------+--------+------+------------+------+------+--------+
    | 会计部   |  7782 | 关羽    | 经理   | 7839 | 1981-06-09 | 2450 | NULL |     10 |
    | 会计部   |  7839 | 韩少云  | 董事长 | NULL | 1981-11-17 | 5000 | NULL |     10 |
    | 会计部   |  7934 | 夏侯惇  | 办事员 | 7782 | 1982-01-23 | 1300 | NULL |     10 |
    | 调查部   |  7369 | 张无忌  | 办事员 | 7902 | 1980-12-17 |  800 | NULL |     20 |
    | 调查部   |  7566 | 朱元璋  | 经理   | 7839 | 1981-04-02 | 2975 | NULL |     20 |
    | 调查部   |  7788 | 宋江    | 分析员 | 7566 | 1987-04-19 | 3000 | NULL |     20 |
    | 调查部   |  7876 | 张飞    | 办事员 | 7788 | 1987-05-23 | 1100 | NULL |     20 |
    | 调查部   |  7902 | 诸葛亮  | 分析员 | 7566 | 1981-12-03 | 3000 | NULL |     20 |
    | 销售部   |  7499 | 曹操    | 推销员 | 7698 | 1981-02-20 | 1600 |  300 |     30 |
    | 销售部   |  7521 | 杨志    | 推销员 | 7698 | 1981-02-22 | 1250 |  500 |     30 |
    | 销售部   |  7654 | 殷天正  | 推销员 | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
    | 销售部   |  7698 | 张三丰  | 经理   | 7839 | 1981-05-01 | 2850 | NULL |     30 |
    | 销售部   |  7844 | 孙二娘  | 推销员 | 7698 | 1981-09-08 | 1500 |    0 |     30 |
    | 销售部   |  7900 | 赵云    | 办事员 | 7698 | 1981-12-03 |  950 | NULL |     30 |
    +----------+-------+---------+--------+------+------------+------+------+--------+
    
    -- 1.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
    /*
    列: deptname, emp.*
    条件: emp.deptno=dept.deptno
     */
    select d.deptname, e.* 
    from dept d left join emp e 
    on e.deptno=d.deptno;
    
    
    
    -- 2.列出薪资比关羽高的所有员工。
    /*
    列: emp.*
    表: emp
    条件: sal>(关羽的薪资)
     */
    -- 求出关羽的薪资:
    
    select * 
    from emp
    where sal> (select sal from emp where empname='关羽');
    
    -- 3.列出所有员工的姓名及其直接上级的姓名。
    /*
    列: e1.empname, (直接上级)e2.empname
    表: emp e1, emp e2
    条件: e1.mgr=e2.empno
     */
    select e1.empname, e2.empname
    from emp e1, emp e2
    where e1.mgr=e2.empno;
    
    -- 4.列出最低薪资大于1500的各种职位及从事此职位的员工人数。
    /*
    列: job  员工人数
    表: emp
    条件: 最低薪资(分组)>1500
    分组条件: job
     */
    
    select job, min(sal) 最低工资, count(*) 员工人数 
    from emp
    group by job
    having min(sal)>1500;
    
    -- 5.列出在销售部的员工的姓名,假定不知道销售部的部门编号。
    /*
    列: empname
    表: dept d, emp e
    条件: d.deptname='销售部'   d.deptno=e.deptno
     */
    select e.empname, d.deptname 
    from dept d, emp e
    where d.deptname='销售部' and  d.deptno=e.deptno;
    
    -- 6.列出与曹操从事相同职位的所有员工及部门名称。
    /*
    列: e.empname d.deptname
    表: emp e, dept d
    条件: job='曹操的职位'  e.deptno=d.deptno
     */
    select e.empname, d.deptname, e.job
    from emp e, dept d
    where e.deptno=d.deptno and job=(select job from emp where empname='曹操');
    
    -- 7.列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。
    /*
    列: e.empname, e.sal, d.deptname
    表: emp e, dept d
    条件: e.deptno=d.deptno sal> (30号部门的最高薪资) 
     */
    select d.deptname, e.*  /*select d.deptname, e.sal, e.empname*/
    from emp e, dept d
    where e.deptno=d.deptno and e.sal > (select max(sal) from emp where deptno=30);
    
    
    
    -- 8.列出在每个部门职位的员工数量、平均工资。
    /*
    列: 员工数量, 平均工资
    表: emp 
    分组条件: deptno
    聚合函数: count(*), avg(sal)
     */
    select deptno, count(*) 员工数量, avg(sal) 平均工资
    from emp
    group by deptno;
     
    
    -- 9.查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。
    /*
    列: 部门人数(count(*))  d.deptno, d.deptname, d.loc
    表: emp e, dept d
    条件: e.deptno=d.deptno
    分组条件: e.deptno
     */
    select d.*, count(*) 部门人数
    from emp e, dept d
    where e.deptno=d.deptno
    group by e.deptno;
    
    
    -- 10.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
    /*
    列: e.empno, e.empname, d.deptname
    表: emp e1, emp e2, dept d
    条件: e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno
     */
    select e1.empno, e1.empname, d.deptname
    from emp e1, emp e2, dept d
    where e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno;
    
    
    -- 11.列出所有职员的姓名及其部门名称,部门的人数。
    /*
    张三丰  调查部 6
    列: e.empname, count(*)(分组e.deptno), d.deptname
    表: emp e, dept d
    条件: e.deptno=d.deptno
    分组条件: e.deptno
     */
    --查询员工及对应的部门
    select e.empname, d.deptname, d.deptno
    from emp e, dept d
    where e.deptno=d.deptno;
    
    --查询部门的人数
    select deptno, count(*) cnt
    from emp
    group by deptno
    
    --关联查询
    select e.empname, d.deptname, e.deptno, e2.cnt 部门人数
    from emp e, dept d, (
        select deptno, count(*) cnt
        from emp
        group by deptno
    ) e2
    where e.deptno=d.deptno and e.deptno=e2.deptno;
  • 相关阅读:
    视频质量评测标准——VMAF
    净化网络环境!可信数字内容版权服务解决方案发布
    如何用sysbench做好IO性能测试
    云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
    CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路
    阿里巴巴持续投入,etcd 正式加入 CNCF
    阿里系统软件迎战“双11”超高流量峰值全纪录
    从SQL Server CloudDBA 看云数据库智能化
    ls -l 权限后面有个点
    Error File: /admin/app/template.app.php at 285 line.
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9642180.html
Copyright © 2011-2022 走看看