SQL Server数据库学习总结及T-SQL语法使用实战

SQL Server数据库及T-SQL实战

  • 声明
  • 名词解释
  • SQL Server数据库
    • 安装sql server
    • 数据库中的三种完整性
  • SQL Server数据库基本操作
    • 创建数据库
      • 指定多个数据库文件创建数据库
      • 为什么sql server一个数据库有多个数据文件
      • 指定多个文件组的数据库
    • 修改数据库
    • 扩大和收缩数据库文件
    • 添加辅助数据库文件
    • 删除数据库
    • 查看数据库状态
      • DATABASEPROPERTYEX函数参数说明
    • 数据库其他操作
      • 分离数据库
      • 附加数据库
      • 收缩数据库、复制和移动数据库
      • 优化数据库
  • 数据库中的表及相关操作
    • 数据类型
    • 常用语法
      • 切换数据库
      • 创建表
      • 修改表
      • 约束
        • 创建约束
        • 创建表时添加约束
        • 删除约束
  • T-SQL语言
    • 基本概念
      • 标识符
        • 命名规则
      • 批处理
      • 变量
      • 全局变量
    • DML
      • 查询
        • 使用关键字DISTINCT
        • TOP 关键字
        • 使用别名查询
        • 计算列
        • 选择查询
        • 表连接
        • 多表查询
        • 子查询
      • **写查询语句步骤**
        • 在查询的基础上创建新表
      • 插入
      • 修改
      • 删除数据
    • 视图
      • 创建视图语法
    • 索引
      • **概念**
      • 使用T-SQL创建索引
      • 利用T-SQL语句删除索引

声明

你好!很高兴你看到这篇博客,我写这篇博客的目的有两个:
1.总结有关T-SQl的实战效果
2.总结SQL Server数据库使用过程中给的技巧
希望朋友你有什么好的意见可以留言,谢谢

名词解释

  • 逻辑名称:逻辑名称就是给用户看的名称,在数据库管理工具中显示的名称,即创建数据库中 create database 逻辑名称。
  • 物理名称:物理名称即存储在系统文件夹中的名字,在数据库管理工具中右键数据库,属性,文件即可查看。
  • ps: 逻辑名称和物理名称在不同的书和系统中的名字有些不同,数据库管理工具中可能将逻辑名称设为数据库文件创建时name后的名称。无伤大雅。

SQL Server数据库

Sql Server数据库是我们公司最常用的数据库之一,那么关于数据库的基本内容讲解,我在这里就不重复了,想要了解的可以简单看一下sql server百科.
关于学习sql server的优质学习资源我这里收集了一下,下载链接

安装sql server

可到官网下载最新版本的sql server,安装教程可以到知乎或者百度查找。
若安装不成功或者有好的安装教程可以留言。
ps:学习资料中的SQL SERVER学习手册,有介绍安装的详细步骤。

数据库中的三种完整性

1.域完整性
对表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效值值等,域完整性可以确保不会输入无效的值。
2.实体完整性
实体完整性就是:主键的约束。
即:关系中的主属性值不能为null且不能有相同的值。
3.参照完整性
外键约束,关系中的外键必须是另一个关系的主键有效值,或者为null.参照完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参照完整性。

SQL Server数据库基本操作

T-SQL语言和sql语言是差不多的,唯一的不同是改变了一些语法书写或者规范,只要你学过sql,那么学习t-sql就是一样的了,相差无几。
ps: t-sql语言不区分大小写

创建数据库

SQL Server数据库学习总结及T-SQL语法使用实战_第1张图片
SQL Server数据库学习总结及T-SQL语法使用实战_第2张图片
以上截图来自《sql server完全学习手册》,[ ]内的数据可以不写。
在该语法中,on用来创建数据文件,加上primary代表是主数据文件。
filegroup关键字用来创建次文件组,其中还可以创建次数据文件。
log on 观健字用来创建事务日志文件。name为所创建文件的文件名称。
filename 指出了文件的存储路径。size定义初始化大小,maxsize定义文件的最大容量,filegrowth指定了文件增长值。
SQL Server数据库学习总结及T-SQL语法使用实战_第3张图片

指定多个数据库文件创建数据库

在创建数据库时,可以为数据库指定多个数据文件(一主多辅)
例如:创建【学生成绩管理系统】数据库,并指定多个数据库文件。
SQL Server数据库学习总结及T-SQL语法使用实战_第4张图片

为什么sql server一个数据库有多个数据文件

SQL Server中一个数据库可以对应多个物理文件,其中有一个的主数据库文件,扩展名为MDF,其他为次数据库文件,扩展名为NDF。可以将不同的文件存放在不同的驱动器上,可以提高数据访问速度。

指定多个文件组的数据库

文件组时分配和管理数据文件的集合,是根据数据文件而创建的。通过创建文件组,可以将不同的数据文件存储在不同的文件组中,这样不仅可以优化数据存储还可以提高数据的I/O读写性能。、
使用过程中需要注意以下几点:

  • 只有数据文件具有文件组,日志文件没有文件组
  • 主数据文件一定存在在主文件组中
  • 与系统相关的数据文件一定在主文件组中
  • 一个数据文件只能存放在一个文件组中

创建【学生成绩管理系统】数据库,并为该数据库指定两个文件组
SQL Server数据库学习总结及T-SQL语法使用实战_第5张图片
SQL Server数据库学习总结及T-SQL语法使用实战_第6张图片
在上述语句中,创建了两个文件组,即:DBGROUP1 与 DBGROUP2。其中,DBGROUP1文件组中学生成绩管理系统_GROUP1和学生成绩管理系统_GROUP2两个数据文件。DBGROUP2文件组中学生成绩管理系统_GROUP3和学生成绩管理系统_GROUP4两个数据文件。

说明
目前用到文件组的情形是,在创建数据库表的时候用关键字ON进行分组。

修改数据库

1. 采用alter关键字
alter database database_name modify name = newdatabase_name
例如:把“学生成绩管理系统” 改为 “Student_result”
alter database “学生管理成绩系统” modify name = “Student_result”
说明:alter修改的是数据库的逻辑名称,对物理名称无影响。
2. 使用系统存储过程 sp
EXEP sp_renamedb ‘学生成绩管理系统’ ‘Student_result’

扩大和收缩数据库文件

扩大和收缩数据库文件目前还没有找到相关语句,解决方案是在数据库管理系统中操作即可。

添加辅助数据库文件

使用add file 语句
修改“学生成绩管理系统”,增加一个新的次要文件,大小为5M
alter database 学生成绩管理系统
add file
(
name = “学生成绩管理系统_data1”,
filename=‘d:\sql server\database\学生成绩管理系统_data1.mdf’,
size=5M,
maxsize=15M,
filegrowth=15%
)

删除数据库

drop database database_name […n]
例如,删除【学生成绩管理系统】数据库,
drop database 学生成绩管理系统

查看数据库状态

采用DATABASEPROPERTYEX(database_name,property)函数
此函数一次只能返回一个选项的信息。
例如:查看【学生成绩管理系统】数据库的状态
use 学生成绩管理系统
go
select DATABASEPROPERTYEX(‘学生成绩管理系统’,‘status’)
as ‘当前数据库状态’

DATABASEPROPERTYEX函数参数说明

DATABASEPROPERTYEX ( database , property )
参数说明:

参数 说明
database 当前链接的数据库名称
property 说明
Collation 排序规则
ComparisonStyle 排列样式
Edition 数据库版本信息(标准版还是企业版)
IsAnsiNullDefault 数据库遵循IOS规则,允许值为null
IsAnsiNullsEnabled 所有与null的比较取值为未知
IsAnsiPaddingEnabled 在比较或插入前,字符串将被填充到相同长度
IsAnsiWarningsEnabled 发生标准错误条件时,SQL Server 会发出错误消息或警告消息
IsArithmeticAbortEnable 如果执行查询时发生溢出或被零除错误,则将结束查询
IsAutoClose 在最后一个用户退出后,数据库完全关闭并释放资源
IsAutoCreateStatistics 查询优化器根据需要创建单列统计信息以提高查询性能
IsAutoCreateStatisticsIncremental 条件允许时,自动创建的单列统计信息递增
IsAutoShrink 可以定期自动收缩数据库文件
IsAutoUpdateStatistics 自动更新统计信息
IsClone 数据库是使用 DBCC CLONEDATABASE 创建的用户数据库的仅限架构和仅限统计数据
IsCloseCursorsOnCommitEnabled 提交事务后,会关闭所有打开的游标
IsFulltextEnabled 支持对数据库进行全文和语义索引
IsInStandBy 数据库以只读方式联机,并允许还原日志。
IsLocalCursorsDefault 游标声明默认为 LOCAL
IsMemoryOptimizedElevateToSnapshotEnabled 在会话设置 TRANSACTION ISOLATION LEVEL 设置为 READ COMMITTED、READ UNCOMMITTED 或较低的隔离级别时,使用 SNAPSHOT 隔离访问内存优化表。
IsMergePublished 如果安装了复制,则 SQL Server 支持发布数据库表供合并复制使用
IsNullConcat Null 串联操作数产生 NULL
IsNumericRoundAbortEnabled 表达式中缺少精度时将产生错误
IsParameterizationForced PARAMETERIZATION 数据库 SET 选项为 FORCED
IsQuotedIdentifiersEnabled 允许对标识符使用英文双引号
IsPublished 如果安装了复制, SQL Server 支持发布数据库表供快照复制或事务复制使用
IsRecursiveTriggersEnabled 已启用触发器递归触发
IsSubscribed 数据库已订阅发布
IsSyncWithBackup 数据库为发布数据库或分发数据库,并且支持在不中断事务复制的情况下还原
IsTornPageDetectionEnabled SQL Server 数据库引擎检测到因电力故障或其他系统故障造成的不完全 I/O 操作
IsVerifiedClone 数据库是使用 DBCC CLONEDATABASE 的 WITH VERIFY_CLONEDB 选项创建的用户数据库的仅限架构和仅限统计信息副本
IsXTPSupported 指示数据库是否支持内存中 OLTP,即创建和使用内存优化表和本机编译模块。
LastGoodCheckDbTime 上次在指定数据库上成功运行 DBCC CHECKDB 的日期和时间
LCID 排序规则的 Windows 区域设置标识符 (LCID)
MaxSizeInBytes 最大数据库大小(以字节为单位)
Recovery 数据库恢复模式
ServiceObjective SQL Database或 SQL 数据仓库 中的数据库的性能级别
ServiceObjectiveId SQL Database 中的服务器目标 ID
SQLSortOrder SQL Server 早期版本中支持的 SQL Server 排序顺序 ID
Status 数据库状态
Updateability 指示是否可以修改数据
UserAccess 指示哪些用户可以访问数据库
Version 用于创建数据库的 SQL Server 代码的内部版本号。 标识为仅供参考。 不提供支持。 不保证以后的兼容性

数据库其他操作

分离数据库

分离数据库是指将数据库从SQL SERVER 2008实例中删除,但是保存其数据库文件和日志文件。
例如:使用sp_detach_db存储过程分离“学生成绩管理系统”数据库
EXEC sp_detach_db 学生成绩管理系统

附加数据库

附加数据库是指重新将分离的数据库定位到相同/不同的是服务器中。
附加数据库时,所有的数据库文件(包括.mdf 和 .ndf文件)都必须可用。
如果任何数据库的文件路径有变,则必须指定文件的当前路径。
使用 FOR ATTACH 语句将分离的“学生成绩管理系统”附加到指定的数据库实例中:
create database 学生成绩管系统
on
(
filename='d:\sql server\DATABASE\学生成绩管理系统_DAT.mdf ’
)
log on
(
filename=‘d:\sql server\DATABASE\学生成绩管理系统_log.ldf’
)
for attach

收缩数据库、复制和移动数据库

语句未找到,可参考手册中的数据库管理工具进行操作。

优化数据库

在sql server 2008中主要从以下三个方面进行优化数据库:
1、数据文件和日志文件的存储位置
在数据库系统中,如果将数据文件和日志文件存放在同一个磁盘中,那么在对这两种数据进行读写操作中,会降低磁盘的运行效率。
方案:将数据文件和日志文件存放在不同的磁盘中,对于多个数据文件应当将它们分散于不同的磁盘进行存储。
2、文件组的使用
文件组时多个数据文件的集合,方便数据文件的管理和访问。
文件组可以提高系统的性能,主要有两个方面:平衡负荷和并行访问。
另外,通过备份单个文件和文件组可以防止数据库发生意外。当数据库出现错误时,通过回复备份的文件和文件组就可以还原数据库,从而简化了数据库的维护工作。
将数据库表和索引放在不同的文件组中,对于经常使用的表来说可以提高查询效率。
注意:文件组可以提高数据库的效率但是不能提高其稳定性
3、RAID技术
RAID 独立磁盘构成的具有冗余能力的阵列
(redundant 英[rɪˈdʌndənt] 多余的
arrays 排列 of
Independent 英[ˌɪndɪˈpendənt] 独立的
Disks 英[dɪsks] 磁盘
)
技术详细介绍.
RAID是由多个磁盘驱动器组成的磁盘系统,它将多个磁盘驱动器组成一个磁盘阵列,以便提供高性能、高可靠性、大存储容量、低成本的磁盘系统。
SQL SERVER中主要涉及的是RAID0、RAID1、RAID5

- RAID0是数据条带化
raid0不断地分割数据,将数据存储在不同地磁盘中,因此具有很高地磁盘读写率。
打个比方:4个磁盘组成的磁盘系统,把数据分割存储在四个磁盘中,在多核计算机中,I/O效率是单个磁盘的4倍。
不足:没有冗余容错机制,一旦一个磁盘损坏,整个磁盘系统都不可以使用。
- RAID1是磁盘镜像化
RAID1最大限度的保证了用户数据的安全性和可修复性。RAID1的操作方式是把用户存储的数据完全复制到另一个磁盘中,就像镜子一样。RAID1的磁盘使用率是50%(如果是两个磁盘)。在sql server中,RAID1策略可用于日志。
- RAID5是带奇偶校验的条带化
什么是奇偶检验
简单的说奇偶校验就是根据检验读取数据时1的个数有没有发生奇偶变化,虽然说一次变化两个的机率比较小,但是奇偶校验检验不出双位错误。
RAID5是最常用的容错等级,没有固定的校验盘,而是按照规则将奇偶校验信息均匀地分布在阵列所属地硬盘上,所以在每块硬盘上,既有数据信息也有校验信息。这样解决了争夺校验盘地问题,而且同一组数据增加了并发操作。既解决了性能问题,也解决了安全问题,既适用于大量数据地操作也适用于各类事务的操作。

数据库中的表及相关操作

SQL Server属于关系型数据库,所谓的关系,指的就是表。
表由行和列组成,每一列都是一个属性,每一行都代表了一条完整的数据。

数据类型

详情点击

常用语法

切换数据库

use + 数据库的名称
例子:切换成DB2数据库
use DB2

创建表

一般我们在创建表之前已经切换到相应的数据库了
简单的书写:
create table table_name
(
属性列名 数据类型(所占字节) [not null / null] [约束条件]

)
完整的写法
sSQL Server数据库学习总结及T-SQL语法使用实战_第7张图片
说明
database_name 用于指定在哪个数据库中建立表
owner 用于指定该数据表的所有者
table_name: 数据表名
column_definition 用于定义数据表中的字段名称
table_constraint 该字段的约束条件
column_name 列名
computed_column_expression 定义计算字段值的表达式
on {filegroup|default} 指定数据表所存储的文件组
textimage_on {filegroup | default} 指定text文本和image文件存储的文件组
data_type 数据类型
constant_expression 指定字段默认值的常量、null或者系统函数
indentity 用于指定该字段为标识字段
seed 标识字段的起始值
increment 用于定义字段的标识增量

例如:在学生成绩管理系统中创建以学号为主键的学生信息表
SQL Server数据库学习总结及T-SQL语法使用实战_第8张图片

修改表

  • 添加列(属性),语法规范
    alter table 表名
    add 属性 数据类型[(长度)][NULL | NOT NULL]
    例子:为student表添加sno列,数据类型为varchar,字节数为15,不能为空
    alter table student
    add sno varchar(15) not null
  • 修改数据类型,语法规范
    alter table 表名
    alter column 属性 数据类型
    例子:将student表中的sno列改为int数据类型
    alter table student
    alter column sno int
  • 删除(列)属性
    alter table 表名
    drop column 属性
    例子:student表中删除sno列
    alter table student
    drop column sno
  • 修改列名
    exec sp_rename ‘表名.列名’,‘新列名’
  • 修改表名
    exec sp_rename ‘原表名’,‘新表名’

约束

  • 主键约束 primary key 唯一确定表中每一条记录的标识符
  • 外键约束 foreign key 用于建立和加强两个表数据之间的连接
  • 唯一约束 unique 指定一个列或多个列的值具有唯一性
  • 检查约束 check 设置检查条件,以限制输入值
  • 默认约束 default 插入操作中没有提供输入值时系统会自动加上指定值

创建约束

alter table 表名
add constraint 约束名 约束类型 (列名)
说明:约束名是自定义的。

  • 主键约束,为学生表中的学号列增加主键约束 primary key
    alter table 学生表
    add constraint pk_学号 primary key (学号)
    强调:主键约束列不可为空

  • 唯一约束 unique , 给姓名添加一个唯一约束 unique
    alter table 学生表
    add constraint un_姓名 unique(姓名)

  • 检查约束 check,给年龄添加检查约束,年龄大于18 check
    alter table 学生表
    add constraint ck_年龄 check (年龄 > 18)

  • 默认约束 default,给性别添加默认约束,男
    alter tale 学生表
    add constraint de_性别 default ‘男’ for 性别。

  • 外键约束:加强两个表之间的联系
    foreign key : 找到有相同的列
    外键的取值规则:空值或参照的主键值
    注意
    1、插入非空值时,如果主键中没有这个值则不能插入
    2、更新时,不能改为主键表中没有的值
    3、删除主键表记录时,可以在外键时选定外键记录一起删除还是拒绝删除
    4、更新主键记录时,可以同时更新外键的值或者拒绝更改
    示例:
    有两张表,成绩表和学生表,都有学号的属性,给成绩表中的学号建立一个外键约束,来自于学生表
    alter table 成绩表
    add constraint fk_学号 foregin key(学号)
    references 学生表 (学号)
    要求
    1、两个表中的字段、类型、长度保持一致
    2、引用的列,references + 的列,必须是主键约束或者唯一约束
    3、两个表中的列,尽量名字保持一致(规范)

创建表时添加约束

eg: test库中,创建dz(编号,姓名,单位,性别,电话);
编号为主键,所有属性都是字符型,长度自己设定;
限制性别的取值为男,女,单位默认值为‘跳动字符’

create table dz
(
编号 char(20) primary key,
姓名 char(20),
单位 char(50) default ‘跳动字符’,
性别 char(5) check (性别=‘男’ or 性别=‘女’),
电话 char(20) unique
)

声明
若存在联合主键,则在最后声明
primary key(列1,列2)

删除约束

alter table 表名
drop constraint 约束名

根据添加约束中的语句操作:

  • 删除默认约束
    alter table 学生表
    drop constraint de_性别
  • 删除主键:若存在外键,则先删除外键
    删除外键约束(成绩表的外键)
    alter table 成绩表
    drop constraint fk_学号
    删除主键约束
    alter table 学生表
    drop constraint pk_学号

T-SQL语言

基本概念

对sql server数据库操作的,增强的sql语言
详情.

标识符

数据库对象的名称即为其标识符

命名规则

  1. 第一个字符必须是英文字母,下划线、@符或#号
  2. 其他字符可以是:英文字母、十进制数字、@、$、#、_(下划线)
  3. Transact_SQL为保留字
  4. 不允许嵌入空格或者其他字符

批处理

t-sql语言一次可提交多条,语句顺序依次执行。

变量

语法: declare @ 字符名称 字符类型
eg:声明两个变量 name 字符类型 age int
declare @name varchar(10),age int
赋值 set 变量 = 值
eg: set @name = ‘张三’
同时多个赋值
select @name = ‘李四’,@age = 19.
输出
print @name
print @age

全局变量

系统内部定义好的,用户只能调用,不可修改
@@+字符名

DML

数据操作语言(Data Manipulation Language)
Manipulation 英[məˌnɪpjʊˈleɪʃən]
包括对数据库的增删改查

查询

使用关键字DISTINCT

如果用户希望在查询返回结果中删除重复行
select distinct 列名 from 表名称

TOP 关键字

用于规定返回的记录的数目
select top n *|column from table
top n 用于指定查询结果返回的行数

使用别名查询

使用select语句查询数据时,可使用别名的方法根据需要对数据显示的标题进行修改
1、在列的表达式中给出别名
select 列名 ‘别名’ from 表名
eg: select 学号 ‘no’ , 姓名 ‘name’, 性别 ‘sex’, 年级 ‘grade’ from 学生信息
2、使用‘=’表达式
select ‘别名’ = 列名 from 表名
eg: select ‘no’ = 学号,‘name’ = 姓名,‘sex’ = 性别 from 学生信息
3、使用AS关键字来连接列表达式和指定的别名
select 列名 as ‘别名’ from 表名
eg: select 学号 as ‘no’, 姓名 as ‘name’, 性别 as ‘sex’ from 表名

计算列

在进行数据查询时,经常需要对查询列的数据进行再次计算
eg:
select 编号,学号,‘调整前成绩’ = 成绩,‘调整后成绩’ = 成绩-10 from 成绩表

选择查询

关键字where , sql server 支持比较、范围、列表、字符串匹配等选择方法

1、比较搜索条件

符号 说明 符号 说明
= 等于 <> 不等于
> 大于 !> 不大于
< 小于 !< 不小于
>= 大于等于 != 不等于
<= 小于等于

2、逻辑运算符
and 两边条件同时满足
or 两边条件满足其一

3、范围搜索条件
范围搜索返回介于两个指定值之间的所有值,可分为包括范围和排他范围两种类型
用between , not between

4、列表搜索条件
IN 关键字,使用户可以选择与列表中的任意值匹配的行
例子:
select 学号,班级编号,姓名,性别,籍贯
from 学生信息
where 籍贯 in (‘beijing’,‘shenzhen’)

5、搜索条件中的字符匹配符
like 关键字搜索与指定模式匹配的字符串

字符 说明
% 替代零个或多个字符
_ 替代一个字符
[ ] 指定范围内单个字符,[ ] 中可以是单个字符[abcd],或者多个字符[a-f]
[^] abcd不在范围内的单个字符,单个 [ ^abcd],不在字符范围[ ^a-f ]

6、涉及空值的查询

  • 空值(null),在数据库中表示不确定的值
  • 判断取值为空的格式为: 列名 is null
  • 判断取值不为空的语句格式为:列名 is not null

7、聚合函数
对一组值执行计算,并返回单个值

函数名 作用
SUM([distinct] <列名>) 计算列值总和
AVG([distinct] <列名>) 计算列值平均值
max([distinct] <列名>) 求列中最大值
min([distinct] <列名>) 求列中最小值
count(*) 统计表中行的个数
count([distinct] <列名>) 统计本列列值个数

上述函数中除了count(*)外,其他函数在计算的过程中均忽略null值。
语法:select 聚合函数 from 表名

8、数据分组
group by 语句用于结合聚合函数,根据一个或多个列对结果集进行分组
使用技巧:
group by 后面的字段,要写在select 的后面第一位
eg:
查询每个年级的总人数和班级总数
select 年级,sum(人数) as ‘总人数’,count(班级编号) as ‘班级个数’
from 班级信息
group by 年级

eg:
查询每门课的最高分和最低分(表为成绩表)
select 课程编号 ,max(成绩) as ‘最高分’,
min (成绩) as ‘最低分’
from 成绩表
group by 课程编号

having通常与group by子句一起使用。相当于一个用于组的where子句,制定组的搜索条件。having子句包含聚合函数,但where不可以使用。
select 学号,sum(成绩)
group by 学号
having sum(成绩) <60

9、order by 排序

  • order by 语句用于对指定的结果集进行排序
  • order by 默认升序
  • 降序排序可以使用desc关键字
  • select * from 成绩表 order by 成绩 [desc]

10、where

  • where子句可以使用的条件
运算符 符号 说明
比较符 =、>、<、>=等 比较两个表达式
逻辑 and、or、not 组合两个表达式的运算结果或取反
范围 between、not between 搜索值是否在范围内
列表 in、not in 查询值是否属于列表之一
字符匹配符 like、not like 字符串是否匹配

语法
select select_list
[into new_table_name]
from table_list
[where search_conditions]
[group by group_by_list]
[having search_conditions]
[order by order_list [ASC | DESC]]

说明:
select 选择列表 into 新表名 from 表名
在查询的基础上创建新表

表连接

在实际查询应用中,用户所需要的数据并不全在一个表中,可能存在多个表中,这时就需要使用多表查询。

在数据库应用中,经常需要从多个相关的表中查询数据,这就是需要进行表连接

  1. 使用内部连接 (只有匹配到的才会有输出
    内部连接是比较常用的一种数据连接查询方式。
    内部连接有以下两种语法式:
    select select_list from 表名1,表名2
    where 表1.列 = 表2.列
    或者
    select select_list from 表1 [inner] join 表2
    on 表1.列 = 表2.列

多表查询

说明: 多表查询首先要在各个表之间建立连接。
技巧
用户在进行基本连接操作时,可以遵循以下基本原则:
select 子句列表中,每个目标列前都要加上基本表名称
from 子句应包括所有使用的基表
where 子句应定义一个连接
**多表查询步骤:**首先确定表,有几个表,再根据模板书写
1、多表查询
案例:查询学生的学号,姓名,性别,以及所在的班级名称和年级
ps:同一张表中的属性,从第二个列开始可以省写表名
涉及两个表:学生信息表和班级信息表

select 学生信息.姓名,学号,性别,班级信息.班级名称,年级
from 学生信息 inner join 班级信息
where 学生信息.班级编号 = 班级信息.班级编号
2、完全连接
说明:使用FULL OUTER JOIN 关键字对两个表进行连接。
这种连接方式返回二者中的所有行。当某行在一个表中设有匹配的值时,
则该表中有值,若没有值则显示为NULL.
案例
查询出每个班的所有情况
select 班级信息.班级名称,年级,人数,课程信息.班主任,课程名称,开课系列
from 班级信息 full outer join 课程信息 on 班级信息.班级编号 = 课程信息.班级编号

子查询

场景 : 给出了查询条件,但却没有具体内容,需要先查出来
使用 : 子查询中可以包含聚合函数
说明
子查询就是where子句的条件
子查询可以嵌套在select、insert、update、delete语句中
子查询的select查询总是使用圆括号括起来

子查询分为两种:
①嵌套子查询
一个查询中嵌套任意多个子查询,一个查询中可以包含另一个子查询
②相关子查询

嵌套查询案例
查询计算机系学生选修了哪些课程 (系在Student表,课程在sc表)
select *
from sc
where sno in
(select sno from student where sdept=‘计算机系’)
ps : where后要什么,子查询就查什么
例子:查询修了‘c02’课程且成绩高于此课程的平均成绩的学生的学号和成绩
select sc.sno,grade
from sc
where cno = ‘c02’ and grade > (select AVG(grade) from sc where cno = ‘c02’)

相关子查询(单值子查询)
这样的子查询只返回一个值,然后将一列值与查询返回的值进行比价
案例
查询和‘ff’在同一个班的学生信息
select 学生信息.xx,xxx,xxxx,
from 学生信心 as s, 班级信息 as c
where s.班级编号 = c.班级编号
and s.班级编号 in
(select 班级编号 from 学生信息 where 姓名=‘ff’)

写查询语句步骤

① 写出select语句框架
select
from
where
②确定有几张表,全部写入from后,用as写别名
③确定子查询
④子查询中遵循①②③
⑤确定要查的所有信息

在查询的基础上创建新表

使用select …INTO 语句可以在查询的基础上创建新表语法为:
select 选择列表
into 新表名
from 表名

插入

  1. 使用insert 和 values 插入行
    **语法形式 : **
    insert [into] table_name [column_list]
    values (data_values,…n)
  2. 使用insert 和 select 插入行
    说明
    在insert语句中使用select子句可以将一个或多个表或视图中的值添加到另一个表中。使用select子句还可以同时插入多行
    insert语句中使用select子句的语法形式为
    insert [into] table_name [column_list]
    select select_list from table_name
    [where]
    [and]
    例子:
    将“student”数据库的“成绩表”中成绩大于70并且课程编号是1003的数据插入到“新成绩表”中。
    insert into 新成绩表
    select * from student
    where 成绩>70
    and 课程编号=‘1003’

修改

语法

  1. update 表名 set 列名 = 表达式
    set子句指定要更改的列和这些列的新值

  2. 带where子句的update语句
    假设将成绩为“95”,并且在‘1002’到‘1003’之间课程编号的所有学生
    调动到学号是3的里面
    update 成绩表
    set 学号=‘3’
    where 课程编号 between ‘1002’ and ‘1003’
    and 成绩 = 95.

  3. 条件不统一,更改的值也不统一,考虑多个update
    eg:更新’课程编号’为1001的行时同时更新’'课程编号’为1002的行,
    这时需要用到多个update语句,为每个单独的条件编号写update语句
    update 成绩表
    set 成绩 = 89
    where 课程编号=1001
    update 成绩表
    set 成绩 = 88
    where 课程编号=1002

删除数据

  1. delete语句
    eg:从成绩表2中删除成绩大于90分的记录
    delete from 成绩表2 where grade > 90
    说明:delete 语句可删除表或视图中的一行或多行
    delete 语句的简化形式为:
    delete from 表名
    where 条件语句
    ② 删除所有行数据,不带where的delete语句
    ③ 删除固定行数据
    20% -> TOP(20) percent
    eg:在数据库中删除20%的学生信息
    delete top(20) percent from 学生信息
    删除前5行
    delete top(5) from 学生信息

视图

视图是基于查询结果的虚表
在SQL SERVER 2008中,可以创建标准视图、索引视图和分区视图

标准视图组合了一个或多个表中的数据,您可以获得使用视图的大多数好处,
包括将重点放在特定数据上及简化数据操作

索引视图是被具体化了的视图,即它已经过计算并存储。索引视图尤其适于聚合多行的查询。但它们不太适于经常更新的基本数据集。

分区视图在一台或多台服务器间水平连接一组成员表中的分区数据

视图的优点:

  1. 着重于特定的数据
  2. 简化数据操作
  3. 自定义数据
  4. 导出和导入数据
  5. 跨服务器组合分区数据

创建视图语法

可以使用create view 语句来创建视图,对应语法如下:
create view view_name
as select 语句
例子:创建stu数据库中的表‘班级信息’中所有记录的视图,view_班级信息
create view view_班级信息
as
select * from 班级信息

查看视图的内容和查看表是一样的
重命名视图也是一样的
eg:
①使用sp_rename 修改视图的名称
例子:
exec sp_rename ‘view_班级信息’,‘view_班级信息2’
②使用sp_rename修改视图中列的名称
例子:
exec sp_rename ‘view_班级信息人数’,‘总人数’

对于表的操作在视图中同样适用
!一旦视图中的数据做了更改,原表中的数据也会更改
即:视图对数据的修改,也会影响原表

  1. 修改视图
    alter view 视图名
    as select 语句
    – alter , 既可以修改视图中的数据,又能修改结构
  2. 修改视图中的数据
    视图中不符合要求的数据,用update进行修改
    例子:
    修改视图view_班级信息2中的人数80的班级编号为28
    update view_班级信息2
    set 班级编号 = 28
    where 人数=80
  3. 删除视图
    语法:drop view 视图名
    删除俩视图
    drop view 视图1,视图2
    带有条件删除
    delete from view_班级信息2
    where 人数 = 80

索引

概念

  1. 索引的定义
    Sql Server的索引是对数据库表中一个或多个列的值进行排序的结构。索引有助于更快的获取信息,是用来定位的。
    (索引类似于书签,有特定的空间和结构来维护索引)
    对表中的列是否创建索引,以及创建何种索引,对于查询的响应速度会有很大的差异。创建了索引的列几乎是立即响应,而不创建索引的列则需要较长的时间等待。
  2. 索引的作用
    在数据库系统中创建索引主要有以下作用:
    ①加快数据检索
    ②保证数据的一致性
    ③实现表与表之间的参照完整性(主键 -> 外键)
    ④在使用group by、order by 子句进行查询时,利用索引可以减少排序和分组的时间
  3. 索引是否必须
    ① 创建索引需要占用数据空间并花费一定的时间
    ② 建立索引会减慢数据修改速度
  4. 选择创建索引的数据列
    ① 定义主键和外键的列
    ② 在指定范围中快速或频繁查询的列
    ③ 链接中频繁使用的列
    ④ 需要按排序顺序快速或频繁检索的列
  5. 检索的类型
    ① 聚集检索:索引的顺序决定了表中行的存储顺序,唯一
    ② 非聚集索引:索引仅记录指向表中行的位置的指针,这些指针本身是有序的,通过这些指针可以在表中快速地定位数据。
  6. 设计索引
    ① 一个表中如果有大量的索引,会影响insert、update、和delete语句的性能
    ② 避免对经常更新的表进行过多的索引,并且索引应保持较窄
    ③ 使用多个索引可以提高更新少而数据量大的查询性能
    ④ 对小表进行索引可能不会产生优化效果
  7. 创建索引
    ① 当有主键约束或者唯一约束时,系统将自动的为建有这些约束的列创建聚集索引。
    ② 当删除主键约束或唯一约束时,这些列上创建的聚集索引也会自动删除
    ③ 若不指定索引类型,Sql server 将使用非聚集索引作为默认的索引类型。

了解
当在同一表中建立聚集索引和非聚集索引时,应先建立聚集索引。
若先建立非聚集索引,在建立聚集索引时,系统会自动将非聚集索引删除,然后再重新建立非聚集索引。
当现有的聚集索引被删除时,系统将自动重建现有的非聚集索引。

使用T-SQL创建索引

使用crate index 语句来创建索引,语法如下:
create [unique]
[clustered | nondustered] index index_name
on 表名 (column [,…n])
其中各参数的含义如下:
① unique
为表或视图创建唯一索引
②clustered
表示创建聚集索引,键值的逻辑顺序决定表中对应行的物理顺序。
③ nonclustered 创建非聚集索引
④ index_name 索引的名称
⑤ column 索引所基于的一列或多列
例子
1、 为student表中的sno列创建非聚集索引
create index ix_stu_sno on student (sno)
2、为student表的sno列创建唯一聚集索引
create unipue clustered index ix_stu_sno on student(sno)

利用T-SQL语句删除索引

可以通过drop index语句删除索引,语法如下:
drop index table_or_view_name.index_name
drop index 表名.索引名
eg:
drop index 员工信息表.index_单位部门
drop index 员工信息表.index_性别

数据越多,效果越明显

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