SQL 语言:基本概述和数据定义

简介: SQL 语言:基本概述和数据定义

1. 数据库语言

数据结构化语言 (Structured Query Language,SQL),在关系数据库中最普遍使用的语言,是一种通用的、功能强大的关系数据库标准语言。

主要功能:数据查询 (Data Query)、数据操纵 (Data Manipulation)、数据定义 (Data Definition)、数据控制 (Data Control)


基本表:实际存储在数据库中的表;


视图:由若干个基本表或其它视图导出的表,是一个虚表;


SQL 用户:可以是应用程序,也可以是终端用户;


任何一个数据库系统都应向用户提供一种数据库语言,其中包括数据定义语言和数据操纵语言;SQL 语言是集数据定义和数据操纵为一体的典型数据库语言。数据库语言与数据模型密切相关,基于不同的数据模型,数据库语言也不同。


数据定义语言 (Data Definition Language,DDL) :用来定义数据库模式,包括数据库模式定义、数据存储结构和存取方法定义,数据库模式的修改和删除功能。


数据操纵语言 (Data Manipulation Language,DML) :用来表示用户对数据库的操作请求,通常数据操纵语言 DML 能进行的操纵有插入、删除、修改、查询数据库中的信息,简称增删改查。


SQL 可以作为独立语言在终端以交互的方式使用,也可以作为程序设计的子语言使用,即嵌入到高级语言中使用,这种方式下使用的 SQL 称为嵌入式 SQL ,嵌入式 SQL 的高级语言称为宿主语言。


在 DBMS 中,对宿主型数据库语言 SQL 采用两种方法处理:第一种方法是采用预编译;第二种方法是修改和扩充主语言,使之能处理 SQL 语句。

2. SQL 概述

2.1 SQL 的特点

综合统一。非关系模型的数据语言分为模式定义语言和数据操纵语言,其缺点是当要修改模式时,必须停止现有数据库的运行,转储数据,修改模式编译后再重装数据库。SQL 集数据定义、数据操纵和数据控制功能于一体,语言风格统一,可独立完成数据库生命周期的所有活动。

高度非过程化。当进行数据操作时,只要指出“做什么”,无须指出“怎么做”,存储路径对用户来说是透明的,提高了数据的独立性。

面向集合的操纵方式。非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而 SQL 语言采用面向集合的操作方式,其操作对象、查找结果可以是元组的集合。

两种使用方式。第一种方式,用户可以在终端输入 SQL 命令,对数据库进行运行操作,称为自含式语言;第二种方式,将 SQL 语言嵌入到高级程序中 (Python等),称为嵌入式语言。

语言简洁、易学易用。

数据查询:SELECT ,该动词是 SQL 中用得最多的动词。

数据定义:CREATE、DROP、ALTER,用于创建新表、修改表和删除表。

数据操作:INSERT、UODATE、DELETE,用于数据的插入、修改和删除。

数据控制:GRANT、REVORK,用于数据库对象访问的权限授予和回收。

2.2 SQL 语言支持三级模式结构

SQL 语言支持关系数据库的三级模式结构 (外模式、模式、内模式),其中,视图对应外模式、基本表对应模式、存储文件对应内模式。

2.3 SQL 的基本组成

数据定义语言。SQL DDL 提供定义关系模式和视图、删除关系和视图、修改关系模式的命令。

交互式数据操作语言。SQL DML 提供查询、插入、删除和修改的命令。

事务控制 (Transaction Control)。SQL 提供定义事务开始和结束的命令。

嵌入式 SQL 和动态 SQL ( Embedded SQL and Dynamic SQL )。用于嵌入到某种通用的高级语言 (C、C++、Java、Python、PL/I、COBOL 和 VB 等) 中混合编程。其中,SQL 负责操作数据库,高级语言负责控制程序流程。

完整性 ( Integrity )。SQL DDL 包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。

权限管理 ( Authorization )。SQL DDL 中包括说明关系和视图的访问权限。

3. 数据定义

3.1 数据类型

SQL 支持的内部基本类型如下:

3.2 创建表

语句格式:

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

列级完整性约束有 NULL (空) 和 UNIQUE (取值唯一) ,如 NOT NULL UNIQUE 表示取值唯一,不能取空值。


示例1. 建立一个供应商、零件数据库。其中关系供应商 S(Sno,Sname,Status,City) 属性名分别表示供应商代码、供应商名、供应商状态和供应商所在城市;关系零件 P(Pno,Pname,Color,Weight,City) 属性名分别表示零件号、零件名、颜色、重量及产地。该数据库要满足如下要求:


(1)供应商代码不能为空,且值是唯一的,供应商的名也是唯一的。


(2)零件号不能为空,且值是唯一的;零件名不能为空。


(3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。


分析:(1)表示 Sno 非空唯一约束,Sname 唯一约束;(2)表示 Pno 非空唯一约束,Pname 非空约束;(3)表示供应商和零件之间是多对多的联系,在关系数据库中,多对多联系必须生成一个关系模式,而该模式的码是该联系两端实体的码加上联系的属性构成的,若该联系名为SP,那么关系模式为SP(Sno, Pno,Qty),另外供应商和零件分别要建立一个关系模式。

CREATE TABLE S
(
  Sno CHAR(5) NOT NULL UNIQUE
  ,Sname CHAR(30) UNIQUE
  ,Status CHAR(8)
  ,City CHAR(20)
  ,PRIMARY KEY(Sno)
);
CREATE TABLE P
(
  Pno CHAR(6)
  ,Pname CHAR(30) NOT NULL 
  ,Color CHAR(8)
  ,Weight NUMERIC(6,2)
  ,City CHAR(20)
  ,PRIMARY KEY(Pno)
);
CREATE TABLE SP
(
  Sno CHAR(5) NOT NULL UNIQUE
  ,Pno CHAR(6) NOT NULL UNIQUE
  ,Qty NUMERIC(9)
  ,PRIMARY KEY(Sno,Pno)
  ,FOREIGN KEY(Sno) REFERENCES S(Sno)
  ,FOREIGN KEY(Pno) REFERENCES P(Pno)
);

PRIMARY KEY(Pno) 已经定义了 Pno 为主码,所以 Pno CHAR(6) NOT NULL UNIQUE 语句中的 NOT NULL UNIQUE 可以省略。

3.3 修改和删除表

修改表语法格式:

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

删除表语法格式:

DROP TABLE <表名>;

示例2. 向“ 供应商” 表S 增加Zap “ 邮政编码”;将 Status 字段改为整型;删除供应商表。

# 向“ 供应商” 表S 增加Zap “ 邮政编码”
ALTER TABLE S ADD Zap CHAR(6);
# 将 Status 字段改为整型
ALTER TABLE S MODIFY Status INT;
# 删除供应商表
DROP TABLE S;

3.4 创建和删除索引

数据库中的索引与书籍中的目录页面类似,利用目录页面可以快速查找信息,在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。数据库中的索引是某个表中一列或者若干列的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。


索引作用如下:


通过创建唯一索引,可以保证数据记录的唯一性。

可以大大加快数据检索速度。

可以加快表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。

在使用 ORDER BY 和 GROUP BY 子句中进行检索数据时,可以显著减少查询中分组和排序的时间。

使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。

索引分为聚集索引和非聚集索引。聚集索引时指索引项的顺序与表中记录的物理顺序一致的索引。


创建索引语法格式:

CREATE [UNIQUE] [CLUSTER|NONCLUSTER] 
  INDEX <索引名>
  ON <表名>(<列名>[<次序>][,<列名>[<次序>]);

参数说明如下:


次序:可选择 ASC (升序) 或 DESC (降序) ,默认值为 ASC。

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

CLUSTER:表明要建立的索引是聚集索引,意为索引项的顺序是与表中记录的物理顺序一致的索引组织,默认。

NONCLUSTER:表示建立的索引是非聚集索引。

删除索引语法格式:

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

示例3. 假设供应销售数据库中有供应商S、零件P、工程项目J、供销情况SPJ 关系,希望建立4个索引。其中,供应商S中Sno按升序建立索引;零件P中Pno按升序建立索引;工程项目J中Jno按升序建立索引;供销情况SPJ中Sno按升序,Pno按降序,Jno按升序建立索引。删除其中一个索引。

CREATE UNIQUE INDEX SNS-O ON S(Sno);
CREATE UNIQUE INDEX P-PNO NO P(Pno);
CREATE UNIQUE INDEX J-JNO ON J(Jno);
CREATE UNIQUE INDEX SPJ-NO ON SPJ(Sno ASC, Pno DESC, JNO ASC);
DROP INDEX SNS-O ON SNS-O;

3.5 创建和删除视图

视图是从一个或者多个基本表或视图中导出的表,其结构和数据是建立在对表的查询基础上的;视图不是真实存在的基本表,而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。

视图的优点和作用如下:


可以使视图集中数据、简化和定制不同用户对数据库的不同数据要求。

可以屏蔽数据的复杂性,用户不必了解数据库的结构,就可以方便地使用和管理数据,简化数据权限管理和重新组织数据以便输出到其他应用程序中。

可以使用户只关心他感兴趣的某些特定数据和所负责的特定任务,而那些不需要的或者无用的数据则不在视图中显示。

大大地简化了用户对数据的操作。

可以让不同的用户以不同的方式看到不同或者相同的数据集。

在某些情况下,由于表中数据量太大,因此在表的设计时常将表进行水平或者垂直分割,但表的结构的变化对应用程序产生不良的影响。

提供了一个简单而有效的安全机制。

创建视图语法格式:

CREATE VIEW 视图名(列表名)
AS SELECT 查询子句
[WITH CHECK OPTION];

视图的创建,必须遵循如下规定:


(1)子查询可以是任意复杂的 SELECT 语句,但通常不允许含有 ORDER BY 子句和 DISTINCT 短语。


(2)WITH CHECK OPTION 表示对 UPDATE,INSTER,DELETE 操作时保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。


(3)组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由 SELECT 子查询目标列的主属性组成。

删除视图语法格式:

DROP VIEW 视图名;

示例4. 若学生关系模式为 Student(Sno,Sname,Sage,Sex,SD,Email,Tel),建立“计算机系”(CS表示计算机系)学生的视图,并要求进行修改、插入操作时保证该视图只有计算机系的学生。

CREATE VIEW CS_STUDENT
AS SELECT Sno,Sname,Sage,Sex
FROM Student
WHERE SD = 'CS'
WITH CHECK OPTION;

DROP VIEW CS_STUDENT;

相关文章
|
21天前
|
SQL 安全 数据处理
揭秘数据脱敏神器:Flink SQL的神秘力量,守护你的数据宝藏!
【9月更文挑战第7天】在大数据时代,数据管理和处理尤为重要,尤其在保障数据安全与隐私方面。本文探讨如何利用Flink SQL实现数据脱敏,为实时数据处理提供有效的隐私保护方案。数据脱敏涉及在处理、存储或传输前对敏感数据进行加密、遮蔽或替换,以遵守数据保护法规(如GDPR)。Flink SQL通过内置函数和表达式支持这一过程。
49 2
|
28天前
|
SQL 存储 数据处理
"SQL触发器实战大揭秘:一键解锁数据自动化校验与更新魔法,让数据库管理从此告别繁琐,精准高效不再是梦!"
【8月更文挑战第31天】在数据库管理中,确保数据准确性和一致性至关重要。SQL触发器能自动执行数据校验与更新,显著提升工作效率。本文通过一个员工信息表的例子,详细介绍了如何利用触发器自动设定和校验薪资,确保其符合业务规则。提供的示例代码展示了在插入新记录时如何自动检查并调整薪资,以满足最低标准。这不仅减轻了数据库管理员的负担,还提高了数据处理的准确性和效率。触发器虽强大,但也需谨慎使用,以避免复杂性和性能问题。
31 1
|
28天前
|
SQL 关系型数据库 MySQL
|
28天前
|
Java 网络架构 数据格式
Struts 2 携手 RESTful:颠覆传统,重塑Web服务新纪元的史诗级组合!
【8月更文挑战第31天】《Struts 2 与 RESTful 设计:构建现代 Web 服务》介绍如何结合 Struts 2 框架与 RESTful 设计理念,构建高效、可扩展的 Web 服务。Struts 2 的 REST 插件提供简洁的 API 和约定,使开发者能快速创建符合 REST 规范的服务接口。通过在 `struts.xml` 中配置 `&lt;rest&gt;` 命名空间并使用注解如 `@Action`、`@GET` 等,可轻松定义服务路径及 HTTP 方法。
33 0
|
28天前
|
测试技术 Java
全面保障Struts 2应用质量:掌握单元测试与集成测试的关键策略
【8月更文挑战第31天】Struts 2 的测试策略结合了单元测试与集成测试。单元测试聚焦于单个组件(如 Action 类)的功能验证,常用 Mockito 模拟依赖项;集成测试则关注组件间的交互,利用 Cactus 等框架确保框架拦截器和 Action 映射等按预期工作。通过确保高测试覆盖率并定期更新测试用例,可以提升应用的整体稳定性和质量。
52 0
|
28天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
37 0
|
28天前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
31 0
|
28天前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
10 0
|
28天前
|
SQL 数据管理 数据库
SQL中外键:维护数据完整性的关键
【8月更文挑战第31天】
40 0