从博客园中看到一篇文章,介绍大软件公司面试时常常会出的两道SQL题(见附录)。
我觉得受益很多,在此之前,我一直觉得,SQL2008似乎提供了这方面的支持,但更低的版本,包括2005,非游标做不出来(水平够菜)。总结心得如下:
1、 强大的group by
1
select stdname,
2
isnull(sum(
case
stdsubject when
'
化学
'
then Result end),
0
) [化学],
3
isnull(sum(
case
stdsubject when
'
数学
'
then Result end),
0
) [数学],
4
isnull(sum(
case
stdsubject when
'
物理
'
then Result end),
0
) [物理],
5
isnull(sum(
case
stdsubject when
'
语文
'
then Result end),
0
) [语文]
6
from #student
7
group by stdname
在这里,group by与sum +
case结合,可以将表1中的记录(行)变成表2的字段(列)。Sum里面如果没有case,那么出来的值,只能是全部科目 ......
最近在群里大家突然讨论下fb(firebird)来了,呵,看了一些资料,突然发觉这个东西也蛮好玩的,于是开始大量的查找有关的资料,下面是一
些fb下的sql写法,转自网上,各位朋友将就些看看吧,过几天偶整理好.net下使用fb的demo上来给大家看看吧,到时支持支持吧,呵呵
一、分页写法小例:
SELECT FIRST
10 templateid,code,name from
template ;
SELECT FIRST
10 SKIP
10 templateid,code,name from
template ;
SELECT
* from
shop ROWS
1 TO
10; --firebird2.0支持这种写法
二、显示表名和表结构
SHOW TABLES
;
SHOW TABLE
tablename;
三、使用ISQL连接数据库
firebird%92bin>isql -u sysdba -p masterkey
SQL>CONNECT
'E:companyxmwsoftnewxmwsoftc2dbcts2.fdb';
或
SQL>CONNECT
'E:%92'
CON>USER
'sysdba'
CONT>PASSWORD
'masterkey';
四、更新字段注释
UPDATE
RDB$RELATION_FIELDS
SET
RDB$DESCRIPTION
= '描述信息'
WHERE
(RDB$RELATION_NAME
= 'SHOP')
& ......
这部分包含那些 PostgreSQL 支持的 SQL 命令的信息.这里的 "SQL" 就是该语言通常
的含义; 每条命令的与标准有关的兼容性的信息可以在相关的参考页中找到.
Table of Contents
ABORT -- 退出当前事务
ALTER GROUP -- 向组中增加用户或从组中删除用户
ALTER USER -- 改变数据库用户帐号.
ANALYZE -- 收集与数据库有关的统计
BEGIN -- 开始一个事务块
CHECKPOINT -- 强制一个事务日志检查点
CLOSE -- 关闭一个游标
CLUSTER -- 根据一个索引对某个表集簇
COMMENT -- 定义或者改变一个对象的评注
COMMIT -- 提交当前事务
COPY -- 在表和文件之间拷贝数据
CREATE AGGREGATE -- 定义一个新的聚集函数
CREATE CONSTRAINT TRIGGER -- 定义一个新的约束触发器
CREATE DATABASE -- 创建新数据库
CREATE FUNCTION -- 定义一个新函数
CREATE GROUP -- 定义一个新的用户组
CREATE INDEX -- 定义一个新索引
CREATE LANGUAGE -- 定义一种新的过程语言
CREATE OPERATOR -- 定义一个新的操作符
CREATE RULE -- 定义一个新的重写规则
CREATE SE ......
TA:
1,WANG
2,ZHANG
4,LI
TB:
1,100
2,200
3,400
1.left join 左连接--以左表为基准,右表中没值的,在结果集中以null值代替。(select * from TA left join TB where TA.ID=TB.ID)
1,WANG,100
2,ZHANG,200
4,NULL
2.right join 右连接--以右表为基准,左表中没值的,在结果集中以null值代替。(select * from TA right join TB where TA=TB)
1,WANG,100
2,ZHANG,200
3,NULL,400
3.inner join 内连接--查询左右表中都有键值内容做为结果集。 (select * from TA inner join TB where TA=TB)
1,WANG,100
2,ZHANG,200
备注: 内连接简写:select * from TA,TB WHERE TA.ID=TB.ID
【笛卡尔积】:
使用交叉联接
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。下面是在sqlserver查询分析器中测试的结果:
select * from TA cross join TB
--下面的是另一种写法
select * from TA ,TB
1,WANG,100
2,ZHA ......
http://blog.csdn.net/java2000_net/archive/2008/04/05/2252640.aspx
http://sqlserver.chinahtml.com/2006/SQL-mssql11432786154012.shtml
http://www.cnblogs.com/garnai/archive/2007/09/19/898221.html
http://tech.ccidnet.com/art/1099/20050223/214511_1.html
http://www.wangchao.net.cn/bbsdetail_43009.html ......
下列语句部分是Mssql语句,不可以在access中使用。
SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:
1、说明:创建数据库CREATE DATABASE database-name
2、说明:删除数据库drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 deviceUSE master
EXEC sp_addumpdevice ''disk'', ''testBack'', ''c:\mssql7backup\MyNwind_1.dat''
--- 开始 备份BACKUP DATABASE pubs TO testBack
4、说明:
创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:
删除新表:drop table tabname
6、说明:
增加一个列:Alter table tabname add column col type 注:列增加后将 ......