SQL数据类型、基本表的定义、索引定义

前言

由于最近做消息中心后台开发,需要进行数据库的操作,在编写SQL(mybatis)上略感吃力,于是复习一下大学时代所学习的数据库的相关基础知识,直接从SQL开始。

I.SQL模式

此处输入图片的描述

II.本次学习所用到的几个表

Student

学号 Sno姓名 Sname性别 Ssex年龄 Sage所在系 Sdept
20021521李勇20CS
20021522刘晨19CS
20021523王敏18MA
20021524张力19IS

Course

课程号 Cno课程名 Cname先行课 Cpno学分 Sage
1数据库54
2数学2
3信息系统14
4操作系统63
5数据结构74
6数据处理2
7PASCAL语言64

CS

学号 Sno课程号 Cno成绩 Grade
20021521192
20021521285
20021521388
20021522290
20021522380

III.SQL的数据定义语句

操作对象创建删除修改
模式create schemadrop schema
create tabledrop tablealter table
视图create viewdrop view
索引create indexdrop index

IV.创建表

一般格式

create table <表名> (<列名> <数据类型> [列级完整性约束]
    [ , <列名> <数据类型> [列级完整性约束]]
    ...
    [,<表级完整性约束>] );

例如:

create table Student(
    Sno char(9) primary key,  /*列级完整性约束, Sno为主码*/
    Sname char(20) unique,   /*列级完整性约束, Sname唯一*/
    Ssex char(2),
    Sage smallint,
    Sdept char(20)
);
create table Course(
    Cno char(4) Primary key,  /*列级完整性约束, Cno为主码*/
    Cname char(40),
    Cpno char(4),                  /*Cpno是先行课*/
    Ccredit smallint,
    foreign key (Cpno) references Course(Cno)  /*表级完整性约束,Cpno 是外码,被参考Course,被参照Cno*/

);
create table SC(
    Sno char(9),
    Cno char(4),Grade smallint,
    primary key (Sno, Cno),   /* 主码有两个属性构成,必须作为表级完整性约束进行定义*/
    foreign key (Sno) references Student(Sno),  /*表级完整性约束,Sno 是外码,被参考Student,被参照Sno*/
    foreign key (Cno) references Course(Cno)   /*表级完整性约束,Cpno 是外码,被参考Course,被参照Cno*/
);
insert into Student(Sno, Sname, Sage, Ssex, Sdept) values('200215121', '李勇', 20, '男', 'CS');
insert into Student(Sno, Sname, Sage, Ssex, Sdept) values('200215122', '刘晨', 19, '女', 'CS');
insert into Student(Sno, Sname, Sage, Ssex, Sdept) values('200215123', '王敏', 18, '女', 'MA');
insert into Student(Sno, Sname, Sage, Ssex, Sdept) values('200215125', '张力', 19, '男', 'IS');


insert into Course(Cno, Cname, Ccredit) values(2, '数学', 2);
insert into Course(Cno, Cname, Ccredit) values(6, '数据处理', 2);
insert into Course(Cno, Cname, Cpno, Ccredit) values(7, 'PASCAL语言', 6, 4);
insert into Course(Cno, Cname, Cpno, Ccredit) values(5, '数据结构', 7, 4);
insert into Course(Cno, Cname, Cpno, Ccredit) values(4, '操作系统', 6, 3);
insert into Course(Cno, Cname, Cpno, Ccredit) values(1, '数据库', 5, 4);
insert into Course(Cno, Cname, Cpno, Ccredit) values(3, '信息系统', 1, 4);

insert into SC(Sno, Cno, Grade) values('200215121', '1', 92);
insert into SC(Sno, Cno, Grade) values('200215121', '2', 85);
insert into SC(Sno, Cno, Grade) values('200215121', '3', 88);
insert into SC(Sno, Cno, Grade) values('200215122', '2', 90);
insert into SC(Sno, Cno, Grade) values('200215122', '3', 80);

V.关于数据类型

各个数据库的数据类型不完全相同,选择数据类型的原则有两个,一个是取值范围,二是要做哪些数据运算。比如年龄:取值为100左右的正整数,取值范围很多数据类型都满足,比如char(3)、长整形、短整型;运算比如需要求平均年龄,这个只有长整形和短整型支持,考虑到存储空间的占用,故选用短整型。

数据类型含义
char(n)长度为n的定长字符串
varchar(n)最大长度为n的变长字符串
int长整数,也可以写成integer
smallint短整数
numeric(p,d)定点数,由p位数字(不包含小数点、符号)组成,小数点后面有d为数字
real取决于机器精度的浮点数
double precision取决于机器精度的双精度浮点数
float(n)浮点数,精度至少为n位数字
date日期,包含年、月、日,格式为 YYYY-MM-DD
time时间,包含一日的时、分、秒,格式为 HH:MM-SS

更多数据类型请参考具体的数据库厂商说明书。

VI.修改基本表

一般格式

alter table <表名> 
    [add <列名> <数据类型> [完整性约束]]
    [drop <完整性约束 名>]
    [alter column<列名> <数据类型>];

例如:

alter table Student add S_ontrance date;  /*学生表增加入学时间列*/

alter table Student alter column Sage int; /*修改学生表的Sage列的数据类型为int,这个在mysql中执行错误*/

alter table Course add unique(Cname); /*增加课程名唯一的约束*/

VII.删除表

一般格式

drop table <表名> [restrict | cascade] 

restrict:删除表示有限制的,如果该表有外键、视图、触发器、存储过程、函数等约束,则删除失败,缺省为restrict

cascade: 删除没有条件,删除该表时,相关联的对象,视图等都会被删除,使用值需谨慎;不同的数据库厂商对的实现细节还是有差距的,比如mysql如果该表有外键的话即使指定cascade也是无法删除的。

比如:在mysq下

drop table Student restrict;

提示错误信息:
[SQL] drop table Student restrict ;
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails

drop table Student cascade;

[SQL] drop table Student cascade;
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails

验证一个表只有视图的情况下:restrict和cascade的差别:首先给SC表创建一个视图,然后删除该表,SC表无其他关联约束:

create view v_sc as select * from SC;
drop table SC restrict;
drop table SC cascade;

可以看到在mysql的实现下restrict,cascade 都可以删除表,但是视图没有删除,在这一点上表现是一致的。

VIII.建立索引

建立索引是加快查询的有效手段。

一般格式

create [unique] [cluster] index <索引名称> on <表名>(<列名>[<次序>] [,<列名>[<次序>]]...);
/**建立索引*/
create unique index StuNoIndex on Student(Sno);

IX.删除索引

一般格式

drop index<索引名称> on <表名>
drop index StuNoIndex on Student;

索引一旦建立,由系统使用并维护,不需用户干预。建立索引是为了减少查询时间,如果数据频繁增删改,系统会花费许多时间来维护索引,从而降低了数据库系统的效率,这个时候可以删除一些不必要的索引。在RDBMS中一般采用B+树、HASH索引来实现,B+树具有动态平衡的优点,Hash索引则具有查找快速的优点。索引是数据库的内部实现技术,属于内模式范畴。至于某一索引在创建时是采用B+树还是Hash索引则由具体的RDBMS来决定。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值