一
.
数据控制语句
(DML)
部分
1.INSERT ( 往数据表里插入记录的语句 )
INSERT INTO 表名 ( 字段名 1, 字段名 2, ……) VALUES ( 值 1, 值 2, ……);
INSERT INTO 表名 ( 字段名 1, 字段名 2, ……) SELECT 字段名 1, 字段名 2, …… FROM 另外的表名 ;
字符串类型的字段值必须用单引号括起来 , 例如 : ’GOOD DAY’
如果字段值里包含单引号 ’ 需要进行字符串转换 , 我们把它替换成两个单引号 ''.
字符串类型的字段值超过定义的长度会出错 , 最好在插入前进行长度校验 .
日期字段的字段值可以用当前数据库的系统时间 SYSDATE, 精确到秒
或者用字符串转换成日期型函数 TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE() 还有很多种日期格式 , 可以参看 ORACLE DOC.
年 - 月 - 日 小时 : 分钟 : 秒 的格式 YYYY-MM-DD HH24:MI:SS
INSERT 时最大可操作的字符串长度小于等于 4000 个单字节 , 如果要插入更长的字符串 , 请考虑字段用 CLOB 类型 ,
方法借用 ORACLE 里自带的 DBMS_LOB 程序包 .
INSERT 时如果要用到从 1 开始自动增长的序列号 , 应该先建立一个序列号
CREATE SEQUENCE 序列号的名称 ( 最好是表名 + 序列号标记 ) INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定 , 如果定义的自动增长的序列号 NUMBER(6) , 最大值为 999999
INSERT 语句插入这个字段值为 : 序列号的名称 .NEXTVAL
2.DELETE ( 删除数据表里记录的语句 )
DELETE FROM 表名 WHERE 条件 ;
注意:删除记录并不能释放 ORACLE 里被占用的数据块表空间 . 它只把那些被删除的数据块标成 unused.
如果确实要删除一个大表里的全部记录 , 可以用 TRUNCATE 命令 , 它可以释放占用的数据块表空间
TRUNCATE TABLE 表名 ;
此操作不可回退 .
3.UPDATE ( 修改数据表里记录的语句 )
UPDATE 表名 SET 字段名 1= 值 1, 字段名 2= 值 2, …… WHERE 条件 ;
如果修改的值 N 没有赋值或定义时 , 将把原来的记录内容清为 NULL, 最好在修改前进行非空校验 ;
值 N 超过定义的长度会出错 , 最好在插入前进行长度校验 ..
注意事项 :
A. 以上 SQL 语句对表都加上了行级锁 ,
确认完成后 , 必须加上事物处理结束的命令 COMMIT 才能正式生效 ,
否则改变不一定写入数据库里 .
如果想撤回这些操作 , 可以用命令 ROLLBACK 复原 .
B. 在运行 INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围 ,
应该把它限定在较小 ( 一万条记录 ) 范围内 ,. 否则 ORACLE 处理这个事物用到很大的回退段 .
程序响应慢甚至失去响应 . 如果记录数上十万以上这些操作 , 可以把这些 SQL 语句分段分次完成 ,
其间加上 COMMIT 确认事物处理 .
二 . 数据定义 (DDL) 部分
1.CREATE ( 创建表 , 索引 , 视图 , 同义词 , 过程 , 函数 , 数据库链接等 )
ORACLE 常用的字段类型有
CHAR 固定长度的字符串
VARCHAR2 可变长度的字符串
NUMBER(M,N) 数字型 M 是位数总长度 , N 是小数的长度
DATE 日期类型
创建表时要把较小的不为空的字段放在前面 , 可能为空的字段放在后面
创建表时可以用中文的字段名 , 但最好还是用英文的字段名
创建表时可以给字段加上默认值 , 例如 DEFAULT SYSDATE
这样每次插入和修改时 , 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如 不允许重复 UNIQUE, 关键字 PRIMARY KEY
2.ALTER ( 改变表 , 索引 , 视图等 )
改变表的名称
ALTER TABLE 表名 1 TO 表名 2;
在表的后面增加一个字段
ALTER TABLE 表名 ADD 字段名 字段名描述 ;
修改表里字段的定义描述
ALTER TABLE 表名 MODIFY 字段名 字段名描述 ;
给表里的字段加上约束条件
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY ( 字段名 );
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE ( 字段名 );
把表放在或取出数据库的内存区
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
3.DROP ( 删除表 , 索引 , 视图 , 同义词 , 过程 , 函数 , 数据库链接等 )
删除表和它所有的约束条件
DROP TABLE 表名 CASCADE CONSTRAINTS;
4.TRUNCATE ( 清空表里的所有记录 , 保留表的结构 )
TRUNCATE 表名 ;
三 . 查询语句 (SELECT) 部分
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE 条件 ;
字段名可以带入函数
例如 : COUNT(*), MIN( 字段名 ), MAX( 字段名 ), AVG( 字段名 ), DISTINCT( 字段名 ),
TO_CHAR(DATE 字段名 ,'YYYY-MM-DD HH24:MI:SS')
NVL(EXPR1, EXPR2) 函数
解释 :
IF EXPR1=NULL
RETURN EXPR2
ELSE
RETURN EXPR1
DECODE(AA ﹐ V1 ﹐ R1 ﹐ V2 ﹐ R2....) 函数
解释 :
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
LPAD(char1,n,char2) 函数
解释 :
字符 char1 按制定的位数 n 显示,不足的位数用 char2 字符串替换左边的空位
字段名之间可以进行算术运算
例如 : ( 字段名 1* 字段名 1)/3
查询语句可以嵌套
例如 : SELECT …… FROM
(SELECT …… FROM 表名 1, [ 表名 2, ……] WHERE 条件 ) WHERE 条件 2;
两个查询语句的结果可以做集合操作
例如 : 并集 UNION( 去掉重复记录 ), 并集 UNION ALL( 不去掉重复记录 ), 差集 MINUS, 交集 INTERSECT
分组查询
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] GROUP BY 字段名 1
[HAVING 条件 ] ;
两个以上表之间的连接查询
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE
表名 1. 字段名 = 表名 2. 字段名 [ AND ……] ;
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE
表名 1. 字段名 = 表名 2. 字段名 (+) [ AND ……] ;
有 (+) 号的字段位置自动补空值
查询结果集的排序操作 , 默认的排序是升序 ASC, 降序是 DESC
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……]
ORDER BY 字段名 1, 字段名 2 DESC;
字符串模糊比较的方法
INSTR( 字段名 , ‘ 字符串 ’)>0
字段名 LIKE ‘ 字符串 %’ [‘% 字符串 %’]
每个表都有一个隐含的字段 ROWID, 它标记着记录的唯一性 .
四 .ORACLE 里常用的数据对象 (SCHEMA)
1. 索引 (INDEX)
CREATE INDEX 索引名 ON 表名 ( 字段 1, [ 字段 2, ……] );
ALTER INDEX 索引名 REBUILD;
一个表的索引最好不要超过三个 ( 特殊的大表除外 ), 最好用单字段索引 , 结合 SQL 语句的分析执行情况 ,
也可以建立多字段的组合索引和基于函数的索引
ORACLE8.1.7 字符串可以索引的最大长度为 1578 单字节
ORACLE8.0.6 字符串可以索引的最大长度为 758 单字节
ORACLE DOC 上说字符串最大可以建索引的长度约是 : 数据块的大小 (db_block_size)*40%
2. 视图 (VIEW)
CREATE VIEW 视图名 AS SELECT …. FROM …..;
ALTER VIEW 视图名 COMPILE;
视图仅是一个 SQL 查询语句 , 它可以把表之间复杂的关系简洁化 .
3. 同义词 (SYNONMY)
CREATE SYNONYM 同义词名 FOR 表名 ;
CREATE SYNONYM 同义词名 FOR 表名 @ 数据库链接名 ;
4. 数据库链接 (DATABASE LINK)
CREATE DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘ 数据库连接字符串 ’;
数据库连接字符串可以用 NET8 EASY CONFIG 或者直接修改 TNSNAMES.ORA 里定义 .
数据库参数 global_name=true 时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查询远端数据库里的表
SELECT …… FROM 表名 @ 数据库链接名 ;
五 . 权限管理 (DCL) 语句
1.GRANT 赋于权限
常用的系统权限集合有以下三个 :
CONNECT( 基本的连接 ), RESOURCE( 程序开发 ), DBA( 数据库管理 )
常用的数据对象权限有以下五个 :
ALL ON 数据对象名 , SELECT ON 数据对象名 , UPDATE ON 数据对象名 ,
DELETE ON 数据对象名 , INSERT ON 数据对象名 , ALTER ON 数据对象名
GRANT CONNECT, RESOURCE TO 用户名 ;
GRANT SELECT ON 表名 TO 用户名 ;
GRANT SELECT, INSERT, DELETE ON 表名 TO 用户名 1, 用户名 2;
2.REVOKE 回收权限
REVOKE CONNECT, RESOURCE FROM 用户名 ;
REVOKE SELECT ON 表名 FROM 用户名 ;
REVOKE SELECT, INSERT, DELETE ON 表名 FROM 用户名 1, 用户名 2;
1.INSERT ( 往数据表里插入记录的语句 )
INSERT INTO 表名 ( 字段名 1, 字段名 2, ……) VALUES ( 值 1, 值 2, ……);
INSERT INTO 表名 ( 字段名 1, 字段名 2, ……) SELECT 字段名 1, 字段名 2, …… FROM 另外的表名 ;
字符串类型的字段值必须用单引号括起来 , 例如 : ’GOOD DAY’
如果字段值里包含单引号 ’ 需要进行字符串转换 , 我们把它替换成两个单引号 ''.
字符串类型的字段值超过定义的长度会出错 , 最好在插入前进行长度校验 .
日期字段的字段值可以用当前数据库的系统时间 SYSDATE, 精确到秒
或者用字符串转换成日期型函数 TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE() 还有很多种日期格式 , 可以参看 ORACLE DOC.
年 - 月 - 日 小时 : 分钟 : 秒 的格式 YYYY-MM-DD HH24:MI:SS
INSERT 时最大可操作的字符串长度小于等于 4000 个单字节 , 如果要插入更长的字符串 , 请考虑字段用 CLOB 类型 ,
方法借用 ORACLE 里自带的 DBMS_LOB 程序包 .
INSERT 时如果要用到从 1 开始自动增长的序列号 , 应该先建立一个序列号
CREATE SEQUENCE 序列号的名称 ( 最好是表名 + 序列号标记 ) INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定 , 如果定义的自动增长的序列号 NUMBER(6) , 最大值为 999999
INSERT 语句插入这个字段值为 : 序列号的名称 .NEXTVAL
2.DELETE ( 删除数据表里记录的语句 )
DELETE FROM 表名 WHERE 条件 ;
注意:删除记录并不能释放 ORACLE 里被占用的数据块表空间 . 它只把那些被删除的数据块标成 unused.
如果确实要删除一个大表里的全部记录 , 可以用 TRUNCATE 命令 , 它可以释放占用的数据块表空间
TRUNCATE TABLE 表名 ;
此操作不可回退 .
3.UPDATE ( 修改数据表里记录的语句 )
UPDATE 表名 SET 字段名 1= 值 1, 字段名 2= 值 2, …… WHERE 条件 ;
如果修改的值 N 没有赋值或定义时 , 将把原来的记录内容清为 NULL, 最好在修改前进行非空校验 ;
值 N 超过定义的长度会出错 , 最好在插入前进行长度校验 ..
注意事项 :
A. 以上 SQL 语句对表都加上了行级锁 ,
确认完成后 , 必须加上事物处理结束的命令 COMMIT 才能正式生效 ,
否则改变不一定写入数据库里 .
如果想撤回这些操作 , 可以用命令 ROLLBACK 复原 .
B. 在运行 INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围 ,
应该把它限定在较小 ( 一万条记录 ) 范围内 ,. 否则 ORACLE 处理这个事物用到很大的回退段 .
程序响应慢甚至失去响应 . 如果记录数上十万以上这些操作 , 可以把这些 SQL 语句分段分次完成 ,
其间加上 COMMIT 确认事物处理 .
二 . 数据定义 (DDL) 部分
1.CREATE ( 创建表 , 索引 , 视图 , 同义词 , 过程 , 函数 , 数据库链接等 )
ORACLE 常用的字段类型有
CHAR 固定长度的字符串
VARCHAR2 可变长度的字符串
NUMBER(M,N) 数字型 M 是位数总长度 , N 是小数的长度
DATE 日期类型
创建表时要把较小的不为空的字段放在前面 , 可能为空的字段放在后面
创建表时可以用中文的字段名 , 但最好还是用英文的字段名
创建表时可以给字段加上默认值 , 例如 DEFAULT SYSDATE
这样每次插入和修改时 , 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如 不允许重复 UNIQUE, 关键字 PRIMARY KEY
2.ALTER ( 改变表 , 索引 , 视图等 )
改变表的名称
ALTER TABLE 表名 1 TO 表名 2;
在表的后面增加一个字段
ALTER TABLE 表名 ADD 字段名 字段名描述 ;
修改表里字段的定义描述
ALTER TABLE 表名 MODIFY 字段名 字段名描述 ;
给表里的字段加上约束条件
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY ( 字段名 );
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE ( 字段名 );
把表放在或取出数据库的内存区
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
3.DROP ( 删除表 , 索引 , 视图 , 同义词 , 过程 , 函数 , 数据库链接等 )
删除表和它所有的约束条件
DROP TABLE 表名 CASCADE CONSTRAINTS;
4.TRUNCATE ( 清空表里的所有记录 , 保留表的结构 )
TRUNCATE 表名 ;
三 . 查询语句 (SELECT) 部分
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE 条件 ;
字段名可以带入函数
例如 : COUNT(*), MIN( 字段名 ), MAX( 字段名 ), AVG( 字段名 ), DISTINCT( 字段名 ),
TO_CHAR(DATE 字段名 ,'YYYY-MM-DD HH24:MI:SS')
NVL(EXPR1, EXPR2) 函数
解释 :
IF EXPR1=NULL
RETURN EXPR2
ELSE
RETURN EXPR1
DECODE(AA ﹐ V1 ﹐ R1 ﹐ V2 ﹐ R2....) 函数
解释 :
IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
LPAD(char1,n,char2) 函数
解释 :
字符 char1 按制定的位数 n 显示,不足的位数用 char2 字符串替换左边的空位
字段名之间可以进行算术运算
例如 : ( 字段名 1* 字段名 1)/3
查询语句可以嵌套
例如 : SELECT …… FROM
(SELECT …… FROM 表名 1, [ 表名 2, ……] WHERE 条件 ) WHERE 条件 2;
两个查询语句的结果可以做集合操作
例如 : 并集 UNION( 去掉重复记录 ), 并集 UNION ALL( 不去掉重复记录 ), 差集 MINUS, 交集 INTERSECT
分组查询
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] GROUP BY 字段名 1
[HAVING 条件 ] ;
两个以上表之间的连接查询
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE
表名 1. 字段名 = 表名 2. 字段名 [ AND ……] ;
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……] WHERE
表名 1. 字段名 = 表名 2. 字段名 (+) [ AND ……] ;
有 (+) 号的字段位置自动补空值
查询结果集的排序操作 , 默认的排序是升序 ASC, 降序是 DESC
SELECT 字段名 1, 字段名 2, …… FROM 表名 1, [ 表名 2, ……]
ORDER BY 字段名 1, 字段名 2 DESC;
字符串模糊比较的方法
INSTR( 字段名 , ‘ 字符串 ’)>0
字段名 LIKE ‘ 字符串 %’ [‘% 字符串 %’]
每个表都有一个隐含的字段 ROWID, 它标记着记录的唯一性 .
四 .ORACLE 里常用的数据对象 (SCHEMA)
1. 索引 (INDEX)
CREATE INDEX 索引名 ON 表名 ( 字段 1, [ 字段 2, ……] );
ALTER INDEX 索引名 REBUILD;
一个表的索引最好不要超过三个 ( 特殊的大表除外 ), 最好用单字段索引 , 结合 SQL 语句的分析执行情况 ,
也可以建立多字段的组合索引和基于函数的索引
ORACLE8.1.7 字符串可以索引的最大长度为 1578 单字节
ORACLE8.0.6 字符串可以索引的最大长度为 758 单字节
ORACLE DOC 上说字符串最大可以建索引的长度约是 : 数据块的大小 (db_block_size)*40%
2. 视图 (VIEW)
CREATE VIEW 视图名 AS SELECT …. FROM …..;
ALTER VIEW 视图名 COMPILE;
视图仅是一个 SQL 查询语句 , 它可以把表之间复杂的关系简洁化 .
3. 同义词 (SYNONMY)
CREATE SYNONYM 同义词名 FOR 表名 ;
CREATE SYNONYM 同义词名 FOR 表名 @ 数据库链接名 ;
4. 数据库链接 (DATABASE LINK)
CREATE DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘ 数据库连接字符串 ’;
数据库连接字符串可以用 NET8 EASY CONFIG 或者直接修改 TNSNAMES.ORA 里定义 .
数据库参数 global_name=true 时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查询远端数据库里的表
SELECT …… FROM 表名 @ 数据库链接名 ;
五 . 权限管理 (DCL) 语句
1.GRANT 赋于权限
常用的系统权限集合有以下三个 :
CONNECT( 基本的连接 ), RESOURCE( 程序开发 ), DBA( 数据库管理 )
常用的数据对象权限有以下五个 :
ALL ON 数据对象名 , SELECT ON 数据对象名 , UPDATE ON 数据对象名 ,
DELETE ON 数据对象名 , INSERT ON 数据对象名 , ALTER ON 数据对象名
GRANT CONNECT, RESOURCE TO 用户名 ;
GRANT SELECT ON 表名 TO 用户名 ;
GRANT SELECT, INSERT, DELETE ON 表名 TO 用户名 1, 用户名 2;
2.REVOKE 回收权限
REVOKE CONNECT, RESOURCE FROM 用户名 ;
REVOKE SELECT ON 表名 FROM 用户名 ;
REVOKE SELECT, INSERT, DELETE ON 表名 FROM 用户名 1, 用户名 2;
以下是
MS SQL
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
--- 创建 备份数据的 device
USE 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
注:列增加后将不能删除。 DB2 中列加上后数据类型也不能改变,唯一能改
变的是增加 varchar 类型的长度。
7 、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8 、说明:创建索引: create [unique] index idxname on tabname(col
….)
删除索引: drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9 、说明:创建视图: create view viewname as select statement
删除视图: drop view viewname
10 、说明:几个简单的基本的 sql 语句
选择: select * from table1 where 范围
插入: insert into table1(field1,field2) values(value1,value2)
删除: delete from table1 where 范围
更新: update table1 set field1=value1 where 范围
查找: select * from table1 where field1 like ’%value1%’ --
-like 的语法很精妙,查资料 !
排序: select * from table1 order by field1,field2 [desc]
总数: select count * as totalcount from table1
求和: select sum(field1) as sumvalue from table1
平均: select avg(field1) as avgvalue from table1
最大: select max(field1) as maxvalue from table1
最小: select min(field1) as minvalue from table1
11 、说明:几个高级查询运算词
A : UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2 )并消去
表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即
UNION ALL ),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1 就是来自 TABLE2 。
B : EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所
有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT
ALL) ,不消除重复行。
C : INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有
重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时
(INTERSECT ALL) ,不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12 、说明:使用外连接
A 、 left outer join :
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN
b ON a.a = b.c
B : right outer join:
右外连接 ( 右连接 ) :结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C : full outer join :
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的 sql 语句
1 、说明:复制表 ( 只复制结构 , 源表名: a 新表名: b) (Access 可用 )
法一: select * into b from a where 1<>1
法二: select top 0 * into b from a
2 、说明:拷贝表 ( 拷贝数据 , 源表名: a 目标表名: b) (Access 可用 )
insert into b(a, b, c) select d,e,f from b;
3 、说明:跨数据库之间表的拷贝 ( 具体数据使用绝对路径 ) (Access 可用 )
insert into b(a, b, c) select d,e,f from b in ‘ 具体数据库 ’
where 条件
例子: ..from b in '"&Server.MapPath(".")&"/data.mdb" &"'
where..
4 、说明:子查询 ( 表名 1 : a 表名 2 : b)
select a,b,c from a where a IN (select d from b ) 或者 :
select a,b,c from a where a IN (1,2,3)
5 、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select
max(adddate) adddate from table where table.title=a.title) b
6 、说明:外连接查询 ( 表名 1 : a 表名 2 : b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON
a.a = b.c
7 、说明:在线视图查询 ( 表名 1 : a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8 、说明: between 的用法 ,between 限制查询数据范围时包括了边界值 ,not
between 不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2
9 、说明: in 的使用方法
select * from table1 where a [not] in (‘ 值 1’,’ 值 2’ ,’ 值 4’ ,
’ 值 6’ )
10 、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2
where table1.field1=table2.field1 )
11 、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join
c on a.a=c.c inner join d on a.a=d.d where .....
12 、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时
间 ,getdate())>5
13 、说明:一条 sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段 , 排序字段 from 表
名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字
段 order by a. 排序字段
14 、说明:前 10 条记录
select top 10 * form table1 where 范围
15 、说明:选择在每一组 b 值相同的数据中对应的 a 最大的记录的所有信息 (
类似这样的用法可以用于论坛每月排行榜 , 每月热销产品分析 , 按科目成绩排
名 , 等等 .)
select a,b,c from tablename ta where a=(select max(a) from
tablename tb where tb.b=ta.b)
16 、说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除
所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except
(select a from tableC)
17 、说明:随机取出 10 条数据
select top 10 * from tablename order by newid()
18 、说明:随机选择记录
select newid()
19 、说明:删除重复记录
Delete from tablename where id not in (select max(id) from
tablename group by col1,col2,...)
20 、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21 、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22 、说明:列示 type 、 vender 、 pcs 字段,以 type 字段排列, case 可以方便
地实现多重选择,类似 select 中的 case 。
select type,sum(case vender when 'A' then pcs else 0
end),sum(case vender when 'C' then pcs else 0 end),sum(case
vender when 'B' then pcs else 0 end) FROM tablename group by
type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23 、说明:初始化表 table1
TRUNCATE TABLE table1
24 、说明:选择从 10 到 15 的记录
select top 5 * from (select top 15 * from table order by id
asc) table_ 别名 order by id desc
随机选择数据库记录的方法(使用 Randomize 函数,通过 SQL 语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求 ASP“ 找个随机数 ” 然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出 1 到 500 范围之内的一个随机数(假设 500
就是数据库内记录的总数)。然后,你遍历每一记录来测试 ID 的值、检查
其是否匹配 RNumber 。满足条件的话就执行由 THEN 关键字开始的那一块代码
。假如你的 RNumber 等于 495 ,那么要循环一遍数据库花的时间可就长了。
虽然 500 这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死定了?
采用 SQL ,你就可以很快地找出准确的记录并且打开一个只包含该记录
的 recordset ,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " &
objRec("c_email")
不必写出 RNumber 和 ID ,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作 “ 随机 ” 记录。 Recordset 没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干 Random 函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准 Random
示例扩展一下就可以用 SQL 应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一 recordset 内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR
ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出 10 条记录(也许是每次页面装载时的 10 条链接的列表),
你可以用 BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这
里的 ID 是自动生成的号码):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber &
" AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有 9 条并发记录。
随机读取若干条记录,测试过
Access 语法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access 左连接语法 ( 最近开发要用左连接 ,Access 帮助什么都没有 , 网上没有
Access 的 SQL 说明 , 只有自己测试 , 现在记下以备后查 )
语法 elect table1.fd1,table1,fd2,table2.fd2 From table1 left
join table2 on table1.fd1,table2.fd1 where ...
使用 SQL 语句 用 ... 代替过长的字符串显示
语法:
SQL 数据库: select case when len(field)>10 then left(field,10)
+'...' else field end as news_name,news_id from tablename
Access 数据库: SELECT iif(len(field)>2,left(field,2)
+'...',field) FROM tablename;
Conn.Execute 说明
Execute 方法
该方法用于执行 SQL 语句。根据 SQL 语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1 .执行 SQL 查询语句时,将返回查询得到的记录集。用法为:
Set 对象变量名 = 连接对象 .Execute("SQL 查询语言 ")
Execute 方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过 Set 方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2 .执行 SQL 的操作性语言时,没有记录集的返回。此时用法为:
连接对象 .Execute "SQL 操作性语句 " [, RecordAffected][,
Option]
·RecordAffected 为可选项,此出可放置一个变量, SQL 语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道 SQL 语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为 adCMDText ,它用于
告诉 ADO ,应该将 Execute 方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans 、 RollbackTrans 、 CommitTrans 方法
这三个方法是连接对象提供的用于事务处理的方法。 BeginTrans 用于开
始一个事物; RollbackTrans 用于回滚事务; CommitTrans 用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans 和 CommitTrans 用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的 Error 集合来实现,若 Error 集合的成员个数不为 0 ,则说明有错误发生
,事务处理失败。 Error 集合中的每一个 Error 对象,代表一个错误信息。
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
--- 创建 备份数据的 device
USE 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
注:列增加后将不能删除。 DB2 中列加上后数据类型也不能改变,唯一能改
变的是增加 varchar 类型的长度。
7 、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8 、说明:创建索引: create [unique] index idxname on tabname(col
….)
删除索引: drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9 、说明:创建视图: create view viewname as select statement
删除视图: drop view viewname
10 、说明:几个简单的基本的 sql 语句
选择: select * from table1 where 范围
插入: insert into table1(field1,field2) values(value1,value2)
删除: delete from table1 where 范围
更新: update table1 set field1=value1 where 范围
查找: select * from table1 where field1 like ’%value1%’ --
-like 的语法很精妙,查资料 !
排序: select * from table1 order by field1,field2 [desc]
总数: select count * as totalcount from table1
求和: select sum(field1) as sumvalue from table1
平均: select avg(field1) as avgvalue from table1
最大: select max(field1) as maxvalue from table1
最小: select min(field1) as minvalue from table1
11 、说明:几个高级查询运算词
A : UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2 )并消去
表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即
UNION ALL ),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1 就是来自 TABLE2 。
B : EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所
有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT
ALL) ,不消除重复行。
C : INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有
重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时
(INTERSECT ALL) ,不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12 、说明:使用外连接
A 、 left outer join :
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN
b ON a.a = b.c
B : right outer join:
右外连接 ( 右连接 ) :结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C : full outer join :
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的 sql 语句
1 、说明:复制表 ( 只复制结构 , 源表名: a 新表名: b) (Access 可用 )
法一: select * into b from a where 1<>1
法二: select top 0 * into b from a
2 、说明:拷贝表 ( 拷贝数据 , 源表名: a 目标表名: b) (Access 可用 )
insert into b(a, b, c) select d,e,f from b;
3 、说明:跨数据库之间表的拷贝 ( 具体数据使用绝对路径 ) (Access 可用 )
insert into b(a, b, c) select d,e,f from b in ‘ 具体数据库 ’
where 条件
例子: ..from b in '"&Server.MapPath(".")&"/data.mdb" &"'
where..
4 、说明:子查询 ( 表名 1 : a 表名 2 : b)
select a,b,c from a where a IN (select d from b ) 或者 :
select a,b,c from a where a IN (1,2,3)
5 、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select
max(adddate) adddate from table where table.title=a.title) b
6 、说明:外连接查询 ( 表名 1 : a 表名 2 : b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON
a.a = b.c
7 、说明:在线视图查询 ( 表名 1 : a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8 、说明: between 的用法 ,between 限制查询数据范围时包括了边界值 ,not
between 不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2
9 、说明: in 的使用方法
select * from table1 where a [not] in (‘ 值 1’,’ 值 2’ ,’ 值 4’ ,
’ 值 6’ )
10 、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2
where table1.field1=table2.field1 )
11 、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join
c on a.a=c.c inner join d on a.a=d.d where .....
12 、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时
间 ,getdate())>5
13 、说明:一条 sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段 , 排序字段 from 表
名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字
段 order by a. 排序字段
14 、说明:前 10 条记录
select top 10 * form table1 where 范围
15 、说明:选择在每一组 b 值相同的数据中对应的 a 最大的记录的所有信息 (
类似这样的用法可以用于论坛每月排行榜 , 每月热销产品分析 , 按科目成绩排
名 , 等等 .)
select a,b,c from tablename ta where a=(select max(a) from
tablename tb where tb.b=ta.b)
16 、说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除
所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except
(select a from tableC)
17 、说明:随机取出 10 条数据
select top 10 * from tablename order by newid()
18 、说明:随机选择记录
select newid()
19 、说明:删除重复记录
Delete from tablename where id not in (select max(id) from
tablename group by col1,col2,...)
20 、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21 、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22 、说明:列示 type 、 vender 、 pcs 字段,以 type 字段排列, case 可以方便
地实现多重选择,类似 select 中的 case 。
select type,sum(case vender when 'A' then pcs else 0
end),sum(case vender when 'C' then pcs else 0 end),sum(case
vender when 'B' then pcs else 0 end) FROM tablename group by
type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23 、说明:初始化表 table1
TRUNCATE TABLE table1
24 、说明:选择从 10 到 15 的记录
select top 5 * from (select top 15 * from table order by id
asc) table_ 别名 order by id desc
随机选择数据库记录的方法(使用 Randomize 函数,通过 SQL 语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求 ASP“ 找个随机数 ” 然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出 1 到 500 范围之内的一个随机数(假设 500
就是数据库内记录的总数)。然后,你遍历每一记录来测试 ID 的值、检查
其是否匹配 RNumber 。满足条件的话就执行由 THEN 关键字开始的那一块代码
。假如你的 RNumber 等于 495 ,那么要循环一遍数据库花的时间可就长了。
虽然 500 这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死定了?
采用 SQL ,你就可以很快地找出准确的记录并且打开一个只包含该记录
的 recordset ,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " &
objRec("c_email")
不必写出 RNumber 和 ID ,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作 “ 随机 ” 记录。 Recordset 没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干 Random 函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准 Random
示例扩展一下就可以用 SQL 应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一 recordset 内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR
ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出 10 条记录(也许是每次页面装载时的 10 条链接的列表),
你可以用 BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这
里的 ID 是自动生成的号码):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber &
" AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有 9 条并发记录。
随机读取若干条记录,测试过
Access 语法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access 左连接语法 ( 最近开发要用左连接 ,Access 帮助什么都没有 , 网上没有
Access 的 SQL 说明 , 只有自己测试 , 现在记下以备后查 )
语法 elect table1.fd1,table1,fd2,table2.fd2 From table1 left
join table2 on table1.fd1,table2.fd1 where ...
使用 SQL 语句 用 ... 代替过长的字符串显示
语法:
SQL 数据库: select case when len(field)>10 then left(field,10)
+'...' else field end as news_name,news_id from tablename
Access 数据库: SELECT iif(len(field)>2,left(field,2)
+'...',field) FROM tablename;
Conn.Execute 说明
Execute 方法
该方法用于执行 SQL 语句。根据 SQL 语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1 .执行 SQL 查询语句时,将返回查询得到的记录集。用法为:
Set 对象变量名 = 连接对象 .Execute("SQL 查询语言 ")
Execute 方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过 Set 方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2 .执行 SQL 的操作性语言时,没有记录集的返回。此时用法为:
连接对象 .Execute "SQL 操作性语句 " [, RecordAffected][,
Option]
·RecordAffected 为可选项,此出可放置一个变量, SQL 语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道 SQL 语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为 adCMDText ,它用于
告诉 ADO ,应该将 Execute 方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans 、 RollbackTrans 、 CommitTrans 方法
这三个方法是连接对象提供的用于事务处理的方法。 BeginTrans 用于开
始一个事物; RollbackTrans 用于回滚事务; CommitTrans 用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans 和 CommitTrans 用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的 Error 集合来实现,若 Error 集合的成员个数不为 0 ,则说明有错误发生
,事务处理失败。 Error 集合中的每一个 Error 对象,代表一个错误信息。
以下是
MS SQL
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
--- 创建 备份数据的 device
USE 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
注:列增加后将不能删除。 DB2 中列加上后数据类型也不能改变,唯一能改
变的是增加 varchar 类型的长度。
7 、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8 、说明:创建索引: create [unique] index idxname on tabname(col
….)
删除索引: drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9 、说明:创建视图: create view viewname as select statement
删除视图: drop view viewname
10 、说明:几个简单的基本的 sql 语句
选择: select * from table1 where 范围
插入: insert into table1(field1,field2) values(value1,value2)
删除: delete from table1 where 范围
更新: update table1 set field1=value1 where 范围
查找: select * from table1 where field1 like ’%value1%’ --
-like 的语法很精妙,查资料 !
排序: select * from table1 order by field1,field2 [desc]
总数: select count * as totalcount from table1
求和: select sum(field1) as sumvalue from table1
平均: select avg(field1) as avgvalue from table1
最大: select max(field1) as maxvalue from table1
最小: select min(field1) as minvalue from table1
11 、说明:几个高级查询运算词
A : UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2 )并消去
表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即
UNION ALL ),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1 就是来自 TABLE2 。
B : EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所
有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT
ALL) ,不消除重复行。
C : INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有
重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时
(INTERSECT ALL) ,不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12 、说明:使用外连接
A 、 left outer join :
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN
b ON a.a = b.c
B : right outer join:
右外连接 ( 右连接 ) :结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C : full outer join :
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的 sql 语句
1 、说明:复制表 ( 只复制结构 , 源表名: a 新表名: b) (Access 可用 )
法一: select * into b from a where 1<>1
法二: select top 0 * into b from a
2 、说明:拷贝表 ( 拷贝数据 , 源表名: a 目标表名: b) (Access 可用 )
insert into b(a, b, c) select d,e,f from b;
3 、说明:跨数据库之间表的拷贝 ( 具体数据使用绝对路径 ) (Access 可用 )
insert into b(a, b, c) select d,e,f from b in ‘ 具体数据库 ’
where 条件
例子: ..from b in '"&Server.MapPath(".")&"/data.mdb" &"'
where..
4 、说明:子查询 ( 表名 1 : a 表名 2 : b)
select a,b,c from a where a IN (select d from b ) 或者 :
select a,b,c from a where a IN (1,2,3)
5 、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select
max(adddate) adddate from table where table.title=a.title) b
6 、说明:外连接查询 ( 表名 1 : a 表名 2 : b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON
a.a = b.c
7 、说明:在线视图查询 ( 表名 1 : a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8 、说明: between 的用法 ,between 限制查询数据范围时包括了边界值 ,not
between 不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2
9 、说明: in 的使用方法
select * from table1 where a [not] in (‘ 值 1’,’ 值 2’ ,’ 值 4’ ,
’ 值 6’ )
10 、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2
where table1.field1=table2.field1 )
11 、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join
c on a.a=c.c inner join d on a.a=d.d where .....
12 、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时
间 ,getdate())>5
13 、说明:一条 sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段 , 排序字段 from 表
名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字
段 order by a. 排序字段
14 、说明:前 10 条记录
select top 10 * form table1 where 范围
15 、说明:选择在每一组 b 值相同的数据中对应的 a 最大的记录的所有信息 (
类似这样的用法可以用于论坛每月排行榜 , 每月热销产品分析 , 按科目成绩排
名 , 等等 .)
select a,b,c from tablename ta where a=(select max(a) from
tablename tb where tb.b=ta.b)
16 、说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除
所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except
(select a from tableC)
17 、说明:随机取出 10 条数据
select top 10 * from tablename order by newid()
18 、说明:随机选择记录
select newid()
19 、说明:删除重复记录
Delete from tablename where id not in (select max(id) from
tablename group by col1,col2,...)
20 、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21 、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22 、说明:列示 type 、 vender 、 pcs 字段,以 type 字段排列, case 可以方便
地实现多重选择,类似 select 中的 case 。
select type,sum(case vender when 'A' then pcs else 0
end),sum(case vender when 'C' then pcs else 0 end),sum(case
vender when 'B' then pcs else 0 end) FROM tablename group by
type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23 、说明:初始化表 table1
TRUNCATE TABLE table1
24 、说明:选择从 10 到 15 的记录
select top 5 * from (select top 15 * from table order by id
asc) table_ 别名 order by id desc
随机选择数据库记录的方法(使用 Randomize 函数,通过 SQL 语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求 ASP“ 找个随机数 ” 然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出 1 到 500 范围之内的一个随机数(假设 500
就是数据库内记录的总数)。然后,你遍历每一记录来测试 ID 的值、检查
其是否匹配 RNumber 。满足条件的话就执行由 THEN 关键字开始的那一块代码
。假如你的 RNumber 等于 495 ,那么要循环一遍数据库花的时间可就长了。
虽然 500 这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死定了?
采用 SQL ,你就可以很快地找出准确的记录并且打开一个只包含该记录
的 recordset ,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " &
objRec("c_email")
不必写出 RNumber 和 ID ,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作 “ 随机 ” 记录。 Recordset 没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干 Random 函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准 Random
示例扩展一下就可以用 SQL 应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一 recordset 内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR
ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出 10 条记录(也许是每次页面装载时的 10 条链接的列表),
你可以用 BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这
里的 ID 是自动生成的号码):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber &
" AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有 9 条并发记录。
随机读取若干条记录,测试过
Access 语法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access 左连接语法 ( 最近开发要用左连接 ,Access 帮助什么都没有 , 网上没有
Access 的 SQL 说明 , 只有自己测试 , 现在记下以备后查 )
语法 elect table1.fd1,table1,fd2,table2.fd2 From table1 left
join table2 on table1.fd1,table2.fd1 where ...
使用 SQL 语句 用 ... 代替过长的字符串显示
语法:
SQL 数据库: select case when len(field)>10 then left(field,10)
+'...' else field end as news_name,news_id from tablename
Access 数据库: SELECT iif(len(field)>2,left(field,2)
+'...',field) FROM tablename;
Conn.Execute 说明
Execute 方法
该方法用于执行 SQL 语句。根据 SQL 语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1 .执行 SQL 查询语句时,将返回查询得到的记录集。用法为:
Set 对象变量名 = 连接对象 .Execute("SQL 查询语言 ")
Execute 方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过 Set 方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2 .执行 SQL 的操作性语言时,没有记录集的返回。此时用法为:
连接对象 .Execute "SQL 操作性语句 " [, RecordAffected][,
Option]
·RecordAffected 为可选项,此出可放置一个变量, SQL 语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道 SQL 语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为 adCMDText ,它用于
告诉 ADO ,应该将 Execute 方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans 、 RollbackTrans 、 CommitTrans 方法
这三个方法是连接对象提供的用于事务处理的方法。 BeginTrans 用于开
始一个事物; RollbackTrans 用于回滚事务; CommitTrans 用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans 和 CommitTrans 用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的 Error 集合来实现,若 Error 集合的成员个数不为 0 ,则说明有错误发生
,事务处理失败。 Error 集合中的每一个 Error 对象,代表一个错误信息。
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
--- 创建 备份数据的 device
USE 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
注:列增加后将不能删除。 DB2 中列加上后数据类型也不能改变,唯一能改
变的是增加 varchar 类型的长度。
7 、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8 、说明:创建索引: create [unique] index idxname on tabname(col
….)
删除索引: drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9 、说明:创建视图: create view viewname as select statement
删除视图: drop view viewname
10 、说明:几个简单的基本的 sql 语句
选择: select * from table1 where 范围
插入: insert into table1(field1,field2) values(value1,value2)
删除: delete from table1 where 范围
更新: update table1 set field1=value1 where 范围
查找: select * from table1 where field1 like ’%value1%’ --
-like 的语法很精妙,查资料 !
排序: select * from table1 order by field1,field2 [desc]
总数: select count * as totalcount from table1
求和: select sum(field1) as sumvalue from table1
平均: select avg(field1) as avgvalue from table1
最大: select max(field1) as maxvalue from table1
最小: select min(field1) as minvalue from table1
11 、说明:几个高级查询运算词
A : UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2 )并消去
表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即
UNION ALL ),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1 就是来自 TABLE2 。
B : EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所
有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT
ALL) ,不消除重复行。
C : INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有
重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时
(INTERSECT ALL) ,不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12 、说明:使用外连接
A 、 left outer join :
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN
b ON a.a = b.c
B : right outer join:
右外连接 ( 右连接 ) :结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C : full outer join :
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的 sql 语句
1 、说明:复制表 ( 只复制结构 , 源表名: a 新表名: b) (Access 可用 )
法一: select * into b from a where 1<>1
法二: select top 0 * into b from a
2 、说明:拷贝表 ( 拷贝数据 , 源表名: a 目标表名: b) (Access 可用 )
insert into b(a, b, c) select d,e,f from b;
3 、说明:跨数据库之间表的拷贝 ( 具体数据使用绝对路径 ) (Access 可用 )
insert into b(a, b, c) select d,e,f from b in ‘ 具体数据库 ’
where 条件
例子: ..from b in '"&Server.MapPath(".")&"/data.mdb" &"'
where..
4 、说明:子查询 ( 表名 1 : a 表名 2 : b)
select a,b,c from a where a IN (select d from b ) 或者 :
select a,b,c from a where a IN (1,2,3)
5 、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select
max(adddate) adddate from table where table.title=a.title) b
6 、说明:外连接查询 ( 表名 1 : a 表名 2 : b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON
a.a = b.c
7 、说明:在线视图查询 ( 表名 1 : a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8 、说明: between 的用法 ,between 限制查询数据范围时包括了边界值 ,not
between 不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2
9 、说明: in 的使用方法
select * from table1 where a [not] in (‘ 值 1’,’ 值 2’ ,’ 值 4’ ,
’ 值 6’ )
10 、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2
where table1.field1=table2.field1 )
11 、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join
c on a.a=c.c inner join d on a.a=d.d where .....
12 、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时
间 ,getdate())>5
13 、说明:一条 sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段 , 排序字段 from 表
名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字
段 order by a. 排序字段
14 、说明:前 10 条记录
select top 10 * form table1 where 范围
15 、说明:选择在每一组 b 值相同的数据中对应的 a 最大的记录的所有信息 (
类似这样的用法可以用于论坛每月排行榜 , 每月热销产品分析 , 按科目成绩排
名 , 等等 .)
select a,b,c from tablename ta where a=(select max(a) from
tablename tb where tb.b=ta.b)
16 、说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除
所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except
(select a from tableC)
17 、说明:随机取出 10 条数据
select top 10 * from tablename order by newid()
18 、说明:随机选择记录
select newid()
19 、说明:删除重复记录
Delete from tablename where id not in (select max(id) from
tablename group by col1,col2,...)
20 、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21 、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22 、说明:列示 type 、 vender 、 pcs 字段,以 type 字段排列, case 可以方便
地实现多重选择,类似 select 中的 case 。
select type,sum(case vender when 'A' then pcs else 0
end),sum(case vender when 'C' then pcs else 0 end),sum(case
vender when 'B' then pcs else 0 end) FROM tablename group by
type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23 、说明:初始化表 table1
TRUNCATE TABLE table1
24 、说明:选择从 10 到 15 的记录
select top 5 * from (select top 15 * from table order by id
asc) table_ 别名 order by id desc
随机选择数据库记录的方法(使用 Randomize 函数,通过 SQL 语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求 ASP“ 找个随机数 ” 然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出 1 到 500 范围之内的一个随机数(假设 500
就是数据库内记录的总数)。然后,你遍历每一记录来测试 ID 的值、检查
其是否匹配 RNumber 。满足条件的话就执行由 THEN 关键字开始的那一块代码
。假如你的 RNumber 等于 495 ,那么要循环一遍数据库花的时间可就长了。
虽然 500 这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死定了?
采用 SQL ,你就可以很快地找出准确的记录并且打开一个只包含该记录
的 recordset ,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " &
objRec("c_email")
不必写出 RNumber 和 ID ,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作 “ 随机 ” 记录。 Recordset 没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干 Random 函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准 Random
示例扩展一下就可以用 SQL 应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一 recordset 内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR
ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出 10 条记录(也许是每次页面装载时的 10 条链接的列表),
你可以用 BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这
里的 ID 是自动生成的号码):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber &
" AND " & RNumber & "+ 9"
注意:以上代码的执行目的不是检查数据库内是否有 9 条并发记录。
随机读取若干条记录,测试过
Access 语法: SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access 左连接语法 ( 最近开发要用左连接 ,Access 帮助什么都没有 , 网上没有
Access 的 SQL 说明 , 只有自己测试 , 现在记下以备后查 )
语法 elect table1.fd1,table1,fd2,table2.fd2 From table1 left
join table2 on table1.fd1,table2.fd1 where ...
使用 SQL 语句 用 ... 代替过长的字符串显示
语法:
SQL 数据库: select case when len(field)>10 then left(field,10)
+'...' else field end as news_name,news_id from tablename
Access 数据库: SELECT iif(len(field)>2,left(field,2)
+'...',field) FROM tablename;
Conn.Execute 说明
Execute 方法
该方法用于执行 SQL 语句。根据 SQL 语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1 .执行 SQL 查询语句时,将返回查询得到的记录集。用法为:
Set 对象变量名 = 连接对象 .Execute("SQL 查询语言 ")
Execute 方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过 Set 方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2 .执行 SQL 的操作性语言时,没有记录集的返回。此时用法为:
连接对象 .Execute "SQL 操作性语句 " [, RecordAffected][,
Option]
·RecordAffected 为可选项,此出可放置一个变量, SQL 语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道 SQL 语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为 adCMDText ,它用于
告诉 ADO ,应该将 Execute 方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans 、 RollbackTrans 、 CommitTrans 方法
这三个方法是连接对象提供的用于事务处理的方法。 BeginTrans 用于开
始一个事物; RollbackTrans 用于回滚事务; CommitTrans 用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans 和 CommitTrans 用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的 Error 集合来实现,若 Error 集合的成员个数不为 0 ,则说明有错误发生
,事务处理失败。 Error 集合中的每一个 Error 对象,代表一个错误信息。
Access
基本操作
Access
基本操作
一、数据库的基本概念和设计方法
所谓数据库实际上是关于某一特定主题或目标的信息集合。它把大量数据按一定的结构进行存储,集中管理和统一使用这些数据,实现数据共享。在 Access 中,数据库不仅包含用于存放加工过的信息的表,还包含以表中所存放的信息为操作对象的查询、窗体、报表、页等数据库对象。
一般地,数据库的设计应遵循以下几个步骤:
1 、确定创建数据库所要完成的目的。
2 、确定创建数据库中所需要的表。
3 、确定表中所需要的字段。
4 、明确有唯一值的主关键字段。
5 、确定表之间的关系。
6 、优化设计。
7 、输入数据并创建其他数据库对象。
二、创建数据库
在 Access 中既可以使用人工的方法按照自己的要求来建立数据库,也可以使用软件为用户提供的各种数据库向导,前者更为自由而后者则显然要方便一些。
A 、自行创建数据库
使用人工的方法按照自己的要求来建立数据库,首先应创建一个空数据库,然后再将对象加入到数据库中。创建空数据库的步骤为:
1 、在启动 Access 后的 Microsoft Access 对话框中选择 “ 空 Access 数据库 ” 选项。
2 、在弹出的 “ 文件新建数据库 ” 对话框中选择数据库存放的位置、输入数据库的名称并单击 “ 创建 ” 按钮,进入 Access 数据库窗口,即完成了空数据库的创建。
B 、使用数据库向导创建数据库
Access 为用户提供了多种数据库向导,使用数据库向导可以方便地完成数据库的创建工作。具体步骤如下:
1 、在启动 Access 后的 Microsoft Access 对话框中选择 “Access 数据库向导、数据页和项目 ” 选项。
2 、在弹出 “ 新建 ” 对话框后单击 “ 数据库 ” 选项卡,选择一种数据库。
3 、在弹出的 “ 文件新建数据库 ” 对话框中,选择数据库存放的位置,输入数据库的名称并单击 “ 创建 ” 按钮。
4 、依次在数据库向导窗口中为数据库中的各个表选择字段、选择显示样式、确定打印报表所用的样式、输入所建数据库的标题、确定是否在所有报表上加一幅图片,最后启动该数据库,至此就完成了使用向导创建数据库的工作。
三、表的基本概念
表是数据库中存储数据的最基本的对象,常称为 “ 基础表 ” ,是构成数据库的一个重要组成部分。表由若干记录组成,每一行称为一个记录,对应着一个真实的对象;每一列称为一个字段,对应着对象的一个属性信息。每个表的关键字(关键字可以为一个字段或多个字段)使表中的记录唯一。在表内还可以定义索引,当表内存放大量数据时可以加速数据的查找。
Access 中的所有数据都存放在数据表中。表是一个数据库系统的基础,只有建立表后,才可以建立查询、窗体和报表等其他项目,逐步完善数据库。
四、创建表
Access 提供了三种创建新表的方法:
1 、使用数据库向导,在一个操作中创建整个数据库所需的全部表、窗体及报表。
2 、使用表向导来选择表的字段,这些字段可以从其他已定义好的表中选择。
3 、使用设计视图创建表。
不管使用哪一种方法来创建表,随时都可以使用表设计试图来进一步自定义表。由于第一种方法已包含在使用数据库向导创建数据库的内容之中,这里着重说明后两种方法的实现。
A 、利用表向导创建表
利用表向导创建新表,一般情况下能满足数据库开发者的要求,至于多余的字段可以用其他的方法将其删除。利用表向导创建表的步骤如下:
1 、在数据库窗口中,单击 “ 对象 ” 列表中的 “ 表 ” ,双击 “ 使用向导创建表 ” 。
2 、在弹出的 “ 表向导 ” 对话框中单击 “ 表向导 ” 并单击 “ 确定 ” 按钮。
3 、在弹出的对话框中选择要使用的表并添加所需要的字段(可以重命名)后单击 “ 下一步 ” 按钮。
4 、为表指定名称并确认主键,单击 “ 下一步 ” 按钮。
5 、选择创建完表后的动作,然后单击 “ 完成 ” 按钮。
B 、利用设计视图创建表
使用设计器建立表的方法有两种:一种方法是直接使用设计器来创建新表,另一种方法是使用表向导来构造一个结构相近的表,然后在设计器中打开修改。下面介绍使用设计器来创建新表的步骤:
1 、在数据库窗口中,单击对象列表中的 “ 表 ” ,双击 “ 使用设计器创建表 ” 的按钮,进入 “ 新建表 ” 对话框。
2 、在各栏中输入字段名称、选择数据类型,然后设置字段属性。
3 、接着选中要设置为关键字的字段,单击 “ 编辑 ” 菜单中 “ 主键 ” 命令,设置 “ 主关键字 ” ,此时在所选字段左边行选定器上出现钥匙标记。
4 、保存所设计的表。
五、关于主关键字与建立表间关系
A 、设置主关键字
为了提高 Access 在查询、窗体和报表操作中的快速查找能力和组合保存在各个不同表中信息的性能,必须为建立的表指定一个主关键字。主关键字可以包含一个或多个字段,以保证每条记录都有唯一的值。设定主关键字的目的就在于保证表中的所有记录都能够被唯一识别。如果表中没有可以用作唯一识别表中记录的字段,则可以使用多个字段来组合成主关键字。其设置步骤如下:
1 、在表设计器中,单击字段名称左边的字段选择按钮,选择要作为主关键字的字段。单击字段选择按钮的同时按住 Ctrl 键可以同时选择多个字段。
2 、单击 “ 编辑 ” 菜单中的 “ 主键 ” 命令,则在该字段的左边显示钥匙标记。
B 、建立表间关系
在表中定义主关键字除了可以保证每条记录可以被唯一识别外,更重要的作用在于多个表间的连接。当数据库中包含多个表时,需要通过主关键字的连接来建立表间的关系,使各表协同工作。
要在两个表间建立关系,必须在这两个表中拥有相同数据类型的字段。其设置步骤如下:
1 、打开表所在的数据库窗口。
2 、单击 “ 工具 ” 菜单中的 “ 关系 ” 命令,弹出 “ 显示表 ” 对话框。
3 、选择要建立关系的表,然后单击 “ 添加 ” 按钮,依次添加完所需要的表后,单击 “ 关闭 ” 按钮。
4 、在关系对话框中选择其中一表中的主关键字,拖曳到另一表中相同的主关键字,释放鼠表键后,弹出 “ 编辑关系 ” 对话框。
5 、若在 “ 编辑关系 ” 对话框中选中 “ 实施参照完整性 ” 和 “ 级联更新相关字段 ” 复选框,则使在更新主表中记录的同时更新关系表中的相关记录。
6 、若在 “ 编辑关系 ” 对话框中选中 “ 实施参照完整性 ” 和 “ 级联删除相关字段 ” 复选框,则使在删除主表中记录的同时删除关系表中的相关记录。
7 、接着单击 “ 联接类型 ” 按钮,弹出 “ 联接属性 ” 对话框,在此选择联接的方式。
8 、在 “ 编辑关系 ” 对话框中单击 “ 创建 ” 按钮,即在创建关系的表之间有一条线将其连接起来,表示已创建好表之间的关系。
9 、关闭关系对话框,按需要选择是否保存关系的设定。
编辑或修改关联性的操作是直接用鼠标在这一条线上双击,然后在弹出的 “ 编辑关系 ” 对话框中进行修改。删除关联性的操作是先用鼠标在这一条线上单击,然后再按 Delete 键删除。
六、记录的基本操作
Access 只允许每次操作一个记录,正在操作的记录在行选定器上显示一个 “ 三角图标 ” 用于标记当前记录。当改变当前记录的数据但又没有保存时,行选定器上显示一个 “ 笔型图标 ” 。
记录的基本操作包括添加记录、修改记录和删除记录。
A 、添加记录
打开表的数据视图画面时,表的最末端有一条空白的记录,在记录的行选定器上显示一个星花图标,标示可以从这里开始增加新的记录。单击 “ 插入 ” 菜单中的 “ 新记录 ” 或直接选定该行即可添加记录。输入完数据后,移到另一个记录时会自动保存该记录。
B 、修改记录
可用 Tab 键或直接用鼠标移到要修改的字段进行修改。
C 、删除记录
选择一条或多条记录后按 Delete 键删除所有选中的记录。
七、总结
读过本文之后,相信您应该可以轻松地创建一个小型的数据库了,然而相比于 Access 强大而繁多的功能,这篇文章涉及的仅仅是最最简单和基本的一些操作,关于查询、窗体、报表、页以及宏与模块的内容将比表的基础操作更为复杂,有兴趣的读者可以查询其它的资料,以便顺利地设计和制作出高质量的应用系统。
一、数据库的基本概念和设计方法
所谓数据库实际上是关于某一特定主题或目标的信息集合。它把大量数据按一定的结构进行存储,集中管理和统一使用这些数据,实现数据共享。在 Access 中,数据库不仅包含用于存放加工过的信息的表,还包含以表中所存放的信息为操作对象的查询、窗体、报表、页等数据库对象。
一般地,数据库的设计应遵循以下几个步骤:
1 、确定创建数据库所要完成的目的。
2 、确定创建数据库中所需要的表。
3 、确定表中所需要的字段。
4 、明确有唯一值的主关键字段。
5 、确定表之间的关系。
6 、优化设计。
7 、输入数据并创建其他数据库对象。
二、创建数据库
在 Access 中既可以使用人工的方法按照自己的要求来建立数据库,也可以使用软件为用户提供的各种数据库向导,前者更为自由而后者则显然要方便一些。
A 、自行创建数据库
使用人工的方法按照自己的要求来建立数据库,首先应创建一个空数据库,然后再将对象加入到数据库中。创建空数据库的步骤为:
1 、在启动 Access 后的 Microsoft Access 对话框中选择 “ 空 Access 数据库 ” 选项。
2 、在弹出的 “ 文件新建数据库 ” 对话框中选择数据库存放的位置、输入数据库的名称并单击 “ 创建 ” 按钮,进入 Access 数据库窗口,即完成了空数据库的创建。
B 、使用数据库向导创建数据库
Access 为用户提供了多种数据库向导,使用数据库向导可以方便地完成数据库的创建工作。具体步骤如下:
1 、在启动 Access 后的 Microsoft Access 对话框中选择 “Access 数据库向导、数据页和项目 ” 选项。
2 、在弹出 “ 新建 ” 对话框后单击 “ 数据库 ” 选项卡,选择一种数据库。
3 、在弹出的 “ 文件新建数据库 ” 对话框中,选择数据库存放的位置,输入数据库的名称并单击 “ 创建 ” 按钮。
4 、依次在数据库向导窗口中为数据库中的各个表选择字段、选择显示样式、确定打印报表所用的样式、输入所建数据库的标题、确定是否在所有报表上加一幅图片,最后启动该数据库,至此就完成了使用向导创建数据库的工作。
三、表的基本概念
表是数据库中存储数据的最基本的对象,常称为 “ 基础表 ” ,是构成数据库的一个重要组成部分。表由若干记录组成,每一行称为一个记录,对应着一个真实的对象;每一列称为一个字段,对应着对象的一个属性信息。每个表的关键字(关键字可以为一个字段或多个字段)使表中的记录唯一。在表内还可以定义索引,当表内存放大量数据时可以加速数据的查找。
Access 中的所有数据都存放在数据表中。表是一个数据库系统的基础,只有建立表后,才可以建立查询、窗体和报表等其他项目,逐步完善数据库。
四、创建表
Access 提供了三种创建新表的方法:
1 、使用数据库向导,在一个操作中创建整个数据库所需的全部表、窗体及报表。
2 、使用表向导来选择表的字段,这些字段可以从其他已定义好的表中选择。
3 、使用设计视图创建表。
不管使用哪一种方法来创建表,随时都可以使用表设计试图来进一步自定义表。由于第一种方法已包含在使用数据库向导创建数据库的内容之中,这里着重说明后两种方法的实现。
A 、利用表向导创建表
利用表向导创建新表,一般情况下能满足数据库开发者的要求,至于多余的字段可以用其他的方法将其删除。利用表向导创建表的步骤如下:
1 、在数据库窗口中,单击 “ 对象 ” 列表中的 “ 表 ” ,双击 “ 使用向导创建表 ” 。
2 、在弹出的 “ 表向导 ” 对话框中单击 “ 表向导 ” 并单击 “ 确定 ” 按钮。
3 、在弹出的对话框中选择要使用的表并添加所需要的字段(可以重命名)后单击 “ 下一步 ” 按钮。
4 、为表指定名称并确认主键,单击 “ 下一步 ” 按钮。
5 、选择创建完表后的动作,然后单击 “ 完成 ” 按钮。
B 、利用设计视图创建表
使用设计器建立表的方法有两种:一种方法是直接使用设计器来创建新表,另一种方法是使用表向导来构造一个结构相近的表,然后在设计器中打开修改。下面介绍使用设计器来创建新表的步骤:
1 、在数据库窗口中,单击对象列表中的 “ 表 ” ,双击 “ 使用设计器创建表 ” 的按钮,进入 “ 新建表 ” 对话框。
2 、在各栏中输入字段名称、选择数据类型,然后设置字段属性。
3 、接着选中要设置为关键字的字段,单击 “ 编辑 ” 菜单中 “ 主键 ” 命令,设置 “ 主关键字 ” ,此时在所选字段左边行选定器上出现钥匙标记。
4 、保存所设计的表。
五、关于主关键字与建立表间关系
A 、设置主关键字
为了提高 Access 在查询、窗体和报表操作中的快速查找能力和组合保存在各个不同表中信息的性能,必须为建立的表指定一个主关键字。主关键字可以包含一个或多个字段,以保证每条记录都有唯一的值。设定主关键字的目的就在于保证表中的所有记录都能够被唯一识别。如果表中没有可以用作唯一识别表中记录的字段,则可以使用多个字段来组合成主关键字。其设置步骤如下:
1 、在表设计器中,单击字段名称左边的字段选择按钮,选择要作为主关键字的字段。单击字段选择按钮的同时按住 Ctrl 键可以同时选择多个字段。
2 、单击 “ 编辑 ” 菜单中的 “ 主键 ” 命令,则在该字段的左边显示钥匙标记。
B 、建立表间关系
在表中定义主关键字除了可以保证每条记录可以被唯一识别外,更重要的作用在于多个表间的连接。当数据库中包含多个表时,需要通过主关键字的连接来建立表间的关系,使各表协同工作。
要在两个表间建立关系,必须在这两个表中拥有相同数据类型的字段。其设置步骤如下:
1 、打开表所在的数据库窗口。
2 、单击 “ 工具 ” 菜单中的 “ 关系 ” 命令,弹出 “ 显示表 ” 对话框。
3 、选择要建立关系的表,然后单击 “ 添加 ” 按钮,依次添加完所需要的表后,单击 “ 关闭 ” 按钮。
4 、在关系对话框中选择其中一表中的主关键字,拖曳到另一表中相同的主关键字,释放鼠表键后,弹出 “ 编辑关系 ” 对话框。
5 、若在 “ 编辑关系 ” 对话框中选中 “ 实施参照完整性 ” 和 “ 级联更新相关字段 ” 复选框,则使在更新主表中记录的同时更新关系表中的相关记录。
6 、若在 “ 编辑关系 ” 对话框中选中 “ 实施参照完整性 ” 和 “ 级联删除相关字段 ” 复选框,则使在删除主表中记录的同时删除关系表中的相关记录。
7 、接着单击 “ 联接类型 ” 按钮,弹出 “ 联接属性 ” 对话框,在此选择联接的方式。
8 、在 “ 编辑关系 ” 对话框中单击 “ 创建 ” 按钮,即在创建关系的表之间有一条线将其连接起来,表示已创建好表之间的关系。
9 、关闭关系对话框,按需要选择是否保存关系的设定。
编辑或修改关联性的操作是直接用鼠标在这一条线上双击,然后在弹出的 “ 编辑关系 ” 对话框中进行修改。删除关联性的操作是先用鼠标在这一条线上单击,然后再按 Delete 键删除。
六、记录的基本操作
Access 只允许每次操作一个记录,正在操作的记录在行选定器上显示一个 “ 三角图标 ” 用于标记当前记录。当改变当前记录的数据但又没有保存时,行选定器上显示一个 “ 笔型图标 ” 。
记录的基本操作包括添加记录、修改记录和删除记录。
A 、添加记录
打开表的数据视图画面时,表的最末端有一条空白的记录,在记录的行选定器上显示一个星花图标,标示可以从这里开始增加新的记录。单击 “ 插入 ” 菜单中的 “ 新记录 ” 或直接选定该行即可添加记录。输入完数据后,移到另一个记录时会自动保存该记录。
B 、修改记录
可用 Tab 键或直接用鼠标移到要修改的字段进行修改。
C 、删除记录
选择一条或多条记录后按 Delete 键删除所有选中的记录。
七、总结
读过本文之后,相信您应该可以轻松地创建一个小型的数据库了,然而相比于 Access 强大而繁多的功能,这篇文章涉及的仅仅是最最简单和基本的一些操作,关于查询、窗体、报表、页以及宏与模块的内容将比表的基础操作更为复杂,有兴趣的读者可以查询其它的资料,以便顺利地设计和制作出高质量的应用系统。