版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL结构化查询语言学习重点:1、SQL语言的特点2、区别DDL(CREATDROPALTER)
和
DML(INSERDELETEUPDAESELECT)3、索引(聚簇索引和非聚簇索引的定义及区别)——与UNIQUE(候选键)和PRIMARY(主键)约束的关系。2026年1月15日31、1974年由CHAMBERLIN和BOYCE提出,当时称为SEQUEL(STUCTUREDENGLISHQUERYLANGUAGE)2、IBM公司对其进行了修改,并用于其SYSTEMR关系数据库系统中;3、1981年IBM推出其商用关系关系数据库SQL/DS,并将其名字改为SQL,由于SQL语言功能强大,简洁易用,因此得到了广泛的使用;4、今天广泛应用于各种大型数据库,如SYBASE、INFORMIX、ORACLE、DB2、INGRES等,也用于各种小型数据库,如FOXPRO、ACCESS。4.1SQL的发展2026年1月15日4SQL的主要特点1、一体化(集DDL、DML、DCL为一体)2、两种使用方法,统一的语法结构(可独立使用,也可以为嵌入语言)3、高度非过程化(用户只需提出干什么,无需指出怎么干)4、语言简洁,易学易用2026年1月15日5数据定义(DDL)定义、删除、修改关系模式(基本表)定义、删除视图(View)定义、删除索引(Index)数据操纵(DML)数据查询数据增、删、改数据控制(DCL)用户访问权限的授予、收回SQL的功能SQL功能动词数据库查询SELECT数据定义CREAT,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE2026年1月15日6SQL数据定义当用SQL语句定义表时,需要为表中的每一个字段设置一个数据类型,用来指定字段所存放的数据是整数、字符串、货币或是其它类型的数据。SQLSERVER的数据类型有很多种,分为9类:2026年1月15日71.整数数据类型:依整数数值的范围大小,有BIT,INT,SMALLINT,TINYINT四种。2.精确数值类型:用来定义可带小数部分的数字,有NUMERIC和DECIMAL两种。二者相同,但建议使用DECIMAL。如:123.0、8000.563.近似浮点数值数据类型:当数值的位数太多时,可用此数据类型来取其近似值,用FLOAT和REAL两种。如:1.23E+104.日期时间数据类型:用来表示日期与时间,依时间范围与精确程度可分为DATETIME与SMALLDATETIME两种。如:1998-06-0815:30:002026年1月15日85.字符串数据类型:用来表示字符串的字段。包括:CHAR,VARCHAR,TEXT三种,如:“数据库”6.UNICODE字符串数据类型:UNICODE是双字节文字编码标准,包括NCHAR,NVARCHAR与NTEXT三种。与字符串数据类型相类似,但UNICODE的一个字符用2字节存储,而一般字符数据用一个字节存储。7.二进制数据类型:用来定义二进制码的数据。有:BINARY,VARBINARY,IMAGE
三种,通常用十六进制表示:如:OX5F3C2026年1月15日9
数据类型数据内容与范围占用的字节BIT0,1,NULL实际使用1BIT,但会占用1BYTE,若一个数据中有数个BIT字段,则可共占1个BYTE8.货币数据类型:用来定义与货币有关的数据,分为MONEY与SMALLMONEY两种,如:123.00009.标记数据类型:有UNIQUEIDENTIFIER
,TIMESTAMP两种,此数据类型通常系统自动产生,而不是用户输入的,TIMESTAMP记录数据更新的时间戳印,而UNIQUEIDENTIFIER用来识别每一笔数据的唯一性。2026年1月15日10INT-2^31到2^31-14BYTESSMALLINT-2^15至2^15-12BYTESTINYINT0至2551BYTESNUMERIC-10^38-1至10^38-11-9位数使用5BYTES10-19位数使用9BYTES20-28位数使用13BYTES29-38位数使用17BYTESDECIMAL-10^38-1至10^38-15-17BYTES因长度而异,与NUMERIC相同FLOAT-1.79E+306至1.79E+308,最多可表示53位数8BYTESREAL-3.40E+38到3.40E+38,最多可表示24位数4BYTES2026年1月15日11DATETIME1753/1/1至9999/12/318BYTESSMALLDATETIME1900/1/1至2079/6/64BYTESCHAR1-8000个字符1个字符占1B,尾端空白字符保留VARCHAR1-8000个字符1个字符占1B,尾端空白字符删除。TEXT2^31-1个字符1个字符占2B,最大可存储2GBNCHAR1-4000个字符1个字符占2B,尾端空白字符保留NVARCHAR1-4000个字符1个字符占2B,尾端空白字符删除2026年1月15日12NTEXT2^30-1个字符1个字符占2B,最大可存储2GBBINARY1-8000个字符在存储时,SQLSERVER会另外增加4B,尾端空白字符会保留VARBINARY1-8000个字符在存储时,SQLSERVER会另外增加4B,尾端空白字符会删除IMAGE2^31-1个字符最大可存储2GBMONEY-2^63-2^63-18BSMALLMONEY-2^31-2^31-14BTIMESTAMP16进制8BUNIQUEIDENTIFIER全局唯一标识符(GUID)可用NEWID()函数生成一个该种类型的字段值。4.2定义子语言DDL回答如下问题:
1.定义子语言的三个命令关键字?
2.数据库定义?
3.表定义?
5.索引定义?
4.视图定义?一.定义子语言的三个命令关键字说明:
(1)
Create
(2)
Drop
(3)
Alter
①
各个命令关键字后应紧跟所要定义的对象关键字,如数据库为DATABASE、表为TABLE、视图为VIEW、索引为INDEX。例如:CREATEDATABASE、DROPDATABASE、ALTERDATABASE等等。
②
SQLSERVER中可用此三命令的数据库对象有:DATABASE、TABLE、VIEW、INDEX、TRIGGER、PROCEDURE、RULE、DEFAULT、FUNCTION。
③
SQLSERVER中,有几个数据库对象没有ALTER命令,如:INDEX、RULE、DEFAULT没有ALTER。二.定义数据库1.数据库及日志
数据库:在中/大型数据库系统中,数据库是一个存储空间,用于存放数据库中的数据库对象,包括表、视图、索引、存储过程、触发器、与数据库安全性有关的控制机制以及其它对象等。
日志(Log):是数据库故障恢复的重要手段和方法。用于记录对数据库的各种操作及所涉及的相关数据,实际上也需要一个存储空间。为安全起见,一般与数据库分开存放。 CREATEDATABASE数据库名
[ON
[<filespec>[,...n]]
]
[LOGON{<filespec>[,...n]}]CreateDatabase命令语法:2.创建数据库(CREATEDATABASE)
<filespec>::= [PRIMARY]
([NAME=
逻辑名,]
FILENAME=
‘OS文件的路径及名字’
[,SIZE=
文件初始大小]
[,MAXSIZE={最大值|UNLIMITED}]
[,FILEGROWTH=
文件大小增量值])
[,...n]
CreateDatabaseStuData
OnPrimary
(Name=StuFile1,Filename=`c:\production\data\StuFile1.mdf',Size=10MB,MaxSize=1000MB,FileGrowth=10MB),(Name=StuFile2,Filename=`c:\production\data\StuFile2.ndf',Size=10MB,MaxSize=1000MB,FileGrowth=10%)
LogOn(Name=Stulog,Filename=`c:\production\data\Stulog.ldf',Size=10MB,MaxSize=1000MB,FileGrowth=10MB)
示例:
①主数据文件扩展名为.mdf;
说明:
②次数据文件扩展名为.ndf;
③日志文件扩展名均为.ldf。ALTERDATABASE数据库名
{ADDFILE<filespec>[,...n]|MODIFYFILE<filespec>
|REMOVEFILE逻辑文件名
|ADDLOGFILE<filespec>[,...n]
|MODIFYNAME=
新数据库名
}
<filespec>::=(NAME=
逻辑文件名
[,NEWNAME=
新逻辑文件名]
[,FILENAME=
‘OS文件的路径及名字’
]
[,SIZE=文件的初始大小]
[,MAXSIZE=最大的文件尺寸
[,FILEGROWTH=
文件大小增量])
3.修改数据库(ALTERDATABASE)AlterDatabase命令语法:2026年1月15日20示例:ALTERDATABASEStuDataADDFILE (Name=StuFile3, Filename='c:\stufiles.ndf', Size=10MB)ALTERDATABASEStuDataMODIFYFILE (Name=StuFile1, MaxSize=3000MB)2026年1月15日21从数据库中删除文件
USEmaster
GO
ALTERDATABASEStuData
REMOVEFILEStuFile2
GO
DROPDATABASE数据库名[,...n
]
①sp_helpdb[数据库名]4.删除数据库(DROPDATABASE)DropDatabase命令语法:5.MSSQLSERVER中与数据库有关的系统存储过程
②sp_renamedb数据库旧名,数据库新名三.定义表1.创建表(CREATETABLE)CreateTable命令语法:CREATETABLE<表名>(<列定义>[{,<列定义>|<表约束>}])<表名>是合法标识符,最多可有128个字符,如S,SC,C,不允许重名。<列定义>:<列名><数据类型>[DEFAULT][{<列约束>}]DEFAULT:若是某字段设置有默认值,当该字段未被输入数据时,则以该默认值自动填入该字段。2026年1月15日24下例显示pubs数据库中所创建的三个表(jobs、employee和publishers)的完整表定义,其中包含所有的约束定义。
CREATETABLEjobs(job_id smallintIDENTITY(1,1)
PRIMARYKEYCLUSTERED,job_desc varchar(50) NOTNULLDEFAULT'NewPosition-titlenotformalizedyet',min_lvl tinyint NOTNULLCHECK(min_lvl>=10),max_lvl tinyintNOT NULLCHECK(max_lvl<=250))2.修改表(ALTERTABLE)ALTERTABLEtable
{[ALTERCOLUMN列名{新数据类型[NULL|NOTNULL]}]
|ADD{[<列定义>]|
列名AS计算表达式}[,...]
|[WITHCHECK|WITHNOCHECK]ADD
{<表级约束>}[,...]
|DROP{[CONSTRAINT]约束名
|COLUMN列名}[,...]
|{CHECK|NOCHECK}CONSTRAINT{ALL|约束名[,...]}
|{ENABLE|DISABLE}TRIGGER{ALL|触发器名[,...n]}
}AlterTable命令语法:DROPTABLE表名3.删除表(DROPTABLE)DropTable命令语法:2026年1月15日26视图是虚表,其数据不存储,其记录来自基本表,只在数据库中存储其定义。视图在概念上与基本表等同,用户可以在视图上再定义视图,可以对视图进行查询.删除.更新等操作。四.定义视图2026年1月15日27使用视图的几个优点:1.利于数据保密,对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。例如,对教师表创建了计算机系视图,本系教师只能使用此视图,而无法访问其他系教师的数据。2.简化查询操作,为复杂的查询建立一个视图,用户不必键入复杂的查询语句,只需针对此视图做简单的查询即可。3.保证数据的逻辑独立性。对于视图的操作,比如查询,只依赖于视图的定义。当构成视图的基本表要修改时,只需修改视图定义中的子查询部分。而基于视图的查询不用改变。这就是第一章介绍过的外模式与模式之间的独立性,即数据的逻辑独立性1.创建/修改视图(CREATE/ALTERVIEW)CREATE/ALTERVIEW[[拥有者].|拥有者.]视图名[(视图列表)]ASSQL查询语句
[WITHCHECKOPTION]Create/AlterView命令语法:创建一个计算机系教师情况的视图SUB_T。CREATEVIEWSUB_TASSELECTTNO,TN,PROFFROMTWHEREDEPT='计算机'2026年1月15日29视图名字为SUB_T,省略了视图列表。视图由子查询中的三列TNO,TN,PROF组成。视图创建后,对视图SUB_T的数据的访问只限制在计算机系内,且只能访问TNO,TN,PROF三列的内容,从而达到了数据保密的目的。视图创建后,只在数据字典中存放视图的定义,而其中的子查询SELECT语句并不执行。只有当用户对视图进行操作时,才按照视图的定义将数据从基本表中取出。其中:2026年1月15日30创建一学生情况视图S_SC_C(包括学号、姓名、课程名及成绩)。
CREATEVIEWS_SC_C(SNO,SN,CN,SCORE)ASSELECTS.SNO,SN,CN,SCOREFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO此视图由三个表连接得到,在S表和SC表中均存在SNO列,则需指定视图列名。
2026年1月15日31创建一学生平均成绩视图S_AVGCREATEVIEWS_AVG(SNO,AVG)ASSELECTSNO,AVG(SCORE)FROMSCGROUPBYSNO此视图的列名之一AVG为库函数的计算结果,则在定义时需指明列名。2026年1月15日322.删除视图(DROPVIEW)DropView命令语法:DROPVIEW视图名视图删除后,只会删除该视图在数据字典中的定义,而与该视图有关的基本表中的数据不会受任何影响,由此视图导出的其他视图的定义不会删除,但已无任何意义。用户应该把这些视图删除。五.定义索引1.索引
概念:索引是关于数据位置信息的关键字表。
目的:1.加快查询速度;2.保证行的唯一性。
类型:聚簇(Clustered)索引、非聚簇(Nonclustered)索引和唯一索引。
聚簇索引:表中数据与索引存储在相邻物理空间,且表中行的物理顺序与索引顺序保持一致。每张表最多只能建一个聚簇索引。
索引建立原则:
(4)
优先建立主键列的索引。
(1)
为数据量大的表建立索引;
(2)
一张表所建索引个数应适量; (3)
掌握建立索引的时机;
唯一索引:被索引的列不能有相同值出现。CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEX<索引名>
ON<表名|视图名>(列名[ASC|DESC][,...
])UNIQUE表明建立唯一索引。CLUSTER表示建立聚集索引。次序用来指定索引值的排列顺序,可为ASC(升序)或DESC(降序),缺省值为ASC。2.创建索引(CREATEINDEX)CreateIndex命令语法:2026年1月15日353.删除索引(DROPINDEX)DropIndex命令语法:DROPINDEX索引名为表SC在SNO和CNO上建立唯一索引。USESTUDENTCREATEUNIQUEINDEXSCIONSC(SNO,CNO)执行此命令后,为SC表建立一个索引名为SCI的唯一索引,此索引为SNO和CNO两列的复合索引,即对SC表中的行先按SNO的递增顺序索引,对于相同的SNO,又按CNO的递增顺序索引。由于有UNIQUE的限制,所以该索引在(SNO,CNO)组合列的排序上具有唯一性,不存在重复值。4.3操纵子语言DML回答如下问题:
1.操纵子语言的四个命令关键字?
2.数据插入?
3.数据修改?
5.数据查询?
4.数据删除?一.操纵子语言的四个命令关键字说明:
①
以上四个命令,均是针对数据的操作。具体说来,其操纵的对象是:表以及满足条件的视图(如:基于一张表的视图等)。
(4)
Select
(1)
Insert
(2)
Update(3)
Delete
②
在定义了约束或限制的情况下,数据的“增删改”操作必须遵守相关的限制条件。二.数据插入(INSERT)1.数据插入命令基本语法INSERT[INTO]表名或视图名[(列名表)]<数据值>
说明:<数据值>的写法决定具体的插入方式。2.数据插入的两种方式 INSERT[INTO]表名或视图名[(列名表)]
VALUES(列值表)
(1)插入一行
2026年1月15日39INSERTINTOpubs..authors VALUES('888-88-8888','Tao','Hongcai','028888-8888','589DarwinLn.','Berkeley','CA','94609',1)INSERTINTOpubs..authors VALUES('111-11-111','','Hongcai','028888-8888','589DarwinLn.','Berkeley','CA','94600',1)2026年1月15日40(2)插入一行或多行
INSERT[INTO]表名或视图名[(列名表)]
SELECT子句CREATETABLEpublishers6
(pub_id char(4) primarykey,
pub_name varchar(40) NULL,
city varchar(20),
state char(2) ,
countryvarchar(30)default'USA',)
INSERTpublishers6
SELECT*FROMpubs..publishers
三.数据修改(UPDATE)1.数据修改命令的语法
SQL语言可以使用UPDATE语句对表中的一行或多行记录的某些列值进行修改,其语法格式为:UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>]…[WHERE<条件>]其中:<表名>是指要修改的表SET子句给出要修改的列及其修改后的值WHERE子句指定待修改的记录应当满足的条件,WHERE子句省略时,则修改表中的所有记录。2.数据修改示例 UPDATEpublishers6 SETcity='Atlanta',state='GA'
示例1:简单的更新 UPDATEpub..titlesSETprice=price*2
示例2:带WHERE子句的更新 UPDATEpubs..authors SETstate='PC',city='BayCity' WHEREstate='CA'ANDcity='Oakland'
示例3:带连接的更新 CREATETABLEs(ColAINT,ColBDECIMAL(10,3)) CREATETABLEt(ColAINTPRIMARYKEY,ColBDECIMAL(10,3)) INSERTINTOsVALUES(1,10.0) INSERTINTOsVALUES(2,20.0) INSERTINTOtVALUES(2,0.0) UPDATEt SETt.ColB=t.ColB+s.ColB FROMtINNERJOINsON(t.ColA=s.ColA)三.数据删除(DELETE)1.数据删除命令的语法使用DELETE语句可以删除表中的一行或多行记录,其语法格式为:DELETEFROM<表名>[WHERE<条件>]其中,<表名>是指要删除数据的表。WHERE子句指定待删除的记录应当满足的条件,WHERE子句省略时,则删除表中的所有记录。1删除一行记录例
删除刘伟教师的记录。DELETEFROMTWHERETN=’刘伟’2删除多行记录例
删除所有教师的授课记录DELETEFROMTC执行此语句后,TC表即为一个空表,但其定义仍存在数据字典中。2026年1月15日463利用子查询选择要删除的行例删除刘伟教师授课的记录。DELETEFROMTCWHERETNO=(SELECTTNOFROMTWHERETN=’刘伟’)四.数据查询(SELECT)1.查询命令语法 SELECT查询列表
[INTO新表名] FROM<源表> [WHERE条件表达式] [GROUPBY分组表达式] [HAVING组内数据条件表达式] [ORDERBY排序表达式[ASC|DESC]] [COMPUTE
{{AVG|COUNT|MAX|MIN|SUM}(表达式)}[,...n]
[BYexpression[,...n]
]
]
说明:查询主要由一些子句构成,如:SELECT子句、INTO子句(Clause)、FROM子句、WHERE子句、GROUPBY子句、HAVING子句、ORDERBY子句、COMPUTE子句等。2.SELECT子句 SELECT[ALL|DISTINCT]<select_list>说明:<select_list>::=
{
*
|{表名|视图名|表别名}.*
|{列名|表达式}[[AS]列别名]
|列别名=表达式
}
[,...n](1)ALL表示重复行可出现于结果中,DISTINCT则相反,ALL为缺省情况;
(2)
*表示FROM子句的表、视图中的所有列均出现于结果中,其顺序遵照表、视图中的顺序。
(3)
表达式中可用聚集函数。3.INTO子句
作用:创建一新表并将查询的结果数据插入其中。
说明:
语法:[INTO新表名](1)SELECT……INTO不能与COMPUTE一起使用;
(2)
可用SELECT……INTO创建一张与FROM子句中的表具有相同结构的、名字不同的新表。如果不需要数据,可令WHERE子句条件为永假即可。4.FROM子句
作用:指定在SELECT、DELETE及UPDATE语句中所用的表、视图及表连接等。
算术比较符:=、<、>、<=或!>、>=或!<、<>或!=
语法:同前面DELETE及UPDATE中的FROM语法。
逻辑比较符:AND、OR、NOT5.WHERE子句
作用:指定限定行的查询条件。
特殊运算符:IN、NOTIN、BETWEEN…AND…、LIKE、NOTLIKE、ISNULL、ISNOTNULL、SOME|ANY、ALL、EXISTS、NOTEXISTS。
②如希望%、_以常规字符出现,则应用[]将其括起或用转义符“$”,如:like“70$%”或like“70[%]”===>70%。(1)LIKE:①%(匹配任意一串字符)、_(匹配任意一个字符)、[](取其中任意单个字符)、^(非)。
③^应与[]联用,如:[^a-f]或[^abcdef]表示a-f这几个字母不能出现。(2)SOME|ANY:
语法:表达式{=|<>|!=|>|>=|!>|<|<=|!<}{SOME|ANY}(子查询)(3)ALL:
语法:表达式{=|<>|!=|>|>=|!>|<|<=|!<}ALL(子查询)
含意:检查子查询是否有行返回,有则TRUE,否则FALSE;如带NOT则相反。(4)[NOT]EXISTS:(5)[NOT]IN:
语法:[NOT]
EXISTS(子查询)
含意:检查测试表达式的值是否在子查询或列表中,是则TRUE,否则FALSE;如带NOT则相反。
语法:测试表达式[NOT]IN
(
子查询
|表达式[,...n]
)6.聚集函数
作用:用于对数据集合进行统计,如求:总和、平均值、最大值、最小值、行数。
COUNT(DISTINCT|ALL表达式)返回非空表达式值的行数
COUNT(*)返回结果的行数,含NULL行和重复行
MAX(DISTINCT|ALL表达式)非空表达式值的最大值
MIN(DISTINCT|ALL表达式)非空表达式值的最小值
SUM(DISTINCT|ALL表达式)非空表达式值的总和
AVG(DISTINCT|ALL表达式)非空表达式值的平均值
用法:一般用于SELECT子句、HAVING子句和ORDERBY子句中。
函数形式及功能:7.GROUPBY子句与HAVING子句GROUPBY子句作用:用于对查询的结果数据集合进行“分组”或“分组统计”,如对各个分组求:总和、平均值、最大值、最小值、行数。GROUPBY子句用法:一般与“聚集函数”联用。说明:HAVING子句作用:用于对分组数据集合的再筛选。HAVING子句用法:须与GROUPBY联用,不能单独使用。
(1)要求SELECT子句的列表中,除了使用聚集函数的列之外,其余各列都必须出现在GroupBy子句的列表中;
(2)注意WHERE、GROUPBY及HAVING三个子句的执行顺序及含意。WHERE用于对FROM子句结果设置过滤条件;GROUPBY用于对WHERE子句的结果分组;HAVING则对GROUPBY分组的结果再过滤。8.ORDERBY子句
作用:用于对结果集进行排序。
说明:ORDERBY中的列一般应在SELECT子句中。
语法:ORDERBY{排序表达式[ASC|DESC]}
[,...n]9.COMPUTE子句与COMPUTEBY子句
概念:COMPUTE用于对查询的结果数据集合最后进行“总计”,如果带有BY,则还可进行“小计”。COMPUTEBY可以与COMPUTE联用。
说明:COMPUTEBY应与ORDERBY联用,且COMPUTEBY后的表达式应与ORDERBY后的表达式(或其子集)内容与顺序一致。
示例:如有ORDERBYa,b,c则可用如下任一COMPUTEBY形式: COMPUTEBYa,b,c COMPUTEBYa,b COMPUTEBYa
10.嵌套子查询(NestedSub-Query)
概念:一个查询语句的查询结果作为另一个查询语句的条件,这样的SELECT语句为“子查询”,亦称“嵌套查询”。
SELECT<查询列表> [INTO<新表名>] FROM<基表名|视图名>[别名]…… WHERE<列名或列表达式><比较运算符>
(
SELECT<查询列> FROM<基表名|视图名>[别名]…… WHERE<条件表达式> [GROUPBY<分组内容>] [HAVING<组内条件>]
)
[GROUPBY<分组内容>] [HAVING<组内条件>] [ORDERBY<排序列名>[ASC|DESC]]说明:(1)子查询之中允许嵌套另一个子查询,但最多嵌套255层,并且总是从嵌套层次最深的一层开始执行,然后再执行它的直接上一层,直至完成整个查询。
(2)
子查询返回为单值时,可用“算术比较符”;返回多列或多行值,则用IN、ANY、ALL、EXISTS等运算符。
相关子查询:子查询与来自主查询(或称外查询)的列有关。意味着子查询是重复执行的,每一次处理外查询结果的一行。11.UNION查询
概念:将两个或多个查询的结果合并成一个结果返回。
语法:<SELECT语句>UNION[ALL]<SELECT语句>说明:(1)
用UNION合并的结果集应有相同的结构,即列数相同、对应列数据类型兼容。
(2)
最后结果的列名取与第一个SELECT语句返回的列名。
(3)
默认情况下,最后结果会去掉重复行;但如有ALL选项,则保留重复行。
(4)
一般,UNION个数不限,且按从左至右顺序执行。
(5)
当用UNION时,各个SELECT语句不能有ORDERBY和COMPUTE子句,而只能在最后一个SELECT语句后带一个ORDERBY和COMPUTE子句,它们是针对最后结果的。不过,各个SELECT语句可用GROUPBY和HAVING子句。2026年1月15日59例1
查询全体学生的学号、姓名和年龄。
SELECTSNO,SN,AGEFROMS例2
查询学生的全部信息。
SELECT*FROMS用‘*’表示S表的全部列名,而不必逐一列出。例3
查询选修了课程的学生号。
SELECT
DISTINCTSNOFROMSC查询结果中的重复行被去掉上述查询均为不使用WHERE子句的无条件查询,也称作投影查询。2026年1月15日60另外,利用投影查询可控制列名的顺序,并可通过指定别名改变查询结果的列标题的名字。例4
查询全体学生的姓名、学号和年龄。
SELECTSNAMENAME,SNO,AGEFROMS其中,NAME为SNAME的别名
2026年1月15日612条件查询当要在表中找出满足某些条件的行时,则需使用WHERE子句指定查询条件。WHERE子句中,条件通常通过三部分来描述:1.
列名;2.
比较运算符;3.
列名、常数。
运算符含义=,>,<,>=,<=,!=比较大小AND,ORBETWEENAND确定范围IN确定集合LIKE字符匹配ISNULL空值表3.8常用的比较运算符多重条件2026年1月15日621比较大小例5
查询选修课程号为‘C1’的学生的学号和成绩。SELECTSNO,SCOREFROMSCWHERECNO=’C1’例6查询成绩高于85分的学生的学号、课程号和成绩。SELECTSNO,CNO,SCOREFROMSCWHERESCORE>852026年1月15日632多重条件查询当WHERE子句需要指定一个以上的查询条件时,则需要使用逻辑运算符AND、OR和NOT将其连结成复合的逻辑表达式。其优先级由高到低为:NOT、AND、OR,用户可以使用括号改变优先级。例7查询选修C1或C2且分数大于等于85分学生的的学号、课程号和成绩。SELECTSNO,CNO,SCOREFROMSCWHERE(CNO=’C1’ORCNO=’C2’)ANDSCORE>=852026年1月15日643确定范围例8
查询工资在1000至1500之间的教师的教师号、姓名及职称。SELECTTNO,TN,PROFFROMTWHERESALBETWEEN1000AND1500等价于SELECTTNO,TN,PROFFROMTWHERESAL>=1000ANDSAL<=15002026年1月15日65例9
查询工资不在1000至1500之间的教师的教师号、姓名及职称。SELECTTNO,TN,PROFFROMTWHERESALNOTBETWEEN1000AND15002026年1月15日664确定集合
利用“IN”可以查询属性值属于指定集合的元组。
例10
查询选修C1或C2的学生的学号、课程号和成绩。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN(‘C1’,‘C2’)此语句也可以使用逻辑运算符“OR”实现。SELECTSNO,CNO,SCOREFROMSCWHERECNO=‘C1’ORCNO=‘C2’2026年1月15日67利用“NOTIN”可以查询指定集合外的元组。例3.31查询没有选修C1,也没有选修C2的学生的学号、课程号和成绩。SELECTSNO,CNO,SCOREFROMSCWHERECNONOTIN(‘C1’,‘C2’)等价于:SELECTSNO,CNO,SCOREFROMSCWHERECNO!=‘C1’ANDCNO!=‘C2’2026年1月15日685部分匹配查询上例均属于完全匹配查询,当不知道完全精确的値时,用户还可以使用LIKE或NOTLIKE进行部分匹配查询(也称模糊查询)。LIKE定义的一般格式为:
<属性名>LIKE<字符串常量>属性名必须为字符型,字符串常量的字符可以包含如下两个特殊符号:%:表示任意知长度的字符串;_:表示任意单个字符。例3.32查询所有姓张的教师的教师号和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘张%’2026年1月15日69例13查询姓名中第二个汉字是“力”的教师号和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘__力%’注:一个汉字占两个字符。6
空值查询某个字段没有值称之为具有空值(NULL)。通常没有为一个列输入值时,该列的值就是空值。空值不同于零和空格,它不占任何存储空间。例如,某些学生选课后没有参加考试,有选课记录,但没有考试成绩,考试成绩为空值,这与参加考试,成绩为零分的不同。
2026年1月15日70例14查询没有考试成绩的学生的学号和相应的课程号。SELECTSNO,CNOFROMSCWHERESCOREISNULL注意:这里的空值条件为ISNULL,不能写成SCORE=NULL。2026年1月15日712
常用库函数及统计汇总查询SQL提供了许多库函数,增强了基本检索能力。常用的库函数,如下表所示函数名称功能AVG按列计算平均值SUM按列计算值的总和MAX求一列中的最大值MIN求一列中的最小值COUNT按列值计个数2026年1月15日72例15求学号为S1学生的总分和平均分。SELECTSUM(SCORE)ASTotalScore,AVG(SCORE)ASAveScoreFROMSCWHERE(SNO='S1')注意:函数SUM和AVG只能对数值型字段进行计算。
2026年1月15日73例16求选修C1号课程的最高分、最低分及之间相差的分数SELECTMAX(SCORE)ASMaxScore,MIN(SCORE)ASMinScore,MAX(SCORE)-MIN(SCORE)ASDiffFROMSCWHERE(CNO='C1')例17求计算机系学生的总数SELECTCOUNT(SNO)FROMSWHEREDEPT='计算机'2026年1月15日74例18求学校中共有多少个系SELECTCOUNT(DISTINCTDEPT)ASDeptNumFROMS注意:加入关键字DISTINCT后表示消去重复行,可计算字段“DEPT“不同值的数目。COUNT函数对空值不计算,但对零进行计算。例19统计有成绩同学的人数SELECTCOUNT(SCORE)FROMSC上例中成绩为零的同学计算在内,没有成绩(即为空值)的不计算。2026年1月15日75例20利用特殊函数COUNT(*)求计算机系学生的总数SELECTCOUNT(*)FROMSWHEREDEPT=‘计算机’COUNT(*)用来统计元组的个数不消除重复行,不允许使用DISTINCT关键字。2026年1月15日763
分组查询GROUPBY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。例22查询各位教师的教师号及其任课的门数。SELECTTNO,COUNT(*)ASC_NUMFROMTCGROUPBYTNOGROUPBY子句按TNO的值分组,所有具有相同TNO的元组为一组,对每一组使用函数COUNT进行计算,统计出各位教师任课的门数。2026年1月15日77若在分组后还要按照一定的条件进行筛选,则需使用HAVING子句。例23
查询选修两门以上课程的学生学号和选课门数SELECTSNO,COUNT(*)ASSC_NUMFROMSCGROUPBYSNOHAVINGCOUNT(*)>=2GROUPBY子句按SNO的值分组,所有具有相同SNO的元组为一组,对每一组使用函数COUNT进行计算,统计出每位学生选课的门数。HAVING子句去掉不满足COUNT(*)>=2的组。2026年1月15日78当在一个SQL查询中同时使用WHERE子句,GROUPBY
子句和HAVING子句时,其顺序是WHERE-GROUPBY-HAVING。WHERE与HAVING子句的根本区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组;HAVING子句作用于组,选择满足条件的组,必须用于GROUPBY子句之后,但GROUPBY子句可没有HAVING子句。2026年1月15日795查询的排序当需要对查询结果排序时,应该使用ORDERBY子句ORDERBY子句必须出现在其他子句之后排序方式可以指定,DESC为降序,ASC为升序,缺省时为升序例24查询选修C1的学生学号和成绩,并按成绩降序排列。SELECTSNO,SCOREFROMSCWHERECNO='C1'ORDERBYSCOREDESC2026年1月15日80例25
查询选修C2、C3、C4或C5课程的学号、课程号和成绩,查询结果按学号升序排列,学号相同再按成绩降序排列。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN('C2','C3','C4','C5')ORDERBYSNO,SCOREDESC2026年1月15日81例26
求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出。SELECTSNO,SUM(SCORE)ASTotalScoreFROMSCWHERESCORE>=60GROUPBYSNOHAVINGCOUNT(*)>=3ORDERBYSUM(SCORE)DESC2026年1月15日82此语句为分组排序,执行过程如下:1.(FROM)取出整个SC2.(WHERE)筛选SCORE>=60的元组3.(GROUPBY)将选出的元组按SNO分组4.(HAVING)筛选选课三门以上的分组5.(SELECT)以剩下的组中提取学号和总成绩6.(ORDERBY)将选取结果排序ORDERBYSUM(SCORE)DESC可以改写成
ORDERBY2DESC
2代表查询结果的第二列。2026年1月15日836数据表连接及连接查询数据表之间的联系是通过表的字段值来体现的,这种字段称为连接字段。连接操作的目的就是通过加在连接字段的条件将多个表连接起来,以便从多个表中查询数据。前面的查询都是针对一个表进行的,当查询同时涉及两个以上的表时,称为连接查询。表的连接方法有两种:方法1:表之间满足一定的条件的行进行连接,此时FROM子句中指明进行连接的表名,WHERE子句指明连接的列名及其连接条件。方法2:利用关键字JOIN进行连接。2026年1月15日84具体分为以下几种:INNERJOIN
:显示符合条件的记录,此为默认值;LEFT(OUTER)JOIN:显示符合条件的数据行以及左边表中不符合条件的数据行,此时右边数据行会以NULL来显示,此称为左连接;RIGHT(OUTER)JOIN:显示符合条件的数据行以及右边表中不符合条件的数据行,此时左边数据行会以NULL来显示,此称为右连接;2026年1月15日85FULL(OUTER)JOIN:显示符合条件的数据行以及左边表和右边表中不符合条件的数据行,此时缺乏数据的数据行会以NULL来显示;CROSSJOIN:会将一个表的每一笔数据和另一表的每笔数据匹配成新的数据行。当将JOIN关键词放于FROM子句中时,应有关键词ON与之相对应,以表明连接的条件。2026年1月15日866.1等值连接与非等值连接例27
查询刘伟老师所讲授的课程。方法1:SELECTT.TNO,TN,CNOFROMT,TCWHERE(T.TNO=TC.TNO)AND(TN=‘刘伟’)这里,TN=‘刘伟’为查询条件,而T.TNO=TC.TNO为连接条件,TNO为连接字段。连接条件的一般格式为:
[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
其中,比较运算符主要有:=、>、<、>=、<=、!=。当比较运算符为“=“时,称为等值连接,其他情况为非等值连接。2026年1月15日87引用列名TNO时要加上表名前缀,是因为两个表中的列名相同,必须用表名前缀来确切说明所指列属于哪个表,以避免二义性。如果列名是唯一的,比如TN,就不必须加前缀。上面的操作是将T表中的TNO和TC表中的TNO相等的行连接,同时选取TN为“刘伟“的行,然后再在TN,CNO列上投影,这是连接、选取和投影的操作组合。方法2:SELECTT.TNO,TN,CNOFROMTINNERJOINTCONT.TNO=TC.TNOANDT.TN='刘伟'2026年1月15日88方法3:SELECTR2.TNO,R2.TN,R1.CNOFROM(SELECTTNO,CNOFROMTC)ASR1INNERJOIN
(SELECTTNO,TNFROMTWHERETN='刘伟')ASR2ONR1.TNO=R2.TNO2026年1月15日89例2查询所有选课学生的学号、姓名、选课名称及成绩。SELECTS.SNO,SN,CN,SCOREFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO本例涉及三个表,WHERE子句中有两个连接条件。当有两个以上的表进行连接时,称为多表连接。2026年1月15日906.2
自身连接当一个表与其自已进行连接操作时,称为表的自身连接。例29
查询所有比刘伟工资高的教师姓名、性别、工资和刘伟的工资。要查询的内容均在同一表T中,可以将表T分别取两个别名,一个是X,一个是Y。将X,Y中满足比刘伟工资高的行连接起来。这实际上是同一表T的自身连接。方法1:SELECTX.TN,X.SALASSAL_a,Y.SALASSAL_bFROMTASX,TASYWHEREX.SAL>Y.SALANDY.TN='刘伟'2026年1月15日91方法2:SELECTX.TN,X.SAL,Y.SALFROMTASXINNERJOINTASYONX.SAL>Y.SALANDY.TN='刘伟'方法3:SELECTR1.TN,R1.SAL,R2.SALFROM(SELECTTN,SALFROMT)ASR1INNERJOIN(SELECTSALFROMTWHERETN='刘伟')ASR2ONR1.SAL>R2.SAL2026年1月15日92例30检索所有学生姓名,年龄和选课名称。方法1:SELECTSN,AGE,CNFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO2026年1月15日936.3外连接在上面的连接操作中,不满足连接条件的元组不能作为查询结果输出。如例28的查询结果只包括有选课记录的学生,而不会有吴丽同学的信息。若将例28改成:例31
查询所有学生的学号、姓名、选课名称及成绩。(没有选课的同学的选课信息显示为空)则应写成如下的SQL语句。
SELECTS.SNO,SN,CN,SCOREFROMSLEFTOUTERJOINSCONS.SNO=SC.SNOLEFTOUTERJOINCONC.CNO=SC.CNO则查询结果只包括所有的学生,没有选课的吴丽同学的选课信息显示为空。2026年1月15日947子查询在WHERE子句中包含一个形如SELECT-FROM-WHERE的查询块,此查询块称为子查询或嵌套查询,包含子查询的语句称为父查询或外部查询。嵌套查询可以将一系列简单查询构成复杂查询,增强查询能力。子查询的嵌套层次最多可达到255层,以层层嵌套的方式构造查询充分体现了SQL“结构化”的特点。嵌套查询在执行时由里向外处理,每个子查询是在上一级外部查询处理之前完成,父查询要用到子查询的结果。2026年1月15日957.1
返回一个值的子查询当子查询的返回值只有一个时,可以使用比较运算符(=,>,<,>=,<=,!=)将父查询和子查询连接起来。例32
查询与刘伟教师职称相同的教师号、姓名。SELECTTNO,TNFROMTWHEREPROF=(SELECTPROFFROMTWHERETN='刘伟')此查询相当于分成两个查询块来执行。先执行子查询:SELECTPROFFROMTWHERETN=’刘伟’2026年1月15日96子查询向主查询只返回一个值,即刘伟教师的职称“讲师”,然后以此作为父查询的条件,相当于再执行父查询,查询所有职称为“讲师”的教师号、姓名。SELECTTNO,TNFROMTWHEREPROF=’讲师’2026年1月15日977.2返回一组值的子查询如果子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入ANY或ALL。其具体含义详见以下各例。1.使用ANY例33
查询讲授课程号为C5的教师姓名。SELECTTNFROMTWHERETNO=ANY(SELECTTNOFROMTCWHERECNO='C5')2026年1月15日98先执行子查询,找到讲授课程号为C5的教师号,为一组值构成的集合(T2,T3,T5);再执行父查询,其中ANY的含义为任意一个,查询教师号为T2、T3、T5的教师的姓名。
该例也可以使用前面所讲的连接操作来实现:SELECTTNFROMT,TCWHERET.TNO=TC.TNOANDTC.CNO='C5‘可见,对于同一查询可使用子查询和连接两种方法来解决,可根据习惯任意选用。
2026年1月15日99例34
查询其他系中比计算机系某一教师工资高的教师的姓名和工资。SELECTTN,SALFROMTWHERESAL>ANY(SELECTSALFROMTWHEREDEPT='计算机')ANDDEPT!='计算机' /*注意:此行是父查询中的条件*/先执行子查询,找到计算机系中所有教师的工资集合(1500,900);再执行父查询,查询所有不是计算机系且工资高于1500或900的教师姓名和工资。
2026年1月15日100此查询也可以写成:SELECTTN,SALFROMTWHERESAL>(SELECTMIN(SAL)FROMTWHEREDEPT='计算机')ANDDEPT!=‘计算机’先执行子查询,利用库函数MIN找到计算机系中所有教师的最低工资——900;再执行父查询,查询所有不是计算机系且工资高于900的教师。2026年1月15日1012.使用IN可以使用IN代替“=ANY”。例35(题目同33)SELECTTNFROMTWHERETNOIN(SELECTTNOFROMTCWHERECNO='C5')2026年1月15日1023.使用ALLALL的含义为全部。例36
查询其他系中比计算机系所有教师工资都高的教师的姓名和工资。SELECTTN,SALFROMTWHERESAL>ALL(SELECTSALFROMTWHEREDEPT='计算机')ANDDEPT!=‘计算机’子查询找到计算机系中所有教师的工资集合(1500,900);父查询找到所有不是计算机系且工资高于1500的教师姓名和工资。2026年1月15日103此查询也可以写成:SELECTTN,SALFROMTWHERESAL>(SELECTMAX(SAL)FROMTWHEREDEPT='计算机')
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园食品安全课件
- 校园防雷电知识课件
- 金溪交通安全培训课件
- 数值分析(25)-常微分方程初值问题的
- 金山区安全仓储知识培训课件
- 金属编织培训课件教案
- 金属检测门培训课件
- 静心宁神:中医音乐与失眠护理
- 2025 小学六年级数学下册圆柱侧面积的推导过程课件
- 2025 小学六年级数学上册百分数荒漠治理率统计课件
- T∕CACM 1086-2018 中医治未病技术操作规范 高血压保健按摩操
- 药务管理中的团队协作与发展试题及答案
- 马克思主义基本原理2023版课后题答案
- 2024-2025学年统编版语文七年级上册课内文言文全文详解及翻译
- 图说01 亚洲的位置和范围-【图说地理】2023-2024年七年级地理下册填图训练手册(人教版)(原卷版)
- 中小企业主的家庭财富管理方案
- 专题03 基本不等式(期末压轴专项训练20题)(原卷版)-25学年高一数学上学期期末考点大串讲(人教A版必修一)
- 档案管理基本知识课件
- 【MOOC】通信原理-北京交通大学 中国大学慕课MOOC答案
- 临床硬膜下血肿患者中医护理查房
- 科研设计及研究生论文撰写智慧树知到期末考试答案章节答案2024年浙江中医药大学
评论
0/150
提交评论