350 likes | 505 Views
回顾: pb 和 sql server 的连接(通过 odbc ). 利用 pb 和 sql server 显示数据. 1 ,连接数据库 1 )创建数据源 2 )创建配置文件 2 ,利用数据窗口显示数据. SQLCA.AutoCommit = true string mysql mysql =" CREATE TABLE XSB4( 学号 char(6) NOT NULL, 姓名 char(8) NOT NULL)" execute immediate :mysql ;
E N D
利用pb和sql server显示数据 1,连接数据库 1)创建数据源 2)创建配置文件 2,利用数据窗口显示数据
SQLCA.AutoCommit = true string mysql mysql ="CREATE TABLE XSB4( 学号 char(6) NOT NULL, 姓名 char(8) NOT NULL)" execute immediate :mysql ; SQLCA.AutoCommit = false if sqlca.sqlcode<>0 then messagebox("d",sqlca.sqlerrtext) end if 在前台创建表
实验一问题: 1,英文状态的标点符号 2,注意查询分析器中的文字颜色 3,必须的记忆 4,一定量的练习
3.0 回顾:创建表 创建分区表 3.1 界面操作表数据(略) 插入记录、删除记录、修改记录 3.2用T-sql语句操作表数据 INSERT语句插入表数据 使用DELETE或TRANCATE语句删除数据 使用UPDATE语句修改数据 第三章 表数据操作
1、数据定义功能(DDL)创建、修改或删除数据库中各种对象,包括表、视图、索引等。命令:CREATE ,ALTER , DROP 2、查询语言(QL) 按照指定的组合、条件表达式或排序检索已存在的数据库中数据,不改变数据库中数据。命令:SELECT 3、数据操纵语言(DML) 对已经存在的数据库进行元组的插入、删除、修改等操作命令:INSERT、UPDATE、DELETE 4、数据控制语言(DCL) 用来授予或收回访问数据库的某种特权命令:GRANT、REVOKE
3.0.1 创建表 基本表的创建 语句基本格式: CREATE TABLE [<库名>].<表名>(<列名><数据类型>[<列级完整性约束条件>] [, <列名><数据类型>[<列级完整性约束条件>] [,…n] [,<表级完整性约束条件>] [,…n]);
(1)NOT NULL约束 不允许为空 。 (2)UNIQUE 约束 不允许该列出现重复的属性值。对于设为主码的列,不能再加“UNIQUE”。 (3)DEFAULT约束 定义该列的缺省值。 (4)CHECK 约束 定义属性值的检查条件。 不能直接跟在列后定义,而通过约束条件表达式来设置,CHECK约束的格式为: CONSTRAINT <约束名> CHECk ( <约束条件> ) (5)PRIMARY KEY 约束 定义该列为主码 列级完整性约束 条件:针对属性值的设置的限制条件,只涉及到一个列的数据,有以下5 种:
(1)UNIQUE 约束 要求列组的值不能有重复. 格式为:CONSTRAINT <约束名> UNIQUE (属性组) (2)PRIMARY KEY 约束 如一个表的主键内有两个或两个以上的列,则必须使用表约束将这两列加入主键内。不能直接跟在列后定义,而通过约束条件表达式来设置。格式为: CONSTRAINT <约束名> PRIMARY KEY (属性组) (3)FOREIGN KEY约束 用于定义外码和参照表。 外键的数据类型必须和参照表中的主码严格匹配。 格式为: CONSTRAINT <约束名> FOREIGN KEY (外码) REFERENCES <被参照表名> (与外码对应的主码名) 表级完整性约束
学生(学号,姓名,年龄,性别,所在系) 课程(课程号,课程名,先行课) 选课(学号,课程号,成绩) 要求:学生表中以学号为候选码, 姓名不能为空, 性别只能输“男”或“女”, 年龄的缺省值为20 课程表中以课程号为候选码 选课表中以学号和课程号为候选码, 成绩限定在0—100, 并且还要求学号与学生表中的学号建立参照关系, 课程号与课程表中的课程号建立参照关系。 用SQL 建立基本表
CREATE TABLE 学生(学号 CHAR(5) NOT NULL PRIMARY KEY, 姓名 CHAR(8) NOT NULL, 年龄 SMALLINT DEFAULT 20, 性别 CHAR(2), 所在系 CHAR(20), CONSTRAINT C1 CHECK(性别 IN(‘男’,‘女’))) CREATE TABLE 课程(课程号 CHAR(5) NOT NULL PRIMARY KEY, 课程名 CHAR(20), 先行课 CHAR(5)) CREATE TABLE 选课(学号 CHAR(5) NOT NULL , 课程号 CHAR(5) NOT NULL , 成绩 SMALLINT, CONSTRAINT C2 CHECK(成绩 BETWEEN 0 AND 100), CONSTRAINT C3 PRIMARY KEY (学号,课程号), CONSTRAINT C4 FOREIGN KEY (学号) REFERENCES 学生(学号), CONSTRAINT C5 FOREIGN KEY (课程号) REFERENCES 课程(课程号))
* 创建分区表 原因:表中数据量大而且常被不同方式访问。导致数据库效率低。 目的:实现数据库的优化,提高查询效率。 原理:将表分成多个单元的表,分散到多个文件组中,实现对单元中数据的并行访问。 缺点:增加了数据库的管理操作和复杂性。根据实际情况使用。 步骤: 第一步:创建分区函数,指定如何分区; 第二步:创建分区方案,定义分区函数在文件组上的位置; 第三步:使用分区方案,创建分区表。
* 创建分区表之第一步 创建分区函数语法格式如下: CREATE PARTITION FUNCTION 分区函数名 ( 用于分区的列的数据类型 ) AS RANGE [ LEFT | RIGHT ] /*默认为left*/ FOR VALUES ( [ 指定边界值 [ ,...n ] ] ) /*n<=999*/ 【例3.7】 针对int类型列创建一名为NumberPF的分区函数,把int类型列中数据分成5个区。(1)分为小于或等于50的区、(2)大于50且小于或等于500的区、(3)大于500且小于或等于1000的区、(4)大于1000且小于或等于2000的区、(5)大于2000的区。 CREATE PARTITION FUNCTION NumberPF(int) AS RANGE LEFT FOR VALUES(50,500,1000,2000)
创建分区方案格式如下: CREATE PARTITION SCHEME 分区方案名 AS PARTITION 分区函数名 [all] TO(文件组1, 文件组2, ……, n) 【例3.8】 假设文件组Fgroup1、Fgroup2、Fgroup3、Fgroup4、Fgroup5已经在数据库PPXSCJ中存在。根据例3.7中定义的分区函数创建一个分区方案,将分区函数中的5个分区分别存放在这5个文件组中。 CREATE PARTITION SCHEME NumberPS AS PARTITION NumberPF TO(Fgroup1, Fgroup2, Fgroup3, Fgroup4, Fgroup5) * 创建分区表之第二步
* 创建分区表之第三步 创建分区表和创建普通表格式一致。 【例3.9】 在数据库PPXSCJ中创建分区表,表中包含编号(值可以是1~5000)、名称两列,要求使用例3.8中的分区方案。 CREATE TABLE sample ( 编号int NOT NULL PRIMARY KEY, 名称char(8) NOT NULL ) ON NumberPS(编号) /*按照分区方案创建分区表*/
3.0.2 修改基本表 1、增加属性 格式: ALTER TABLE <表名> ADD <新列名> <数据类型> [<列级完整性约束条件>] [,…n] 例:向学生表中增加“家庭地址”和电话 ALTER TABLE 学生 ADD 家庭地址 VARCHAR(30),电话 CHAR(12)
3.0.2 修改基本表 2、删除属性格式: ALTER TABLE <表名> DROP COLUMN <列名> 例1:在学生表中删除“家庭地址”和“电话” ALTER TABLE 学生 DROP COLUMN 家庭地址,电话 注:不允许删除已定义列级完整性约束或表级完整性约束的属性,NOT NULL 约束除外,要删除这些属性必须先删除该属性上的约束条件 例2:ALTER TABLE 学生 DROP COLUMN 性别 例3:ALTER TABLE 学生 DROP COLUMN 姓名 例2不能执行,因为在“性别”属性上已定义了CHECK约束条件 ,例3应该可以执行,因为在“姓名”属性上只定义了not null约束
3.0.2 修改基本表 3、删除完整性约束条件 格式: ALTER TABLE <表名> DROP <约束名> 例:向学生表中删除“性别”属性上的约束C1,然后删除“性别”属性。 ALTER TABLE 学生 DROP C1 ALTER TABLE 学生 DROP COLUMN 性别
3.0.2 修改基本表 4、修改属性格式: ALTER TABLE <表名> ALTER COLUMN <列名> <数据类型> 注:只能改变宽度,增加 NOT NULL约束, 对于已有数据的表,只能将属性的宽度改为已有数据的宽度 例:改变学生表中“所在系”的宽度 ALTER TABLE 学生 ALTER COLUMN 所在系 VARCHAR(16)
3.0.2 删除基本表 格式:DROP TABLE <表名> 注:基本表一旦被删除,表中的数据及在此表基础上建立的索引,视图将自动地全部被删除,所以要特别小心 不能删除已被定义为其它表的被参照表的表 例:DROP TABLE 学生 不能执行,因为学生表已被选课表定义为它的被参照表
3.2.1 使用INSERT语句插入表数据 1、插入单个元组 语句格式: INSERT INTO <表名> [( <属性列1> [, <属性列2> …)] VALUES ( <常量1> [, <常量2>]…) 注: a、在INTO子句中若没有指明任何列名,则在VALUES子句中必须在每个列上均有值,并且要与表中属性的逻辑顺序对应 例:INSERT INTO 选课 VALUES(‘98008’,‘c5’,70) 对 INSERT INTO 选课 VALUES(‘98008’,‘c5’) 错 INSERT INTO 选课 VALUES('c2','98008',70) 错
3.2.1 使用INSERT语句插入表数据 b、如果某些列在INTO子句中没有出现,则新插入的记录在这些列上取空值,但如果这些列在表定义是定义为NOT NULL,则不能在INTO子句中省略 例:INSERT INTO 选课(学号,课程号) VALUES('98008','c4') 对 INSERT INTO 选课(学号,成绩) VALUES(‘98008’,70) 错 c、INTO子句中列名与VALUES子句中的常量要求逻辑顺序一致 例:INSERT INTO 选课(学号,课程号) VALUES('98008','c4') 对 INSERT INTO 选课(学号,课程号) VALUES(‘c1’,’98008’) 错
3.2.1 使用INSERT语句插入表数据 2、插入子查询的结果集 格式: INSERT INTO<表名> [( <属性列1> [, <属性列2> …)] <子查询> 例:求各专业学生的平均学分,并要求将结果存入数据库中 Step1: 先建立“各专业平均学分表” Step2: 再将平均年龄写入此表中 CREATE TABLE 各专业平均年龄表(专业名 CHAR(10), 平均学分 tinyint) INSERT INTO 各专业平均年龄表 SELECT 专业名,AVG(总学分) FROM 学生 GROUP BY 专业名
3.2.1 使用INSERT语句插入表数据 【例3.1】向PXSCJ数据库的表XSB中插入如下的一行: 001112 罗林琳 计算机 0 1/30/1980 0:0:0 40 可以使用如下的T-SQL语句: USE PXSCJ INSERT INTO XSB VALUES(‘001112’,’罗林琳’,’计算机’, 0 ,‘1/30/1980 0:0:0’, 40,NULL) GO
3.2.1 使用INSERT语句插入表数据 【例3.2】将XSB表中专业名为‘计算机’的各记录的学号、姓名和专业名列的值插入到XSB1表的各行中。 第一步:用如下的CREATE语句建立表XSB1: CREATE TABLE XSB1 ( num char(6) NOT NULL, name char(8) NOT NULL, speiality char(10) NULL ) 第二步:用如下的INSERT语句向XSB1表中插入数据: INSERT INTO XSB1 SELECT 学号,姓名,专业名 FROM XSB WHERE 专业名=’计算机’
(1)插入单个元组 格式: INSERT INTO <表名> [( <属性列1> [, <属性列2> …)]VALUES ( <常量1> [, <常量2>]…) (2)插入子查询的结果集 格式: INSERT INTO <表名> [( <属性列1> [, <属性列2> …)] <子查询> 练习:求每门课的平均成绩,并将结果存入数据库中 注意:先建立平均成绩表,再将各门课平均成绩写入 要点:插入数据
3.2.2 使用DELETE或TRANCATE语句删除数据 DELETE FROM<表名> [WHERE <条件>] 注: a、如果无WHERE子句,则表示修改表中全部元组 b、WHERE子句中可以嵌入子查询 c、一个DELETE语句只能删除一个表中的元组,即FROM子句中只能有一个表名,不允许有多个表名。 例:删除“计算机”专业的学生记录及该专业学生所有选课记录 DELETE FROM 选课 WHERE 学号 IN ( SELECT 学号 FROM 学生 WHERE 专业名=‘计算机’) DELETE FROM 学生 WHERE 所在系=‘计算机'
3.2.2 使用DELETE或TRANCATE语句删除数据 【例3.3】将PXSCJ数据库的XSB表中总学分小于39的行删除,使用如下的T-SQL语句: USE PXSCJ DELETE FROM XSB WHERE 总学分<39 【例3.4】将PXSCJ数据库的XSB表中备注为空的行删除 DELETE FROM XSB WHERE 备注 IS NULL 将PXSCJ数据库的XSB表中的所有行均删除 DELETE XSB //能删除XSB表中的所有行
3.2.2 使用DELETE或TRANCATE语句删除数据 2. 使用TRUNCATE TABLE语句删除表数据 使用TRUNCATE TABLE语句将删除指定表中的所有数据,因此也称其为清除表数据语句。 语法格式: TRANCATE TABLE name 例:将PXSCJ数据库的XSB表中的所有行均删除 DELETE XSB //能删除XSB表中的所有行 Trancate table XSB
要点:删除数据 格式: DELETE FROM <表名> [WHERE <条件>] 注意: a、如无WHERE子句,则表示修改全部 b、WHERE子句中可以嵌入子查询 c、一个DELETE语句只能删除一个表中的元组 练习: 删除“国际贸易概论”这门课的选课记录及该课程信息
3.2.3 使用UPDATE语句修改数据 UPDATE<表名> SET <列名1>=<表达式1> [, <列名2>= <表达式2> ][,…n] [WHERE<条件>] 注: a、如果无WHERE子句,则表示修改表中全部元组 例:将学生表中每个学生总学分加1 UPDATE 学生 SET 总学分=总学分+1 b、WHERE子句中可以嵌入子查询 例:将“高等数学”的成绩加5分 UPDATE 选课 SET 成绩=成绩+5 WHERE 课程号 =(SELECT 课程号 FROM 课程 WHERE 课程名='高等数学')
3.2.3 使用UPDATE语句修改数据 【例3.5】将PXSCJ数据库的XSB表中学号为001110的学生的备注列值改为“三好生”。 USE PXSCJ UPDATE XSB SET 备注=”三好生” WHERE 学号=001110 GO
3.2.3 使用UPDATE语句修改数据 【例3.6】将XSB表中的所有学生的总学分都增加10。将姓名为“罗林琳”的同学的专业改为“通信工程”,备注改为“转专业学习”,学号改为001241。 UPDATE XSB SET 总学分 = 总学分+10 UPDATE XSB SET 专业 = ‘通信工程’, 备注 = ‘转专业学习’, 学号 = ‘001241’ WHERE 姓名 = ‘罗林琳’
要点:修改数据 格式:UPDATE <表名> SET <列名1>=<表达式1> [, <列名2>= <表达式2> ][,…n] [WHERE <条件>] 注意: a、如无WHERE子句,则表示修改全部 b、WHERE子句中可以嵌入子查询 练习:1、将成绩表中所有成绩加2分 2、将“数据库”的所有成绩加5分
作业:p71 习题7 7. 写出T-SQL语句,对产品销售数据库产品表(结构见第2章习题的第7题)进行如下操作: (1) 插入如下记录 0001 空调 3000 200 0203 冰箱 2500 100 0301 彩电 2800 50 (2) 将产品数据库的产品表中的每种商品的价格打8折。 (3) 将产品数据库的产品表中价格打8折后小于50的商品删除。