2、表名和列名规则:
? 必须以字母开头 ? 长度必须是1-30个字符
? 只能包含A–Z、 a–z、 0–9、 _ $ ,# ? 不能与同一用户拥有的其它对象重名 ? 注:名称不区分大小写。
3、DEFAULT选项
? 指定插入时的列的默认值。
? 文字值、表达式或SQL函数都是合法值。 ? 其它列的名称或伪列是不合法的值。 ? 默认数据类型必须与列数据类型匹配。
演示 - 创建表
1. 创建表hr.DEPT表:DEPTNO、DNAME和LOC。
演示 - 创建表可选择字段类型
1. VARCHAR、VARCHAR2、NVARCHAR、NVARCHAR2:可变长度字符数据 2. CHAR、NCHAR:固定长度字符数据
3. NUMBER(p,s)、DECIMAL(p,s):可变长度数字数据。p为精度(是指十进制
数字的总数),小数位为s的数(指小数点右边的数字的位数) 4. DATE:日期值
5. TIMESTAMP:是DATE类型的扩展,可以存储年、月和日,小时、分钟及秒值。 6. BLOB:二进制数据
7. CLOB:字符数据最多为2千兆
练习 - 创建学生表
1. 创建一张学生表:hr.student,要求包括学生的学号、姓名、年龄、出生日期、性别、
身份证号、联系电话、住址。(提示:每个字段的长度可自定)
2. 创建完成后查看表结构(H2的语法:show columns from hr.student;)
10-2子查询创建表
?
通过组合CREATE TABLE和AS subquery选项可以创建表并插入行。
CREATE TABLE table [(column, column...)] AS subquery; ?
使指定列的数量与子查询列数匹配。
? ? 定义具有列名和默认值的列 规则:
? 可在创建表时指定具体的列名,子查询的结果将插入到该表中。 ? 列定义只能包含列名和默认值
? 如果已经给出列的规格,则列数必须等于子查询SELECT列表中的列数 ? 如果没有给出列的规格,则表的列名称将和子查询的列名相同。 ? 完整性的规则不会传递到新表中,只有列数据类型定义会被传递。
演示 - 子查询创建表
1. 用子查询创建名为DEPT80的表,该表包含部门80中的所有员工的详细资料。
练习 - 子查询创建表
1. 创建新表hr.emp2,该表的结构与hr.employees相同,但是不需要插入hr.employees
的行数据。
练习 - 子查询创建表
1. 创建表hr.dept,该表包含两列分别为id,name。
2. 通过子查询查询表hr.departments,只要DEPARTMENT_ID,DEPARTMENT_NAME这
两列的类型及行数据并插入到hr.dept。
10-3 ALTER TABLE
1、使用ALTER TABLE可以完成以下任务:
? 添加新列 ? 修改现有列 ? 为新列定义默认值 ? 删除列
2、语法
ALTER TABLE table
ADD (column datatype [DEFAULT expr] [, column datatype]...); H2语法:
ALTER TABLE table ALTER COLUMN columnName (column datatype [DEFAULT expr]
[, column datatype]...); Oracle语法:
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr] [, column datatype]...); ALTER TABLE table DROP (column);
演示 - 添加新列
1. 向表hr.dept80添加新列job_id,添加的新列将成为表的最后一行。
演示 - 修改列
1. 可以修改列的数据类型、大小和默认值。 2. 3. 4. 5.
对默认值的更改只影响以后对表的插入操作。 可以增大数字列或字符列的精度或宽度。
只有在列仅包含空值或表没有行时,才可以减少列的宽度。 只有在列包含空值时,才可以更改数据类型。
演示 - 删除列
1. 使用DROP COLUMN子句可以从表中删除不再需要的列。 2. 规则:
? ? ? ?
要删除的列可以包含数据,也可以不包含数据。 使用Alter Table语句时,每次只能删除一列。 表在更改之后,必须至少余下一列。 列一旦被删除,就无法恢复。
练习 - 列操作
1. 创建表hr.dept80.
2. 给表hr.dept80新增一列department_id number(4)。 3. 修改表hr.dept80的department_id列的宽度为6。 4. 删除表hr.dept80的department_id列。 创建表hr.dept80的代码:
--删除表
DROP TABLE hr.dept80; --子查询创建表
CREATE TABLE hr.dept80 as SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM hr.employees
WHERE department_id = 80;
10-4删除表
1、该表的所有数据及结构都会被删除。 2、所有待定事务处理都会被提交。 3、所有索引都会被删除。
4、语法 DROP TABLE tablename;
演示 - 删除表
1. 删除表hr.dept80;
11-1表约束
1、约束会在表级别上强制执行规则。 2、约束可以防止在存在相关性时删除表。 3、约束的类型如下:
? NOT NULL:指定该列不能为空值。
? UNIQUE:指明一个列或列组合中的值对于表中的所有行必须唯一。 ? PRIMARY KEY:唯一标识表中的第一行。
? FOREIGN KEY:在列和被引用表的列之间建立并实施一个外键关系。 ? CHECK:指定条件必须为真。
4、规则
? 可以给约束命名或系统自动产生。
? 可以在创建表的同时创建约束或在表创建之后创建约束。 ? 可以在列或表级别上定义约束。
11-2创建约束
1、语法
CREATE TABLE [schema.]table (column datatype[DEFAULT expr] [column_constraint], ...
[table_constraint][,...]); column_constraint:列级定义的约束
table_constraint:表级定义的约束
2、列约束
column[CONSTRAINT constraint_name] constraint_type,
3、表约束级别
column,...
[CONSTRAINT constraint_name] constraint_type (column, ...),
注:表级不能定义NOT NULL约束
constraint_name:是约束名
constraint_type:约束的类型
演示 - NOT NULL约束
1. 确保该列不允许有空值。只能在列级上定义。
演示 - UNIQUE(唯一)约束
1. UNIQUE约束可以在表级或列级上定义。
2. 有多列组合的唯一约束必须用表级别定义来创建。
演示 - PRIMARY KEY约束
1. PRIMARY KEY约束将创建一个主键。每个表只能创建一个主键。 2. 可以在表级或列级别上定义。
3. 组合键(有多列组合而成)通过表级别定义来创建。注: PRIMARY KEY列将自动
创建UNIQUE索引。
演示 - FOREIGN KEY(外键)约束
1. FOREIGN KEY(外键)约束将指定一个列或列组合作为外键,并建立与同一表或
外表中主键或唯一约束列之间的关系。
2. FOREIGN KEY(外键)约束可在表级或列级定义。 3. FOREIGN KEY(外键)约束关键字
? FOREIGN KEY:在表级约束上定义子表的中列。 ? REFERENCES:标识父表中的表和列。
ON DELETE CASCADE:当删除父表中的行时,也删除子表中的行。 ? ON DELETE SET NULL:将相关外键值转换为空值。
演示 - FOREIGN KEY(外键)约束
1. 演示设置不同的关键约束,对操作有一定的影响。
? ON DELETE CASCADE:当删除父表中的行时,也删除子表中的行。