zoukankan      html  css  js  c++  java
  • mysql基础(三)——中级查询

    创建表

    CREATE TABLE DEPT(
        DEPTNO int(2) PRIMARY KEY,
        DNAME VARCHAR(14) ,
        LOC VARCHAR(13) ) ; 
                            
    INSERT INTO DEPT VALUES(10,'ACCOUNTING','NEW YORK');
    INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
    INSERT INTO DEPT VALUES(30,'SALES','CHICAGO');
    INSERT INTO DEPT VALUES(40,'OPERATIONS','BOSTON'); 
    
    
     CREATE TABLE EMP
       (EMPNO int(4) primary key ,
        ENAME VARCHAR(10),
        JOB VARCHAR(9),
        MGR int(4),
        HIREDATE DATE,
        SAL decimal(7,2),
        COMM  decimal(7,2),
        DEPTNO int(2),
        foreign key (DEPTNO) references DEPT (DEPTNO)    
       );
    
     INSERT INTO EMP VALUES
    (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
    INSERT INTO EMP VALUES
    (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);
    INSERT INTO EMP VALUES
    (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30);
    INSERT INTO EMP VALUES
    (7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20);
    INSERT INTO EMP VALUES
    (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);
    INSERT INTO EMP VALUES
    (7698,'BLAKE','MANAGER',7839,'1985-5-1',2850,NULL,30);
    INSERT INTO EMP VALUES
    (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);
    INSERT INTO EMP VALUES
    (7788,'SCOTT','ANALYST',7566,'1987-6-12',3000,NULL,20);
    INSERT INTO EMP VALUES
    (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
    INSERT INTO EMP VALUES
    (7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30);
    INSERT INTO EMP VALUES
    (7876,'ADAMS','CLERK',7788,'1987-6-13',1100,NULL,20);
    INSERT INTO EMP VALUES
    (7900,'JAMES','CLERK',7698,'1981-12-3', 950,NULL,30);
    INSERT INTO EMP VALUES
    (7902,'FORD','ANALYST',7566,'1981-12-3' ,3000,NULL,20);
    INSERT INTO EMP VALUES
    (7934,'MILLER','CLERK',7782,'1982-1-23', 1300,NULL,10);
    
     CREATE TABLE BONUS
        (
        ENAME VARCHAR(10)    ,
        JOB VARCHAR(9)  ,
        SAL int,
        COMM int
        ) ;
    
     
    CREATE TABLE SALGRADE
          ( GRADE int,
        LOSAL int,
        HISAL int );
    
    INSERT INTO SALGRADE VALUES (1,700,1200);
    INSERT INTO SALGRADE VALUES (2,1201,1400);
    INSERT INTO SALGRADE VALUES (3,1401,2000);
    INSERT INTO SALGRADE VALUES (4,2001,3000);
    INSERT INTO SALGRADE VALUES (5,3001,9999);

    表结构

    dept

    emp

     salgrade

    bonus

    =========================================

    开始查询练习(单表查询)

    1.查询所有岗位名称

    select DISTINCT  JOB  from EMP ;

    2.查询所有年薪超过30000的员工信息 

    select e.ENAME ,( e.SAL)*12 as totalsal from EMP e where (e.SAL)*12 > 30000;

    3.查询所有没有奖金的员工信息 
    select * from EMP where (COMM is NULL OR COMM = 0);

    4.查询所有有奖金的员工信息 

    select * from EMP where (COMM is not NULL and comm !=0);

    5.查询所有薪水在2000-4000范围内的员工信息 [not between]
    select * from EMP where SAL BETWEEN 2000 AND 4000;

    6.查询所有部门编号是10或30的员工信息  [not in]
    select * from EMP where DEPTNO IN (10,30);

    select * from EMP where emp.DEPTNO=10 or emp.DEPTNO=30;

    7.查询姓名里面包含ALL的员工姓名 

    select ENAME from EMP WHERE ENAME LIKE ‘%ALL%’;

    8.查询所有以”S”开头的同学 
    select * from EMP WHERE ENAME LIKE ‘S%’;

    9.查询第三个字母为A的员工姓名 (_为占位符号)
    select ENAME from EMP WHERE ENAME LIKE '__A%';

    10.查询所有员工信息,按照部门降序排列,部门内按照薪水升序排列 
    select * from EMP ORDER BY DEPTNO DESC,SAL ASC;

    11.查询雇员表中,姓名为SMITH的雇员,截止到今天共工作了多少周

    SELECT ROUND (datediff(now(),HIREDATE)/7) AS  Weeks  FROM EMP WHERE ENAME = 'SMITH';

    【mysql日期函数详细参考:https://www.cnblogs.com/ggjucheng/p/3352280.html】

    MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

    MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
    select datediff('2008-08-08', '2008-08-01'); -- 7
    select datediff('2008-08-01', '2008-08-08'); -- -7

    MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

    select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
    select timediff('08:08:08', '00:00:00'); -- 08:08:08

    注意:timediff(time1,time2) 函数的两个参数类型必须相同。

    MySQL 为日期减去一个时间间隔:date_sub()

     
    mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
    
    +----------------------------------------------------------------+
    | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
    +----------------------------------------------------------------+
    | 1997-12-30 22:58:59 |
    +----------------------------------------------------------------+
     

    MySQL 为日期增加一个时间间隔:date_add()

    set @dt = now();
    
    select date_add(@dt, interval 1 day); -- add 1 day
    select date_add(@dt, interval 1 hour); -- add 1 hour
    select date_add(@dt, interval 1 minute); -- ...
    select date_add(@dt, interval 1 second);
    select date_add(@dt, interval 1 microsecond);
    select date_add(@dt, interval 1 week);
    select date_add(@dt, interval 1 month);
    select date_add(@dt, interval 1 quarter);
    select date_add(@dt, interval 1 year);
    
    select date_add(@dt, interval -1 day); -- sub 1 day
     MySQL 时间戳(timestamp)转换、增、减函数:
     
    select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
    select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
    select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01
    
    select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
    select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00
    
    MySQL timestampadd() 函数类似于 date_add()。
    select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
    select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
    select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12
    
    select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
     

    mysql时区

    convert_tz(dt,from_tz,to_tz)
    
    select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

    时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

    select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
    select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
    select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

    12.查询‘SMITH’的领导姓名 
    SELECT ENAME FROM EMP WHERE EMPNO = (SELECT MGR FROM EMP WHERE ENAME = ‘SMITH’);  推荐子查询

    select a.* from emp b,emp a where b.ENAME='SMITH'and b.MGR=a.EMPNO

     



    13.查询部门名称是‘SALES’的员工信息 

    select * from emp where emp.DEPTNO = (select d.DEPTNO from dept d where d.DNAME='SALES');

     

    14.查询公司中薪水最高的员工信息

    select * from emp e where e.SAL=(select max(SAL) from emp);

    15.查询各部门的平均薪水及部门编号,要求只有员工姓名中包含 ‘A’才参与统计,只列出平均薪水>1500的,按照平均薪水降序排列 【group by 分组后的条件只能用 having】

    select avg(e.sal),e.DEPTNO from emp e where e.ENAME like '%A%'group by e.DEPTNO having avg(e.sal)>1500 order by avg(e.sal) desc;

     

    16.查询各部门最高薪水的员工信息

    create view vi as select max(emp.SAL) sal, emp.DEPTNO from emp group by emp.DEPTNO;
    select f.* from emp f ,vi v where f.SAL= v.sal and f.DEPTNO = v.DEPTNO;

    or 【in 双向匹配】

    select * from EMP where (deptno,SAL) in (select deptno,MAX(sal) from emp GROUP BY DEPTNO);

    17.查询薪水大于该部门平均薪水的员工信息 

     select * from emp f where f.sal > (select avg(e.sal)  from emp e where e.DEPTNO = f.DEPTNO  ) 

    18.查询薪水等级为4的员工信息

    select * from emp e where e.sal between (select g.LOSAL from salgrade g where g.GRADE=4) and (select g.HISAL from salgrade g where g.GRADE=4);

    19.查询领导者是‘BLAKE’的员工信息

    select * from emp e where e.MGR=(select f.EMPNO from emp f where f.ENAME='BLAKE');

    20.查询不是领导的员工信息 【ifnull() ,not exists】

    select * from emp e1 where not EXISTS (select * from emp e2 where e2.mgr = e1.empno);

    or

    select * from emp e where e.EMPNO not in (select ifnull(f.mgr,0) from emp f );

    IFNULL(expr1,expr2) 

    如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。 是有问题的,0不是null

     

    21.查询平均工资比10部门低的部门编号 

    select  e.DEPTNO,avg(e.sal) from  emp e  group by  e.DEPTNO having avg(e.sal) < (select avg(f.sal) from emp f where f.deptno='10');

    22.查询在纽约工作的所有员工 

    select * from emp e where e.DEPTNO = (select d.DEPTNO from dept d where d.LOC='NEW YORK')

    23.查询‘SALES’部门平均薪水的等级 

    select s.GRADE from salgrade s where

    (select avg(e.sal) avgsal from emp e where e.DEPTNO = (select d.DEPTNO from dept d where d.DNAME='SALES')) between s.LOSAL and s.HISAL;

    24.查询10号部门的员工在整个公司中所占的比例 【dual】

    select (select count(*) from emp e where e.DEPTNO='10')/(select count(*) from emp) FROM dual

    25.每页显示5条。 limit[m,n] m起始页 n每页显示数
    显示第一页内容:

    select  EMP.* from emp where 1=1 limit 0,5

    显示第二页的内容:

    select * from emp where 1=1   limit 5,5;

    26.查询所有领导的信息:要求使用exists关键字【exists 和 in的区别】

    select e.* from emp e  where e.EMPNO in (select f.MGR from emp f);

    select * from emp e1 where EXISTS (select * from emp e2 where e2.mgr = e1.empno);

    “外层查询表小于子查询表,则用exists,外层查询表大于子查询表,则用in,如果外层和子查询表差不多,则爱用哪个用哪个。”

      
  • 相关阅读:
    枚举和字符串转换
    JavaScript string.format
    Jquery 中toggle的用法举例
    JQuery 实现倒计时
    找位置
    图算法
    文件操作总结
    动态规划——总结
    回文字符串
    a+b_1
  • 原文地址:https://www.cnblogs.com/slowcity/p/9212910.html
Copyright © 2011-2022 走看看