最近在学习数据库,发现做C/S架构,数据库不熟悉真的是硬伤。所以决定努力学习一下数据库,在这里记录一下学习笔记和心得,希望可以和大家一起交流一起进步。
数据库管理系统根据模型对数据进行存储和管理,主要模型有层次模型,网状模型和关系模型三种。
层次模型采用一对多的关系结构,采用关键词来访问其中每一层次的每一部分。它存取方便且速度快;结构清晰,容易理解。数据修改和数据库扩展容易实现;检索关键属性方便但结构不够灵活;同一属性数据需要存储多次,数据冗余大;不适用与拓扑空间数据的组织。
网状类型具有多对多类型的数据组织方式,能明确而方便的表示数据间复杂关系。数据冗余小。但是网状结构的复杂增加了用户查询和定位的困难;需要存储数据间联系的指针,是的数据量增大,数据的修改很不方便。
关系模型以记录或二维数据表的形式组织数据,以便于利用各种实体与属性之间的关系进行存储和变换,不分层也无指针,是建立空间数据和属性数据之间关系的一种非常有效的数据组织方法。结构灵活,概念单一,满足所有布尔逻辑运算和数学运算规则形成的查询要求。能搜索、组合和比较不同类型的数据;增加和删除数据非常方便,具有很高的数据独立性,更好的安全保密性。但数据库大时,查找满足特定关系的数据比较费时;而且无法表达空间关系。
SQL(Structured Query Language,结构化查询语言)适用于关系数据库查询的结构化语言。
SQL包括数据库定义语言(DDL)、数据库操纵机语言(DML)、数据库查询语言(DQL)和数据库控制语言(DCL)。
数据模型根据不用的应用层次分为三种模型:分别是概念数据模型,逻辑数据模型和物理数据数据模型。
Conceptual Data Model是面向数据库用户实现现实世界的模型,主要用来描述世界的概念化结构,它使数据库的设计人员在设计的初始阶段,摆脱计算机系统及DBMS(数据库管理系统)的具体技术问题。集中分析数据及数据之间的联系等,与集体的数据管理系统无关。概念数据数据模型必须换成逻辑数据模型才能在DBMS中实现。常用的模型为E-R模型,扩充的E-R模型、面向对象模型及谓词模型。
实体集合中的实体彼此是可以区别的。如果实体集中的属性或者最小属性组合的值能唯一标识其对应实体,则应该将该属性或者该属性组合称为码。码可能有多个,对于每一个实体集,可指定一个码为主码。
实体集A和实体集B之间存在着各种关系,通常把这些关系称为“联系”通常,将实体集及实体集联系的图表示为实体(Entity)-联系(Relationship)模型。
一对一联系
一对多联系
多对多联系
逻辑模型是用户从数据库中所看到的模型,是具体的DBMS所支持的数据模型。此模型纪要面向用户又要面向系统,主要用于数据库管理系统DBMS的实现。
对于1:1 的联系,既可单独对应一个关系模式,也可以不单独对应一个关系模式。
(1)联系单独对应一个关系模式。则由联系属性、参与联系的各实体集的主码属性构成关系模式,其主码可参与联系实体集的任一方主码。
(2)联系不单独对应一个关系模式,联系的属性及一方的主码加入另一方实体集对应的关系模式中。
对于(1:n)的联系,既可以单独对应一个关系模式,也可以不单独对应一个关系模式。
(1)联系单独对应的一个关系模式,则由联系的属性,参与联系的各个实体集的主码属性构成关系模式,n端的主码作为该关系模式的主码。
(2)联系不单独对应一个关系模式,则将联系的属性及1端的主码加入n端实体集对应的关系模式,主码仍为n端的主码。
对于(m:n)的联系,单独对应一个关系模式,该模式包括联系的属性,参与联系的各实体集的主码属性,该关系模式的主码由各实体集的主码属性共同组成。
物理模型是面向计算机物理表示的模型,描述了数据在存储介质上的组织结构。它不但与具体的DBMS有关,而且还与操作系统和硬件有关。每一种逻辑数据模型都有其对应的物理数据模型。
即开放式数据库互联,是微软推出的一种实现应用程序和关系型数据库之间通信的接口标准。符合该标准的数据库就可以通过SQL语句编写的程序对数据库进行操作,但是只针对关系型数据库。ODBC本质上是一组数据库访问API,由一组函数调用组成,核心是SQL语句。
ADO(ActiveX Data Object)是微软公司开发的基于COM的数据库应用程序接口,通过ADO连接数据库,可以灵活的操作数据库中的数据,使用ADO访问关系数据库有两种方式,一种是通过ODBC驱动程序,另一种是通过OLE DB Provider。后者有更高的访问效率。
ADO.NET数据模型由ADO发展而来,但它不只是对ADO的改进,而是用了一种全新的技术。主要体现在以下几个方面:
(1)ADO.NET采用的不是ActiveX技术,而是与.NET框架紧密结合的产物。
(2)ADO.NET包含对XML标准的完全支持,对于跨平台交换数据有重要意义。
(3)ADO.NET既能在与数据连接的环境下工作,又能在断开与数据源连接的条件下工作。如此便减少了连接过多对服务器数据库资源的占用。
JDBC是JavaSoft开发的。以Java语言编写的用于数据库连接和操作的类和接口,可以为多种关系型数据库提供统一的访问方式。
对于网络环境下数据库应用,由于用户装多,采用传统的JDBC数据库连接方式,系统资源开销过大成为大型企业级应用效率的瓶颈,采用数据库连接池技术对数据库进行管理,可以大大提升系统的效率和稳定性。
数据库引擎
SQL Server数据库引擎包括数据库引擎(用于存储、处理和保护数据安全的核心服务)、复制、全文搜索,用于管理关系数据和XML数据的工具以及Data Qualify Services(DQS)服务器。
Analysis Services
包括用于创建和管理联机分析处理以及数据挖掘应用程序的工具。
Reporting Services
用于创建、管理和部署表格报表、矩阵报表、图形报表以及自由格式报表的服务器和客户端组组件。还是一个可以用于开发报表应用程序的可拓展平台。
Master Data Services
是针对主数据管理的SQL Server解决方案。可以配置MDS来管理任何领域,MDS中可包括层次结构,各种界别的安全性、事务、数据版本和业务规格、以及可用于管理数据的Excel外接程序。
SQL Server Management Studio
用于访问,配置、管理和开发SQL Server组件的集成环境。它使各种技术水平的开发人员和管理员都可以使用SQL Server
SQL Server配置管理器
为SQL Server服务,服务器协议,客户端协议和客户端别名提供基本配置管理。
SQL Server Profiler
提供一个图形化用户界面,用于监视数据库引擎实例或Analysis Services实例。
数据库引擎优化顾问
数据库引擎优化顾问可以协助创建索引,索引视图和分区的最佳组合。
数据质量客户端
提供非常简单和直观的图形用户界面,用于连接到DQS 数据库并执行数据清理操作,它还允许用户集中监视在数据清理操作过程中的执行的各项活动。
在一台机器上安装一个或者多个SQL Server,其中一个城为数据库实例。一般安装的第一个SQL Server采用默认实例。通过实例名称来区分不同的SQL Server
表:存放数据和表示关系的主要形式,是主要的数据库对象
试图:一个或多个基本表中生成的引用表
索引:为了实现对表记录的快速查询,可对表的记录按某个字段或者它们的组合进行排序,这种排序称为逻辑排序。通过逻辑顺序搜索索引表达式的值,可以实现快速访问。
约束:用与保障数据的一致性和完整性。具有代表性的就是表的主键和外键。
存储过程:存储过程是一组为了完成特定功能的SQL语句集合。存储过程具有名称,可以接收参数,并输出参数。存储过程独立于表存在。
触发器:触发器基于一个表的操作,编写若干条T-SQL语句,当操作发生时,这些语句被执行,返回真或假,如果返回假,当前表的操作不被执行。
默认值:默认值是表在插入新纪录时,系统设置的字段初始值。
用户和角色:用户是值对数据库有操作的权限的使用者,;角色是一个用户组,给角色分配操作权限,该角色对应的用户组都有该操作权限。
规则:规则用来限制表字段的数据范围。
类型:用户根据需要在给定的系统类型上定义自己的数据类型。
函数:用户可以根据需要将若干个T-SQL语句或者系统函数进行组合实现特定功能定义成自己的函数。
命令格式:
CREATE DATABASE 数据库名称
[
ON
[PRIMARY]
[<数据文件选项>]
[<数据文件组选项>]
[LOG ON{<日志文件选项>...}]
[COLLATE 排序名]
····
]
<文件选项>={(NAME=逻辑文件名称, **//数据库名字**
FILENAME={'操作系统文件名'|'存储路径'} **操作系统在创建物理文件时使用的路径和路径名(使用已经存在路径,SQL SERVER不会自行创建不存在路径)**
[,SIZE=文件初始容量]**(对于主文件,若不能确定大小,则默认为model数据库文件大小,对于辅助数据文件,自动设置为3M)**
[,MAXSIZE={文件最大容量|UNLIMITED}]**指定文件最大容量,UNLIMITED关键字表示文件大小不受限制,但是增长受磁盘控件限制(当然,这句话是废话)。**
[,FILEGROWTH=文件增量[容量|%]]**有百分比和容量值两种方式。如10%则表示,在原来控件的大小的基础上每次增长10%,后者每次增加指定大小容量,如5M,而不管原来空间的大小。**
)
}
<文件组选项>=>{
FILEGROUP 文件组名 [DEFAULT]**DEFAULT指定命名文件组数据库中默认文件组**
<文件选项>**用于指定属于该文件组的文件的属性**
}
**另外,COLLATE排序名:指定数据库的默认排序规则。“排序名”既可以是Windows排序规则名称,也可以是数据库排序规则名称(默认)**
*创建一个数据库和一个日志文件*
CREATE DATABASE DBTEST ON
(
Name="Test1",
FILENAME="F:\Test1.mdf",
SIZE=5MB,
MAXSIZE=50MB,
FILEGROWTH=10%
)
LOG ON
(
NAME="Test1_log",
FILENAME="F:\Test1.ldf",
SIZE=2MB,
MAXSIZE=5MB,
FILEGROWTH=1MB
);
*创建2个数据文件和1个日志文件*
CREATE DATABASE DBTEST1 ON
PRIMARY
(
Name="Test2_data1",
FILENAME="F:\Test2_data1.mdf",//.mdf用于主数据文件
SIZE=20MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=10%
),
(
Name="Test2_data2",
FILENAME="F:\Test2_data2.ndf",//.ndf用于辅助库数据文件
SIZE=20MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=10%
)
LOG ON
(
NAME="Test2_log",
FILENAME="F:\Test2_log1.ldf",
SIZE=50MB,
MAXSIZE=100MB,
FILEGROWTH=10MB
);
*创建数据库:两个文件组*
CREATE DATABASE Tset3
ON
PRIMARY
(
NAME='test3_dat1',
FILENAME='F:\test3_dat1.mdf',
SIZE=20MB,
MAXSIZE=60MB,
FILEGROWTH=5MB
),
FILEGROUP test3Group1
(
NAME='test3_dat2',
FILENAME='F:\test3_dat2.mdf',
SIZE=20,
MAXSIZE=100,
FILEGROWTH=10%
)
使用ALTER DATABASE命令可对数据库进行修改,语法格式如下
ALTER DATABASE 数据库名
{ ADD FILE<文件选项>...[TO FILEGROUP 文件组名] 【*在文件组中增加数据文件*】
|ADD LOG FILE<文件选项>... 【*增加日志文件*】
|REMOVE 逻辑文件名 【*删除数据库文件*】
|MODIFY FILE<文件选项> 【*更改文件属性*】
|MODIFY NAME=新数据库名
|MODIFY FILEGROUP 文件组名
{
<文件组可更新选项>
|DEFAULT
|NAME=新文件组名
}【*更改文件组属性*】
|SET<属性选项>...[WITH<中止>]
|COLLATE 排序名
命令主题
(1)ADD FILE子句,向数据库添加数据文件,<文件属性>给出文件的属性。关键字TO FILEGROUP指出添加的数据文件所在的文件组名,如默认,则为主文件组。
(2)ADD LOG FILE:向数据库添加日志文件。<文件属性>给出日志文件属性。
(3)REMOVE FILE:从数据库删除数据文件,被删除的文件名由其参数"逻辑文件名"给出。
(4)ADD FILEGROUP:向数据库添加文件组,被添加的文件组由参数"文件组名"给出。
(5)REMOVE FILEGROUP:删除文件组,被删除的文件组名由参数"文件组名"给出。
(6)MODIFY NAME:更改数据库名。
(7)MODIFY FILEGROUP:用于修改文件组属性。
(8)MODIFY FILE:修改数据库文件属性。
(9)SET:设置数据库属性。
T-SQL
*修改数据库文件大小和增长方式
ALTER DATABASE DBTEST
MODIFY FILE
(
NAME='Test1',
MAXSIZE=100MB,
FILEGROWTH=5MB
)
*修改数据库DBTEST现有数据文件Test1的相关属性。
*为数据库DBTEST添加数据文件testbak。
ALTER DATABASE DBTEST
ADD FILE
(
NAME='test1bak',
FILENAME='F:\test1bak.ndf',
SIZE=10MB,
MAXSIZE=50MB,
FILEGROWTH=5%
)
*删除数据库文件test1bak
ALTER DATABASE DBTEST
REMOVE FILE test1bak
【注意:不能删除主日志文件】
*为数据库添加文件组
ALTER DATABASE DBTEST
ADD FILEGROUP fgroup
GO/**/
ALTER DATABASE DBTEST
ADD FILE
(
NAME='test1_data2',
FILENAME='F:\test1_data2.ndf',
SIZE=10MB
),
(
NAME='test1_data3',
FILENAME='F:\test1_data3.ndf',
SIZE=10MB
)
TO FILEGROUP fgroup
GO
【GO命令不是T-SQL语句,但他是SSMS代码编辑器识别的命令,他向SQL Serve实例发送当前的批T-SQL语句的信号。GO命令和T-SQL语句不能在同一行,否则会出现运行错误。】
ALTER DATABASE DBTEST
REMOVE FILE test1_data2
GO
ALTER DATABASE DBTEST
REMOVE FILE test1_data3
GO
ALTER DATABASE DBTEST
REMOVE FILEGROUP fgroup
GO
【被删除的文件组中的数据文件必须先删除,且不能删除主文件组】
DROP DATABASE 数据库名
(1)表结构:组成表各列的名称和数据类型
(2)记录:每个表中若干行数据
(3)字段:每个记录由若干个数据项组成,将构成记录的每个数据项称为字段。
(4)空值:空值(NULL)通常表示未知,不可用或将在以后添加的数据。
(5)关键字:若表中的记录的某一字段或字段组合能唯一标识记录。
【精度】指数值数据中所存储的十进制数据的总位数。
【小数位数】数值数据中小数点有点可以有的数字位数的最大值。
CREATE TABLE 表名
(
{<列定义>|<计算列定义>|<列集>}
[<表约束>][,....n]
)
[;]
<列定义>::=
列名<数据类型> //指定列名,列的数据类型
[NULL|NOT NULL] //指定是否为空
[
[CONSTRAINT 约束名]
DEFAULT 常量表达式//指定默认值
]
|[IDENTITY[(初值,增量)]//指定列为标识列
[ROWGUIDCOL]//指定列为全局表示符列
[<列约束>...] //指定列的约束
<数据类型>::=
类型名[(精度[,小数位]|max)]
【说明】
1.DEFAULT 常量表达式:为所在列指定默认值,默认值必须为常量值,标量函数或着NULL。DEFAULT定义可适用于除定义timestamp或带identity属性的列意外的任何列。
2.IDENTITY:指定该列为标识符列,为该列提供一个唯一的,递增的值。
3.ROWGUIDCOL:表示列是行的全局标识符列。该属性并不强制列中所存在值的唯一性,为不会插入表中的新行自动生成值。
4.<列约束>:列的完整性约束。
<计算列定义>
列名 AS 计算列表达式
[PERSISTED [NOT NULL]]
【注意:有些函数,如getdate()每次调用都输出不同的结果,不能用于计算表达式的定义。】
use DBTEST
GO
Create Table xsb1
(
学号 char(6) NOT NULL PRIMARY KEY,
姓名 char(8) NOT NULL,
性别 bit NULL DEFAULT 1,
出生时间 date NULL,
专业 char(12) NULL DEFAULT '计算机',
总学分 int NULL DEFAULT 0,
备注 varchar(500) NULL,
年龄 AS 2015-year(出生时间) PERSISTED
)
【临时表】:以上创建的表为持久表,如果由存放临时数据的需求,则需要创建临时表,临时表的生命周期比较短,当断开数据库的连接时,数据库会自动删除它。
在表名称前面添加“#”表示的创建的是本地临时表,只有创建者可以使用,“##”表示全局临时表,可供所有用户使用。
【命令结构】
【修改表结构】
ALTER TABLE 表名
{
ALTER COLUMN 列名称{,...}//修改列属性
|ADD //添加列
{
<列的定义>
[,...]<表约束>
}
|DROP//删除列
{
[CONSTRAINT] 约束名//删除约束
|COLUMN 列名
}[,...]
}
【注意】在删除一个列之前,必须先删除基于该列的所有索引和约束。
【修改列】
ALTER COLUMN 列名
{
类型名[(精度[,小数字位数])]
[COLLATE 排序名]
[NULL|NOT NULL]
········
}
T-SQL示例
--新增列
ALTER table xsb1 ADD 入学时间 date
GO
---将姓名长度从6修改为10
ALTER table xsb1 ALTER COLUMN 姓名 char(10)
GO
---将入学时间数据类型修改为smalldatetime
ALTER table xsb1 ALTER COLUMN 入学时间 smalldatetime
GO
---删除列
ALTER table xsb1 DROP column 入学时间,年龄
GO
DROP TABLE 表名[,…]
[;]
INSERT [TOP(表达式)[PERCENT]]
INTO 表名|视图名
[(列表)]
VALUES(DEFAULT|NULL|表达式···)//指定列值
|DEFAULT VALUES//强制每个新行包含每个列的默认值
|SELECT VALUES
|SELECT 命令
T-SQL
---插入单条数据
insert into xsb1 values('231301','王一平','1','1990-02-10','管理工程',null,50,null)
insert into xsb1 values('231302','王二平',DEFAULT,'1990-02-10','管理工程',50,null,null)
insert into xsb1(学号,姓名,出生时间,专业,总学分)values('191301','王琳','1990-02-10','管理工程',50)
---插入多条数据
insert into xsb1 values('231303','王三平',DEFAULT,'1990-02-10','管理工程',50,null,null),('231304','王四平',DEFAULT,'1990-02-10',default,50,null,null)
---向表中插入其它表中的数据【两张表结构相同】
INSERT INTO xsb2 SELECT * FROM sxb1 where 专业='软件工程'
测试数据SQL
insert into xsb values
('191301','斯塔克',DEFAULT,'1995-02-10','管理工程',50,null,null),
('191302','索尔',DEFAULT,'1996-02-10','管理工程',50,null,null),
('191303','索拉卡',0,'1994-10-06','管理工程',50,null,null),
('191304','韦鲁斯',DEFAULT,'1995-08-26','管理工程',50,null,null),
('191306','李元芳',DEFAULT,'1995-11-20','管理工程',50,null,null),
('191307','李世明',DEFAULT,'1995-01-10','管理工程',54,null,null),
('191308','盖伦',DEFAULT,'1996-02-10','管理工程',52,'班长',null),
('231309','张三丰',DEFAULT,'1997-02-10','管理工程',50,null,null)
GO
insert into kcb values
('101','计算机基础',1,80,5),
('102','程序设计语言',1,68,4),
('206','离散数学',1,68,4),
('208','数据结构',1,68,4),
('209','操作系统',1,68,4),
('210','计算机原理',1,85,5),
('212','数据库原理',1,68,4),
('301','计算机网络',1,51,3),
('302','软件工程',1,51,3)
GO
insert into cjb values
('191301','101',80),
('191301','102',78),
('191301','206',76),
('191302','102',78),
('191302','206',78),
('191303','101',62),
('191303','102',70),
('191303','206',81),
('191304','101',90),
('191304','102',84),
('191304','206',65),
('191306','101',65),
('191306','102',71)
GO
UPDATE [TOP(表达式)[PRECENT]]
{表名|视图名}
SET{列名=表达式,...}
[FROM<表源>...]
[WHERE<查找条件>|...]
...
T-SQL
UPDATE SET xsb1
SET 备注='测试备注',总学分=总学分+3
WHERE 学号='2631301'
---删除符合条件的记录
DELETE [TOP(表达式)[PRECENT]]
[FROM 表名|视图名|<表源>]
[WHERE <查找条件>|...]
---删除表所有记录
TRUNCATE TABLE 表名//删除指定表中所有数据
TRUNCATE和DELETE相比,前者的执行速度比较快,使用系统和事务日志资源少。TRUNCATE通过释放存储表数据所使用的数据页来删除数据,并且只在事务日志中记录页的释放。而DELETE则是记录行。
不能使用TRUNCATE删除外键约束引用的表,也不能删除参与了索引视图的表。
表记录删除之后不能恢复。
如果需要删除表记录的同时删除表结构,则需要使用DROP TABLE 表名的命令
SELECT <输出列>//指定查询结果输出列
[INTO 新表]//指定查询结果存入新表
[FROM {<表源>[,...]}]//指定查询源
[WHERE <条件>]//查询条件
[GROUP BY <分组条件>]//指定查询结果分组条件
[HAVING <分组统计条件>]//指定查询结果分组统计条件
[ORDER BY <排序顺序>]//指定查询结果排序顺序
使用as或=改变列名称,select 姓名=name等同于select 姓名 as name
替换查询结果中数据
CASE
WHEN 条件1 THEN 表达式1
WHEN 条件2 THEN 表达式2
.....
ELSE 表达式
END
T-SQL
SELECT 学号,姓名,等级=
CASE WHEN 总学分 IS NULL THEN '尚未选课'
WHEN 总学分<60 THEN '不及格'
WHEN 总学分>60 AND 总学分<90 THEN '良好'
WHEN 总学分>90 THEN '优秀'
END
FROM xsb1 WHERE 专业='计算机'
计算列值
SELECT 表达式 [,表达式]
T-SQL
SELECT 学号,姓名,出生时间,YEAR(GETDATE())-YEAR(出生时间) as 年龄 FROM xsb1
消除结果集中的重复行
SELECT DISTINCT|ALL 列名[,列名...]
T-SQL
SELECT DISTINCT 专业 FROM xsb1//当使用关键字ALL时,将保留结果集的所有行
限制结果集合返回行数
[TOP 表达式[PERCENT][WITH TIES]]
T-SQL
SELECT TOP 1 * FROM xsb1
聚合函数
BINARY_CHECKSUM:返回对表中的行或表达式列表计算的二进制校验值,用于检测表的行修改
CHECKSUM:返回在表的行上或在表达式上计算的校验值,用于生成哈希索引
CHECKSUM_AGG:返回组中值的校验值
COUNT_BIG:求组中的项数,返回bigint类型整数。
GROUPING:产生一个附加列
GROUPING_ID:为聚合列列表中的每一行创建一个值以标识聚合级别。
STDEV:返回给定表达式中所有值的统计标准偏差。
STDEVP:返回给定表达式中所有值的填充统计标准偏差。
VAR:返回给定表达式中所有值的统计方差。
VARP:返回给定表达式中所有值的填充的统计方差。
T-SQL
//统计学生人数和专业人数
SELECT COUNT(*) AS 学生总数,COUNT(DISTINCT 专业) AS 专业总数 FROM xsb1
模式匹配
表达式 [NOT]LIKE 模式串 [ESCAPE 转义符]
表达式:一般为字符串表达式,在查询语句中可以是列名。
模式串:可以使用通配符
转义符:应为有效的SQL SERVER字符,没有默认值,且必须为单个字符。当模式串中含有与通配符相同的字符时,应该用过该字符串前的转义符指明其为模式串的一个匹配字符。使用ESCAPE可指定转义符。
T-SQL
---查询xsb表中倒数第五个数字为9,且倒数第一个数字在1--5之间学生学号,姓名及专业
SELECT 学号,姓名,专业 FROM xsb1 WHERE 学号 LIKE '%9___[1-5]'
范围比较
关键字BETWEEN和IN
当查询的条件是某个值的范围时候,可以使用BETWEEN关键字
表达式 [NOT] BETWEEN 表达式1 AND 表达式2
T-SQL
---查询学生表中年龄不在1995年的所有人
SELECT * FROM xsb1 where 出生时间 NOT BETWEEN '1995-1-1' AND '1995-12-31'
或
SELECT * FROM xsb1 WHERE YEAR(出生时间)!=1995
使用IN关键字可指定一个值表,值表中列出所有可能的值,当与值表中的任何一个匹配时,及返回TRUE,否则返回FALSE
表达式 IN(表达式[,…])
T-SQL
---查询xsb1中专业是“管理工程”和“计算机”的同学。
SELECT * FROM xsb1 WHERE 专业 IN('管理工程','计算机')
或
SELECT * FROM xsb1 WHERE 专业=‘计算机’ OR 专业=’管理工程‘
空值比较
表达式 IS [NOT]NULL
T-SQL
---查询备注为空的同学
SELECT * FROM xsb1 WHERE 备注 IS NULL
子查询
在查询条件中,可以使用另一个查询结果作为条件的的一部分
指定查询对象:From子句
---查询选修了与学号为191302的同学所选修的全部课程的同学学号
select distinct 学号 from cjb as CJ1
where not exists (
select * from cjb as CJ2 where CJ2.学号='191302' and not exists
(
select * from cjb as CJ3 where CJ3.学号=CJ1.学号 and CJ3.课程号=CJ2.课程号
)
)
导出表
如要为列指定别名,则必须为所有列指定列名
连接谓词:<、<=、=、>、>=、!=、<>、!<、!>
(1)自然连接:它在目标列中去除相同的字段名
select xsb.*,cjb.课程号,cjb.成绩 From xsb,cjb where xsb.学号=cjb.学号
(2)多表连接
select xsb.学号,姓名,专业,成绩 from xsb,cjb,kcb where(专业='管理工程' and 成绩>=80)
(3)Cross Join:表示交叉连接,将两个表进行笛卡尔积运算
指定查询结果分组方法 GROUP BY
ROLLUP,CUBE,GROUPING SETS 使用
指定查询结果分组后筛选条件 HAVING
WHERE、GROUP BY与HAVING子句都被使用时看,要注意作用和执行顺序。WHERE用于筛选由FROM子句指定的数据对象记录。GROUP BY用于对WHERE的结果进行分组,HAVING用于对GROUP BY以后的分组数据进行分组。
EXCEPT和INTERSECT用于比较两个查询结果,返回非重复值
EXCEPT从EXCEPT关键字左边返回右边没有查询到的所有非重复值。INTERSECT返回INTERSECT关键字左右两个查询都返回的所有非重复值。