### Visual FoxPro中SQL命令语法及示例
#### 1. 准备
- **1.1 创建文档中所要使用到的数据库及环境配置**
在开始学习Visual FoxPro (VFP) 中的SQL命令之前,需要创建一个用于演示的基础数据库环境。以下是创建过程的步骤:
```sql
CLOSE ALL
CLEAR ALL
SET SAFETY OFF
IF NOT DIRECTORY('e:\我的数据库\') THEN
MD 'e:\我的数据库\' // 创建目录
ELSE
DELETE FILE 'e:\我的数据库\*.*' // 清空目录
ENDIF
SET DEFAULT TO 'e:\我的数据库\' // 设置默认路径
CREATE DATABASE '学生信息' // 创建数据库
```
这段代码首先关闭了所有已打开的文件,清理了内存,并设置了系统安全模式关闭。接着检查并创建了必要的文件夹,并清空该文件夹中的所有文件。最后设置了系统的默认目录,并创建了一个名为“学生信息”的数据库。
- **1.2 数据库中所包含的表**
为了展示SQL命令的应用场景,本文档创建了三个表:“课程”、“成绩”和“学生”,每个表的具体字段如下所示:
- **课程表**: 包含课程号、课程名、先行课和学分。
- **成绩表**: 包含学号、课程号和成绩。
- **学生表**: 包含学号、姓名和性别。
这些表的数据示例如下:
| 课程号 | 课程名 | 先行课 | 学分 |
|--------|------------|--------|------|
| 1 | 计算机基础 | 0 | 3 |
| 学号 | 课程号 | 成绩 |
|------|--------|-------|
| 1 | 2 | 89 |
| 学号 | 姓名 | 性别 |
|------|--------|------|
| 1 | 张小艳 | 女 |
- **1.3 约定**
为了确保SQL命令的正确性和一致性,以下是一些约定:
- 下划线部分与方括号或逗号之间的关系,表明某些元素可以被重复使用。
- 特定的前缀或后缀用来指示数据类型的书写格式,如表示字符型列名的书写方式,需要用特定的符号括起来。
- 各种前缀和后缀的含义如下表所示:
| 前缀/后缀 | 说明 |
|-----------|--------------|
| exp | 表达式 |
| var | 变量 |
| n | 数值型或整型 |
| list | 列表 |
| c | 字符型 |
| l | 逻辑型 |
#### 2. 创建表 (CREATE TABLE)
- **2.1 示例_创建表**
创建表是SQL中最基本的操作之一,下面的SQL语句展示了如何创建上述提到的三个表:
```sql
CREATE TABLE 课程 (
课程号 n(4),
课程名 c(20),
先行课 n(4),
学分 n(2)
);
CREATE TABLE 成绩 (
学号 n(4),
课程号 n(4),
成绩 n(3)
);
CREATE TABLE 学生 (
学号 n(4),
姓名 c(10),
性别 c(2)
);
```
#### 3. 修改表结构 (ALTER TABLE)
- **3.1 添加新列或修改列**
当需要向表中添加新的列或修改现有列时,可以使用ALTER TABLE命令:
```sql
ALTER TABLE 课程 ADD COLUMN 课程简介 c(255);
ALTER TABLE 课程 MODIFY COLUMN 课程名 c(30);
```
- **3.2 仅添加/修改列的约束**
有时候可能只需要添加或修改某个列的约束条件:
```sql
ALTER TABLE 课程 ADD CONSTRAINT CK_课程 CHECK (学分 > 0);
```
- **3.3 删除列约束**
如果不再需要某个约束,可以通过以下命令来删除它:
```sql
ALTER TABLE 课程 DROP CONSTRAINT CK_课程;
```
- **3.4 添加主索引、唯一索引、外码约束**
在表中添加主键、唯一索引或者外键约束可以增强数据的一致性:
```sql
ALTER TABLE 课程 ADD PRIMARY KEY (课程号);
ALTER TABLE 课程 ADD UNIQUE (课程名);
ALTER TABLE 成绩 ADD FOREIGN KEY (课程号) REFERENCES 课程 (课程号);
```
- **3.5 添加/修改表约束**
可以添加或修改表级别的约束:
```sql
ALTER TABLE 课程 ADD CONSTRAINT PK_课程 PRIMARY KEY (课程号);
```
- **3.6 删除主索引、表自定义约束、列、唯一索引、外码约束**
如果需要删除这些约束,可以使用以下命令:
```sql
ALTER TABLE 课程 DROP PRIMARY KEY;
ALTER TABLE 课程 DROP CONSTRAINT PK_课程;
ALTER TABLE 成绩 DROP FOREIGN KEY FK_课程;
```
- **3.7 重命名列**
如果需要更改某列的名称,可以使用以下命令:
```sql
ALTER TABLE 课程 RENAME COLUMN 先行课 TO 前置课程;
```
#### 4. 删除表 (DROP TABLE)
- **4.1 示例_删除表**
当不再需要某个表时,可以使用DROP TABLE命令将其删除:
```sql
DROP TABLE 课程;
```
#### 5. 插入数据 (INSERT INTO)
- **5.1 示例_插入数据**
向表中插入数据是非常常见的操作:
```sql
INSERT INTO 课程 (课程号, 课程名, 先行课, 学分)
VALUES (1, '计算机基础', 0, 3);
```
#### 6. 修改数据 (UPDATE)
- **6.1 示例_修改数据**
更新表中的数据也很常见:
```sql
UPDATE 课程 SET 课程名 = '基础计算机科学' WHERE 课程号 = 1;
```
#### 7. 删除数据 (DELETE FROM)
- **7.1 示例_删除数据**
删除表中的记录可以用以下命令:
```sql
DELETE FROM 课程 WHERE 课程号 = 1;
```
#### 8. 数据查询 (SELECT)
- **8.1 Select命令各子句执行顺序**
SELECT命令的执行顺序通常为FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY。了解这一点对于编写高效的查询非常重要。
- **8.2 Select子句**
选择哪些列被返回:
```sql
SELECT 课程号, 课程名 FROM 课程;
```
- **8.3 From子句**
指定查询的目标表:
```sql
SELECT * FROM 课程;
```
- **8.4 Where子句**
用于筛选查询结果:
```sql
SELECT * FROM 课程 WHERE 课程号 = 1;
```
- **8.5 Groupby子句和Having子句**
用于对结果进行分组并过滤分组后的结果:
```sql
SELECT 课程名, COUNT(*) AS 课程数量 FROM 课程 GROUP BY 课程名 HAVING COUNT(*) > 1;
```
- **8.6 Orderby子句**
对结果进行排序:
```sql
SELECT * FROM 课程 ORDER BY 课程号 ASC;
```
- **8.7 Into/In子句**
指定查询结果的输出位置:
```sql
SELECT * FROM 课程 INTO CURSOR TempTable;
```
#### 9. 合并查询 (UNION)
- **9.1 示例_合并查询**
将两个或多个SELECT语句的结果合并在一起:
```sql
SELECT 课程号, 课程名 FROM 课程
UNION
SELECT 课程号, 课程名 FROM 成绩;
```
#### 10. 嵌套查询
- **10.1 示例_嵌套查询**
在一个SELECT语句中使用另一个SELECT语句作为子查询:
```sql
SELECT * FROM 课程 WHERE 课程号 IN (SELECT 课程号 FROM 成绩);
```
#### 11. 将查询的结果插入其它表
- **11.1 示例_将查询结果插入其它表**
将一个查询的结果插入到另一个表中:
```sql
INSERT INTO 新表 (列1, 列2) SELECT 列1, 列2 FROM 旧表 WHERE 条件;
```
#### 12. 实际应用举例
- **12.1 示例_实际应用**
为了更好地理解如何在实际应用中使用这些SQL命令,以下是一个综合的例子:
```sql
-- 创建新表
CREATE TABLE 新表 (课程号 n(4), 课程名 c(30));
-- 插入数据
INSERT INTO 新表 (课程号, 课程名) SELECT 课程号, 课程名 FROM 课程;
-- 更新数据
UPDATE 新表 SET 课程名 = '高级计算机基础' WHERE 课程号 = 1;
-- 查询并合并结果
SELECT * FROM 新表
UNION
SELECT * FROM 课程
INTO CURSOR TempTable;
-- 使用嵌套查询
SELECT * FROM 新表 WHERE 课程号 IN (SELECT 课程号 FROM 成绩);
-- 删除表
DROP TABLE 新表;
```
以上例子涵盖了从创建表、插入数据、更新数据、查询数据到删除表的整个流程,同时也展示了SQL命令在实际应用中的强大功能。
本文档详细介绍了Visual FoxPro 9.0中的SQL命令语法,并通过实例演示了如何创建、修改和查询数据。这些基础知识对于初学者来说至关重要,能够帮助他们快速上手并掌握Visual FoxPro中的SQL操作。
1