【数据库】第三章 关系数据库标准语言—SQL 笔记

文章目录

    • 一、结构化查询语言
    • 二、数据库的结构
        • 2.1 创建数据库
        • 2.2 修改数据库
        • 2.3 删除数据库
        • 2.4 查看数据库信息
        • 2.5 迁移用户数据库
    • 三、数据类型
    • 四、创建数据表
        • 4.1 定义数据表的约束
        • 4.2 修改数据表
        • 4.3 删除数据表
        • 4.4 查看数据表
    • 五、单关系(表)的数据查询
        • 5.1 无条件查询
        • 5.2 条件查询
        • 5.3 统计汇总查询
        • 5.4 分组查询
        • 5.5 查询结果的排序
    • 六、多关系(表)的数据查询
        • 6.1 查询结构
        • 6.2 内连接查询
        • 6.3 外连接查询
        • 6.4 交叉查询
        • 6.5 自连接查询
    • 七、子查询
        • 7.1 普通子查询
        • 7.2 相关子查询
    • 八、其他类查询
        • 8.1 合并查询
        • 8.2 查询结构到表中
    • 九、数据表中的数据的操纵
        • 9.1 添加数据
        • 9.2 修改数据
        • 9.3 修改数据
    • 十、视图
        • 10.1 创建视图
        • 10.2 修改视图
        • 10.3 删除视图
        • 10.4 查询视图
    • 十一、创建与使用索引
        • 11.1 索引概述
        • 11.2 修改索引
        • 11.3 删除索引
        • 11.4 查看索引
        • 11.5 创建与使用索引

一、结构化查询语言

结构化查询语言 Structured Query Language,简称SQL,含数据查询、数据定义、数据操纵、数据控制。
大型数据库: Sybase  SQL Server  Oracle  DB2  MySQL
小型数据库: FoxPro  Access  SQLite
SQL的基本概念

  1. 基本表(Base Table):一个关系对应一个基本表;一个或多个基本表对应一个存储文件
  2. 视图(View):
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第1张图片
  3. SQL语言支持的关系数据库的三级模式结构
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第2张图片

SQL的主要特点
 SQL语言是类似于英语的自然语言,简洁易用
 SQL是一种一体化的语言
 SQL语言是一种非过程化的语言
 SQL语言是一种面向集合的语言
 SQL语言既是自含式语言,又是嵌入式语言
SQL Server 2012 简介
SQL Server是一个支持关系模型的关系数据库管理系统
企业版(Enterprise Edition):可作为大型web站点服务器
标准版(Standard Edition) :适用于部门级等中小规模的应用(学习数据库时常使用此版本)
Web版(Web Edition) :面向Internet Web服务环境设计,成本低
开发者版(Developer Edition):拥有企业版的特性,但只限于在开发、测试和演示中使用
【数据库】第三章 关系数据库标准语言—SQL 笔记_第3张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第4张图片

二、数据库的结构

从逻辑上看:描述信息的数据存在数据库中并由DBMS统一管理
从物理上看:描述信息的数据是以文件的方式存储在物理磁盘上,由操作系统进行统一管理数据库的存储结构是指数据库文件在磁盘上如何存储。
 在SQL Server 2012中,创建数据库时,会对应地在物理磁盘上创建相应的操作系统文件,数据库中的所有数据、对象和数据库操作日志都存储在这些文件中

数据库的结构——数据文件和事务日志文件
数据文件
 存放数据库数据和数据库对象的文件
 主要数据文件(.mdf ) +次要数据文件(.ndf ) (主要数据文件只有一个,次要数据文件可有多个)
事物日志文件
 保存用于恢复数据库的日志信息,扩展名为.ldf
 当数据库破坏时可以用事务日志还原数据库内容
文件组
文件组(File Group)是将多个数据文件集合起来形成的一个整体,(相当于文件夹)
主要文件组+次要文件组;
一个数据文件只能存在于一个文件组中,一个文件组也只能被一个数据库使用;
日志文件不分组,它不属于任何文件组。

“SQL Server 2012的系统数据库有master、model、msdb、tempdb和resource。
 前4个数据库存储路径为:\Program Files\Microsoft SQL Server\MSSQL11.SQLSERVER\MSSQL\DATA\;
 resource数据库是一个只读和隐藏的数据库,不显示在系统数据库列表中,它的物理文件名为mssqlsystemresource.mdf和mssqlsystemresource.ldf,存储路径为:\Program Files\Microsoft SQL Server\MSSQL11. SQLSERVER\MSSQL\Binn\。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第5张图片
 SQL Server 2012提供了AdventureWorks示例数据库。
 与SQL Server 2000等早期版本不同,SQL Server 2012默认并不安装示例数据库,需要手工下载安装。
 SQL Server 2012联机丛书基本都以该数据库为例讲解,建议读者手工下载安装该示例数据库。

2.1 创建数据库

创建用户数据库有两种典型方法:一是通过Management Studio创建;二是通过SQL命令创建。

  1. 用 Management Studio 创建数据库
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第6张图片 -----【数据库】第三章 关系数据库标准语言—SQL 笔记_第7张图片
  2. 创建数据库的SQL命令的语法格式如下所示:
    CREATE DATABASE 数据库名称
    [ON
    [FILEGROUP 文件组名称]
    ( NAME=数据文件逻辑名称,
    FILENAME=‘路径+数据文件名’,
    SIZE=数据文件初始大小,
    MAXSIZE=数据文件最大容量,
    FILEGROWTH=数据文件自动增长容量, )]
    [LOG ON
    ( NAME=日志文件逻辑名称,
    FILENAME='路径+日志文件名’,
    SIZE=日志文件初始大小,
    MAXSIZE=日志文件最大容量,
    FILEGROWTH=日志文件自动增长容量, )]
    [COLLATE 数据库校验方式名称]
    [FOR ATTACH]
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第8张图片 -----【数据库】第三章 关系数据库标准语言—SQL 笔记_第9张图片
2.2 修改数据库

修改用户数据库有两种典型方法:一是通过Management Studio修改;二是通过SQL命令修改。

  1. 用 Management Studio修改数据库
    在“对象资源管理器”窗口,右键单击要修改的数据库,从快捷菜单中选择“属性”命令,即可弹出数据库属性对话框。
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第10张图片
    “常规”选项卡包含数据库的状态、所有者、创建日期、大小、可用空间、用户数、备份和维护等信息。
    “文件”选项卡
    包含数据文件和日志文件的名称、存储位置、初始容量大小、文件增长和文件最大限制等信息。“文件组”选项卡
    可以添加或删除文件组。但是,如果文件组中有文件则不能删除,必须先将文件移出文件组,才能删除文件组。
    “选项”选项卡可以设置数据库的许多属性,如排序规则、恢复模式、兼容级别等。
    更改跟踪”项卡 可以设定是否对数据库的修改进行跟踪。
    “权限”选项卡可以设定用户或角色对此数据库的操作权限。
    “扩展属性”选项卡可以设定表或列的扩展属性。在设计表或列时,通常通过表名或列名来表达含义,当表名或列名无法表达含义时,就需要使用扩展属性。
    “镜像”选项卡可以设定是否对数据库启用镜像备份。镜像备份是一种高性能的备份方案,但需要投入一定的设备成本,一般用于高可靠性环境。
    “事务日志传送”选项卡设定是否启用事务日志传送。事务日志传送备份是仅次于镜像的高可靠性备份方案,可以达到分钟级的灾难恢复能力,实施成本远小于镜像备份,是一种经济实用的备份方案。

  2. 用SQL命令修改数据库
    可以使用ALTER DATABASE命令修改数据库。注意,只有数据库管理员 ( DBA ) 或者具有 CREATEDATABASE权限的人员才有权执行此命令。下面列出常用的修改数据库的SQL命令的语法格式:
    ALTER DATABASE 数据库名称
    ADD FILE(具体文件格式)
    [,…n][TO FILEGROUP 文件组名]|ADD LOG FILE(具体文件格式)
    [,…n]|REMOVE FILE 文件逻辑名称|MODIFY FILE(具体文件格式)|ADD FILEGROUP 文件组名
    |REMOVE FILEGROUP 文件组名|MODIFY FILEGROUP 文件组名
    { READ_ONLY|READ_WRITE,| DEFAULT,| NAME = 新文件组名} }
    其中,“具体文件格式”为:
    ( NAME = 文件逻辑名称[ , NEWNAME = 新文件逻辑名称][ , SIZE = 初始文件大小] [ , MAXSIZE = 文件最大容量] [ , FILEGROWTH = 文件自动增长容量] )
    例子:
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第11张图片-----【数据库】第三章 关系数据库标准语言—SQL 笔记_第12张图片

2.3 删除数据库

删除用户数据库有两种典型方法:一是通过Management Studio删除;二是通过SQL命令删除。

  1. 用Management Studio删除数据库
     打开“对象资源管理器”,右键单击要删除的数据库,从快捷菜单中选择“删除”。
     删除数据库后,与此数据库关联的数据文件和日志文件都会被删除,系统数据库中存储的该数据库的所有信息也会被删除,因此务必要慎重!
  2. 用SQL命令删除数据库
    DROP DATABASE
    数据库名称[,…n]
    [例]
    删除数据库Teach。
    DROP DATABASE Teach
2.4 查看数据库信息

查看数据库信息有两种典型方法:一是通过Management Studio查看;二是通过系统存储过程查看

  1. 用Management Studio查看数据库信息
    在Management Studio的“对象资源管理器”窗口中,选中“数据库”节点下的某个数据库,单击鼠标右键,在快捷菜单中选择“属性”,即可查看该数据库的详细信息。
  2. 用系统存储过程显示数据库信息
     用系统存储过程显示数据库结构 Sp_helpdb [[@dbname=] ‘name’]
    例如:EXEC Sp_helpdb AdventureWorks2012
     用系统存储过程显示文件信息 Sp_helpfile [[@filename =] ‘name’]
    例如:EXEC Sp_helpfile Address
     用系统存储过程显示文件组信息 Sp_helpfilegroup [[@filegroupname =] ‘name’]
    例如:use AdventureWorks2012 EXEC Sp_helpfilegroup
2.5 迁移用户数据库

当需要将数据库文件从一台电脑迁移到另外的电脑上时,介绍两种常用的迁移数据库的方法:一是分离和加载数据库;二是生成脚本

  1. 分离和加载数据库
    1.1 分离数据库
    在对象资源管理器中,选择要迁移的数据库节点,单击鼠标右键,在快捷菜单中选择“任 务”,在之后出现的级联菜单中选择“分离”,会弹出 “分离数据库”属性对话框。
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第13张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第14张图片
    1.2 加载数据库
    在对象资源管理器中选择“数据库”节点,单击鼠标右键,在快捷菜单中选择“附加”,会弹出“附加数据库”属性对框框。 在“附加数据库”属性对话框中,单击其中的“添加”按钮,在弹出的对话框中选择需要的.mdf文件,即可把数据库文件附加成功。
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第15张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第16张图片
  2. 生成脚本
    在对象资源管理器中,选择要操作的数据库节点,单击鼠标右键,在快捷菜单中选择“任务”,在之后出现的级联菜单中选择 “生成脚本”命令,会弹出“生成和发布脚本”窗口。
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第17张图片

三、数据类型

SQL使用数据定义语言(Data DefinitionLanguage,DDL)实现数据定义功能。
关系表中的每一列(即每个字段)都来自同一个域,属于同一种数据类型。
创建数据表之前,需要为表中的每一个属性设置一种数据类型。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第18张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第19张图片
整数型
按照取值范围从大到小,包括bigint、int、smallint、tinyint、bit。在实际应用中,可以根据属性的具体取值范围选择适合的整数型
数值型
 包括精确数值型numeric、decimal和近似数值型float、real。  numeric与decimal在功能上等效,用于精确存储数值。  以numeric为例,格式为numeric(p,s),其中p表示数据长度,s表示小数位数。
 例如,成绩的数据类型可以设置为numeric(4,1),表示数据长度为4,小数位为小数点后一位。  float和real用来存储数据的近似值,当数值的位数太多时,可用它们存取数值的近似值。
货币型
按 照 取 值 范 围 从 大 到 小 , 包 括 money 和smallmoney,它们可以精确到所代表的货币单位的万分之一,也就是小数点后面4位。通常情况下,货币型可以转换为精确数值型。
日期型
按照时间范围从大到小,包括datetime和
smalldatetime,可以精确到秒,smalldatetime
比datetime少占用4个字节。此外,还有一个
常用的日期型是date,这种数据类型只显示
日期,不显示时间。
字符型
包括char、varchar、nchar、nvarchar、text、ntext。其中,char、varchar存放非Unicode字 符(即ASCII字符),一个字符占1个字节,
char是定长的,varchar是非定长的。
例如, “学号(SNo)”可以设置为char(6),表示学号最多可以包含6个非Unicode字符,即使小于6个,在内存中也要分配6个字节的空间;如果设置为varchar(6),则学号实际包含多少非Unicode字符,在内存中就分配多少字节。
nchar、nvarchar存放Unicode字符,一个字符占2个字节,nchar是定长的,nvarchar是非定长的。nchar、nvarchar的用法与char、varchar相同,只是 占 用 内 存 空 间 不 同 。 例 如 , 如 果 “ 学 号(SNo)”设置为nchar(6),则学号占12个字节;如果设置为nvarchar(6),则学号根据实际长度分配字节。
当某个字符型属性需要描述的字符数比较多时,可以将其设置为text、ntext。其中,text存放非
Unicode字符,定长,最大可存储2GB;ntext存 放Unicode字符,非定长,最大可存储2GB。
二进制数据型
包括binary、varbinary、image。 binary是定长的二进制数据型,varbinary是非定长的二进制数据型,两者最多可以表示8000个字节。任何类型的数据都可存储在这种类型的字段中,不需数据转换。
image类型可以存储图片本身,这时需要事先将图片转换成二进制流的形式,也可以存储图片路径。
特殊类型
包括timestamp 、uniqueidentifier、sql_variant、table。
timestamp数据类型提供数据库范围内的唯一值。此类型相当于binary(8)或varbinary(8),但当它所定义的列更新或添加数据行时,此列的值会被自动更新 , 一 个 计 数 值 将 自 动 地 添 加 到 此timestamp数据列中。每个数据库表中只能有一个timestamp数据列。
uniqueidentifier数据类型称为全球唯一标识符(Globally Unique Identifier,GUID ),可用NEWID( )函数产生。
sql_variant数据类型可以存储除文本、图形数据和timestamp类型数据外的其他任何合法的SQL Server数据,此数据类型大大方便了SQL Server的开发工作。
table数据类型用于存储对表或视图处理后的结果集,这一类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。

四、创建数据表

创建数据表有两种典型方法:一是通过Management Studio创建;二是通过SQL命令创建
右键单击“对象资源管理器”中“数据库”节点下的“表”节点,从快捷菜单中选择“新建表”命令,会弹出定义数据表结构对话框。 其中,每一行用于定义数据表的一个字段,包括字段名、数据类型、长度、字段是否为NULL以及默认值等。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第20张图片
“列名”(即表中某个字段名)由用户命名,最长128字 符,可包含中文、英文、下划线、#号、货币符号(¥) 及@符号。同一表中不允许有重名的列。 “数据类型”,定义字段可存放数据的类型。 “允许空”,当对某个字段的“允许空”列上打勾时,
表示该字段的值允许为NULL值。这样,在向数据表中
输入数据时,如果没有给该字段输入数据,系统将自动
取NULL值,否则,必须给该字段提供数据。 “默认值”,表示该字段的默认值(即DEFAULT值)。
如果规定了默认值,在向数据表中输入数据时,如果没
有给该字段输入数据,系统自动将默认值写入该字段。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第21张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第22张图片

4.1 定义数据表的约束

在SQL Server中,对于数据表的约束分为列约束表约束
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。
表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用“,”分隔,定义表约束时必须指出要约束的列的名称。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第23张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第24张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第25张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第26张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第27张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第28张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第29张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第30张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第31张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第32张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第33张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第34张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第35张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第36张图片

4.2 修改数据表

用Management Studio修改数据表的结构
在Management Studio中的“对象资源管理器”窗口中,展开“数据库”节点。
右键单击要修改的数据表,从快捷菜单中选择“设计”命令,则会弹出修改数据表结构对话框。可以在此对话框中修改列的数据类型、名称等属性,添加或删除列,也可以指定表的主关键字约束。
修改完毕后,单击工具栏中的保存按钮,存盘退出。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第37张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第38张图片
[例] 在S表中增加一个班号列和住址列。
ALTER TABLE S
ADD
Class_No VARCHAR(6),
Address NVARCHAR(20)
使用此方式增加的新列自动填充NULL值,所以不能
为增加的新列指定NOT NULL约束。
[例] 在SC表中增加完整性约束定义,使
Score在0~100之间。
ALTER TABLE SC
ADD
CONSTRAINT Score_Chk CHECK(Score
BETWEEN 0 AND 100)
[例] 把S表中的SN列加宽到12个字符。
ALTER TABLE S
ALTER COLUMN
SN NVARCHAR(12)
 不能改变列名;
 不能将含有空值的列的定义修改为NOT NULL约束;
 若列中已有数据,则不能减少该列的宽度,也不能
改变其数据类型;
 只能修改NULL/NOT NULL约束,其他类型的约束
在修改之前必须先将约束删除,然后再重新添加修
改过的约束定义。
[例] 删除S表中的主键。
ALTER TABLE S
DROP CONSTRAINT S_Prim

4.3 删除数据表

当某个基本表已不再使用时,可将其删除。
删除后,表中的数据和所建的索引都被删除,建立在该表上的视图不会删除,系统将继续保留其定义,但已无法使用。
如果重新恢复该表,这些视图可重新使用。
用Management Studio删除数据表
在Management Studio中,右键单击要删除的表,从快捷菜单中选择“删除”命令,会弹出“删除对象”对话框。
单击“显示依赖关系”按钮,即会弹出“依赖关系”对话框,其中列出了表所依靠的对象和依赖于表的对象,当有对象依赖于表时不能删除表。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第39张图片
DROP TABLE <表名>
只能删除自己建立的表,不能删
除其他用户所建的表

4.4 查看数据表

查看数据表的属性
在Management Studio的“对象资源管理器”中展开“数据库”节点,选中相应的数据库,从中找到要查看的数据表。
右键单击该表,从快捷菜单中选择“属 性”菜单项,则会弹出“表属性”对话框,从中可以看到表的详细属性信息,如表名、所有者、创建日期、文件组、记录行数、数据表中的字段名称、结构和类型等。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第40张图片
查看数据表中的数据
在Management Studio的“对象资源管理器”中,用右键单击要查看数据的表,从快捷菜单中选择“选择前1000行(W)”命令,则会显示表中的前1000条数据。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第41张图片

五、单关系(表)的数据查询

单关系(表)的数据查询结构
【数据库】第三章 关系数据库标准语言—SQL 笔记_第42张图片

5.1 无条件查询

无条件查询是指只包含“SELECT…FROM”的查询,这种查询最简单,相当于只对关系(表)进行投影操作。
[例] 查询全体学生的学号、姓名和年龄。
SELECT SNo, SN, Age
FROM S
在菜单栏下方的快捷工具中,单击“新建查询”,会弹出查询窗口(即对象资源管理器右侧的窗口)。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第43张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第44张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第45张图片

5.2 条件查询

当要在表中找出满足某些条件的行时,则需使用WHERE子句指定查询条件。WHERE子句中,条件通常通过三部分来描述。
(1)列名 (2)比较运算符 (3)列名、常数
常用的比较运算符如下表所示:
【数据库】第三章 关系数据库标准语言—SQL 笔记_第46张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第47张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第48张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第49张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第50张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第51张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第52张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第53张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第54张图片

5.3 统计汇总查询

SQL提供了许多库函数,增强了基本检索能力。常用的库函数如下表所示。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第55张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第56张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第57张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第58张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第59张图片
COUNT(*)用来统计元组的个数,不消除重复行 ,不允许使用DISTINCT关键字。

5.4 分组查询

GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第60张图片
若在分组后还要按照一定的条件进行筛选,则需使用HAVING子句
【数据库】第三章 关系数据库标准语言—SQL 笔记_第61张图片

5.5 查询结果的排序

当需要对查询结果排序时,应该使用ORDER BY子句,ORDER BY子句必须出现在其他子句之后。排序方式可以指定,DESC为降序,ASC为升序,缺省时为升序。
【数据库】第三章 关系数据库标准语言—SQL 笔记_第62张图片 【数据库】第三章 关系数据库标准语言—SQL 笔记_第63张图片

六、多关系(表)的数据查询

6.1 查询结构

当查询同时涉及两个及两个以上的表时,称为连接查询。
连接查询实际上是通过各个表之间共同字段的关联性来查询数据的,这种字段称为连接字段。
表的连接方法有以下两种 :

  1. 表之间满足一定条件的行进行连接时,FROM子句指明进行连接的表名 ,WHERE子句指明连接的列名及其连接条件。
  2. 利用关键字JOIN进行连接:当将JOIN关键词放于FROM子句中时,应有关键词ON与之对应,以表明连接的条件
    JION的分类:
    【数据库】第三章 关系数据库标准语言—SQL 笔记_第64张图片
6.2 内连接查询

[例] 查询“刘伟”老师所讲授的课程,要求列出教师号、教师姓名和课程号。
方法1
SELECT T.TNo,TN,CNo
FROM T,TC
WHERE (T.TNo = TC.TNo) AND (TN=‘刘伟’)
这里TN='刘伟’为查询条件,而T.TNo = TC.TNo为连接条件,TNo为连接字段。
方法2
SELECT T.TNo, TN, CNo
FROM T INNER JOIN TC
ON T.TNo = TC.TNo
WHERE (TN = ‘刘伟’)
[例] 查询所有选课学生的学号、姓名、选课名称及成绩。
SELECT S.SNo,SN,CN,Score
FROM S,C,SC
WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo

6.3 外连接查询

符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中。
外部连接分为左外部连接右外部连接两种。以主表所在的方向区分外部连接,主表在左边,则称为左外部连接;主表在右边,则称为右外部连接。
[例] 查询所有学生的学号、姓名、选课名称及成绩(没有选课的同学的选课信息显示为空)
SELECT S.SNo,SN,CN,Score
FROM S
LEFT OUTER JOIN SC
ON S.SNo=SC.SNo
LEFT OUTER JOIN C
ON C.CNo=SC.CNo

6.4 交叉查询

交叉查询(CROSS JOIN)对连接查询的表没有特殊的要求,任何表都可以进行交叉查询操作。
[例] 对学生表S和课程表C进行交叉查询。
SELECT *
FROM S CROSS JOIN C

6.5 自连接查询

[例] 查询所有比“刘伟”工资高的教师姓名、工资和刘伟的工资
方法1:
SELECT X.TN,X.Sal AS
Sal_a,Y.Sal AS Sal_b
FROM T AS X ,T AS Y
WHERE X.Sal>Y.Sal
AND Y.TN=‘刘伟’
方法2:
SELECT X.TN, X.Sal,Y.Sal
FROM T AS X INNER JOIN
T AS Y
ON X.Sal>Y.Sal
AND Y.TN=‘刘伟’

七、子查询

7.1 普通子查询

【数据库】第三章 关系数据库标准语言—SQL 笔记_第65张图片-----【数据库】第三章 关系数据库标准语言—SQL 笔记_第66张图片
【数据库】第三章 关系数据库标准语言—SQL 笔记_第67张图片-----【数据库】第三章 关系数据库标准语言—SQL 笔记_第68张图片

7.2 相关子查询

相关子查询的执行顺序是:
(1)选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询;
(2)父查询根据子查询返回的结果判断此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中。
(3)重复执行这一过程,直到处理完父查询表中的每一行数据。
使用EXISTS
带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假” 。当子查询的查询结果为非空时,外层的WHERE子句返回真值,否则返回假值。
NOT EXISTS与此相反。
[例] 用含有EXISTS的语句查询讲授课程号为C5的教师姓名。
SELECT TN
FROM T
WHERE EXISTS ( SELECT *
FROM TC
WHERE TNo = T.TNo AND CNo = ‘C5’)
【数据库】第三章 关系数据库标准语言—SQL 笔记_第69张图片

八、其他类查询

8.1 合并查询

合并查询是使用UNION操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果,UNION操作会自动将重复的数据行剔除。
参加合并查询的各个子查询使用的表结构应该相同,即各个子查询中的字段数目和对应的数据类型都必须相同。
[例] 从SC数据表中查询出学号为“S1”同学的学号和总分,再从SC数据表中查询出学号为“S5”的同学的学号和总分,然后将两个查询结果合并成一个结果集。
SELECT SNo AS 学号, SUM(Score) AS 总分
FROM SC
WHERE (SNo = ‘S1’)
GROUP BY SNo
UNION
SELECT SNo AS 学号, SUM(Score) AS 总分
FROM SC
WHERE (SNo = ‘S5’)
GROUP BY SNo

8.2 查询结构到表中

使用SELECT…INTO 语句可以将查询结果存储到一个新建的数据库表或临时表中。
[例]从SC数据表中查询出所有同学的学号和总分,并将查询结果存放到一个新的数据表Cal_Table中。
SELECT SNo AS 学号, SUM(Score) AS 总分
INTO Cal_Table
FROM SC
GROUP BY SNo

九、数据表中的数据的操纵

9.1 添加数据
  1. 添加一行新记录 INSERT INTO
    [例] 在SC表中添加一条选课记录(‘S7’, 'C1’)。
    INSERT INTO SC (SNo, CNo)
    VALUES (‘S7’, ‘C1’)
  2. 添加多行记录 INSERT INTO <表名> [(<列名1>[,<列名2>…])]子查询
    [例] 求出各系教师的平均工资,把结果存放
    在新AvgSal中。
    首先建立新表AvgSal,用来存放系名和各系的平均工资。
    CREATE TABLE AvgSal
    ( Department VARCHAR(20),
    Average SMALLINT )
    然后利用子查询求出T表中各系的平均工资,把结果存放
    在新表AvgSal中。
    INSERT INTO AvgSal
    SELECT Dept,AVG(Sal)
    FROM T
    GROUP BY Dept
9.2 修改数据

UPDATE
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]…
[WHERE <条件>]

  1. 修改一行
    [例] 把刘伟老师转到信息系
    UPDATE T
    SET Dept= ‘信息’
    WHERE SN= ‘刘伟’
  2. 修改多行
    [例] 将所有学生的年龄增加1岁。
    UPDATE S
    SET Age=Age+1
    [例] 把教师表中工资小于或等于1000元的讲师的工资提高20%。
    UPDATE T
    SET Sal = 1.2 * Sal
    WHERE (Prof = '讲师 ')
    AND (Sal <= 1000)
  3. 用子查询选择要修改的行
    [例] 把讲授C5课程的教师的岗位津贴增加100元。
    UPDATE T
    SET Comm = Comm + 100
    WHERE (TNo IN (SELECT TNo
    FROM T, TC
    WHERE T.TNo =TC.TNo AND TC.CNo = ‘C5’))
  4. 用子查询提供要修改的值
    [例] 把所有教师的工资提高到平均工资的1.2倍。
    UPDATE T
    SET Sal = (SELECT 1.2 * AVG(Sal)FROM T)
9.3 修改数据

DELETE
FROM<表名>
[WHERE <条件>]

  1. 删除一条记录
    [例] 删除刘伟老师的记录。
    DELETE
    FROM T
    WHERE TN= ‘刘伟’
  2. 删除多行记录
    [例] 删除所有教师的授课记录。
    DELETE
    FROM TC
  3. 利用子查询选择要删除的行
    [例] 删除刘伟老师授课的记录。
    DELETE
    FROM TC
    WHERE (TNo = ( SELECT TNo
    FROM T
    WHERE TN = ‘刘伟’))

十、视图

视图是一个虚拟表,其内容由查询定义。
同基本表一样,视图包含一系列带有名称的列和行数据。
行和列数据来自定义视图的查询所引用的基本表,并且在引用视图时动态生成。

10.1 创建视图

用SQL命令创建视图
CREATE VIEW view_name [ (column [ ,…n ] ) ] AS select_statement
[例] 创建一个计算机系教师情况的视图Sub_T。
CREATE VIEW Sub_T
AS SELECT TNo, TN, Prof
FROM T
WHERE Dept = ‘计算机’
[例] 创建一学生情况视图S_SC_C(包括学号、姓名、课程名及成绩)。
CREATE VIEW S_SC_C(SNo, SN, CN, Score)
AS SELECT S.SNo, SN, CN, Score
FROM S, C, SC
WHERE S.SNo = SC.SNo AND SC.CNo = C.CNo
[例] 创建一学生平均成绩视图S_Avg。
CREATE VIEW S_Avg(SNo, Avg)
AS SELECT SNo, Avg(Score)
FROM SC
GROUP BY SNo

10.2 修改视图

用SQL命令修改视图
ALTER VIEW <视图名>[(<视图列表>)] AS <子查询> [例] 修改学生情况视图S_SC_C(包括姓名、课程名及成绩)。
ALTER VIEW S_SC_C(SN, CN, Score)
AS SELECT SN, CN, Score
FROM S, C, SC
WHERE S.SNo = SC.SNo AND SC.CNo =C.CNo

10.3 删除视图

用SQL命令删除视图 DROP VIEW <视图名>
[例] 删除计算机系教师情况的视图Sub_T。
DROP VIEW Sub_T

10.4 查询视图
【数据库】第三章 关系数据库标准语言—SQL 笔记_第70张图片 #### 10.5 更新视图 由于视图是一张虚表,所以对视图的更新最终转换成对基本表的更新。 其语法格式如同对基本表的更新操作一样 。 【数据库】第三章 关系数据库标准语言—SQL 笔记_第71张图片

十一、创建与使用索引

11.1 索引概述
  1. 索引
    索引是一种可以加快检索的数据库结构。
    通过创建良好的索引,可以显著提高数据库查询和应用程序的性能。
    索引一旦创建,将由DBMS自动管理和维护。当操作数据时,DBMS会自动更新索引。
    要避免在一个表中创建大量的索引,否则会影响数据操作的性能,降低系统的响应速度。
    2.索引的类型
    聚集索引
    在聚集索引中,表中行的物理存储顺序与索引键的逻辑顺序相同。
    由于真正的物理存储只有一个,因 此,一个表只能包含一个聚集索引。
    非聚集索引
    非聚集索引与聚集索引具有相似的索引结构。
    不同的是,非聚集索引不影响数据行的物理存储顺序
    唯一索引
    唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行在某种方式上具有唯一性。
    视图索引
    对视图而言,查询动态生成的结果集开销很大,特别是涉及对大量行进行复杂处理的视图。
    如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提升性能,这类索引称为视图索引。
    全文索引
    全文索引是目前搜索引擎的关键技术之一。试想在1兆大小的文件中搜索一个词,可能需要几秒,在更大的文件中搜索开销会更大。为加快此类检索速度,出现了全文索引技术,也称倒排文档技术。
    XML索引
    可以对xml数据类型列创建XML索引。XML索引对列中xml实例的所有标记、值和路径进行索引,提高查询性能。
  2. 创建索引
    用SQL语句创建索引的基本语法:
    CREATE [UNIQUE] [CLUSTERED |
    NONCLUSTERED] INDEX index_name
    ON table_or_view_name (column_name [ASC | DESC] [,…n])
    [WITH [,…n] ]
    [ON {filegroup_name | “default” } ]
    用SQL语句创建索引:
    [例] 为表SC在SNo和CNo上建立惟一索引。
    CREATE UNIQUE INDEX SCI ON
    SC(SNo,CNo)
    [例] 为教师表T在TN上建立聚集索引。
    CREATE CLUSTER INDEX TI ON T(TN)
11.2 修改索引

修改索引的SQL命令语法如下:
ALTER INDEX { index_name | ALL }
ON table_or_view_name
{ REBUILD
[ [PARTITION = ALL]
[ WITH ( [ ,…n ] ) ]
| [ PARTITION = partition_number
[ WITH ( [ ,…n ] )] ] ]
| DISABLE
| REORGANIZE
[ PARTITION = partition_number ]
[ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
| SET ( [ ,…n ] ) }[ ; ]
修改索引的参数介绍:
(1)REBUILD:删除索引并且重新生成索引。
(2)PARTITION:指定只重新生成或重新组织索引的一个分区。
(3)DISABLE:将索引标记为禁用,从而不能由数据库引擎使用。
(4)REORGANIZE:重新组织索引。

11.3 删除索引

用SQL语句删除索引
DROP INDEX

.
DROP INDEX ON

11.4 查看索引

用Sp_helpindex存储过程查看索引
Sp_helpindex [@objname =] ‘name’ ,其中[@objname =] 'name’为 表的名称
[例] 查看表SC的索引。
EXEC Sp_helpindex SC

11.5 创建与使用索引

如果要更改索引名称,可利用Sp_rename存储过程更改,其语法如下:
Sp_rename ‘数据表名.原索引名’, ‘新索引名’ [例] 更改T表中的索引TI名称为T_Index。
EXEC Sp_rename ‘T.TI’, ‘T_Index’

你可能感兴趣的:(数据库,数据库)