SQLCookBook第一章学习日记1

来源:互联网 发布:木马盗号软件 编辑:程序博客网 时间:2024/05/20 22:30

第一章——检索记录

1.1从表中检索所有行和列

问题: 查看表中所有数据

解决方案:对表使用select语句和特殊字符“*”:

select *    from table_name

讨论:

在SQL中,字符“*”具有特殊的含义。使用它,将从指定的表中返回每一列。治理由于没有使用where子句,所以会返回每一行。还有一种方法,就是分别列出每一列:

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

在交互执行的特定查询中,使用select *更容易些,然而,在写代码的时候,最好是分别指定每一列。她们的性能相同,但是,显式地指定列后就可以很清楚产需中究竟返回了哪些列。同样,其他人,而不是编者自己,也更容易理解这样的查询(他们可能不知道查询中表的所有列)

1.2从表中检索部分行

问题:从表中查看满足特定条件的行。

select * from emp    where deptno = 10

讨论:
利用where子句,可以只检索用户感兴趣的行。如果where子句中的表达式对某行为真,则返回该行。

多数厂商都支持通用的运算符,例如 =、<、>、<=、>=、!、<>。另外,如果要检索满足多种条件的行,可以使用and or 和圆括号。

1.3查找满足多个条件的行

问题:要返回满足多个条件的行。

select * from emp    where depthno = 10 or comn is not null or sal<=2000 and deptno = 20

讨论:
可以使用and or以及圆括号的组合,来查找满足多个条件的数据,在解决方案的示例中,where中子句查找满足下列条件的数据行:

deptno为10,但是comm不为null 或者工资最多为2000美金,且deptno为20

圆括号中的条件作为一个整体进行判断

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

1.4 从表中检索部分列

问题:要查看一个表中特定列的值,而不是所有列的值。

select ename,deptno,sal from emp 

讨论:
通过在select子句中指定列,可以保证不会返回多余的数据。在跨越网络检索数据时这非常重要,因为这样可以避免不需要的数据所带来的时间的浪费。

1.5为列取有意义的名称

问题:改变查询所返回的列名,使他们更具可读性,更容易理解。例如求每个员工的工资和提成的查询;

select  sal,com from emp

什么是sal,什么是comm?结果的标签应该更明确些。

select sal as salary,comm as commision from emp

讨论:
使用as关键字可以为查询返回的列取个新名,即为这些列取别名,所取得新名就是别名,使用比较好的别名。使用比较好的别名。可以使其他人更容易理解查询结果。

1.6在where子句中引用取别名的列

问题:前面已经使用别名功能,为查询结果提供了更有意义的列名。而且也是用where子句将一些数据排除在外了,然而,我们还想在where子句中引用别名:

select sal as salary,comm as commision  from emp    where salary < 5000

将查询作为内联视图就可以引用其中取别名的列了:

select * from (    select sal as salary ,comm as commission    from emp)   xwhere salary <5000

讨论:对这个简单的例子而言,可以不内联视图,也不在where子句中直接引用comm或sal而得到相同的结果,本方案介绍的方法在下列情形的where子句里都可以使用:

聚集函数标量子查询视窗函数别名

将取别名的查询作为内联视图,便可以在外部查询中引用其中的别名列。为什么要这么做呢?where子句是在select之前进行处理的,这样,在处理求解问题查询的where子句之前,salary和commision并不存在,要到where子句处理完成之后,别名才生效。

然而,from子句是在where之前的处理。将原查询放在from子句中,那么,在最外层的where子句之前,以及最外层的where子句看到别名之前,就已经生成了查询结果。如果表列没有特别命名的话,这个技巧特别有用。

注意:这个解决方案中的内联视图别名为X,并非所有数据库都需要内敛视图显式给内联视图取别名,但一些数据库是这样的。所有的数据库都接受这种方式。

1.7连接列值

问题;将多列值作为一列返回。

select ename,job from empwhere deptno = 10

MySQL
支持concat函数

select concat(ename, 'work as A' ,job) as msqfrom emp    where deptno = 10

DB2,Oracle,PostgreSQL
使用双竖线作为连接运算符

select ename || 'work as A ' || job as ,msgfrom emp    where deptno = 10

SQL Server
使用‘+’进行连接操作

select ename + 'work as A ' +job as msgfrom emp    where deptno = 10

讨论:
使用concat函数连接来自多个列的数值。在db2,oracle和postgresql中,‘||’是concat函数的简写方式 ,”+”是SQL中的简写方式。

0 0