【数据库】SQL Server知识点总结
【数据库】SQL Server知识点总结
文章目录
1. 数据库系统概述
1.1数据库技术的产生、发展
数据处理的中心问题是数据管理,数据管理经历了人工管理、文件系统和数据库系统三个阶段。
各阶段有如下特点
- 人工管理阶段:(1)数据没有专门的存取设备 (2)数据没有专门的管理软件 (3)数据不共享 (4)数据不具有独立性。
- 文件系统阶段:(1)数据以文件形式长期保存 (2)由文件系统管理数据 (3)程序和数据间有一定的独立性 (4)文件的形式已经多样化 (5)数据具有一定的共享性。
- 数据库系统阶段:(1)结构化的数据及其联系的集合 (2)数据共享性高、冗余度低 (3)数据独立性高 (4)有统一的数据管理和控制功能 (4个控制功能:①数据的安全性控制 ②数据的完整性控制 ③并发控制 ④数据恢复)
1.2数据库系统的组成
数据库系统主要由数据库、数据库用户、计算机硬件系统和计算机软件系统等几部分组成
数据库 :是存储在计算机内、由组织的、可共享的数据和数据对象的集合。有集成性和共享性的特点。
数据库用户 :用户是指使用数据库的人,包括第一类用户(即最终用户)、第二类用户(即应用程序员)、第三类用户(即数据库管理员)。
软件系统 : 主要包括操作系统(OS)、数据库管理系统(DBMS)及应用开发工具和应用系统等。DBMS是数据库系统的核心软件。
硬件系统 : 指存储和运行数据库系统的硬件设备,包括CPU、内存、大容量的存储设备、输入输出设备和外部设备。
1.3数据库系统的内部体系结构
数据库系统内部的体系结构从逻辑上分为外模式、模式、内模式三级抽象模式结构和二级映像功能。
(1)模式:也称概念模式,是全体数据的逻辑结构的描述,一个数据库只有一个模式。
(2)外模式:也称子模式或用户模式,是部分数据逻辑结构的描述,外模式一般是模式的子集,一个数据库可以有多个外模式。
(3) 内模式 :也称存储模式或物理模式,是对数据库存储结构的描述,一个数据库只能有一个内模式。
DBMS在三级模式之间提供了二级映像功能,保证了数据库系统的数据独立性,即逻辑独立性和物理独立性
(1)外模式 / 模式映像:数据库的同一模式可以有任意多个外模式,对于每一个外模式,都存在一个外模式 / 模式映像,确定了数据的局部逻辑结构与全局逻辑结构的对应关系。外模式 / 模式映像保证了数据与程序间的逻辑独立性。
(2)模式 / 内模式映像:数据库中的模式和内模式都只有一个,所以模式 / 内模式映像是唯一的,确定了数据的全局逻辑结构和存储结构之间的关系。模式 / 内模式映像保证了数据的物理独立性。
1.4数据库系统的外部体系结构
- 单用户结构的数据库系统 2.主从式结构的数据库系统 3.分布式结构的数据库系统 4.客户机 / 服务器结构的数据库系统(C/S) 5.浏览器 / 服务器结构的数据库系统(B/S)
1.5数据模型
数据模型分为以下三类:
- 第一类是概念模型,是对现实世界的第一级抽象。
- 第二类是逻辑模型(或称数据模型),是对现实世界的第二级抽象,逻辑模型主要包括层次模型、网状模型、关系模型和面向对象模型等。
- 第三类模型是物理模型,是对数据的最底层抽象。
数据模型主要由数据结构、数据操作和数据的完整性约束三部分组成。
2.关系数据库
2.1关系模式
关系模式的表示R(U)或R(A1,A2,…An),R为关系名,U为属性名的集合;A1,A2,…An为各属性名
2.2关系的码与关系的完整性
候选码:能唯一标识关系中元组的一个属性或属性集,称为候选码或候选键。
主码:如果一个关系中有多个候选码,可以从中选择一个作为操作变量,被选用的候选码称为主码。
主属性与非主属性:主属性:包含在主码中的各个属性称为主属性。
非主属性:不包含在任何候选码中的属性称为非主属性。
外码(外部关系键):如果R2的一个或一组属性X不是R2的主码,而是另一个关系R1的主码,则该属性或属性组X称为R2的外码。并称R2为参照关系,R1为被参照关系。
2.3关系的完整性
- 实体完整性:实体完整性是指主码的值不能为空或部分为空。
- 参照完整性:如果R2的外码X与关系R1的主码相符,则X的每个值或者等于R1中主码的某一个值或者取空值。
- 用户自定义的完整性:用户自定义完整性是针对某一具体关系数据库的约束条件。
2.4关系代数
传统的集合运算:并(∪)、交(∩)、差(—)、广义笛卡儿积
专门的关系运算:选取、投影、连接、除法
3.关系数据库标准语言——SQL
SQL是结构化查询语言,是关系型数据库的标准语言,其功能包括数据查询(select)、数据定义(create、drop、alter)、数据操纵(insert、update、delete)和数据控制(grant、revoke)。
3.1SQL的基本概念
1.基本表:一个关系对应一个基本表。
2.视图:视图是从一个或多个基本表导出的表,是一个虚表。数据库只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。
SQL支持数据库的三级模式结构,外模式对应视图和部分基本表,模式对应基本表,内模式对应存储文件。
3.2数据库的创建和使用
创建一个数据库时,将至少产生两个文件:数据文件和事务日志文件。其中,数据文件又分为主数据文件,用来存储数据库的启动信息和部分或全部数据(扩展名为.mdf
)和次数据文件,用来存储主数据文件未存储的其他数据(扩展名为.ndf
)。事务日志文件,保存用于恢复数据库的日志信息(扩展名为.ldf
)。
3.2.1创建数据库
create database 数据库名称
on
(
name = 数据文件名,
filename = '路径+数据文件名',
size = 数据文件初始大小,
maxsize = 数据文件最大容量,
filegrowth = 数据文件自动增长容量
)
log on
(
name = 日志文件逻辑名称,
filename = '路径+日志文件名',
size = 日志文件初始大小,
maxsize = 日志文件最大容量,
filegrowth = 日志文件自动增长容量
)
例如:
create database Study
on
(
name = Study,
filename = 'D:\Study.mdf',
size = 5,
maxsize = 50,
filegrowth = 5
)
log on
(
name = Study_log,
filename = 'D:\Study_log.ldf',
size = 5,
maxsize = 50,
filegrowth = 5
)
注意:(1)如果只使用第一条语句“
create database 数据库名称
”,系统会按照默认属性创建数据库。 (2)
filegrowth
可以是具体的容量,也可以是unlimited,表示无增长容量限制。 (3)用()括起来的语句,除了最后一个命令外,其余的命令都要用逗号作为分隔符。
3.2.2修改数据库
//像数据库中添加数据文件
alter database 数据库名称
add file
(
name = 数据文件名,
filename = '路径+数据文件名',
size = 数据文件初始大小,
maxsize = 数据文件最大容量,
filegrowth = 数据文件自动增长容量
)
//向数据库中添加日志文件
alter database 数据库名称
add log file
(
name = 日志文件逻辑名称,
filename = '路径+日志文件名',
size = 日志文件初始大小,
maxsize = 日志文件最大容量,
filegrowth = 日志文件自动增长容量
)
//从数据库中删除逻辑文件,并删除物理文件
alter database 数据库名称
remove file 文件逻辑名称
//指定要修改的文件
alter database 数据库名称
modify file
(
name = 要修改的逻辑文件名,
修改的内容(如:filegrowth = 20)
)
3.2.3删除用户数据库
drop database 数据库名称
3.3数据表的创建和使用
3.3.1数据类型
常用的数据类型有整数型(bigint、int、smallint、tinyint、bit
),数值型(numeric、decimal、float、real
),货币型(money、smallmoney
),日期型(datetime、smalldatetime
),字符型(char、varchar、nchar、nvarchar、text、ntext
)等
3.3.2创建数据表
create table 表名(列名 数据类型)
例如:
create table Student
(
s_no char(6),
class_no char(6),
s_name varchar(10),
s_sex char(2) default '男',
s_birthday datetime
)
default为默认值,当该字段未输入数据时,以该默认值自动填入字段。
3.3.3定义数据表的约束
约束分为列约束和表约束,列约束是对某一个特定列的约束,包含在列定义中。表约束不包含在列约束中,通常用于对多个列一起进行约束。
完整性约束的基本语法格式为:
constraint 约束名 约束类型
,其中约束名可省略,系统会指定一个名称。
在SQL Server中可以定义5种完整性约束
- NULL/NOT NULL
create table Student
(
s_no char(6) constraint sno not null,
age int
)
也可省略名称,如下:
create table Student
(
s_no char(6) not null,
age int
)
有了NOT NULL约束,当s_no为空时,系统会给出错误提示。
- UNIQUE约束(唯一约束)
create table Student
(
s_no char(6) unique,
class_no char(6)
)
unique也可用于表约束,如下:
create table Student
(
s_no char(6),
class_no char(6),
sex char(2),
constraint s_uniq unique(s_no,sex)
)
unique约束用于指明基本表在某一列或多个列的组合上的取值必须唯一,唯一约束可以为NULL,但为了保证唯一性,只能有一个NULL值。
- PRIMARY KEY约束(主键约束)
create table Student
(
s_no char(6) primary key,
class_no char(6),
s_name varchar(10),
)
primary key也可用于表约束,如下:
create table Student
(
s_no char(6),
class_no char(6),
s_name varchar(10),
primary key(s_no,s_name)
)
primary key约束用于定义基本表的主键,起到唯一标识的作用,其值不能为NULL,也不能重复。
- FOREIGN KEY(外键约束)
//主表
create table S
(
class_no char(6) primary key
)
//从表
create table Student
(
s_no char(6),
class_no char(6) foreign key references S(class_no),
s_name varchar(10),
)
FOREIGN KEY约束指定某一列或几列作为外部键,其中包含外部键的表称为从表,包含外部键所引用的主键的表称为主表。
- CHECK约束
create table Student
(
sex char(2) check(sex = '男' or sex = '女') default '男',
age int check(age between 20 and 25)
)
CHECK约束用来检查字段值所允许的范围。
3.3.4修改数据表
(1)ADD方式:用于增加新列和完整性约束
//向Student中增加新列name和address
alter table Student
add
name char(6),
address char(20)
(2)ALTER方式:用于修改某些列
//将Student表中的name列加宽到10个字符
alter table Student
alter column
name char(10)
(3)DROP方式:用于删除完整性约束
alter table Student
drop constraint 约束名
3.3.5删除基本表
drop table 表名
3.4单表的数据查询
创建一个基本表,如下:
create table Student
(
s_no char(6) primary key,
class_no char(6) not null,
s_name varchar(10) not null,
s_sex char(2) check(s_sex = '男' or s_sex = '女'),
s_birthday datetime
)
s_no | class_no | s_name | s_sex | s_birthday99120 |
---|---|---|---|---|
991201 | js0001 | 徐辉 | 女 | 1978-08-01 00:00:00.000 |
991101 | js0002 | 王一山 | 男 | 1980-12-04 00:00:00.000 |
991104 | js0002 | 牛莉 | 女 | 1981-06-09 00:00:00.000 |
002101 | xx0001 | 李丽丽 | 女 | 1981-09-19 00:00:00.000 |
991102 | xx0001 | 李王 | 男 | 1980-09-23 00:00:00.000 |
3.4.1无条件查询
格式为:select 列名 from 表名
select s_no,class_no,s_name,s_sex,s_birthday
from Student
或
select *
from Student
用 * 表示Student表的全部列名,而不必逐一列出
select distinct s_no,class_no as c_s
from Student
distinct 会消去重复行;as可以为查询结果的列名重新命名
3.4.2条件查询
格式为:select 列名 from 表名 where 条件
以下是条件查询中常用的几种比较运算符
- 比较大小(包含=、>=、<=、<、>、<>、!=)
//查询出生日期在1980年以后的学生的学号
select s_no
from Student
where s_birthday > '1980-01-01'
//查询所有男同学,要求显示其学号s_no、姓名s_name、出生日期s_birthday
select s_no,s_name,s_birthday
from Student
where s_sex = '男'
- 多重条件(包含AND、OR、NOT)
//查询所有出生日期在“1980-01-01”前的女同学,要求显示其学号s_no、姓名s_name、性别s_sex
select s_no,s_name,s_sex
from Student
where s_birthday < '1980-01-01' and s_sex = '女'
- 确定范围(BETWEEN…AND)
//查询出生日期在1980-1-1和1982-1-1之间的学生的姓名和出生日期
select s_name,s_birthday
from Student
where s_birthday between '1980-1-1' and '1982-1-1'
- 确定集合(IN)
//查询班号为js0001和js0002的学生的姓名和班号
select s_name,class_no
from Student
where class_no in('js0001','js0002')
此语句也可用OR实现
select s_name,class_no
from Student
where class_no = 'js0001' or class_no = 'js0002'
- 字符匹配(LIKE)
//查询所有姓“李”的男同学,要求显示其学号s_no、姓名s_name、性别s_sex、出生日期s_birthday
select s_no,s_name,s_sex,s_birthday
from Student
where s_sex = '男' and s_name like '李%'
//查询所有姓名中含有“一”字的同学,要求显示其学号s_no、姓名s_name。
select s_no,s_name
from Student
where s_name like '%一%'
%代表0个或多个字符;_(下划线)代表一个字符
- 空值(IS NULL)
//查询出生日期为空的学生姓名
select s_name
from Student
where s_birthday is null
is null不能写成= null
3.4.3常用聚合函数
AVG(按列计算平均值)、SUM(按列计算值的总和)、MAX(求一列中的最大值)、MIN(求一列中的最小值)、COUNT(按列值统计个数)、COUNT(*)用来统计元组的个数,不消除重复行。
//查询有多少个班级
select count(distinct class_no) as classnum
from Student
distinct 表示消除重复行,as为查询的每一项内容取一个别名,否则查询结果中就不显示列名
3.4.4分组查询
GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。
HAVING子句和WHERE子句一样是条件筛选,不同的是,WHERE子句是作用于基本表或视图,选出满足条件的元组,而HAVING子句是作用于组,选择满足条件的组。其顺序是WHERE 、GROUP BY、HAVING。
select count(s_no) as s_num
from Student
group by class_no
having(count(s_no) >= 2)
3.4.5查询结果的排序
ORDER BY子句可以为查询结果排序,DESC为降序,ASC为升序,默认时为升序。
select s_no
from Student
order by s_no asc
3.5多表的连接查询
inner join(内连接):显示符合条件的记录。
left outer join(左外连接):显示符合条件的数据行以及左边表中不符合条件的数据行,此时右边数据行以NULL显示。
right outer join(右外连接):显示符合条件的数据行以及右边表中不符合条件的数据行,此时左边数据行以NULL显示。
full outer join(全外连接):显示符合条件的数据行以及左边表和右边表中不符合条件的数据行,此时缺乏数据的数据行会以NULL显示。
cross join(交叉查询):将一个表中的每一个记录和另一个表中的每个记录匹配成新的数据行。
创建一个数据表如下:
create table Choice
(
s_no char(6),
course_no char(5),
score numeric(6,1)
)
s_no | course_no | score |
---|---|---|
991104 | 01001 | 78.0 |
991201 | 01001 | 67.0 |
991101 | 01002 | 90.0 |
991102 | 01002 | 58.0 |
3.5.1内连接查询
//查询所有同学的选课及成绩情况,要求显示学生的学号s_no,姓名s_name,课程号course_no和课程的成绩score
//隐式内连接查询
select Student.s_no,s_name,course_no,score
from Student,Choice
where Student.s_no = Choice.s_no
//显示内连接查询
select Student.s_no,s_name,course_no,score
from Student inner join Choice
on Student.s_no = Choice.s_no
3.5.2外连接查询
外部链接分为左外部连接和右外部连接两种。以主表所在的方向区分外部链接,主表在左边,则为左外部连接;主表在右边,则为右外部连接。
//查询所有同学情况,要求显示学生的学号s_no,姓名s_name,成绩score
select Student.s_no,s_name,score
from Student left outer join Choice
on Student.s_no = Choice.s_no
3.5.3交叉查询
select *
from Student cross join Choice
3.6子查询
3.6.1普通子查询
先执行子查询,然后把子查询的结果作为父查询的查询条件的值。
(1)返回一个值的普通子查询
当子查询的返回值只有一个时,可以使用比较运算符(= 、>、<、!=、>=、<=)将父查询和子查询连接起来。
//查询和王一山是同一班级的同学的姓名(使用子查询)
select s_name
from Student
where class_no = (select class_no
from Student
where s_name = '王一山')
(2)返回一组值的普通子查询
当子查询的返回值不是一个值,而是一组值的时候,不能用比较运算符,而应使用ANY或ALL或IN。
//查询教授课程号为01001的教师姓名
select s_name
from Student
where s_no = any( select s_no
from Choice
where course_no = '01001')
= ANY等价与IN;NOT IN等价于<>ALL;>ALL等价于>MAX( );<ALL等价于<MIN( );>ANY登记于>MIN( );<ANY等价于<MAX( )。
3.6.2相关子查询
首先选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询,然后父查询根据子查询返回的结果判断此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中.
3.6.3其他类型查询
(1)集合运算查询(union)
(2)存储查询结果到表中(select…into)
3.7数据表中数据的操纵
3.7.1添加数据到数据表
insert into 表名(列名)
values(值)
3.7.2修改数据表中的数据
updata 表名
set 列名 = 表达式
where 条件
可用子查询选择要修改的行。
3,7,3删除数据
delete
from 表名
where 条件
可用子查询选择要修改的行。
算了,后面不想写了。。。
上一篇: SQL基础知识点总结
下一篇: wordpress文章内容调用