❶ 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欄位存儲訪問者訪問你站點的日期和時間。
注