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

2021-09-06 14:17:12 浏览数 (1)

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

第一章 检索数据

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

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

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

代码语言:javascript复制
select sal as salary, comm as commission
  from emp
 where salary < 5000;

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

代码语言:javascript复制
select *
  from (
select sal as salary, comm as commission
  from emp
       ) x
 where salary < 5000;

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

代码语言:javascript复制
select concat(cname, ' WORKS AS A ', job) from emp;

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

代码语言:javascript复制
select ename || ' WORKS AS A '|| job from emp;

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

代码语言:javascript复制
select ename   ' WORKS AS A '   job from emp;

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

代码语言:javascript复制
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),

代码语言:javascript复制
select * from emp where rownum <= 5;

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

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

代码语言:javascript复制
select coalesce(c, 0) from emp;

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

代码语言:javascript复制
select case
       when c is not null then c
       else 0
       end
  from emp;

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

9. 随机返回记录

DB2,

代码语言:javascript复制
select ename, job
  from emp
 order by rand() fetch first 5 rows only;

MySQL,

代码语言:javascript复制
select ename, job
  from emp
 order by rand() limit 5;

PG,

代码语言:javascript复制
select ename, job
  from emp
 order by random() limit 5;

Oracle,

代码语言:javascript复制
select *
  from (
select ename, job
  from emp
 order by dbms_random.value()
          )
 where rownum <= 5;

SQL Server,

代码语言:javascript复制
select *
  from (
select ename, job
  from emp
 order by dbms_random.value()
          )
 where rownum <= 5;

0 人点赞