SQL实例学习(一)

检索记录

检索所有行和列

  1. 代码

    # 查询表中所有数据
    select * from EMP;
    
    # 查询具体制定的列
    select EMPNO, ENAME, JOB, SAL, MGR, HIREDATE, COMM, DEPTNO from EMP;
    

筛选行

  1. 代码

    # 筛选行, 查看满足条件的行
    select * from EMP where DEPTNO = 10;
    

查找满足多个查询条件的行

  1. 代码

    # 查找满足多个条件的行
    select *
    from EMP
    where DEPTNO = 10
       or COMM is not null
       or SAL <= 2000 and DEPTNO = 20;
    

筛选列

  1. 代码

    # 筛选列
    select ENAME, DEPTNO, SAL
    from EMP;
    

创建有意义的列名

  1. 代码

    # 创建有意义的列名,使用AS创建别名
    select SAL as salary, COMM as commission
    from EMP;
    

在where子句中引用别名列

  1. 错误代码

    # 执行会报错
    select SAL as salary, COMM as commission 
    from EMP
    where salary < 5000;
    
  2. 正确代码,使用内嵌视图

    # 使用别名
    select *
    from (select SAL as salary, COMM as commission from EMP) x
    where salary < 5000;
    
  3. 说明, where子句会比select子句先执行,就失败的例子而言,当where子句被执行时,salary和commission尚不存在。直到where子句执行完毕,别名才会生效。from子句会先于where子句查询。

串联多列的值

  1. 查找结果的值

    ENAME JOB
    CLARK MANAGER
    KING PRESIDENT
    MILLER CLERK
  2. 想要的结果

    CLARK WORKS AS AMANAGER
    KING WORKS AS APRESIDENT
    MILLER WORKS AS ACLERK
    
  3. 代码

    # 串联多列的值
    # CONCAT函数可以串联多列的值
    select concat(ENAME, ' WORKS AS A', JOB) as msg
    from EMP
    where DEPTNO = 10;
    

在select语句里使用条件逻辑

  1. 代码

    # select语句里使用条件逻辑
    select ENAME,
           SAL,
           case
             when SAL <= 2000 then 'UNDERPAID'
             when SAL >= 4000 then 'OVERPAID'
             else 'OK'
               end as status
    from EMP;
    
  2. 结果

    ENAME SAL STATUS
    SMITH 800 UNDERPAID
    ALLEN 1600 UNDERPAID
    WARD 1250 UNDERPAID
    JONES 2975 OK
    MARTIN 1250 UNDERPAID
    BLAKE 2850 OK
    CLARK 2450 OK
    SCOTT 3000 OK
    KING 5000 OVERPAID
    TURNER 1500 UNDERPAID
    ADAMS 1100 UNDERPAID
    JAMES 950 UNDERPAID
    FORD 3000 OK
    MILLER 1300 UNDERPAID

限定返回行数

  1. 代码

    # 限定返回的行数
    select *
    from EMP
    limit 5;
    

随机返回若干行记录

  1. 代码

    # 随机返回若干行记录
    select ENAME, JOB
    from EMP
    order by rand()
    limit 5;
    

查找null值

  1. 代码

    # 查找null值
    select *
    from EMP
    where COMM is null;
    

把null值转换为实际值

  1. 代码

    # 把null值转换为实际值
    # coalesce函数会返回参数列表里的第一个非null值。
    select coalesce(COMM, 0), ENAME
    from EMP;
    
    # 使用case
    select case
             when COMM is not null then COMM
             else 0 end
    from EMP;
    

查找匹配项

  1. 代码

    # 查询匹配项
    # '%I%'表示任意位置出现I的字符串都会检索出来,'%ER'表示检索以ER结尾的字符串
    select ENAME, JOB
    from EMP
    where DEPTNO in (10, 20)
      and (ENAME like '%I%' or JOB like '%ER');
    

查询结果排序

指定顺序返回查询结果

  1. 代码

    # sal从小到大
    select ENAME, JOB, SAL
    from EMP
    where DEPTNO = 10
    order by SAL asc;
    

多字段排序

  1. 代码

    # 先按照DEPTNO升序,然后再按照SAL降序排列
    select EMPNO, DEPTNO, SAL, ENAME, JOB
    from EMP
    order by DEPTNO, SAL desc;
    

依据子句排序

  1. 代码

    # 按照职位字段的最后两个字符对检索结果进行结果
    select ENAME, JOB
    from EMP
    order by substr(JOB, length(JOB) - 2);
    

排序时对null值的处理

  1. 代码

    # 排序时对null值的处理
    # 添加辅助列进行排序
    select ENAME, SAL, COMM
    from (select ENAME, SAL, COMM, case when COMM is null then 0 else 1 end as is_null from EMP) x
    order by is_null desc, COMM;
    

根据条件逻辑动态调整排序项

  1. 代码

    # 根据条件逻辑动态调整排序项
    select ENAME, SAL, JOB, COMM
    from EMP
    order by case when JOB = 'SALESMAN' then COMM else SAL end;
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 5,866评论 0 2
  • 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资? –查询工资最高和最低的工资是多少? –查询公...
    C_cole阅读 12,032评论 0 3
  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 4,826评论 0 0
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 5,227评论 0 0
  • 找男朋友时,大家都说婚姻只有一次,要慎重选择,准备婚礼时,大家都说,这些都要都要,所以攀比礼金,酒席,钻戒,蜜月等...
    Refreshment阅读 4,014评论 0 1