zoukankan      html  css  js  c++  java
  • SQL实战(二)

    一、

    获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
    结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
    CREATE TABLE `dept_emp` (
    `emp_no` int(11) NOT NULL,
    `dept_no` char(4) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `dept_manager` (
    `dept_no` char(4) NOT NULL,
    `emp_no` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));

     

    这道题是读取dept_emp 中的 当前员工(9999-01-01)的部门(d001),从dept_manager 中读取该部门的经理(10002)。注意同一个人的话不输出。

    1、

    select e.emp_no,m.emp_no from dept_emp as e,dept_manager as m
    where e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"
    

    注意是靠部门联系两个表,然后再判断 具体条件

    2、join

    select e.emp_no,m.emp_no as manager_no  --改名为manager_no
    from dept_emp as e join dept_manager as m
    on e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"
    

    3、left join

    select e.emp_no,m.emp_no as manager_no  --改名为manager_no
    from dept_emp as e left join dept_manager as m
    on e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"
    where manager_no is not NUll
    

    左连接去掉NULL。

    二、

    获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
    CREATE TABLE `dept_emp` (
    `emp_no` int(11) NOT NULL,
    `dept_no` char(4) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));

    十个人六个部门,有重叠,找最高.

    可以看到d001部门有两个员工,10001和1002,一个表中不能将1001和1002和为一类比较。所以得先用join连接两个表,而不能直接from a,b这种形式。

    1、

    select d.dept_no,d.emp_no,max(s.salary) from dept_emp as d 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  --按部门分组,找最大的
    

    2、

    select d.dept_no,d.emp_no,s.salary from dept_emp as d 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  --按部门分组,找最大的
    
    having max(s.salary)  --函数放最后
    

    三、

    题目描述

    从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
    CREATE TABLE IF NOT EXISTS "titles" (
    `emp_no` int(11) NOT NULL,
    `title` varchar(50) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date DEFAULT NULL);

    统计职称人数

    group by 分组,count 统计个数,having 控制条件

    1、

    select title,count(title) as t from titles 
    
    group by title
    

    四、

    题目描述

    从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
    注意对于重复的emp_no进行忽略。
    CREATE TABLE IF NOT EXISTS "titles" (
    `emp_no` int(11) NOT NULL,
    `title` varchar(50) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date DEFAULT NULL);

    where和having的不同之处在于,where是查找之前的限定,而having是查找之后。 

    这道题是去这两个重

    首先按engineer分组,然后按10010 去重

    1、

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

     2、

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

    这里注意名称的命名  

    五、

    题目描述

    查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));

    select * from employees as e
    where e.emp_no%2==1 and e.last_name!="Mary"
    order by hire_date desc
    

    六、

    题目描述

    统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    CREATE TABLE IF NOT EXISTS "titles" (
    `emp_no` int(11) NOT NULL,
    `title` varchar(50) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date DEFAULT NULL);

    1、

    select t.title,avg(s.salary) from titles as t join salaries as s --合并表
    on t.emp_no=s.emp_no and t.to_date="9999-01-01" and s.to_date="9999-01-01"--三个条件,人和职位对应起来,对应现在的工资,现在的人
    group by t.title --按职位分类

    虽然能通过测试,这段程序还是有问题的,如果向上题那样重复记录了,其实计算就是错误的。

    七、

    题目描述

    获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    1、
    条件限制,排序,读取
    select emp_no,salary from salaries
    where to_date="9999-01-01"
    order by salary desc
    limit 1,1
    

    2、上面这段程序并没有考虑重复的情况

    用distinct 去重复

    select emp_no,salary from salaries
    where to_date="9999-01-01" and salary=(select distinct salary from salaries where to_date="9999-01-01" order by salary desc limit 1,1)
    

    3、比较大小的方式

    select emp_no,max(salary) from salaries
    where to_date="9999-01-01" and salary <(select max(salary) from salaries)
    

    先读取最大的,然后比较选出次大的

    八、

    查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));  

    1、不用排序就是用比较的方法

    select e.emp_no,max(s.salary),e.last_name,e.first_name from employees as e,salaries as s
    where e.emp_no=s.emp_no and s.to_date="9999-01-01" and s.salary <(select max(salary) from salaries where to_date="9999-01-01")
    

    九、

    查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
    CREATE TABLE `departments` (
    `dept_no` char(4) NOT NULL,
    `dept_name` varchar(40) NOT NULL,
    PRIMARY KEY (`dept_no`));
    CREATE TABLE `dept_emp` (
    `emp_no` int(11) NOT NULL,
    `dept_no` char(4) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));  

    输出结果如下才对

    没有部门的显示none,10010编号的显示了两次

    三个表,6个部门,11个人对应于部门,每个人情况表

     首先employees和dept_emp左连接形成一个表,然后再左连接departments 形成新的表.考察left join的双层嵌套

    select e.last_name,e.first_name,de.dept_name   --所有获取的内容放在前面
    
    from (employees as e left join dept_emp as dp on e.emp_no=dp.emp_no) --第一层left join,形成新的表
    
    left join departments as de on de.dept_no=dp.dept_no --第二层left join 
    

    十、

    查找员工编号emp_now为10001其自入职以来的薪水salary涨幅值growth
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));  

    1、默认递增排列的

    select max(s.salary)-min(s.salary) as growth from salaries as s
    
    where s.emp_no="10001"

    注意growth的生成,只能select ...as...的形式  

    2、排序,找出第一个和最后一个

    select (
    (select salary from salaries where emp_no="10001" order by from_date desc limit 0,1)
    -
    (select salary from salaries where emp_no="10001" order by from_date  limit 0,1)
    )
    as growth 
    
  • 相关阅读:
    【C++】未定义的标识符“_TCHAR*”
    【C++】编写动态库DLL
    【C++】使用SQLite步骤及示例
    【VS】如何查询该项目是什么样工程类型
    新概念英语第一册单词
    地道情景表达一
    日常学习经典口语一
    全国省市区sql脚本
    关于Object.defineProperty
    响应式原理
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/8973264.html
Copyright © 2011-2022 走看看