《SQL Cookbook》 - 第一章 检索数据

Posted bisal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《SQL Cookbook》 - 第一章 检索数据相关的知识,希望对你有一定的参考价值。

朋友推荐了一本书《SQL Cookbook》,翻译过来就是《SQL经典实例》,讲的都是SQL编写层面的案例,例如获得随机数、NULL值判断、求中位数、日期计算等,都是日常工作中可能用到的,但是有些知识点可能稍微模糊,用的时候,得琢磨下,或者有些知识点不了解,你不知道通过SQL还可以实现某个功能,借此机会,系统回顾一下SQL相关的开发技能,争取了解之前不知道的,巩固之前模糊的知识点,跟大家共享读书笔记。

第一章 检索数据

1. 在SELECT语句中指定具体的列名,可以确保查询语句不会返回无关的数据。当在整个网络范围内检索数据时,这样做更重要,因为他避免了将时间浪费在检索不需要的数据上。

2. 新的列名被称作别名,他会让检索结果更易于理解,对于一些数据库,可以省略AS关键字,但所有的数据库都支持这个关键字。

3. WHERE子句比SELECT子句率先执行,当WHERE子句执行时,salary和commission尚不存在,直到WHERE子句执行了,这些别名列才会生效,

select sal as salary, comm as commission
  from emp
 where salary < 5000;

然而,FROM子句会先于WHERE子句执行,如果将最初的查询放入一个FROM子句,查询结果就可以在最外层的WHERE子句开始前产生,最外层的WHERE子句就可以“看到”别名列了,

select *
  from (
select sal as salary, comm as commission
  from emp
       ) x
 where salary < 5000;

4. mysql中可以用concat连接多列的值,

select concat(cname, ' WORKS AS A ', job) from emp;

DB2、Oracle和PG使用竖线进行连接,

select ename || ' WORKS AS A '|| job from emp;

SQL Server则使用"+"进行连接,

select ename + ' WORKS AS A ' + job from emp;

5. 可以为CASE表达式的执行结果取一个别名,让结果集更有可读性。ELSE子句是可选的,若没有他,对于不满足测试条件的行,CASE表达式会返回NULL,

select ename, sal,
       case when sal <= 2000 then 'UNDERPAID'
            when sal >= 4000 then 'OVERPAID'
            else 'OK'
       end as status
  from emp;

6. Oracle会在取得某一行数据再为其编号,同时使用rownum和等式条件是不对的,(除rownum = 1),

select * from emp where rownum <= 5;

7. NULL值不会等于或者不等于任何值,而且不能和其自身做比较,不能使用=或者!=,需要使用IS NULL或IS NOT NULL。

可以使用COALESCE将NULL值改为实际值,该函数会返回参数列表第一个非NULL的值,如果c不为0,返回c,否则返回0,

select coalesce(c, 0) from emp;

此处能使用CASE,但是明显COALESCE函数更加方便、更简洁,

select case
       when c is not null then c
       else 0
       end
  from emp;

8. 运算符%可以匹配任意长度的的连续字符,下划线_用于匹配单个字符。

9. 随机返回记录

DB2,

select ename, job
  from emp
 order by rand() fetch first 5 rows only;

MySQL,

select ename, job
  from emp
 order by rand() limit 5;

PG,

select ename, job
  from emp
 order by random() limit 5;

Oracle,

select *
  from (
select ename, job
  from emp
 order by dbms_random.value()
          )
 where rownum <= 5;

SQL Server,

select *
  from (
select ename, job
  from emp
 order by dbms_random.value()
          )
 where rownum <= 5;

近期更新的文章:

梅西 ≠ 一人一城?

小白学习MySQL - 表空间碎片整理方法

Oracle字符串类型扩容隐患

PG逻辑复制的REPLICA IDENTITY设置

Oracle、SQL Server和MySQL的隐式转换异同

文章分类和索引:

《公众号800篇文章分类和索引

以上是关于《SQL Cookbook》 - 第一章 检索数据的主要内容,如果未能解决你的问题,请参考以下文章

Java 7 Concurrency Cookbook 翻译 第一章 线程管理之四

Java 7 Concurrency Cookbook 翻译 第一章 线程管理之六

Java 7 Concurrency Cookbook 翻译 第一章 线程管理之三

Java 7 Concurrency Cookbook 翻译 第一章 线程管理之一

SQL Cookbook:检索记录

《Pandas Cookbook》第02章 DataFrame基本操作