• 【数据库原理及应用】——SQL概述及数据定义(学习笔记)


    📖 前言:结构化查询语言(Structured Query Language,简称SQL)是关系数据库的标准语言,由于它具有功能丰富、使用方便灵活、语言简洁易学等突出的优点,因而深受计算机界和计算机用户的欢迎。1986年10月,美国国家标准局(ANSI)的数据库委员会批准将SQL作为数据库语言的美国标准,同年公布了标准SQL。此后不久,国际标准化组织(ISO)也做出了同样的决定。

    在这里插入图片描述


    🕒 0. 思维导图

    请添加图片描述

    🕒 1. SQL概述

    🕘 1.1 什么是SQL

    • SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言
    • SQL是一个通用的、功能极强的关系数据库语言

    🕘 1.2 SQL的特点

    ①、综合统一

    • 数据定义语言 DDL(Data Definition Language),数据操纵语言 DML(Data Manipulation Language),数据控制语言 DCL(Data Control Language) 功能于一体。
    • 可以独立完成数据库生命周期中的全部活动:
      • 定义关系模式,插入数据,建立数据库;
      • 对数据库中的数据进行查询和更新;
      • 数据库重构和维护
      • 数据库安全性、完整性控制等
    • 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行。
    • 数据操作符(即语言风格)统一

    ②、高度非过程化

    • 非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径
    • SQL只要提出“做什么”,无须了解存取路径。
    • 存取路径的选择以及SQL的操作过程由系统自动完成。

    ③、面向集合的操作方式

    • 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
    • SQL采用集合操作方式:
      • 操作对象、查找结果可以是元组的集合
      • 一次插入、删除、更新操作的对象可以是元组的集合

    ④、以同一种语法结构提供多种使用方式

    • SQL是自含式(交互式)语言
      • 能够独立地用于联机交互的使用方式
    • SQL又是嵌入式语言
      • SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用

    ⑤、语言简洁,易学易用

    SQL功能极强,完成核心功能只用了9个动词。

    SQL功能动词
    数据查询(DQL)SELECT
    数据定义(DDL)CREATE(增)、DROP(删)、ALTER(改)
    数据操纵(DML)INSERT、UPDATE、DELETE
    数据控制(DCL)GRANT(授权)、REVOKE(撤回权限)

    🕘 1.3 SQL的体系结构

    SQL支持关系数据库三级模式结构
    在这里插入图片描述

    • 基本表

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

      • 逻辑结构组成了关系数据库的内模式
      • 物理结构是任意的,对用户透明
    • 视图

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

      • 可以是应用程序,也可以是终端用户
      • 可用SQL语言对视图和基本表进行查询

    🕒 2. 数据定义

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

    操作对象创建删除修改
    模式CREATE SCHEMADROP SCHEMA
    CREATE TABLEDROP TABLEALTER TABLE
    视图CREATE VIEWDROP VIEW
    索引CREATE INDEXDROP INDEX

    🕘 2.1 创建、修改和删除基本表

    🕤 2.1.1 定义基本表

    三要素:关系名(表名)、属性名(列名)、完整性约束

    CREATE TABLE <表名>(
          <列名> <数据类型>[ <列级完整性约束条件> ]
          [<列名> <数据类型>[ <列级完整性约束条件>] ]
           ………
          [<表级完整性约束条件> ]
     );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    ❗ 转载请注明出处
    作者:HinsCoder
    博客链接:🔎 作者博客主页

    🕤 2.1.2 常用的完整性约束

    • 主码约束: PRIMARY KEY (唯一性)
    • 参照完整性约束:FOREIGN KEY ... REFERENCES ...
    • 唯一性约束:UNIQUE (与主码约束的区别在于可以取空
    • 非空值约束:NOT NULL
    • 取值约束:CHECK

    🕤 2.1.3 数据类型

    • 不同的数据库系统支持的数据类型不完全相同
    • SQL中的概念用数据类型来实现
    • 定义表的属性时 需要指明其数据类型及长度
    • 选用哪种数据类型
      • 取值范围
      • 要做哪些运算

    常见的数据类型

    类型数据类型举例及缩写说明
    整数数据bigint、int、smallint、tinyint、bit前4个分别以8、4、2、1个字节表示,其中bit同C语言的bool,输入0以外的值均认为是1
    精确数值数据decimal、numeric必须指定范围和精度:DECIMAL(p [,d])例:DECIMAL(10,2)(总体10位,小数点后2位)(其中,2可省略,这样就变成10位整数了)
    NUMERICDECIMAL相同
    注意:我们学过C语言的float其实是不精确
    浮点数值数据float、real分别是8个字节最大53位、4个字节最大24位
    字符串数据char、varchar固定长度字符串,如CHAR(n),不足会用空格补上;可变字符串,尾部的空格会去掉
    日期时间数据date、time、datetimedate:日期类型 DATE’yyyy-mm-dd’ 例: DATE ’ 2022-10-23 ’
    time:时间类型 TIME ‘hh:mm:ss’ 例:TIME ’ 16 : 55 : 02 . 5 ’
    datetime:日期时间类型

    例1:建立一个学生“STUDENT”表。

    CREATE TABLE Student
       ( Sno  char(8)  PRIMARY KEY,			/*列级完整性约束*/
         Sname    varchar(10)  NOT NULL,
         Ssex      char(2)  NOT NULL  DEFAULT('女'),
         Sage      smallint,
         Smajor    varchar(20) ,
         Shometown  varchar(24) 
       );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例2: 建立一个课程“Course”表。

    CREATE TABLE Course
       ( Cno  char(4) PRIMARY KEY,
         Cname    varchar(20)  NOT NULL,
         Cpno     char(4),			-- 先修课
         Ccredit   real,
         FOREIGN  KEY (Cpno)  REFERENCES Course(Cno)  -- 表级完整性约束条件, Cpno是外码,被参照表是Course 
       );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    例3: 建立一个选修“SC”表,其中(Sno,Cno)为主码

    CREATE TABLE SC
     (Sno  	char(8)	, 
      Cno  	char(4),
      Grade   smallint,
      PRIMARY  KEY (Sno, Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义*/
      FOREIGN  KEY (Sno)  REFERENCES Student (Sno) , 
      /* 表级完整性约束条件, Sno是外码,被参照表是Student */
      FOREIGN  KEY (Cno)  REFERENCES Course(Cno)
      /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
     );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    CREATE TABLE SC
     (Sno  	char(8)	REFERENCES Student (Sno),  /* 列级完整性约束条件*/
      Cno  	char(4)	REFERENCES Course(Cno),    /* 列级完整性约束条件*/
      Grade   	smallint,
      PRIMARY  KEY (Sno, Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义*/
      );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子分析结果
    (1)主关键字的定义:有两种方法
    ① 列级的完整性约束,在属性及其类型后加上保留字PRIMARY KEY ;
    ② 表级的完整性约束,在列出关系模式的所有属性后,再附加一个声明:PRIMARY KEY (<属性1>[,<属性2>,…]
    注意:当主关键字由一个属性列组成时,可采用上述两种方法定义,但是如果关键字由多个属性构成时,则必须采用第二种方法。

    (2)外部关键字的定义
    其格式为:REFERENCES <表名> <属性>
    既可以定义在列级,也可以定义在表级。外键一定要有被参照表!
    (3)关于缺省值
    在定义属性时增加保留字DEFAULT和一个合适的值,例如: 年龄 SMALLINT DEFAULT 18

    🕤 2.1.4 修改基本表

    ALTER TABLE <表名>
       [ ADD     [COLUMN] <新列名>< 数据类型> [完整性约束]] 
       [ DROP    [COLUMN] <列名>[RESTRICT | CASCADE]]
       [ MODIFY  [COLUMN] <列名><新数据类型>];
    
    • 1
    • 2
    • 3
    • 4

    注意:在SQL Server中不支持MODIFY,用的是ALTER

    其中:

    • RESTRICT:删除该列是有限制的。
      在没有视图或约束引用到该属性列时,才能在基本表中删除该列,否则拒绝删除操作。
    • CASCADE:删除该列没有限制。
      在基本表中删除该列时,所有引用到此列的视图和约束也要一起被自动删除。

    例4:在Student表中增加“总学分TotalCredit”属性,类型为INT型。

    ALTER TABLE Student ADD TotalCredit INT;
    
    • 1

    需要说明的是,新增加的列不能定义为“NOT NULL”。基本表在增加一列后,原有元组在新增加的列上的值都被定义为空值(NULL)。

    例5:在Student表中删除“籍贯Shometown”属性。

    ALTER TABLE Student DROP Shometown;
    
    • 1

    在这里插入图片描述
    注意:这条语句在MySQL里正常,但在SQL Server 会报错,需要在DROP后加上COLUMN。原因是系统无法区分要删除的是列还是完整性约束。

    ALTER TABLE Student DROP COLUMN Shometown;
    
    • 1

    例6:在Student表中将主键(Sno)删去。

    ALTER TABLE Student DROP Sno;
    
    • 1

    例7:在Student表中将“籍贯Shometown”属性的字符长度改为30。

    ALTER TABLE Student Alter COLUMN Shometown CHAR(30);
    
    • 1

    修改原有的列定义时需要慎重,很可能会破坏不满足条件的数据,比如修改Student中属性籍贯Shometown的字符串长度由24变为18,表中超过18长度的字符串都会被截取,丢失信息。

    🕤 2.1.5 删除基本表

    DROP TABLE <表名>RESTRICT|CASCADE];
    
    • 1
    • 系统从数据字典中删去:
      • 该基本描述
      • 该基本表上的所有索引的描述
      • 该基本表表中的数据
    • 表上的视图往往仍然保留,但无法引用

    这里引入一个概念:数据字典

    • 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
    • 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
    • 在进行查询优化和查询处理时,数据字典中的信息是其重要依据。

    例8:假设已经存在一个表,表名为“临时表”,现将其删除,并将与该表有关的其他数据库对象一起删除。

    DROP TABLE 临时表 CASCADE;
    
    • 1

    例9:删除SC表

    DROP TABLE SC
    
    • 1

    前面曾经提到过,不同的数据库产品对于SQL语言的支持会有所不同,SQL99有RESTRICT和CASCADE选项,含义与前面相同。目前居于主流的Oracle 9i数据库只有CASCADE选项,而SQL Server数据库这两个选项都没有。

    🕘 2.2 创建和删除索引

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

    • 谁可以建立索引?

      • DBA 或 表的属主(即建立表的人)
      • DBMS一般会自动建立以下列上的索引
        • PRIMARY KEY
        • UNIQUE
    • 谁维护索引?

      • DBMS自动完成
    • 使用索引

      • DBMS自动选择是否使用索引以及使用哪些索引
    • RDBMS中索引一般采用B+树、HASH索引来实现

      • B+树索引具有动态平衡的优点
      • HASH索引具有查找速度快的特点
    • 采用B+树,还是HASH索引 则由具体的RDBMS来决定

    • 索引是关系数据库的内部实现技术,属于内模式的范畴

    • 很多DBMS使用主键的概念建立主索引,一个表只能有一个主索引

    • CREATE INDEX语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引,不同的DBMS略有区别

    🕤 2.2.1 建立索引

    CREATE [UNIQUE] [CLUSTERED] INDEX <索引名> 
    ON <表名>(<列名>[<次序>][,<列名>[<次序>] ])
    • 1
    • 2
    • Unique表明此索引的每一个索引值只对应唯一的数据记录
    • Cluster指其索引项的顺序与表中记录的物理顺序一致的索引组织

    例10:为Student、Course和SC表建立索引。

    CREATE  INDEX  STU_IDX_SNO  ON   Student (Sno);
    CREATE  INDEX  COU_IDX_CNO  ON   Course (Cno);
    CREATE  INDEX  SC_IDX_SNO_CNO  ON  SC (Sno, Cno);
    
    • 1
    • 2
    • 3

    🕤 2.2.2 删除索引

    DROP INDEX <索引名> ON <表名>;
    DROP INDEX <表名>.<索引名>;
    
    • 1
    • 2
    • 删除索引时,系统会从数据字典中删去有关该索引的描述。
    • DROP INDEX命令可以删除当前数据库内的一个或几个索引,有的时候需要添加表名作为索引名的前缀,中间通过“.”来连接。当一个索引被删除后,该索引先前占有的存储空间就会被收回。但是,DROP INDEX不会影响PRIMARY KEY和UNIQUE约束条件,这些约束条件删除必须用ALTER TABLE DROP命令来完成。

    例11:删除SC表中在学号Sno和课程号Cno上建立的索引

    SC_IDX_SNO_CNO。
    DROP  INDEX  SC.SC_IDX_SNO_CNO
    
    • 1
    • 2

    🕤 2.2.3 使用索引的技巧

    (1)记录少的表不适宜建立。
    (2)索引列中有较多的不同的数据和空值时,会大大提高索引的性能。
    (3)当查询要返回的数据很少时,索引可以优化你的查询(比较好的情况是少于全部数据的25%),否则,会加大系统开销。
    (4)索引可以提高数据的返回速度,但会使更新操作变慢,因此不要对经常需要更新或修改的字段创建索引。
    (5)在设计数据库的可用空间时要考虑索引所占用的空间。
    (6)不要将索引与表存储在同一个驱动器上。

    🕒 3. 实操

    前置工作:创建数据库
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    导出数据到EXCEL
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    🕒 4. 课后习题

    1. 【单选题】建立数据库三级模式的功能由SQL语言的________完成。
      A、数据定义功能
      B、数据操纵功能
      C、数据查询
      D、数据控制

    2. 【单选题】以下关于聚集索引和非聚集索引说法正确的是( )。
      A、每个表只能建立一个非聚簇索引
      B、每个表只能建立一个聚簇索引
      C、一个表上不能同时建立聚集簇和非聚簇索引
      D、以上都不对

    3. 【填空题】数据库语言包括____和数据操纵语言两大部分,前者负责描述和定义数据库的各种特性,后者说明对数据库进行的各种操作。

    4. 【填空题】
      假设有两个关系:
      Departments(Deptno, Dname, TotalNumber, Phone, Loc)
      Employees(Eno, Ename, Eage, Sex, Salary, Deptno)
      其中Employees表的Deptno值参照Departments表的Deptno,则Deptno为Employees表的外键,在SQL语句中用( )关键词定义该约束,用( )关键词表示该引用关系。

    5. 【判断题】可以在值为“null”的列上建立主键约束。( )

    答案:1.A 2.B 3.数据定义语言 4.foreign key references 5.×


    OK,以上就是本期知识点“SQL概述及数据定义”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
    💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
    🎉如果觉得收获满满,可以点点赞👍支持一下哟~

    ❗ 转载请注明出处
    作者:HinsCoder
    博客链接:🔎 作者博客主页

  • 相关阅读:
    如何在现有项目中使用`Masa MiniApi`?
    C++ Makefile 的编写。
    使用create-react-app创建react应用
    rpt层构建以及实现,220626,hm
    iTOP-RK33399开发板Qt系统移植-交叉编译Qt代码
    【Qt之绘制兔纸】
    Redis快速入门----------客户端使用
    基于SSM实现毕业设计管理系统
    学习栈,Java实现
    【JavaScript面试】网页轮播图的制作
  • 原文地址:https://blog.csdn.net/HinsCoder/article/details/127152922