美文网首页
ODPS教程:快速掌握SQL写法

ODPS教程:快速掌握SQL写法

作者: youyuge | 来源:发表于2020-04-21 22:01 被阅读0次

    实战案例:https://help.aliyun.com/document_detail/51009.html?spm=a2c4g.11186623.2.20.4e6b1ad7ljabib

    一、创建数据库与表

    和原链接中一致,将string替换成MySQL中的varchar(256)

    二、导入数据

    使用本地MySQL导入txt文本:

    mysqlimport -u root -p --local --fields-terminated-by="," aliyun_test1 emp.txt
    

    其中,aliyun_test1代表数据库名称,emp.txt代表了数据文件的路径为cmd当前目录下的txt文件,也代表了table名称为emp。若没事先建表则会报错,说表 aliyun_test1.emp不存在。

    具体mysqlimport命令的使用教程:https://www.runoob.com/mysql/mysql-database-import.html

    • 示例一:列出员工人数大于零的所有部门。
      为了避免数据量太大,您需要使用Join进行改写。
    select a.deptno,a.dname,a.loc,b.num from 
    dept a  join 
    (select deptno, count(*) as num from emp group by deptno) b 
    on a.deptno = b.deptno;
    

    这里在子查询中使用了count函数,故可显示人员数目。这里用了inner join,保证了emp表中未出现的deptno不会出现在结果中。若使用left join,则结果中还会保留。

    或官方解法,其实是使用join改写了where in的写法,效率更高:

    SELECT d.*
    FROM dept d
    JOIN (
        SELECT DISTINCT deptno AS no
        FROM emp
    ) e
    ON d.deptno = e.no;
    

    或where in写法,效率比join低,但是好写(不推荐):

    SELECT d.*
    FROM dept d
    where deptno in(
        SELECT DISTINCT deptno
        FROM emp
    ) ;
    
    • 示例二:列出薪金比SMITH多的所有员工。
    select * from emp where sal > (select sal from emp where ename='SMITH');
    

    官方解法,MapJoin(https://help.aliyun.com/document_detail/73785.html)的典型场景。:

    SELECT /*+ MapJoin(a) */ e.empno
        , e.ename
        , e.sal
    FROM emp e
    JOIN (
        SELECT MAX(sal) AS sal
        FROM `emp`
        WHERE `ENAME` = 'SMITH'
    ) a
    ON e.sal > a.sal;
    

    高效之处:使用了ODPS的mapjoin注释,能有效提高小表的执行速度,此处小表为Smith的sal值,其实就一个值罢了。同时使用join代替了where比较语句,提高了执行效率。

    • 示例三:列出所有员工的姓名及其直接上级的姓名。
      非等值连接。
    select a.empno,a.ename, b.ename as manager 
    from emp a left join emp b 
    on a.mgr = b.empno;
    

    这里用left join,因为老板KING没上级,若用inner join则不会显示KING。

    • 示例四:列出最低薪金大于1500的所有工作。
    select job, min(sal) as sal 
    from emp 
    group by job 
    having sal > 1500;
    

    这里得用having,在group by后做过滤,若用where则是之前过滤。

    • 示例五:列出在每个部门工作的员工数量、平均工资
      平均则要用聚合函数。
    SELECT COUNT(empno) AS cnt_emp
        , ROUND(AVG(sal), 2) AS avg_sal
    FROM emp
    GROUP BY DEPTNO;
    
    • 示例七: 用一个SQL写出每个部门的人数、CLERK(办事员)的人数占该部门总人数占比。
    select deptno, count(*) as num, 
      round( sum(case when 
                  job='CLERK' then 1 else 0 end)
                 / count(*) ,2)
      as clerk_rate from emp group by deptno;
    

    相关文章

      网友评论

          本文标题:ODPS教程:快速掌握SQL写法

          本文链接:https://www.haomeiwen.com/subject/xywpihtx.html