zoukankan      html  css  js  c++  java
  • 牛客网数据库SQL实战 1-11

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

    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`));

    解答:limit 的使用,

    通常 limit offset,rows

      一般是用于select语句中用以从结果集中拿出特定的一部分数据。

      offset是偏移量,表示我们现在需要的数据是跳过多少行数据之后的,可以忽略;rows表示我们现在要拿多少行数据。默认是0。

    select * from employees order by hire_date desc limit 1

    注释:limit 的使用

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

    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`));

    解答:同上limit 的使用,倒数第三就是跳2条数据。

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

    3.  查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号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`));
    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`));

    解答:坑点有薪水详情,并不是只有薪水值,剩余的就是利用where连接两个表。

    select salaries.* ,dept_manager.dept_no from salaries,dept_manager
    where dept_manager.to_date='9999-01-01' 
    and salaries.to_date='9999-01-01'
    and salaries.emp_no = dept_manager.emp_no

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

    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`));

    解答:两个表连接,其中右边表值为NULL的元组不显示

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

    5.  查找所有员工的last_name和first_name以及对应部门编号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`));

    解答:两个表连接,左边的表的数据全部显示即使右边表有值为NULL,需要用到外连接。有几种表连接的方式,

    inner join 两边表同时有对应的数据,即任何一边缺失数据就不显示。
    left join 会读取左边数据表的全部数据,即便右边表无对应数据。
    right join 会读取右边数据表的全部数据,即便左边表无对应数据。

    加一个on 和 where 用法的问题,有人说join为什么不用where在后面加选择条件

    因为where会直接对于生成好的临时表进行过滤的。这时已经没有left  join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    select employees.last_name,employees.first_name,dept_emp.dept_no
    from employees left join dept_emp on dept_emp.emp_no=employees.emp_no;

    6.  查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_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`));
    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`));

    解答:入职的情况为  employees.hire_date = salaries.from_date,然后就是逆序函数order by的使用。

    select employees.emp_no, salaries.salary
    from employees, salaries
    where employees.emp_no = salaries.emp_no 
    and employees.hire_date = salaries.from_date
    order by employees.emp_no desc

    7.  查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

    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`));

    解答:首先看题知道输出的涨幅次数为t,所以要用as语句将count(emp_no)的值转换为t,由于count()函数不可用于where语句中,故使用having语句来限定t>15的条件

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

    8.  找出所有员工当前(to_date='9999-01-01')具体的薪水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`));

    解答:使用了distinct 去重。

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

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

    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`));
    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`));

    解答:两个表连接选择选择直接where选择就行了。

    select dept_manager.dept_no, dept_manager.emp_no, salaries.salary from salaries,dept_manager
    where dept_manager.emp_no = salaries.emp_no
    and salaries.to_date = '9999-01-01'
    and dept_manager.to_date = '9999-01-01'

    10.  获取所有非manager的员工emp_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`));
    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`));

    解答:选择那些emp_no不在dept_manager中出现的就是员工

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

    11.  获取所有员工当前的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`));

    解答:

    select dept_emp.emp_no,dept_manager.emp_no as manager_no
    from dept_emp ,dept_manager
    where dept_emp.emp_no != dept_manager.emp_no
    and dept_emp.dept_no = dept_manager.dept_no
    and dept_emp.to_date='9999-01-01'
    and dept_manager.to_date='9999-01-01'

     



  • 相关阅读:
    在C#中子线程如何操作主窗口线程上的控件
    创建数据透视表数据包含合并单元格
    sql,nosql
    Enthought科学计算,数据分析
    程序员常去的14个顶级开发社区
    Windows查看进程taskList,终止进程tskill
    Pandas库之DataFrame
    centos下chm阅读器
    c++回调函数
    __NSAutoreleaseNoPool(): ... utoreleased with no pool in place
  • 原文地址:https://www.cnblogs.com/jkzr/p/10456150.html
Copyright © 2011-2022 走看看