SQL技巧(1)检索记录

(Molinaro-SQL cookbook笔记)

1.检索所有列和行(*匹配所有列)

select *
from emp
Better style:

select  empno, ename, job, sal, mgr, hiredate, comm, deptno
from emp

两者性能相同,但列出所有列的名称提高了可读性。


2.检索满足条件的行

多数厂商都支持的where中的运算符

=   <   >   <=   >=   !   <>

逻辑运算符优先级:
not > and > or
所以

where deptno = 10 or comm is not null or sal <= 2000 and deptno=20
等价于

where deptno = 10 or comm is not null or (sal <= 2000 and deptno=20)


3.select语句和where语句中的别名

select sal as salary, comm as commission
from emp
但是select-from-where的执行顺序为

from->where->select, 在where运行是别名并不存在,可以使用内联视图(inline view)解决:

select *
from (
         select sal as salary, comm as commission
         from emp
    ) X
where salary < 5000
其中内联视图的别名为X,并非所有数据库都需要显示命名,但所有数据库都接受这种方式。


4.连接列值

Oracle,PostgreSQL

select ename || 'work as' || job as msg
MySQL
select concat (ename, 'work as' , job) as msg
SQL server
select ename + 'work as' + job as msg


5.select语句中的条件逻辑

ENAMESALSTATUS
SMITH800UNDERPAID
ALLEN4200OVERPAID
WARD2450OK

select ename, sal,
       case when sal <= 2000 then 'UNDERPAID'
            when sal >= 4000 then 'OVERPAID'
            else 'OK'
       end as status
from emp
未匹配的行会返回NULL


6.限制返回行数

DB2

select *
from emp fetch first 5 rows only
MySQL, PostgreSQL

select * 
from emp limit 5
Oracle

select * 
from emp
where rownum <= 5
注:无法用rownum = 5来返回第五行,获取的每一行由于不满足 rownum = 5永远都重新计算为第1行

SQL Server

select top 5 *
from emp

7.随即返回n条记录

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
PostgreSQL
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 top 5 ename, job
from emp
order by newid()
注:在ORDER BY中使用数字常量,根据select列表中相应位置的列排序,在ORDER BY中使用函数时,按函数在每一行计算结果。

8.查找空值

select *
from emp
where comm is null
NULL不能用等于和不等于跟任何值比较(包括自身),必须使用IS NULL/ IS NOT NULL

9.将空值转换为实际值

select coalesce(comm, 0)
from emp
若comm非空,返回comm值,否则返回0


10.按模式搜索

select ename, job
from emp
where deptno in (10, 20) and (ename like '%I%' or job like ’%ER')
在部门10和部门20, 返回名字中有‘I’或者职务中以‘er'结尾的员工。

IN 操作符: 在 WHERE 子句中规定多个值, IN (value1,value2,...)

通配符: % 匹配任何字符  _匹配单个字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值