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

    一、

    题目描述

    查找排除当前最大、最小salary之后的员工的平均工资avg_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、三个条件,to-date max(salary) min(salary)

    select avg(salary) as avg_salary from salaries where
    (salary not in (select max(salary) from salaries )
    and salary not in (select min(salary) from salaries)
    and to_date='9999-01-01')
    

    2、

    select (sum(salary)-max(salary)-min(salary))/(length(salary)-2) as avg_salary from salaries
    where to_date='9999-01-01'
    

    这种方法通过不了,不知道为什么。

    二、

    分页查询employees表,每5行一页,返回第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`));

    select * from employees
    limit 5 offset 5

    select * from employees
    limit 5,5
    

    三、

    题目描述

    获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和recevied,没有分配具体的员工不显示
    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`));
    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 de.emp_no as dept_no,de.dept_no as dept_no,em.btype ,em.recevied  from dept_emp as de 
    left join emp_bonus as em
    on de.emp_no=em.emp_no
    

    四、

    题目描述

    使用含有关键字exists查找未分配具体部门的员工的所有信息。
    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 `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`));
    数据见上题
    1、
    select * from employees 
    where(emp_no not in (select emp_no from dept_emp))
    

    2、使用exists

    select * from employees as em
    where not exists (select emp_no from dept_emp as de where de.emp_no=em.emp_no)

    比较exists 和 in

    这是同一个表的两次比较。date=2011-7-1时,7-2和7-3大于它,所以存在满足的条件,not exist 就会使不输出。同理7-2也是,但是7-3时,没有满足的条件,not exists 翻转下后,就有 的输出了。

    distinct作用于所有列。

    group by与聚合函数共同使用。

    五、

    题目描述

    存在如下的视图:
    create view emp_v as select * from employees where emp_no >10005;
    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`));
    获取employees中的行数据,且这些行也存在于emp_v中。注意不能使用intersect关键字。

    1、

    SELECT em.* FROM employees AS em, emp_v AS ev WHERE em.emp_no = ev.emp_no
    

    2、

    SELECT * FROM emp_v
    

    六、

    获取有奖金的员工相关信息。
    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 `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 emp_bonus(
    emp_no int not null,
    recevied datetime not null,
    btype smallint not null);
    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`));
    给出emp_no、first_name、last_name、奖金类型btype、对应的当前薪水情况salary以及奖金金额bonus。 bonus类型btype为1其奖金为薪水salary的10%,

    btype为2其奖金为薪水的20%,其他类型均为薪水的30%。 当前薪水表示to_date='9999-01-01' 

    case的应用

    select em.emp_no,em.first_name,em.last_name,bon.btype,s.salary,
    (    case bon.btype
            when 1 then s.salary*0.1
            when 2 then s.salary*0.2
            else s.salary*0.3
        end )as bonus
    from employees as em join emp_bonus as bon
    on em.emp_no=bon.emp_no
    join salaries as s
    on s.to_date='9999-01-01' and s.emp_no=em.emp_no
    

    七、

    题目描述

    按照salary的累计和running_total,其中running_total为前两个员工的salary累计和,其他以此类推。 具体结果如下Demo展示。。
    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`));
    select s1.emp_no,s1.salary,
    (select sum(s2.salary) from salaries as s2 
     where s2.emp_no<=s1.emp_no and s2.to_date='9999-01-01') as running_total 
    from salaries as s1 where s1.to_date='9999-01-01'
    

    一表两用的比较方法。

    八、

    题目描述

    对于employees表中,给出奇数行的first_name
    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 e1.first_name from
    (select e2.first_name,(select count(*) from employees as e3 where e2.first_name<=e3.first_name)as row_num from employees as e2)as e1
    where e1.row_num%2=1

    1、first_name排序而非emp_no 排序,所以不是1357这样式的。

    2、一定要注意嵌套里的名称对应关系。  

     黄色部分是统计的按名称的排序

    绿色部分是将名称和对应的排序(添加新的名字 row_num)连接。

    赋予新的名字,然后判断输出。

    select B.new_name from (select A.neme  as  new_name  from A) as B 双层嵌套的格式,一定要注意名字。

  • 相关阅读:
    用XYNTService把Python程序变为服务
    今天被坑了,而且被坑的好爽! 该死的UTF-8 有 BOM 格式编码
    php 图片上传 500 Internal Server Error 错误
    Linux下 PHP 安装pecl_http方法
    PHP压缩html网页代码原理(清除空格,换行符,制表符,注释标记)
    一段代码让DedeCMS完美兼容PHP5.4
    win7+ oracle +php环境的搭建
    在netbeans下使用调试PHP的插件XdeBug
    使用webbench做压力测试
    ubuntu 13.04 nginx.conf 配置详解
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/8999853.html
Copyright © 2011-2022 走看看