朋友推荐了一本书《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;