关系数据库标准语言SQL

关系数据库标准语言SQL

概述

SQL:
SQL语言原名SEQUEL (读作[si:kwl]),是一个通用的、功能极强的关系数据库语言。是一种介于关系代数与关系演算之间的结构化查询语言(Structured Query Language),其功能包括数据定义、数据查询、数据操纵和数据控制
SQL的特点:

  • 综合统一
  • 高度非过程化
  • 面向集合的操作方式
  • 两种使用方式,统一的语法结构,既是独立的语言,也是嵌入语言
  • 简洁易学

基本表:

  • 本身独立存在的表,SQL中一个关系就对应一个基本表
  • 一个(或多个)基本表对应一个存储文件,一个表可以带若干索引

存储文件:

  • 物理结构和存储方式构成了关系数据库的内模式
  • 物理结构对用户是隐蔽的

视图:

  • 从一个或几个基本表导出的表
  • 视图是一个虚表,数据库中只存放视图的定义而不存放视图对应的数据
  • 用户可以在视图上再定义视图

学生-课程数据库

学生-课程模式 S-T

  • 学生表:Student(Sno, Sname, Ssex, Sage, Sdept)
  • 课程表:Course(Cno, Cname, Cpno, Ccredit)
  • 学生选课表:SC(Sno, Cno, Grade)

关系数据库标准语言SQL_第1张图片
关系数据库标准语言SQL_第2张图片
关系数据库标准语言SQL_第3张图片

数据定义

SQL的数据定义功能: 模式定义、表定义、视图和索引的定义

关系数据库标准语言SQL_第4张图片
现代关系数据库管理系统提供了一个层次化的数据库对象命名机制

  • 一个关系数据库管理系统的实例(Instance)中可以建立多个数据库
  • 一个数据库中可以建立多个模式
  • 一个模式下通常包括多个表、视图和索引等数据库对象

关系数据库标准语言SQL_第5张图片
语法:
create database
例:create database student
使用数据库:
use

例:use student

删除数据库:
drop database

例:drop database student

模式

  • 模式是一个独立于数据库用户的非重复命名空间,在空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。可以将模式视为数据库对象的容器。
  • 一个数据库可以有多个模式,模式隶属于数据库。

模式定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> ;

  • 如果没有指定模式名,则模式名隐含为用户名
  • 权限:使用该命令,用户必须具有DBA权限,或者获得了DBA授权CREATE SCHEMA 的权限
  • 例3.1:CREATE SCHEMA Test AUTHORIZATION ZHANG;
  • 例3.2:CREATE SCHEMA AUTHORIZATION WANG;

CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义> |<视图定义> |<授权定义>]

  • 例3.3:为用户ZHANG 创建一个模式Test,并且在其中定义一个表TAB1
 CREATE SCHEMA Test  AUTHORIZATION  ZHANG
                CREATE TABLE  TAB1  (Sno  char(9) PRIMARY KEY,
                                                            Sname  char(20),
                                                            Sage  int )

DROP SCHEMA <模式名>

CASCADE(级联)

  • 删除模式的同时把该模式中所有的数据库对象全部删除
    RESTRICT(限制)
  • 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
  • 当该模式中没有任何下属的对象时才能执行

例3.4:DROP SCHEMA Test CASCADE;

数据类型

  • SQL中域的概念用数据类型来实现
  • 定义列时需要指明其数据类型及长度
  • 属性选用哪种数据类型
    • 取值范围
    • 要做哪些运算

关系数据库标准语言SQL_第6张图片

定义基本表
CREATE TABLE <表名>
(<列名> <数据类型> [ <列级完整性约束条件> ]
[,<列名> <数据类型> [ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );

  • <列级完整性约束条件>:涉及相应属性列的完整性约束条件
  • <表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件

[例3.5] 建立“学生”表Student。学号是主码,姓名取值唯一。

CREATE TABLE Student          
   (Sno   CHAR(9) PRIMARY KEY/*主码 列级完整性约束条件*/                  
    Sname  VARCHAR(20) UNIQUE/* Sname取唯一值*/ 
    Ssex    CHAR(2), 
    Sage   SMALLINT, 
    Sdept  CHAR(20) 
   )

[例3.6 ] 建立一个“课程”表Course。

CREATE TABLE  Course 
   ( Cno       CHAR(4) PRIMARY KEY, 
     Cname  CHAR(40),            
     Cpno     CHAR(4)/*先修课*/                               
     Ccredit  SMALLINTFOREIGN KEY (Cpno) REFERENCES Course(Cno)
   );

[例3.7] 建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno, Cno)为主码。

CREATE TABLE  SC 
 (    Sno  CHAR(9),       
      Cno  CHAR(4),  
      Grade    SMALLINTPRIMARY KEY (Sno,Cno)FOREIGN KEY (Sno) REFERENCES Student(Sno)FOREIGN KEY (Cno) REFERENCES Course(Cno)
  ); 

常用完整性约束

  • 主码约束: PRIMARY KEY
  • 唯一性约束:UNIQUE
  • 非空值约束:NOT NULL
  • 参照完整性约束: FOREIGN KEY

ALTER TABLE <表名>
[ ADD [COLUMN]<新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [COLUMN]<列名>[CASCADE|RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名[CASCADE|RESTRICT] ]
[ ALTER COLUMN <列名> <数据类型> ];

  • <表名>:要修改的基本表
  • ADD子句:增加新列和新的完整性约束条件
  • DROP子句:删除列和指定的完整性约束条件
  • ALTER COLUMN子句:用于修改列名和数据类型

[例3.8] 向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值。
[例3.9] 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;

[例3.10] 增加课程名称必须取唯一值的约束条件
ALTER TABLE Course ADD UNIQUE(Cname);

DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的

  • 欲删除的基本表不能被其他表的约束所引用
  • 如果存在依赖该表的对象,则此表不能被删除

CASCADE:删除该表没有限制

  • 在删除基本表的同时,相关的依赖对象一起删除

[例3.12] 如果选择CASCADE时可以删除表,视图也自动被删除
DROP TABLE Student CASCADE;

–NOTICE: drop cascades to view IS_Student

SELECT * FROM IS_Student;

–ERROR: relation “ IS_Student ” does not exist

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

  • DBA或表的属主(即建立表的人)根据需要建立
  • 有些DBMS自动建立以下列上的索引
    PRIMARY KEY
    UNIQUE

维护索引

  • DBMS自动完成

使用索引

  • DBMS自动选择是否使用索引以及使用哪些索引

语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON
<表名>(<列名>[<次序>][,<列名>[<次序>] ]…);

  • 用<表名>指定要建索引的基本表名字
  • 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
  • 用<次序>指定索引值的排列次序,升序:ASC(默认),降序:DESC。
  • UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录
  • CLUSTER 表示要建立的索引是聚簇索引

[例3.13] 为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。

CREATE UNIQUE INDEX  Stusno ON  Student(Sno);
CREATE UNIQUE INDEX Coucno ON  Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); 

唯一值索引

  • 对于已含重复值的属性列不能建UNIQUE索引
  • 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束

聚簇索引

  • 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致

例如:

CREATE CLUSTER INDEX Stusname ON Student(Sname);
在 Student 表的 Sname(姓名)列上建立一个聚簇索引,而且 Student表中的
记录将按照 Sname 值的升序存放

  • 在一个基本表上最多只能建立一个聚簇索引
  • 聚簇索引的用途:对于某些类型的查询,可以提高查询效率
  • 聚簇索引的适用范围
    很少对基表进行增删操作
    很少对其中的变长列进行修改操作

ALTER INDEX <旧索引名> RENAME TO <新索引名>

[例3.14] 将SC表的SCno索引名改为SCSno
ALTER INDEX SCno RENAME TO SCSno;

DROP INDEX <索引名>

  • 删除索引时,系统会从数据字典中删去有关该索引的描述

[例3.15] 删除Student表的Stusname索引。
DROP INDEX Student.Stusname

你可能感兴趣的:(关系数据库,java,面试,经验分享,dba,数据库架构)