一、创建数据库
create database 数据库名
on
(
name=N'逻辑名',
filename=N'路径\文件名',
size=1MB,
filegrowth=1MB
)
log on
(
name=N'逻辑名_log',
filename=N'路径\文件名_log.ldf',
siez=10MB,
filegrowth=10%
)
二、创建构架
CREATE SCHEMA [ouyubin] AUTHORIZATION [dbo]
三、根据构架创建表
create table jkTest.Tbl1
(
id int identity(1,1) primary key not null,
QQ varchar(15) not null,
PWD varchar(20) not null
);
四、修改表
1、设置主键
alter table jkTest.Tbl1
add constraint PK_Tb1_id primary key(id)
2、添加唯一约束
add constraint UQ_表名_字段名 unique(字段)
3、添加默认约束
add constraint DF_表名_字段名 default(值) for 字段
4、添加检查约束
add constraint CK_表名_字段名 check(stuAge>=0 and stuAge<=150 or stuAge is null表达式)
5、添加外键约束
add constraint FK_外键表_主键表_字段 foreign key(外键表中的字段) references 主键表名(主键表中的字段)
6、删除:
删除约束:alter table 表名 drop 约束名
删除列:alter table 表名 drop column 列名
7、增加:
增加一列:增加一列:alter table 表名 add 列名 类型
8、修改数据类型:
alter table 表名 alter column 列名 类型
五、使用系统视图sys.objects来查看所有的数据库对象.
select * from sys.objects where type='U'
六、完整的查询语句书写格式
注意分行写SQL语句,这样不需要某个地方的时候,直接注释就可以了。如不需要查询某个字段了,在字段前注释,而不用删除这个字段
select top 数字 percent distinct
,字段
,常量
,聚合函数
from
数据源
where
条件
group by
字段
having
条件
order by
字段;
七、
1、匹配::_任意一个字符;%任意多个任意字符; [_] _愿意是任意字符,在[]里表示_,[]还可以表示范围,如[a-z]
2、范围:between and ;in(散值,散值)
3、group by分组,按照什么分组就只显示什么数据,select后面只能跟你分组的字段
4、having子句:select stName form 表名 group by stName having count(stname)>3
having用于分组后的筛选
5、order by排序,将结果集排序
八、聚合函数
1、AVG平均值
2、SUM总和
3、Count计数
4、MAX最大值
5、Min最小值
九、开窗函数
select *,AVG(score) over() from 表名
本文链接
对于一个简单的表, 两行两列(行号暂且不算). 要对它进行行列互换, 怎么做?
先准备测试数据:
n INT,
gender VARCHAR(10),
total INT
);
INSERT INTO TempSum(n, gender, total) VALUES
(1, 'male', 23), (2, 'female', 45);
SELECT * FROM TempSum;
n gender total
---- ------ -----
1 male 23
2 female 45
看到行列互换, 大家首先想到的大概是PIVOT:
FROM TempSum
pivot(max(total) FOR gender
IN (male, female)) AS P;
n male female
---- ---- ------
1 23 NULL
2 NULL 45
或者, n列也可以去掉的:
-- n, --uncomment to show n
max(CASE WHEN gender='male' THEN total END) AS male,
max(CASE WHEN gender='female' THEN total END) AS female
FROM TempSum
GROUP BY n;
male female
---- ------
23 NULL
NULL 45
如果, 我不想要NULL, 要显示成
23 45
的样式. 或者, 如果TempSum表中根本没有n列. 怎么办?
思路:
Step1, 把male和female放到一行
Step2, 把23和45放到一行, 要注意它们和gender的对应顺序
Step3, 把Step1和Step2的两行作个UNION. OK!
实现:
Step1, gender可以认为是已知的, hard code就可以的:
Step2, male和female的total本不在同一行, 可以做个自连接, 选出来一行让它左边对应male的total, 右边对应female的total:
FROM TempSum a JOIN TempSum b ON a.gender<>b.gender
WHERE a.gender='male' --AND b.gender='female'
Step3, 用UNION ALL就可以的, 就不多解释了:
UNION ALL
SELECT convert(VARCHAR(10), a.total), convert(VARCHAR(10), b.total)
FROM TempSum a JOIN TempSum b ON a.gender<>b.gender
WHERE a.gender='male' --AND b.gender='female';
-- results
No Column Name No Column Name
-------------- --------------
male female
23 45
看到No Column Name, 把它也去掉吧. 其实, 走到Step2的时候, 大概就可以想到了:
FROM TempSum a JOIN TempSum b
RETCODE rcode;
rcode = ::SQLAllocEnv(SQL_HANDLE_ENV, SQL_NULL, & henv);
if(rcode == SQL_SUCCESS) // 环境句柄创建成功
{
// 执行其它操作
…………
}
retcode = ::SQLAllocConnect( m_henv, & hdbc);
if(rcode == SQL_SUCCESS) // 连接句柄创建成功
{
// 执行其它操作
…………
}
(PUCHAR)pszSourceName, SQL_NTS,
(PUCHAR)pszUserId, wLengthUID,
(PUCHAR)pszPassword, wLengthPSW );
if(rcode == SQL_SUCCESS) // 数据源连接成功
{