❶ sql语法范例大全的目 录
第1篇 SQL及关系数据库概述
第1章 关系数据库概述 2
1.1 数据库的基本概念 3
1.1.1 数据库的发展 3
1.1.2 数据库系统组成 3
1.1.3 数据处理的抽象描述 3
1.1.4 数据模型 4
1.2 关系数据库基本概念 4
1.2.1 关系模式 4
1.2.2 关系模型的特点及组成 5
1.2.3 关系数据语言的种类 6
1.2.4 域 7
1.2.5 笛卡儿积 7
1.2.6 关系 8
1.2.7 全关系系统十二准则 9
1.2.8 规范化(NF范式) 9
1.3 关系数据库类型 10
1.3.1 桌面数据库 10
1.3.2 网络数据库 10
1.4 常用关系数据库介绍 10
1.4.1 Microsoft Access 11
1.4.2 FoxPro 11
1.4.3 MySQL 11
1.4.4 Firebird 12
1.4.5 PostgreSQL 13
1.4.6 Informix 14
1.4.7 DB2 14
1.4.8 Sybase 15
1.4.9 SQL Server 17
1.4.10 Oracle 22
1.5 小结 29
第2章 SQL概述 30
2.1 SQL的功能和特性 31
2.2 SQL语法分类 32
2.3 SQL标准与版本 32
2.3.1 SQL92标准 33
2.3.2 SQL99标准 33
2.3.3 SQL:2003标准 34
2.4 SQL表达式 34
2.5 SQL标识符 34
2.5.1 特殊字符(语法约定) 34
2.5.2 注释字符 35
2.6 SQL常量 35
2.7 SQL变量 37
2.8 SQL数据类型 37
2.8.1 数值型数据 37
2.8.2 字符型数据 38
2.8.3 日期数据类型 38
2.8.4 其他数据类型 39
2.9 SQL语句 40
2.9.1 SQL语句分类 40
2.9.2 SELECT查询语句 41
2.10 SQL语句的执行方法 42
2.11 SQL与关系数据库 42
2.12 SQL的发展 42
2.13 小结 42
第3章 SQL扩展、工具及范例数据库介绍 44
3.1 T-SQL 46
3.1.1 注释语句 46
3.1.2 常量 46
3.1.3 变量 46
3.1.4 运算符 47
3.1.5 数据类型 48
3.1.6 函数 49
3.1.7 流程控制语句 49
3.2 PL/SQL 50
3.2.1 注释语句 50
3.2.2 数据类型 51
3.2.3 SQL92、T-SQL、PL/SQL数据
类型比较 51
3.2.4 运算符 52
3.2.5 函数 52
3.2.6 PL/SQL与T-SQL函数比较 53
3.2.7 常量和变量 53
3.2.8 流程控制语句 54
3.3 SQLCMD工具 55
3.4 SQL Server查询分析工具 57
3.5 Oracle企业管理器EM工具 58
3.6 Oracle SQL * Plus工具 60
3.6.1 SQL*Plus的主要功能 60
3.6.2 SQL*Plus启动和快速登录
方法 61
3.6.3 SQL*Plus常用命令操作 62
3.6.4 iSQL * Plus 70
3.7 PL/SQL Developer工具 72
3.7.1 主要功能特性 72
3.7.2 软件资源 74
3.7.3 基本用法 74
3.8 TOAD工具 76
3.8.1 主要功能特性 76
3.8.2 软件资源 77
3.8.3 基本用法 77
3.9 范例数据库介绍 80
3.9.1 SQL Server学籍管理数据库 80
3.9.2 SQL Server系统示例库 84
3.9.3 Oracle系统示例库 84
3.10 本章小结 90
第2篇 SQL运算符和函数
第4章 SQL运算符 92
4.1 算术运算符 94
4.2 赋值运算符 94
4.3 字符串串联运算符 94
4.3.1 加号“+” 94
4.3.2 双竖号“||” 94
4.4 一元运算符 94
4.5 逻辑运算符 95
4.6 比较运算符 95
4.7 集合运算符 96
4.7.1 UNION运算符 96
4.7.2 EXCEPT运算符 96
4.7.3 INTERSECT运算符 97
4.8 运算符优先级 97
4.9 SQL92、SQL Server和Oracle运算符
比较 97
4.10 小结 99
第5章 函数 100
5.1 数值函数 102
5.2 字符串函数 103
5.3 日期时间函数 104
5.4 数据类型转换函数 106
5.4.1 CAST ()函数 106
5.4.2 CONVERT () 函数 107
5.5 统计函数 109
5.5.1 SUM ()求和 110
5.5.2 COUNT ()计数 110
5.5.3 MAX () /MIN ()求最大/
最小值 111
5.5.4 AVG ()求均值 112
5.5.5 VAR () /VARP () 求方差 113
5.5.6 STDEV () /STDEVP ()求标准
误差 113
5.5.7 使用DISTINCT关键字进行
重值筛选 114
5.6 小结 114
第3篇 数据查询操作
第6章 简单查询 116
6.1 用SELECT子句选择列表 118
6.1.1 选择列 119
6.1.2 更改列标题 119
6.1.3 使用TOP限制选择行数 120
6.1.4 DISTINCT去掉重复的字段
数据 121
6.1.5 DISTINCTROW去掉重复的
记录数据 122
6.2 FROM子句 122
6.2.1 对具有相同列名的两个表
进行查询 123
6.2.2 从查询结果集合中查询数据 123
6.3 WHERE子句 123
6.3.1 使用比较运算符指定查询
条件 124
6.3.2 使用逻辑运算符指定查询
条件 124
6.3.3 使用范围BETWEEN指定
查询条件 125
6.3.4 使用列表IN指定查询条件 125
6.3.5 使用LIKE与通配符指定查询
条件 125
6.3.6 NULL空值的判断 126
6.3.7 使用包含判断词EXISTS、
ALL、ANY、SOME 126
6.4 GROUP BY子句 130
6.4.1 一般情况的分组查询 131
6.4.2 GROUP BY子句根据多列组
合行 132
6.4.3 CUBE和ROLLUP运算符及
使用 132
6.4.4 GROUP BY子句中的NULL
值处理 133
6.5 HAVING子句 134
6.5.1 HAVING子句的一般应用 134
6.5.2 HAVING与WHERE子句的
区别 135
6.5.3 HAVING子句单独使用 136
6.5.4 HAVING子句与CASE语句
结合使用 137
6.6 ORDER BY子句 137
6.6.1 ORDER BY子句的使用 137
6.6.2 ORDER BY子句的约束 139
6.7 小结 139
第7章 连接查询 141
7.1 连接概述 143
7.1.1 连接范围 143
7.1.2 连接类型 143
7.1.3 笛卡儿积 143
7.1.4 连接语法 144
7.1.5 连接运算符 144
7.2 自(身)连接 144
7.3 内连接(INNER JOIN) 145
7.3.1 等值连接 145
7.3.2 不等连接 146
7.3.3 自然连接 147
7.4 外连接 148
7.4.1 左外连接(LEFT JOIN) 148
7.4.2 右外连接(RIGHT JOIN) 149
7.4.3 全外连接(FULL JOIN) 150
7.5 交叉连接(CROSS JOIN) 151
7.6 小结 151
第8章 集合查询 153
8.1 集合概念 155
8.2 集合性质 155
8.3 集合运算 155
8.4 UNION运算符 156
8.4.1 使用UNION进行表内查询 156
8.4.2 使用UNION进行多表查询 157
8.4.3 使用UNION JOIN连接查询 158
8.5 INTERSECT运算符 159
8.6 EXCEPT运算符 159
8.7 小结 160
第9章 子查询 161
9.1 概述 163
9.1.1 子查询定义 163
9.1.2 子查询语法 163
9.1.3 子查询的两种基本形式 164
9.1.4 子查询的优点 165
9.1.5 子查询分类 165
9.1.6 子查询中的比较运算符与谓词 165
9.1.7 使用子查询的规则 168
9.2 单行子查询 169
9.3 多行子查询 170
9.3.1 在多行子查询中使用IN比较符 170
9.3.2 在多行子查询中使用ALL、SOME、ANY比较符 171
9.4 多列子查询 172
9.5 相关子查询 173
9.5.1 使用单行比较运算符引入相关子查询 174
9.5.2 使用IN引入相关子查询 174
9.5.3 在子查询中使用[NOT] EXISTS 175
9.6 在各类SQL语句中使用子查询 177
9.6.1 在SELECT子句中使用子查询 177
9.6.2 在FROM子句中使用子查询 177
9.6.3 在WHERE子句中使用子查询 177
9.6.4 在GROUP BY子句中使用子查询 178
9.6.5 在HAVING子句中使用子查询 178
9.6.6 在CREATE TABLE语句中使用子查询 178
9.6.7 在CREATE VIEW语句中使用子查询 179
9.6.8 在INSERT INTO子句中使用子查询 180
9.6.9 在UPDATE语句中使用子查询 181
9.6.10 在DELETE语句中使用子查询 182
9.6.11 使用WITH子句重用子查询 182
9.7 树查询 183
9.8 小结 184
第4篇 数据更新操作
第10章 数据库操作 186
10.1 创建数据库 188
10.2 查看数据库信息 193
10.3 更改数据库 193
10.3.1 更改数据库名称 195
10.3.2 修改数据库文件 195
10.3.3 更改数据库属性 200
10.4 删除数据库 201
10.5 小结 201
第11章 方案操作 202
11.1 方案概述 204
11.2 查找方案 204
11.3 创建方案 204
11.4 更改方案 206
11.5 删除方案 206
11.6 小结 207
第12章 数据表操作 208
12.1 创建表 210
12.2 复制表 211
12.3 修改表结构 212
12.3.1 增加列和约束 212
12.3.2 查找列约束 214
12.3.3 修改列和约束 214
12.3.4 删除列和约束 215
12.4 行记录操作 215
12.4.1 插入记录 215
12.4.2 修改记录 218
12.4.3 删除记录(DELETE) 223
12.4.4 删除记录(TRUNCATE) 225
12.5 重命名表 226
12.6 删除表 226
12.7 MERGE语句 226
12.8 小结 228
第13章 索引操作 229
13.1 索引的分类 231
13.1.1 索引的概念 231
13.1.2 索引分类 231
13.2 索引使用的场所 232
13.3 查看索引 233
13.4 创建索引 234
13.4.1 创建索引的方法 234
13.4.2 CREATE INDEX语法 234
13.4.3 创建聚簇索引 236
13.4.4 创建非聚簇索引 236
13.4.5 创建简单列索引 236
13.4.6 创建组合列索引 237
13.4.7 创建普通索引 238
13.4.8 创建唯一索引 238
13.4.9 创建视图索引 241
13.5 修改索引 242
13.6 禁用/启用索引 245
13.7 删除索引 245
13.8 小结 246
第14章 视图操作 248
14.1 查询视图 250
14.2 创建视图 251
14.3 修改视图 255
14.4 删除视图 256
14.5 小结 257
第15章 序列操作 258
15.1 创建序列 260
15.2 查找序列值 260
15.3 使用序列 261
15.4 修改序列 261
15.5 删除序列 262
15.6 小结 262
第5篇 数据安全管理
第16章 完整性约束 264
16.1 数据库的安全性 266
16.2 完整性约束分类 267
16.3 表约束 268
16.3.1 DEFAULT约束 268
16.3.2 NOT NULL约束 269
16.3.3 CHECK约束 269
16.3.4 UNIQUE约束 270
16.3.5 PRIMARY KEY约束 270
16.3.6 FOREIGN KEY约束 271
16.3.7 FOREIGN KEY的MATCH
约束 272
16.4 域约束 273
16.5 断言 273
16.6 禁止与启用约束 274
16.7 查看约束 275
16.8 删除约束DROP 275
16.9 小结 275
第17章 用户管理 277
17.1 查找用户及相关信息 279
17.2 创建用户 282
17.3 修改用户 285
17.4 删除用户 286
17.5 小结 286
第18章 角色管理 288
18.1 角色的概念 290
18.2 查找角色 290
18.3 创建角色 293
18.4 更改角色 295
18.5 删除角色 295
18.6 小结 295
第19章 权限管理 297
19.1 权限分类 299
19.2 查看权限 299
19.3 授予权限 303
19.3.1 授予ALL权限 304
19.3.2 授予SELECT权限 304
19.3.3 授予CREATE权限 304
19.3.4 授予INSERT权限 305
19.3.5 授予UPDATE列权限 305
19.3.6 授予ALTER权限 305
19.3.7 授予EXECUTE权限 306
19.3.8 授予REFERENCES权限 306
19.3.9 授予DELETE权限 306
19.3.10 授予DROP权限 306
19.3.11 授予用户角色的权限 307
19.4 收回权限 308
19.5 小结 309
第6篇 SQL编程
第20章 事务控制与并发处理 312
20.1 事务的基本概念 314
20.2 锁的基本概念和分类 314
20.3 事务的并发控制 318
20.3.1 并发控制方法 319
20.3.2 事务隔离级别 319
20.3.3 事务特性的设置 321
20.4 事务开始和终止 322
20.5 数据库读写访问操作 322
20.6 事务提交 322
20.7 事务回滚 323
20.8 SQL Server与Oracle事务处理的
比较 324
20.9 小结 324
第21章 存储过程 326
21.1 存储过程的概念 329
21.2 存储过程的优点 329
21.3 存储过程分类 329
21.4 SQL Server存储过程中的控制语句 330
21.4.1 注释语句 330
21.4.2 屏幕输出语句 330
21.4.3 变量定义和使用语句 330
21.4.4 块语句 331
21.4.5 判断语句 331
21.4.6 循环语句 332
21.4.7 转向定位语句 333
21.4.8 定时执行语句 333
21.4.9 错误捕获语句 333
21.5 Oracle存储过程中的控制语句 333
21.5.1 注释语句 334
21.5.2 屏幕输出语句 334
21.5.3 变量和常量的定义和使用 334
21.5.4 块语句BEGIN…END 337
21.5.5 判断语句IF、CASE 338
21.5.6 循环语句 340
21.5.7 转向定位语句 342
21.5.8 定时执行作业任务dbms_job 342
21.5.9 错误捕获语句 346
21.6 存储过程的创建 346
21.6.1 创建存储过程的语法 346
21.6.2 创建无参数的存储过程 347
21.6.3 创建有参数的存储过程 347
21.7 存储过程的调用与执行 349
21.7.1 RETURN语句及返回值 350
21.7.2 存储过程的创建和调用步骤 351
21.7.3 存储过程调用方法和步骤 352
21.7.4 调用无参数的过程 352
21.7.5 调用有参数的过程 352
21.8 存储过程的查看 354
21.8.1 查看SQL Server存储过程 354
21.8.2 查看Oracle存储过程 356
21.9 存储过程的修改和重编译 359
21.9.1 修改存储过程 360
21.9.2 重命名存储过程 360
21.9.3 存储过程的重编译 361
21.10 存储过程的删除 364
21.11 SQL Server中几个重要的存储
过程介绍 365
21.11.1 sp_attach_db 366
21.11.2 sp_attach_single_file_db 366
21.11.3 sp_changedbowner 367
21.11.4 sp_changeobjectowner 367
21.11.5 sp_configure 368
21.11.6 xp_cmdshell 370
21.11.7 sp_spaceused 373
21.11.8 sp_msforeachtable 374
21.12 存储过程应用实例 374
21.12.1 用存储过程实现数据表更新
操作 374
21.12.2 用存储过程实现数据备份与
恢复 376
21.13 小结 377
第22章 存储函数 379
22.1 存储函数和存储过程的区别 381
22.2 存储函数的类型和约定 381
22.3 存储函数的创建和调用 383
22.3.1 存储函数创建语法 385
22.3.2 存储函数调用类型、方法和
语法 387
22.3.3 SQL Server存储函数的创建
和调用 387
22.3.4 Oracle存储函数的创建和
调用 390
22.4 存储函数的更改 396
22.5 存储函数的编译 397
22.6 存储函数信息的查看 397
22.6.1 查看SQL Server存储函数 398
22.6.2 查看Oracle存储函数 399
22.7 存储函数的删除 401
22.8 小结 402
第23章 触发器 404
23.1 触发器概述 406
23.1.1 触发器的基本概念 406
23.1.2 触发器的用途和优势 407
23.1.3 触发器的类型 408
23.1.4 触发器中的两个临时表 409
23.2 创建SQL Server触发器 409
23.2.1 创建DML触发器 410
23.2.2 创建DDL触发器 420
23.2.3 创建INSTEAD OF触发器 423
23.2.4 创建嵌套触发器 426
23.2.5 创建递归触发器 428
23.3 创建Oracle触发器 430
23.3.1 触发谓词的使用 431
23.3.2 创建DML语句触发器 432
23.3.3 创建DML行触发器 435
23.3.4 创建DDL触发器 438
23.3.5 创建INSTERD OF触发器 439
23.3.6 创建事件触发器 441
23.4 更改触发器 444
23.5 重新编译Oracle触发器 446
23.6 禁止和启用触发器 446
23.7 查看触发器信息 447
23.7.1 查看SQL Server触发器 447
23.7.2 查看Oracle触发器 449
23.8 删除触发器 451
23.9 本章小结 453
第24章 游标 455
24.1 游标的基本概念 457
24.1.1 游标的基本原理 457
24.1.2 游标的内容构成 457
24.1.3 游标的类型 457
24.1.4 游标变量 461
24.2 游标操作 462
24.2.1 申明游标 462
24.2.2 打开游标 463
24.2.3 读取数据 464
24.2.4 关闭游标CLOSE 469
24.2.5 删除游标 469
24.3 查看游标 470
24.3.1 查看SQL Server游标 470
24.3.2 查看Oracle游标 475
24.4 游标循环 476
24.5 参数游标 478
24.6 游标嵌套 479
24.7 游标应用 479
24.8 小结 483
第25章 错误和异常处理 486
25.1 错误和异常分类 488
25.2 SQL Server错误和异常处理 488
25.2.1 错误信息及存储 488
25.2.2 错误捕获方法 488
25.3 Oracle错误和异常处理 492
25.3.1 异常处理方法 492
25.3.2 异常处理语法 492
25.3.3 预定义异常处理 493
25.3.4 非预定义异常处理 494
25.3.5 自定义异常处理 495
25.4 小结 496
第7篇 SQL在数据库开发和
管理中的应用
第26章 嵌入式SQL 498
26.1 ESQL基本概念 500
26.2 SQL的使用方法 500
26.3 ESQL语句和宿主语言之间的通信
方法 502
26.3.1 使用SQL通信区通信 503
26.3.2 使用主变量通信 503
26.3.3 使用游标通信 506
26.4 ESQL的编译处理过程 507
26.5 使用WHENEVER语句简化错误
处理 507
26.6 在高级语言中嵌入SQL 509
26.6.1 ESQL的语法格式 509
26.6.2 在Visual C++下执行ESQL
语句 509
26.6.3 在Visual C#中执行嵌入式
T-SQL语句 511
26.7 在数据库管理系统中嵌入SQL 513
26.7.1 ESQL语句与T-SQL和
PL/SQL语句的比较 513
26.7.2 在SQL Server中使用嵌入式
SQL 514
26.7.3 在Oracle中嵌入SQL 517
26.8 动态SQL技术 524
26.8.1 动态SQL的基本概念 524
26.8.2 SQL Server动态SQL语句的处理 525
26.8.3 Oracle动态SQL语句的处理 527
26.9 小结 532
第27章 数据库的存取访问技术 534
27.1 数据库系统的开发环境 536
27.2 应用系统的典型结构 536
27.3 开发平台和工具 538
27.3.1 Power Builder 538
27.3.2 Delphi 539
27.3.3 Oracle Developer Suite 539
27.3.4 .NET 540
27.3.5 J2EE 542
27.3.6 .NET和J2EE比较 543
27.4 数据库的连接访问技术 543
27.4.1 OLE DB 543
27.4.2 ODBC 545
27.4.3 JDBC 547
27.4.4 ADO 549
27.4.5 ADO.NET 556
27.4.6 Recordset对象方法的使用 561
27.5 ASP/ASP.NET与数据库的连接和访问 562
27.5.1 ASP/ASP.NET与Text 563
27.5.2 ASP/ASP.NET与Excel 563
27.5.3 ASP/ASP.NET与Access 564
27.5.4 ASP/ASP.NET与SQLServer 564
27.5.5 ASP/ASP.NET与Oracle 565
27.6 VB.NET与数据库的连接和访问 566
27.6.1 VB.NET与Text 566
27.6.2 VB.NET与Excel 566
27.6.3 VB.NET与Access 567
27.6.4 VB.NET与SQL Server 568
27.6.5 VB.NET与Oracle 568
27.7 VC#.NET与数据库的连接和访问 569
27.7.1 VC#.NET与Excel 569
27.7.2 VC#.NET与Access 570
27.7.3 VC#.NET与SQL Server 571
27.7.4 VC#.NET与Oracle 572
27.8 小结 572
第28章 用SQL管理SQL Server数据库 573
28.1 操作系统管理 576
28.1.1 查看服务器属性和操作系统参数 576
28.1.2 查看磁盘目录和文件信息 577
28.1.3 查看存储介质与磁盘分区信息 578
28.1.4 查看服务器提供的服务组件与程序 579
28.2 DBMS管理 579
28.2.1 查看数据库服务属性 579
28.2.2 查看数据库系统版本及配置参数 580
28.2.3 查看和修改数据库属性 580
28.2.4 查看数据库文件和文件组属性 582
28.2.5 查看当前数据库重要的数据对象 582
28.2.6 查看数据库日志 583
28.3 用户对象、权限与安全管理 584
28.3.1 查看数据库角色 584
28.3.2 查看和管理数据库用户 585
28.3.3 查看有关权限 586
28.3.4 查看和管理用户的数据对象 587
28.3.5 查看和管理进程 590
28.3.6 查看数据库锁 591
28.3.7 数据库备份和恢复 593
28.4 小结 597
第29章 用SQL管理Oracle数据库 599
29.1 系统管理 606
29.1.1 查看数据库系统属性 606
29.1.2 查看所有数据库对象的属性 607
29.1.3 查看和修改当前数据库的字符集 608
29.1.4 查看数据库文件的属性 609
29.1.5 查看和设置数据库归档信息 609
29.1.6 查看数据库的数据字典 611
29.1.7 查看数据库的后台进程 612
29.1.8 查看和修改系统的当前时间 612
29.1.9 查看SCN和MTS 613
29.2 连接、会话与进程管理 614
29.2.1 查看数据库的并发连接会话数 614
29.2.2 查看客户端连接会话信息 614
29.2.3 查看会话进程及客户端信息 617
29.3 表空间和数据文件管理 619
29.3.1 查看表空间信息 619
29.3.2 查看表空间的数据文件和容量统计信息 620
29.3.3 查看数据对象所占用的表空间信息 622
29.3.4 查看表空间的碎片 623
29.3.5 查看数据文件信息 624
29.3.6 查看日志组信息 625
29.3.7 查看竞争与等待信息 626
29.3.8 查看TRACE脚本文件 628
29.4 回滚段管理 628
29.4.1 查看回滚段的属性 628
29.4.2 查看用户与会话正在使用的回滚段 631
29.5 数据表管理 631
29.5.1 查看数据表的基本属性 631
29.5.2 查看表的存储信息 632
29.5.3 查看表的约束与关联信息 634
29.5.4 表记录管理 636
29.6 索引管理 637
29.6.1 查看索引属性 637
29.6.2 查看用户的索引信息 637
29.6.3 查看索引的存储属性 638
29.6.4 对字段进行全文检索 638
29.7 存储过程、存储函数和触发器管理 639
29.7.1 查看存储过程和函数的状态信息 639
29.7.2 查看触发器、过程、函数的创建脚本 639
29.8 查看运行的SQL语句 640
29.8.1 查看进程所对应的SQL语句 640
29.8.2 查看用户正在运行的SQL语句 642
29.8.3 查看Disk Read最高的SQL语句 642
29.8.4 查看回滚段里正在运行的SQL语句 643
29.8.5 查看视图对应的SQL语句 643
29.8.6 查看SQL语句的执行情况 643
29.9 角色、用户与安全管理 643
29.9.1 查看数据库角色信息 644
29.9.2 查看数据库用户信息 644
29.9.3 查看用户对象和类型 646
29.9.4 查看有关授权信息 649
29.9.5 查看数据备份和恢复信息 650
29.10 锁管理 651
29.10.1 查看锁 651
29.10.2 查看被锁的进程及锁类型信息 654
29.10.3 查看被锁定的数据库对象 655
29.10.4 查看锁定对象的客户端信息 656
29.10.5 解锁操作 656
29.11 参数调整与性能优化 657
29.11.1 查看数据库服务器参数 658
29.11.2 查看客户端参数 659
29.11.3 查看会话环境参数 659
29.11.4 查看inin.ora参数 659
29.11.5 查看NLS参数 659
29.11.6 查看SGA 660
29.11.7 查看PGA 670
29.11.8 查看排序区 670
29.11.9 查看Large Pool 671
29.11.10 查看Java语言区 671
29.11.11 查看UGA区 671
29.11.12 查看CPU资源 671
29.11.13 查看I/O资源的使用情况 672
29.11.14 查看等待与竞争 673
29.11.15 SQL语句优化 676
29.12 小结 678
第8篇 附录
附录A SQL常用语句分类索引 680
附录B SQL、SQL Server、Oracle常用函数分类对照索引 683
附录C SQL Server常用系统表和系统存储过程索引 689
附录D Oracle数据库常用视图索引 696
附录E Oracle数据库系统环境变量参数 700
❷ SQL数据库常用语法都有哪些
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。
练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。
在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。
SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。
如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。
回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。
既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。
有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。
让我们来看一看上述INSERT语句的语法图:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。
SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下:
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:
SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表,如表1所示。
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
❸ SQL数据库常用命令及语法举例
下面是一些常用的SQL语句,虽然很基础,可是却很值得收藏,对于初学者非常实用
❹ sql常用语句,帮我归纳出来,谢谢
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice '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:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
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
三、技巧
1、1=1,1=2的使用,在SQL语句组合时用的较多
"where 1=1" 是表示选择全部 "where 1=2"全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的数据库名
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
小记存储过程中经常用到的本周,本月,本年函数
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
Dateadd(mm,datediff(mm,0,getdate()),0)
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))
Dateadd(yy,datediff(yy,0,getdate()),0)
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
上面的SQL代码只是一个时间段
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
就是表示本周时间段.
下面的SQL的条件部分,就是查询时间段在本周范围内的:
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
而在存储过程中
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)
❺ SQL的基本语法
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice '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/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1(仅用于SQlServer)
法二: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.排序字段
具体实现:
关于数据库分页:
declare @start int,@end int
@sql nvarchar(600)
set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
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、说明:删除重复记录
1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
alter table tablename
--添加一个自增列
add column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,...)
alter table tablename drop column column_b
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // 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
❻ SQL 数据库常用命令及语法举例
SQL2000常用命令,语法使用方法
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
(3) 删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.execute(sql)
用 rs("别名") 获取统的计值,其它函数运用同上。
(5) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
4. 记录集对象的方法:
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
2、更改表格
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
说明:增加一个栏位(没有删除某个栏位的语法。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
说明:更改表得的定义把某个栏位设为主键。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
说明:把主键的定义删除。
3、建立索引
CREATE INDEX index_name ON table_name (column_name)
说明:对某个表格的栏位建立索引以增加查询时的速度。
4、删除
DROP table_name
DROP index_name
二、的资料形态 DATATYPEs
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数
点后有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串,n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)
和 char(n) 一样,不过其单位是两个字符 double-bytes, n不能超过127。这个形态是为
了支援两个字符长度的字体,例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字符字串,n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。
timestamp
包含了 年、月、日、时、分、秒、千分之一秒。
三、资料操作 DML (Data Manipulation Language)
资料定义好之后接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:
1、增加资料:
INSERT INTO table_name (column1,column2,...)
valueS ( value1,value2, ...)
说明:
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。
INSERT INTO table_name (column1,column2,...)
SELECT columnx,columny,... FROM another_table
说明:也可以经过一个子查询(subquery)把别的表格的资料填入。
2、查询资料:
基本查询
SELECT column1,columns2,...
FROM table_name
说明:把table_name 的特定栏位资料全部列出来
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:
INSERT INTO EMPLOYEES valueS
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。
如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。
回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd)
❼ sql语法查询数据都有什么语法
http://www.eeyes.net/et/etnew/jiaocheng/sql.txt
或:
SQL介绍
使用SELECT 语句从表中取数据
创建新表
字段属性
向表中添加数据
删除和修改表
为了建立交互站点,你需要使用数据库来存储来自访问者的信息。例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简历,所感兴趣的工作等等这样的信息。创建动态网叶也需要使用数据库,如果你想显示符合来访者要求的最好的工作,你就需要从数据库中取出这份工作的信息。你将会发现,在许多情况下需要使用数据库。
在这一章里,你将学会怎样使用"结构化查询语言"(SQL〕来操作数据库。SQL语言是数据库的标准语言。在Active Sever Pages 中,无论何时你要访问一个数据库,你就要使用SQL语言。因此,掌握好SQL对ASP编程是非常重要的。
注意:
你可以把"SQL"读作"sequel",也可以按单个字母的读音读作S-Q-L。 两种发音都是正确的,每种发音各有大量的支持者。在本书里,认为"SQL"读作"sequel"。
通过这一章的学习,你将理解怎样用SQL实现数据库查询,你将学会怎样使用这种查询从数据表中取出信息,最后,你将学会怎样设计和建立自己的数据库。
注意:
通过下面几章对SQL的介绍,你将对SQL有足够的了解,从而可以有效地使用Active Sever Pages。但是,SQL是一种复杂的语言,本书不可能包括它的全部细节。要全面掌握SQL语言,你需要学习在Microsoft SQL Sever 中使用SQL。你可以到附近的书店去买一本Microsoft SQL Sever 6.5。
SQL介绍:
本书假设你是在SQL操作Microsoft SQL Sever 的数据库。你也可以用SQL操作许多其它类型的数据库。SQL是操作数据库的标准语言。(事实上,关于SQL语言有一个专门的ANSI标准〕
注意:
不要在你的站点上试图用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同时服务于许多用户,如果你希望你的站点有较高的访问率,MS Access是不能胜任的。
在学习SQL的细节之前,你需要理解它的两大特点。一个特点容易掌握,另一个掌握起来有点困难。
第一个特点是所有SQL数据库中的数据都存储在表中。一个表由行和列组成。例如,下面这个简单的表包括name 和e-mail address:
Name Email Address
................................................................
Bill Gates [email protected]
president Clinton [email protected]
Stephen Walther [email protected]
这个表有两列(列也称为字段,域〕:Name和Email Address。有三行,每一行包含一组数据。一行中的数据组合在一起称为一条记录。
无论何时你向表中添加新数据,你就添加了一条新记录。一个数据表可以有几十个记录,也可以有几千甚至几十亿个记录。虽然你也许永远不需要存储十亿个Email地址,但知道你能这样做总是好的,也许有一天你会有这样的需要。
你的数据库很有可能包含几十个表,所有存储在你数据库中的信息都被存储在这些表中。当你考虑怎样把信息存储在数据库中时,你应该考虑怎样把它们存储在表中。
SQL的第二个特点有些难于掌握。这种语言被设计为不允许你按照某种特定的顺序来取出记录,因为这样做会降低SQL Sever取记录的效率。使用SQL,你只能按查询条件来读取记录。
当考虑如何从表中取出记录时,自然会想到按记录的位置读取它们。例如,也许你会尝试通过一个循环,逐个记录地扫描,来选出特定的记录。在使用SQL时,你必须训练自己,不要有这种思路。
假如你想选出所有的名字是"Bill Gates"的记录,如果使用传统的编程语言,你也许会构造一个循环,逐个查看表中的记录,看名字域是否是"Bill Gates"。
这种选择记录的方法是可行的,但是效率不高。使用SQL,你只要说,"选择所有名字域等于Bill Gates的记录",SQL就会为你选出所有符合条件的记录。SQL会确定实现查询的最佳方法。
建设你想取出表中的前十个记录。使用传统的编程语言,你可以做一个循环,取出前十个记录后结束循环。但使用标准的SQL查询,这是不可能实现的。从SQL的角度来说,在一个表中不存在前十个记录这种概念。
开始时,当你知道你不能用SQL实现某些你感觉应该能实现的功能,你会受到挫折。你也许会以头撞墙甚至想写恶毒的信件给SQL的设计者们。但后来你会认识到,SQL的这个特点不仅不是个限制,反而是其长处。因为SQL不根据位置来读取记录,它读取记录可以很快。
综上所述,SQL有两个特点:所有数据存储在表中,从SQL的角度来说,表中的记录没有顺序。在下一节,你将学会怎样用SQL从表中选择特殊的记录。
使用SQL从表中取记录。
SQL的主要功能之一是实现数据库查询。如果你熟悉Internet 引擎,那么你已经熟悉查询了。你使用查询来取得满足特定条件的信息。例如,如果你想找到有ASP信息的全部站点,你可以连接到 Yahoo!并执行一个对Active Sever Pages的搜索。在你输入这个查询后,你会收到一个列表,表中包括所有其描述中包含搜索表达式的站点。
多数Internet 引擎允许逻辑查询。在逻辑查询中,你可以包括特殊的运算符如AND、OR和NOT,你使用这些运算符来选择特定的记录。例如,你可以用AND来限制查询结果。如果你执行一个对Active Sever Pages AND SQL的搜索。你将得到其描述中同时包含Active Sever Pages 和SQL的记录。当你需要限制查询结果时,你可以使用AND。
如果你需要扩展查询的结果,你可以使用逻辑操作符OR。例如,如果你执行一个搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站点,你收到的列表中将包括所有其描述中同时包含两个表达式或其中任何一个表达式的站点。
如果你想从搜索结果中排除特定的站点,你可以使用NOT。例如,查询"Active Sever Pages "AND NOT "SQL"将返回一个列表,列表中的站点包含Active Sever Pages,但不包含SQL。当必须排除特定的记录时,你可以使用NOT。
用SQL执行的查询与用Internet搜索引擎执行的搜索非常相似。 当你执行一个SQL查询时,通过使用包括逻辑运算符的查询条件,你可以得到一个记录列表。此时查询结果是来自一个或多个表。
SQL查询的句法非常简单。假设有一个名为email_table 的表,包含名字和地址两个字段,要得到Bill Gates 的e_mail地址,你可以使用下面的查询:
SELECT email from email_table WHERE name="Bill Gates"
当这个查询执行时,就从名为email_table的表中读取Bill Gates的e_mail 地址。这个简单的语句包括三部分:
■ SELECT语句的第一部分指名要选取的列。在此例中,只有email列被选取。当执行 时,只显示email列的值 [email protected]。
■ SELECTT语句的第二部份指明要从哪个(些)表中查询数据。在此例中,要查询的表名为email_table 。
■ 最后,SELECT语句的WHERE子句指明要选择满足什么条件的记录。在此例中,查询条件为只有name列的值为Bill Gates 的记录才被选取。
Bill Gates很有可能拥有不止一个email地址。如果表中包含Bill Gates的多个email地址。用上述的SELECT语句可以读取他所有的email地址。SELECT语句从表中取出所有name字段值为Bill Gates 的记录的email 字段的值。
前面说过,查询可以在查询条件中包含逻辑运算符。假如你想读取Bill Gates 或Clinton总统的所有email地址,你可以使用下面的查询语句:
SELECT email FROM email_table WHERE name="Bill Gates" OR
name="president Clinton"
此例中的查询条件比前一个复杂了一点。这个语句从表email_table中选出所有name列为Bill Gates或president Clinton的记录。如果表中含有Bill Gates或president Clinton的多个地址,所有的地址都被读取。
SELECT语句的结构看起来很直观。如果你请一个朋友从一个表中为你选择一组记录,你也许以非常相似的方式提出你的要求。在SQL SELECT语句中,你"SELECT特定的列FROM一个表WHERE某些列满足一个特定的条件"。
下一节将介绍怎样执行SQL查询来选取记录。这将帮助你熟悉用SELECT语句从表中取数据的各种不同方法。
使用ISQL执行SELECT查询
当你安装SQL Sever时,你同时安装了一个叫作ISQL/w的应用程序。ISQL/w允许你执行交互的SQL查询。在把查询包括到你的ASP网页中之前,用ISQL/w对其进行测试是非常有用的。
注意:
在这本书的第一部份,你学习了怎样安装和配置Microsoft SQL Sever 。如果没有安装SQL Sever或者SQL Sever不能运行,请参阅第三章"安装和使用SQL Sever"。
选择任务上SQL Sever程序组中的ISQL_w以启动该程序。程序启动时,首先会出现一个对话框,要求输入服务器信息和登录信息(见图10.1)。在Sever框中,输入你的SQL服务器的名字。如果服务器正运行在本地计算机上,服务器名字就是你计算机的名字。在登录信息框中,输入一个登录帐号和密码或选择使用"可信连接",然后单击Connect按钮。
图10。1
注意:
如果你将SQL Sever配置为使用完整安全或混合安全,那么你可以使用可信连接。如果你使用标准安全,你则需要提供用户帐号和密码。要了解更多信息,参见第三章。
如果一切正常,在你单击连接按钮后会出现一个查询窗口,如图10.2所示。(如果有异常,请参考第三章)
图10.2
在执行查询之前,你需要选择数据库。安装 SQL Sever时你已为自己创建了一个数据库,SQL Sever还有许多系统数据库,如master,model,msdb,和tempdb。
方便的是,SQL Sever带有一个特殊的名为pubs的例子数据库。库 pubs中包含供一个虚拟的出版商使用的各个表。文档中所有的例子程序都是针对这个库来设计的。本书中的许多例子也使用这个数据库。
在查询窗口顶部的DB下拉框中选择数据库pubs,这样你就选择了数据库。你所有的查询都将针对这个库中的各个表来执行。现在你可以执行你的第一个查询了。这真让人兴奋!
你的第一个查询将针对一个名为autrors的表,表中包含所有为某个虚拟出版商工作的作者的相关数据。单击查询窗口并输入以下的语句:
SELECT phone FROM authors WHERE au_name="Ringer"
输入完成后,单击执行查询按钮(一个绿色三角形,看起来像VCR播放键)。单击此按钮后,任何出现在查询窗口中的语句均会被执行。查询窗口会自动变成结果显示窗口,你可以看到查询的结果(见图10.3)。
你看到的查询结果也许与图10.3所示的不同。在SQL Sever的不同版本中,库pubs中的数据会有所不同。对SQL Sever 6.5来说,将会找到两条记录。结果显示窗口中应显示如下内容:
phone
...................
801 826_0752
801 826_0752
(2 row(s) affected)
图10.3
你所执行的SELECT语句从表authors中取出所有名字为Ringer的作者的电话号码。你通过在WHERE子句中使用特殊的选择条件来限制查询的结果。你也可以忽略选择条件,从表中取出所有作者的电话号码。要做到这一点,单击Query标签,返回到查询窗口,输入以下的SELECT语句:
SELECT Phone FROM authors
这个查询执行后,会取出表authors中的所有电话号码(没有特定的顺序)。如果表authors中包含一百个电话号码,会有一百个记录被取出,如果表中有十亿个电话号码,这十亿条记录都会被取出(这也许需要一些时间)。
表authrs的字段包括姓,名字,电话号码,地址,城市,州和邮政编码。通过在SELECT语句的第一部份指定它们,你可以从表中取出任何一个字段。你可以在一个SELECT语句中一次取出多个字段,比如:
SELECT au_fname ,au_lname, phone FROM authors
这个SELECT语句执行后,将取出这三个列的所有值。下面是这个查询的结果的一个示例(为了节省纸张,只显示查询结果的一部分,其余记录用省略号代替):
au_fname au_lname phone
.....................................................................................
Johnson White 408 496_7223
Marjorie Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O'Leary 408 286_2428
...
(23 row(s) affected)
在SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:
SELECT * FROM authors
这个SELECT语句执行后,表中的所有字段的值都被取出。你会发现你将在SQL查询中频繁使用星号。
技巧:
你可以使用星号来查看一个表的所有列的名字。要做到这一点,只需要在执行完SELECT语句后看一下查询结果的列标题。
操作多个表
到现在为止,你只尝试了用一句SQL查询从一个表中取出数据。你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:
SELECT au_lname ,title FROM authors, titles
这个SELECT语句执行时,同时从表authors和表titles中取出数据。从表authors中取出所有的作者名字,从表titles中取出所有的书名。在ISQL/w程序中执行这个查询,看一下查询结果。你会发现一些奇怪的出乎意料的情况:作者的名字并没有和它们所着的书相匹配,而是出现了作者名字和书名的所有可能的组合,这也许不是你所希望见到的。
出了什么差错?问题在于你没有指明这两个表之间的关系。你没有通过任何方式告诉SQL如何把表和表关联在一起。由于不知道如何关联两个表,服务器只能简单地返回取自两个表中的记录的所有可能组合。
要从两个表中选出有意义的记录组合,你需要通过建立两表中字段的关系来关联两个表。要做到这一点的途径之一是创建第三个表,专门用来描述另外两个表的字段之间的关系。
表authors有一个名为au_id的字段,包含有每个作者的唯一标识。表titles有一个名为title_id的字段,包含每个书名的唯一标识。如果你能在字段au_id和字段title_id 之间建立一个关系,你就可以关联这两个表。数据库pubs中有一个名为titleauthor的表,正是用来完成这个工作。表中的每个记录包括两个字段,用来把表titles和表authors关联在一起。下面的SELECT语句使用了这三个表以得到正确的结果:
SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id
当这个SELECT语句执行时,每个作者都将与正确的书名相匹配。表titleauthor指明了表authors和表titles的关系,它通过包含分别来自两个表的各一个字段实现这一点。第三个表的唯一目的是在另外两个表的字段之间建立关系。它本身不包含任何附加数据。
注意在这个例子中字段名是如何书写的。为了区别表authors和表titles中相同的字段名au_id,每个字段名前面都加上了表名前缀和一个句号。名为author.au_id 的字段属于表authors,名为titleauthor.au_id的字段属于表titleauthor,两者不会混淆。
通过使用第三个表,你可以在两个表的字段之间建立各种类型的关系。例如,一个作者也许写了许多不同的书,或者一本书也许由许多不同的作者共同完成。当两个表的字段之间有这种"多对多"的关系时,你需要使用第三个表来指明这种关系。
但是,在许多情况下,两个表之间的关系并不复杂。比如你需要指明表titles和表publishers之间的关系。因为一个书名不可能与多个出版商相匹配,你不需要通过第三个表来指明这两个表之间的关系。要指明表titles和表publishers之间的关系,你只要让这两个表有一个公共的字段就可以了。在数据库pubs中,表titles和表publishers都有一个名为pub_id的字段。如果你想得到书名及其出版商的一个列表,你可以使用如下的语句:
SELECT title,pub_name FROM titles,publishers
WHERE titles.pub_id=publishers.pub_id
当然,如果一本书是由两个出版商联合出版的,那么你需要第三个表来代表这种关系。
通常,当你予先知道两个表的字段间存在"多对多"关系时,就使用第三个表来关联这两个表。反之,如果两个表的字段间只有"一对一"或"一对多"关系,你可以使用公共字段来关联它门。
操作字段
通常,当你从一个表中取出字段值时,该值与创建该表时所定义的字段名联系在一起。如果你从表authors中选择所有的作者名字,所有的值将会与字段名au_lname相联系。但是在某些情况下,你需要对字段名进行操作。在SELECT语句中,你可以在缺省字段名后面仅跟一个新名字来取代它。例如,可以用一个更直观易读的名字Author Last Name来代替字段名au_lname:
SELECT au_lname "Author Last Name" FROM authors
当这个SELECT语句执行时,来自字段au_lname的值会与"Author Last Name"相联系。查询结果可能是这样:
Author Last Name
................................................................................
White
Green
Carson
O'Leary
Straight
...
(23 row(s) affected)
注意字段标题不再是au_lname,而是被Author Last Name所取代。
你也可以通过执行运算,来操作从一个表返回的字段值。例如,如果你想把表titles中的所有书的价格加倍,你可以使用下面的SELECT语句:
SELECT price*2 FROM titles
当这个查询执行时,每本书的价格从表中取出时都会加倍。但是,通过这种途径操作字段不会改变存储在表中的书价。对字段的运算只会影响SELECT语句的输出,而不会影响表中的数据。为了同时显示书的原始价格和涨价后的新价格,你可以使用下面的查询:
SELECT price "Original price", price*2 "New price" FROM titles
当数据从表titles中取出时,原始价格显示在标题Original price下面,加倍后的价格显示在标题New price下面。结果可能是这样:
original price new price
.........................................................................
19.99 39.98
11.95 23.90
2.99 5.98
19.99 39.98
...
(18 row(s) affected)
你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进行运算,例如:
SELECT price*ytd_sales "total revenue" FROM titles
在这个例子中,通过把价格与销售量相乘,计算出了每种书的总销售额。这个SELECT语句的结果将是这样的:
total revenue
.....................................................
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68
...
(18 row(s) affected)
最后,你还可以使用连接运算符(它看起来像个加号)来连接两个字符型字段:
SELECT au_fname+" "+au_lname "author name" FROM authors
在这个例子中,你把字段au_fname和字段au_lname粘贴在一起,中间用一个逗号 隔开,并把查询结果的标题指定为author name。这个语句的执行结果将是这样的:
author names
..................................................................
Johnson White
Marjorie Green
Cheryl Carson
Michael O'Leary
Dean Straight
...
(23 row(s) affected)
可以看到,SQL为你提供了对查询结果的许多控制。你应该在ASP编程过程中充分利用这些优点。使用SQL来操作查询结果几乎总是比使用有同样作用的脚本效率更高。
排序查询结果
本章的介绍中曾强调过,SQL表没有内在的顺序。例如,从一个表中取第二个记录是没有意义的。从SQL的角度看来,没有一个记录在任何其他记录之前。
然而,你可以操纵一个SQL查询结果的顺序。在缺省情况下,当记录从表中取出时,记录不以特定的顺序出现。例如,当从表authors中取出字段au_lname时,查询结果显示成这样:
au_lname
...........................................
White
Green
Carson
O'Leary
Straight
...
(23 row(s) affected)
看一列没有特定顺序的名字是很不方便的。如果把这些名字按字母顺序排列,读起来就会容易得多。通过使用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:
SELECT au_lname FROM authors ORDER BY au_lname
当这个SELECT语句执行时,作者名字的显示将按字母顺序排列。ORDER BY子句将作者名字按升序排列。
你也可以同时对多个列使用ORDER BY子句。例如,如果你想同时按升序显示字段au_lname和字段au_fname,你需要对两个字段都进行排序:
SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname
这个查询首先把结果按au_lname字段进行排序,然后按字段au_fname排序。记录将按如下的顺序取出:
au_lname au_fname
...............................................................................
Bennet Abraham
Ringer Albert
Ringer Anne
Smith Meander
...
(23 row(s) affected)
注意有两个作者有相同的名字Ringer。名为Albert Ringer的作者出现名为Anne Ringer的作者之前,这是因为姓Albert按字母顺序应排在姓Anne之前。
如果你想把查询结果按相反的顺序排列,你可以使用关键字DESC。关键字DESC把查询结果按降序排列,如下例所示:
SELECT au_lname,au_fname FROM authors
WHERE au_lname="Ringer" ORDER BY au_lname ,au_fname DESC
这个查询从表authors中取出所有名字为Ringer的作者记录。ORDER BY子句根据作者的名字和姓,将查询结果按降序排列。结果是这样的:
au_lname au_fname
....................................................................................................
Ringer Anne
Ringer Albert
(2 row(s) affectec)
注意在这个表中,姓Anne出现在姓Albert之前。作者名字按降序显示。
你也可以按数值型字段对一个查询结果进行排序。例如,如果你想按降序取出所有书的价格,你可以使用如下的SQL查询:
SELECT price FROM titles ORDER BY price DESC
这个SELECT语句从表中取出所有书的价格,显示结果时,价格低的书先显示,价格高的书后显示。
警告:
不是特别需要时,不要对查询结果进行排序,因为服务器完成这项工作要费些力气。这意味着带有ORDER BY 子句的SELECT语句执行起来比一般的SELECT语句花的时间长。
取出互不相同的记录
一个表有可能在同一列中有重复的值。例如,数据库pubs的表authors中有两个作者的名字是Ringer。如果你从这个表中取出所有的名字,名字Ringer将会显示两次。
在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:
SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"
当这个SELECT语句执行时,只返回一个记录。通过在SELECT语句中包含关键字DISTINCT,你可以删除所有重复的值。例如,假设有一个关于新闻组信息发布的表,你想取出所有曾在这个新闻组中发布信息的人的名字,那么你可以使用关键字DISTINCT。每个用户的名字只取一次——尽管有的用户发布了不止一篇信息。
警告:
如同ORDER BY子句一样,强制服务器返回互不相同的值也会增加运行开销。福气不得不花费一些时间来完成这项工作。因此,不是必须的时候不要使用关键字DISTINCT。
创建新表
前面说过,数据库中的所有数据存储在表中。数据表包括行和列。列决定了表中数据的类型。行包含了实际的数据。
例如,数据库pubs中的表authors有九个字段。其中的一个字段名为为au_lname,这个字段被用来存储作者的名字信息。每次向这个表中添加新作者时,作者名字就被添加到这个字段,产生一条新记录。
通过定义字段,你可以创建一个新表。每个字段有一个名字和一个特定的数据类型(数据类型在后面的"字段类型"一节中讲述),例如字段au_lname存储的是字符型数据。一个字段也可以存储其它类型的数据。
使用SQL Sever,创建一个新表的方法是很多的。你可以可执行一个SQL语句或使用SQL事务管理器(SQL Enterprise Manager)来创建一个新表。在下一节里,你将学会如何用SQL语句来创建一个新表。
用SQL创建新表
注意:
如果你还没有建立自己的数据库,现在就跳回到第三章创建这个库。你绝不能向master,tempdb或任何其他任何系统数据库中添加数据。
从SQL Sever程序组(在任务栏中)中启动ISQL/w程序。出现查询窗口后,从窗口顶部的下拉列表中选择你在第三章所创建的数据库。下一步,在查询窗口中键入下面的SQL语句,单击执行查询按钮,执行这个语句:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate
DATETIME)
如果一切正常,你会在结果窗口中看到如下的文字(如果出现异常,请参阅第三章):
This command dit not return data ,and it did not return any rows
祝贺你,你已经建立了你的第一个表!
你所创建的表名为guestbook,你可以使用这个表来存储来字你站点访问者的信息。你是用REEATE TABLE语句创建的这个表,这个语句有两部分:第一部份指定表的名子;第二部份是括在括号中的各字段的名称和属性,相互之间用逗号隔开。
表guestbook有三个字段:visitor,comments 和entrydate。visitor字段存储访问者的名字,comments字段存储访问者对你站点的意见,entrydate字段存储访问者访问你站点的日期和时间。
注