数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述

SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言

SQL是一个通用的、功能极强的关系数据库语言

SQL的动词

基本概念

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

存储文件 :逻辑结构组成了关系数据库的内模式; 物理结构是任意的,对用户透明。

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

2.数据定义

关系数据库系统支持三级模式结构,其模式、外模式、和内模式 中的基本对象有表、视图、和索引。因此SQL的数据定义功能包括: 模式定义、表定义、视图和索引的定义

模式:现代关系数据库管理系统提供了一个层次化的数据库对象命名机制

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

master为数据库,新建的数据库会在该数据库的目录之下。

1.模式定义

定义模式实际上定义了一个命名空间 。

在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。

创建新数据库

CREATE DATABASE 数据库名 /*该系统不区分大小写*/
go   /*开始运行*/

进入数据库

USE 数据库名
GO

将会从mater位置,转移到刚刚所建立数据库的位置。以下所有操作都在新建数据库下进行。

2.基本表的基本操作

以下以此表作为实例建立数据库

1.定义基本表

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

<表名>:所要定义的基本表的名字

<列名>:组成该表的各个属性(列)

<列级完整性约束条件>:涉及相应属性列的完整性约束条件

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

如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。

CREATE TABLE Student          
      (Sno   CHAR(8) PRIMARY KEY,       /*Sno为主码*/                                               
        Sname VARCHAR(20) UNIQUE,       /*Sname取唯一值*/ 
        Ssex    CHAR(6),
        Sbirthdate Date,
        Smajor  VARCHAR(40)
      ); 


CREATE TABLE  Course
          (Cno       CHAR(5) PRIMARY KEY,
        	 Cname  VARCHAR(40) NOT NULL,      /*Cname不为空*/      
            Ccredit  SMALLINT,
            Cpno     CHAR(5),
            FOREIGN KEY (Cpno) REFERENCES  Course(Cno)  
                         /*Cpno是外码,被参照表是Course,被参照列是Cno*/
          ); 

CREATE TABLE SC
  (Sno CHAR(8),
   Cno CHAR(5),
   Grade SMALLINT,            
   Semester CHAR(5),          
   Teachingclass CHAR(8),     
   PRIMARY KEY (Sno,Cno),    	/* 主码由两个属性构成,必须作为表级完整性进行定义*/
   FOREIGN KEY (Sno) REFERENCES Student(Sno),
                                /* 表级完整性约束条件,Sno是外码,被参照表是Student */
   FOREIGN KEY (Cno) REFERENCES Course(Cno)
                                /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);

SQL中域的概念用数据类型来实现

定义表的属性时, 需要指明其数据类型及长度 ,选用哪种数据类型 ,取值范围 ,要做哪些运算。

字符数据类型

精确数值数据类型

近似数数据类型

二进制数据类型

日期和时间数据类型

2.数据录入

INSERT INTO Student
values 
('20180001','李勇','男','2004-3-8','信息安全'),
('20180002','刘晨','女','2003-9-1','计算机科学与技术'), 
('20180003','王敏','女','2005-8-1','计算机科学与技术'),
('20180004','张立','男','2004-1-8','计算机科学与技术'),
('20180005','陈新奇','男','2005-11-1','信息管理与信息系统'),
('20180006','赵明','男','2004-6-12','数据科学与大数据技术'),
('20180007','王佳佳','女','2002-12-7','数据科学与大数据技术'),
('20180008','刘莎莎','女','2003-10-5','信息安全')

INSERT INTO Course
values 
('81001','程序设计基础与C语言',4,NULL),
('81002','数据结构',4,'81001'),
('81003','数据库系统概论',4,'81002'),
('81004','信息系统概论',4,'81003'),
('81005','操作系统',4,'81001'),
('81006','Python语言',3,'81002'),
('81007','离散数学',4,NULL),
('81008','大数据技术概论',4,'81003'),
('81009','DB_Design',2,'81003')
          

INSERT INTO SC
values 
('20180001','81001',85,'20192','81001-01'),
('20180001','81002',96,'20201','81002-01'),
('20180001','81003',87,'20202','81003-01'),
('20180002','81001',80,'20192','81001-02'),
('20180002','81002',98,'20201','81002-01'),
('20180002','81003',71,'20202','81003-02'),
('20180003','81001',81,'20192','81001-01'),
('20180003','81002',76,'20201','81002-02'),
('20180004','81001',56,'20192','81001-02'),
('20180004','81002',97,'20201','81002-02'),
('20180005','81003',68,'20202','81003-01'),
('20180006','81001',null,'20192','81001-02')

3.修改基本表

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

<表名>是要修改的基本表

ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件

DROP COLUMN子句用于删除表中的列

DROP CONSTRAINT子句用于删除指定的完整性约束条件

ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型

不管基本表中原来是否已有数据,新增加的列一律为空值

4.删除基本表

DROP TABLE <表名>

若表上建有视图,表不能删除

5.索引的建立与删除

建立索引的目的:加快查询速度

关系数据库管理系统中常见索引: 顺序文件上的索引; B+树索引; 散列(hash)索引; 位图索引

特点: B+树索引具有动态平衡的优点; HASH索引具有查找速度快的特点

谁可以建立索引 :数据库管理员 或 表的属主(即建立表的人)

谁维护索引 :关系数据库管理系统自动完成

使用索引 :关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引

建立索引:

CREATE [UNIQUE] [CLUSTERED] INDEX <索引名> 
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]...);

<表名>:要建索引的基本表的名字

索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔

<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC

UNIQUE:此索引的每一个索引值只对应唯一的数据记录

CLUSTERED:表示要建立的索引是聚簇索引

CREATE CLUSTERED INDEX Stusname            
ON   Student(Sname);

在Student表的Sname(姓名)列上建立一个聚簇索引

在最经常查询的列上建立聚簇索引以提高查询效率

一个基本表上最多只能建立一个聚簇索引 ,经常更新的列不宜建立聚簇索引。

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

Student表按学号升序建唯一索引

Course表按课程号升序建唯一索引

SC表按学号升序和课程号降序建唯一索引

删除索引

DROP INDEX <索引名> ON <表名>;

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

DROP INDEX Stusname on student;

删除Student表的Stusname索引

6.数据字典

数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息: 关系模式定义; 视图定义 ;索引定义 ;完整性约束定义 ;各类用户对数据库的操作权限 ;统计信息等。

关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。

相关推荐
YGGP4 分钟前
【每日八股】Redis篇(二):数据结构
数据结构·数据库·redis
愉悦的麻婆豆腐14 分钟前
Neo4j使用neo4j-admin导入csv数据方法
数据库·neo4j
夜泉_ly3 小时前
MySQL -安装与初识
数据库·mysql
qq_529835354 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New7 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6757 小时前
数据库基础1
数据库
我爱松子鱼7 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo7 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser8 小时前
【SQL】多表查询案例
数据库·sql
Galeoto8 小时前
how to export a table in sqlite, and import into another
数据库·sqlite