第3章 SQL的基础知识 数据库管理及应用 3.1 SQL简介 3.2 SQL的数据模型 3.3 标识符 3.4 使用SQL语句管理数据库 3.3 标识符 3.4 使用SQL语句管理数据库 3.5 使用SQL语句管理表 3.6 使用SQL语句维护数据 3.7 SQL简单查询语句
第3章 SQL的基础知识 3.1 SQL简介 SQL全称是“结构化查询语言(Structured Query Language)”,是1974年IBM提出的,经过不断完善发展,于1987年发展成为关系数据库的标准语言,被国际标准化组织采纳。 SQL 语言结构简洁,功能强大,简单易学,自从IBM 公司1981 年推出以来,SQL 语言得到了广泛的应用。Oracle,Sybase,Informix,SQL Server 大型的数据库管理系统,VisualFoxpro,PowerBuilder 微机上常用的数据库开发系统,都支持SQL 语言作为查询语言。
第3章 SQL的基础知识 SQL 语言主要由以下几部分组成: ① 数据定义语言DDL(Data Definition Language)。数据定义语言用于建立、修改、删除数据库中的各种对象——表、视图、索引等。如:CREATE、ALTER、DROP。 ② 数据操作语言DML(Data Manipulation Language)。数据操纵语言用于改变数据库数据。主要有三条语句:INSERT、UPDATE、DELETE。 ③ 数据控制语言 DCL(Data Control Language)。数据控制语言用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。包含两条命令:GRANT、REVOKE。 ④ 数据查询语言 DQL(Data Query Language)。数据查询语言用于检索数据库记录,基本结构是由 SELECT 子句、FROM 子句、WHERE 子句组成的查询块。
3.2 SQL 的数据类型 第3章 SQL的基础知识 3.2.1 整数数据型 所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。在 SQL Server 中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。 3.2.1 整数数据型
第3章 SQL的基础知识 3.2.2 精确浮点型
第3章 SQL的基础知识 3.2.3 近似浮点型 n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。
第3章 SQL的基础知识 3.2.4 日期时间型
第3章 SQL的基础知识 3.2.5 字符型
第3章 SQL的基础知识 3.2.6 货币型 货币类型的小数位数固定为4.
第3章 SQL的基础知识 3.2.7 Unicode 字符型
第3章 SQL的基础知识 3.2.8 二进制字符型
第3章 SQL的基础知识 3.2.9 特殊数据型
第3章 SQL的基础知识 3.3 标识符 3.3.1 标识符概述 数据库对象的名称即为标识符,在 SQL Server 中的所有内容都可以有标识符。服务器、数据库和数据库对象(例如表、视图、列、索引、触发器、过程、约束及规则等)都可以有标识符。使用标识符要注意以下几点: ① 标识符必须是统一码(Unicode)2.0 标准中规定的字符,以及其他一些语言字符,如汉字
第3章 SQL的基础知识 3.3.2 特殊标识符 ② 标识符不能有空格符或特殊字符_、#、@、$以外的字符。 ③ 标识符不允许是 Transact-SQL 的保留字。 ③ 标识符长度不得超过128 个字符。 3.3.2 特殊标识符
3.4 使用 SQL 语句管理数据库 第3章 SQL的基础知识 3.4.1 创建数据库 1. 创建数据库的最简语法 CREATE DATABASE database_name 数据库设置用系统默认值。 【例 3.1】 使用 SQL 语句创建学生成绩管理数据库(StudScore_DB1),所有参数均取默认值。 CREATE DATABASE StudScore_DB1
第3章 SQL的基础知识 2. 创建数据库的完整语法 CREATE DATABASE database_name [ ON [PRIMARY] [ <filespec> [,...n] ] [, <filegroupspec> [,...n] ] ] [ LOG ON { <filespec> [,...n]} ] <filespec> ::= ( [ NAME = logical_file_name, ]FILENAME = 'os_file_name'[, SIZE = size][, MAXSIZE = { max_size | UNLIMITED } ][, FILEGROWTH = growth_increment] ) [,...n] <filegroupspec> ::= FILEGROUP filegroup_name <filespec> [,...n] ON——用来存储数据库数据部分的磁盘文件(数据文件)。该关键字后跟以逗号分隔的 <filespec>项列表,<filespec>项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的<filegroup>项列表(可选),<filegroup>项用以定义用户文件组及其文件。 PRIMARY——指定关联的<filespec>列表定义主文件。一个数据库只能有一个主文件。如果没有指定PRIMARY,那么CREATE DATABASE 语句中列出的第一个文件将成为主文件。 LOG ON——用来存储数据库日志的磁盘文件(日志文件)。该关键字后跟以逗号分隔的 <filespec>项列表,<filespec>项用以定义日志文件。如果没有指定LOG ON,将自动创建一个日志文件,该文件使用系统生成的名称,大小为数据库中所有数据文件总大 小的 25%。 NAME——为由<filespec>定义的文件指定逻辑名称。 FILENAME——为<filespec>定义的文件指定操作系统文件名。 SIZE——指定<filespec>中定义的文件的大小。 MAXSIZE——指定<filespec>中定义的文件可以增长到的最大大小。 UNLIMITED——指定<filespec>中定义的文件将增长到磁盘变满为止。 FILEGROWTH——指定<filespec>中定义的文件的增长增量。
第3章 SQL的基础知识 【例 3.2】 创建一个学生成绩管理数据库(StudScore_DB2),该数据库的主文件逻辑名称为“StudScore_DB2_Data1”,物理文件名为“StudScore_DB2_Data1.mdf”,初始大小为10MB,最大尺寸为无限大,增长速度为 10%;数据库的日志文件逻辑名称为“StudScore_DB2_log1”,物理文件名为“StudScore_DB2_log1.ldf”,初始大小为 5 MB,最大尺寸为 25 MB,增长速度为1 MB。 CREATE DATABASE StudScore_DB2 ON (NAME = StudScore_DB2_Data1, FILENAME = ‘D:\ StudScore_DB2_Data1.mdf’, SIZE = 10, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) LOG ON ( NAME = ‘StudScore_DB2_log1’, FILENAME = ‘D:\StudScore_DB2_log1.ldf’, SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 1MB )
第3章 SQL的基础知识 3.4.2 修改数据库 ALTER DATABASE 命令的语法如下: ALTER DATABASE databasename { ADD FILE <filespec> [,...n] [TO FILEGROUP filegroup_name] | ADD LOG FILE <filespec> [,...n] | REMOVE FILE logical_file_name [WITH DELETE] | ADD FILEGROUP filegroup_name | REMOVE FILEGROUP filegroup_name | MODIFY FILE <filespec> | MODIFY NAME = new_dbname | MODIFY FILEGROUP filegroup_name } <filespec> ::= ( NAME = logical_file_name [ , NEWNAME = new_logical_name ] [ , FILENAME = 'os_file_name' ] [ , SIZE = size ] [ , MAXSIZE = { max_size | UNLIMITED } ] [ , FILEGROWTH = growth_increment ] )
【例 3.3】 修改学生成绩管理数据库(StudScore_DB2),添加 5 M 的次要数据文件。 第3章 SQL的基础知识 【例 3.3】 修改学生成绩管理数据库(StudScore_DB2),添加 5 M 的次要数据文件。 ALTER DATABASE StudScore_DB2 ADD FILE ( NAME = StudScore_DB2_Data2, FILENAME = ‘D:\ StudScore_DB2_Data2.ndf’, SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB )
第3章 SQL的基础知识 【例 3.4】 修改学生成绩管理数据库(StudScore_DB2),添加两个 5 MB 大小的日志文件。 ALTER DATABASE StudScore_DB2 ADD LOG FILE ( NAME = StudScore_DB2_log2, FILENAME = ‘D:\ StudScore_DB2_Log2.ldf’, SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB), ( NAME = StudScore_DB2_Log3, FILENAME = ‘D:\ StudScore_DB2_Log3.ldf’, FILEGROWTH = 5MB)
第3章 SQL的基础知识 3.4.3 删除数据库 在SQL Server 中可以用DROP DATABASE 命令一次删除一个或几个数据库,数据库所有者和数据库管理员DBA 才有权执行此命令,删除数据库语法如下: DROP DATABASE database_name [,...n] 【例 3.5】 删除学生成绩管理数据库(StudScore_DB2)。 DROP DATABASE StudScore_DB2
第3章 SQL的基础知识 3.5 使用 SQL 语句管理表 3.5.1 创建表 创建数据库后,需要创建数据表。使用 SQL 语句(CREATE TABLE)创建数据表语法简化形式如下: CREATE TABLE tablename ( column1 datatype [constraint], column2 datatype [constraint], … columnN datatype [constraint] ); 注意,在建立创建表时必须以英文半角字符输入,数据表名称、字段名称必须以字母开头,后面可以使用字母、数字或下划线,名称的长度不能超过 30 个字符。不要使用 SQL语言中的保留关键字,如 SELECT、CREATE、INSERT 等作为数据表或字段的名称。
第3章 SQL的基础知识 1. 创建带主键(PK)约束的数据表 在SQL Server 中使用主键保证实体完整性,被设为主键字段的列既不能重复也不能为空,每个表必须有一个主键,在CREATE TABLE 语句使用Pimary Key 语句设置主键字段。 Primary key 为主键约束,建立主键可以避免表中存在完全相同的记录,即数据表所有记录唯一且不能为空,主键用于保证实体完整性。Not Null 用来限制数据表中某一列的值不能为空。Unique 限制数据表某一列中不能存在两个值相同的记录,所有记录的值都必须是唯一的。 NULL 值:没有意义或丢失或不知道是否有意义的值。 DEFAULT 值:当数据表设计时某个字段设有默认值,在数据录入时,该字段若不输入,则以默认值来填充该字段。
第3章 SQL的基础知识 【例 3.6】 创建学生信息表(StudInfo) CREATE TABLE StudInfo ( StudNo varchar(15) primary key, StudName varchar(20) not null, StudSex Char(2) default '男' not null, StudBirthDay datetime null, ClassID varchar(10) not null )
第3章 SQL的基础知识 【例 3.7】 创建班级信息表(ClassInfo) CREATE TABLE ClassInfo ( ClassID Varchar(10) primary key, ClassName varchar(50) not null, ClassDesc varchar(100) null )
第3章 SQL的基础知识 2. 创建带外键(FK)关系的数据表 在SQL Server 中使用外键保证参照完整性 【例 3.8】 创建带外键关系的学生信息表(StudInfo)。 --DROP TABLE StudInfo --删除学生信息表(StudInfo) CREATE TABLE StudInfo ( StudNo varchar(15) primary key , StudName varchar(20)NOT NULL , StudSex char(2) NOT NULL , StudBirthDay datetime NULL , ClassID varchar(10) Constraint FK_ClassID Foreign key references ClassInfo(ClassID) NOT NULL --建立外键关系 )
第3章 SQL的基础知识 3. 创建带CHECK 约束的数据表 针对用户的需求,不同的字段有不同的取值范围(值域),SQL Server 使用CHECK 约束保存域的完整性。 【例 3.9】 创建带约束的学生成绩信息表 CREATE TABLE StudScoreInfo ( StudNo varchar(15), CourseID varchar(10), StudScore Numeric(4,1) default 0 Check(StudScore>=0 AND StudScore<=100),--使用Check 约束学生成绩在0 到100 之间取值 Constraint PK_S_C Primary Key (StudNo,CourseID)--建立复合主键 )
第3章 SQL的基础知识 4. 创建带标识列(IDENTITY)的数据表 语法: 参数: 功能: 在 SQL Server 中,对于每个表,均可创建一个包含系统生成的序号值的标识符列,该序号值以唯一方式标识表中的每一行。当在表中插入行时,标识符列可自动生成唯一的编号,如学生的报名序号、学生缴费编号等。通过使用IDENTITY 属性,指定标识列初值和增量以实现标识符列。 语法: IDENTITY [ ( seed , increment ) ] 参数: Seed:初值,装载到表中的第一个行所使用的值。 Increment:步长即增量值,该值被添加到前一个已装载的行的标识值上。 必须同时指定种子和增量,或者二者都不指定。如果二者都未指定,则取默认值 (1,1)。 功能: 在表中创建一个标识列。该属性与CREATE TABLE 及ALTER TABLE 语句一起使用。
第3章 SQL的基础知识 注意事项: 【例 3.10】 创建带标识列(IDENTITY)的学生报到信息表(StudEnrollInfo)。 ① 一个表只能有一个标识列,且该列必须是decimal、int、numeric、smallint、bigint 或tinyint 数据类型。 ② 可指定种子和增量。二者的默认值均为1。 ③ 标识符列不能允许为Null 值,也不能包含DEFAULT 定义或对象。 【例 3.10】 创建带标识列(IDENTITY)的学生报到信息表(StudEnrollInfo)。 CREATE TABLE StudEnrollInfo ( Seq_ID INT IDENTITY(100001,1), StudNo Varchar(15) Primary Key, StudName Varchar(30) not null )
第3章 SQL的基础知识 3.5.2 修改表 ALTER TABLE 命令可以添加或删除表的列、约束,也可以禁用或启用已存在的约束或触发器。 1. 添加新列 语法: ALTER TABLE table_name ADD COLUMN column_name datatype 参数: Table_name:要修改的数据表名。 Column_name:要添加的字段名。 Datatype:要添加的字段数据类型。 【例 3.11】 修改学生成绩信息表(StudScoreInfo)增加自动编号新列。 Alter Table StudScoreInfo Add Seq_ID int Identity(1001,1)
第3章 SQL的基础知识 2. 修改约束 语法: 功能: ALTER TABLE table_name DROP CONSTRAINT constraint_name 功能: 把主键的定义删除。 【例 3.12】 修改学生成绩信息表(StudScoreInfo)删除主键(PK_S_C)。 ALTER TABLE StudScoreInfo DROP CONSTRAINT PK_S_C
第3章 SQL的基础知识 语法: ALTER TABLE table_name ADD primary key (column_name) ALTER TABLE table_name ADD CONSTRAINT constraint_name primary key(column_name) 功能: 更改表的定义把某列设为主键。主键名称由系统生成或用户自定义。 【例 3.13】 修改学生成绩信息表(StudScoreInfo)将(StudNo、CourseID)设置为复合主键(PK_S_C)。 ALTER TABLE StudScoreInfo ADD Constraint PK_T_C primary key(StudNo,CourseID)
第3章 SQL的基础知识 3. 删除列 语法: ALTER TABLE table_name DROP COLUMN column_name 参数: Table_name:要删除的数据表名。 Column_name:要删除的字段名。 【例 3.14】 修改学生成绩信息表(StudScoreInfo)删除自动编号列。 ALTER TABLE StudScoreInfo DROP COLUMN Seq_ID
3.5.3 删除表 第3章 SQL的基础知识 语法: 功能: DROP TABLE table_name 删除数据表。 【例 3.15】 删除学生成绩信息表(StudScoreInfo)。 DROP TABLE StudScoreInfo
3.6 使用 SQL 语句维护数据 第3章 SQL的基础知识 3.6.1 数据插入 SQL 语言使用INSERT 语句为数据表添加记录。INSERT 语句通常有两种形式:一种是插入一条记录,另一种是一次插入多条记录,即使用子查询批量插入。INSERT 语句简化形式: INSERT [INTO] tablename [(column { ,column})] VALUES (columnvalue [{,columnvalue}]); 注意:插入的多个值与字段名具有一一对应关系。
第3章 SQL的基础知识 【例 3.16】 使用INSERT 语句为班级信息表(ClassInfo)添加新记录。 INSERT INTO ClassInfo (ClassID,ClassName,ClassDesc) VALUES (‘20000704’,’计算机2000’,’计算机怎样’) 【例 3.17】 使用INSERT 语句为班级信息表(ClassInfo)添加新记录。 (ClassName,ClassID) –问题:字段名顺序颠倒 (‘20000704’,’计算机2000’) 注意:因ClassDesc 字段允许为空,所以本例中没有添加班级描述值。 【例 3.18】 使用INSERT 语句为学生成绩信息表(StudScoreInfo)添加新记录。 INSERT INTO StudScoreInfo (StudNo,CourseID,StudScore) ('20000704001','A0101',80.5) 注意:在插入新记录时,如果字段为字符型、日期型,则插入的值需要加上单引号“’”作为定界符,如果为数据型,则不需要加上单引号“’”。
第3章 SQL的基础知识 3.6.2 数据更新 SQL 语言使用UPDATE 语句更新或修改满足规定条件的现有记录。UPDATE 语句的格式为: UPDATE tablename SET columnname = newvalue [, nextcolumn = newvalue2...] WHERE columnname OPERATOR value [and|or column OPERATOR value]; 【例 3.19】 更新班级编号为“20000704”的班级名称为“计科2000 级”、班级描述为空值。 UPDATE ClassInfo SET ClassName=’ 计科2000 级’,ClassDesc=NULL WHERE ClassID=’20000704’ 用UPDATE 语句时,关键一点就是要设定好用于进行判断的WHERE 条件从句。省略WHERE 条件,则执行全表更新。
第3章 SQL的基础知识 3.6.3 数据删除 SQL 语言使用DELETE 语句删除数据库表格中的行或记录。DELETE 语句的格式为: DELETE FROM tablename WHERE columnname OPERATOR value [AND|OR column OPERATOR value]; 【例 3.20】 删除班级编号为“20000704”的班级信息。 DELETE FROM ClassInfo WHERE ClassID=’20000704’ 注意:在WHERE 从句中设定删除记录的判断条件,在使用DELETE 语句时不设定WHERE 从句,则表格中的所有记录将全部被删除。
第3章 SQL的基础知识 3.6.4 TRUNCATE TABLE 命令 TRUNCATE TABLE 命令语法如下: TRUNCATE TABLE table_name 【例 3.21】 删除学生成绩表(StudScoreInfo)所有记录。 TRUNCATE TABLE StudScoreInfo 如果要删除表中的所有数据,使用TRUNCATE TABLE 命令比用DELETE 命令快得多,因为DELETE 命令除了删除数据外,还会对所删除的数据在事务处理日志中作记录,以防止删除失败时可以使用事务处理日志来恢复数据,而TRUNCATE TABLE 命令不会对事务处理日志进行数据删除记录操作。TRUNCATE TABLE 命令功能上相当于使用不带WHERE 子句的DELETE 命令,但是TRUNCATE TABLE 命令不能用于被别的表的外关键字依赖的表。
第3章 SQL的基础知识 3.6.5 记录操作语句简化形式 1. 添加新记录(INSERT) 2. 更新记录(UPDATE) INSERT [INTO] TableName(FieldsList) VALUES(ValuesList) 2. 更新记录(UPDATE) UPDATE TableName SET FieldName1=Value1,FieldName2=Value2,… WHERE <search_condition> 3. 删除记录(DELETE) DELETE [FROM] tablename
第3章 SQL的基础知识 3.7 SQL 简单查询语句 3.7.1 SELECT 查询语句结构 1. SELECT 语句精简结构 语法: 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_list:表示需要检索的字段的列表,字段名称之间使用逗号分隔。在这个列表中,还可以包含其他表达式,例如常量或Transact-SQL 函数。如果使用*来代替字段的列表,那么系统将返回数据表中的所有字段。 INTO new_table_name:该子句将指定使用检索出来的结果集创建一个新的数据表。New_table_name 为这个新数据表的名称。 FROM table_list:使用这个句子指定检索数据的数据表的列表。 GROUP BY group_by_list:GROUP BY 子句根据参数group_by_list 提供的字段将结果集分成组。 ORDER BY order_list [ASC | DESC]:ORDER BY 子句用来定义结果集中的记录排列的顺序。Order_list 将指定排序时需要依据的字段的列表,字段之间使用逗号分隔。ASC 和DESC 关键字分别指定记录是按升序还是按降序排序。 HAVING search_conditions : HAVING 子句是应用于结果集的附加筛选,search_conditions 将用来定义筛选条件。
第3章 SQL的基础知识 2. SELECT 语句的执行过程 ① 读取 FROM 子句中基本表、视图的数据。 ② 选取满足WHERE 子句中给出的条件表达式的元组。 ③ 按 GROUP 子句中指定列的值分组,同时提取满足 HAVING 子句中组条件表达式的那些组。 ④ 按 SELECT 子句中给出的列名或列表达式求值输出。 ⑤ ORDER 子句对输出的目标表进行排序,按附加说明 ASC 升序排列,或按 DESC 降序排列。
第3章 SQL的基础知识 3.7.2 SELECT 子句 SELECT 子句指定需要通过查询返回的表的列。 语法: SELECT [ ALL | DISTINCT ] [ TOP n [PERCENT] [ WITH TIES] ] <select_list> <select_list> ::= { * | { table_name | view_name | table_alias }.* | { column_name | expression | IDENTITYCOL | ROWGUIDCOL } [ [AS] column_alias ] | column_alias = expression } [,...n]
第3章 SQL的基础知识 1. 简单查询 【例 3.22】 查询学生信息表(StudInfo)所有记录。 SELECT StudNo,StudName,StudSex,StudBirthDay,ClassID FROM StudInfo 注意:可以使用符号*来选取表的全部列。 SELECT * FROM StudInfo 【例 3.23】 查询学生信息表(StudInfo)部分列记录。 SELECT StudNo,StudName,ClassID FROM StudInfo 【例 3.24】 在查询学生信息表(StudInfo)中使用连接列。 SELECT StudNo+StudName,StudName,StudSex, StudName, ClassID FROM StudInfo 【例 3.25】 在查询学生信息表(StudScoreInfo)中使用计算列。 SELECT StudNo,CourseID,StudScore+5,StudScore*0.8 FROM StudScoreInfo
第3章 SQL的基础知识 2. DISTINCT 使用DISTINCT 关键字去除重复的记录。如果DISTINCT 后有多个字段名,则是多个字段的组合不重复的记录。对于Null 值被认为是相同的值。 【例 3.26】 查询学生信息表(StudInfo)中不重复的性别记录。 SELECT DISTINCT StudSex FROM StudInfo 【例 3.27】 查询学生信息表(StudInfo)中姓名和性别不重复的记录。 SELECT DISTINCT StudName,StudSex FROM StudInfo
第3章 SQL的基础知识 3. TOP TOP n [PERCENT]:指定返回查询结果的前n 行数据,如果PERCENT 关键字指定的话,则返回查询结果的前百分之n 行数据。 WITH TIES:此选项只能在使用了ORDER BY 子句后才能使用,当指定此项时除了返回由TOP n PERCENT 指定的数据行外,还要返回与TOP n PERCENT 返回的最后一行记录中由ORDER BY 子句指定的列的列值相同的数据行。 【例 3.28】 查询学生信息表(StudInfo)中前10 条的记录。 SELECT TOP 10 * FROM StudInfo 【例 3.29】 查询学号为20050319001 成绩中最高的10 门成绩。 SELECT TOP 10 * FROM StudScoreInfo WHERE StudNo='20050319001' ORDER BY StudScore DESC 【例 3.30】 查询学号为20050319001 成绩中的20%条记录。 SELECT TOP 20 PERCENT * FROM StudScoreInfo WHERE StudNo='20050319001'
第3章 SQL的基础知识 4. 别名运算 前面示例查询结果的表头以英文字段名显示,SQL语言使用AS关键字进行别名运算(AS可省略,但空格不能省略),可灵活指定查询结果各字段显示的名称。 【例 3.31】 查询学生信息表(StudInfo)学号、姓名、班级编号信息,并以中文字段名显示。 SELECT StudNo As 学号,姓名=StudName,ClassID 班级编号 FROM StudInfo 【例 3.32】 为字符串连接取别名。 SELECT StudNo+StudName As 学号姓名,性别='学生性别:'+StudSex FROM StudInfo
第3章 SQL的基础知识 5. 使用 INTO 子句 INTO new_table_name 子句将查询的结果集创建一个新的数据表。参数new_table_name指定了新建的表的名称,新表的列由SELECT 子句中指定的列构成,且查询结果各列必须具有唯一的名称,新表中的数据行是由WHERE 子句指定的。但如果SELECT 子句中指定了计算列在新表中对应的列则不是计算列,而是一个实际存储在表中的列其中的数据,由执行SELECT...INTO 语句时计算得出。 【例 3.33】 将学生信息表(StudInfo)中查询的部分字段结果存储新表。 SELECT StudNo AS 学号,StudName 姓名,出生日期=StudBirthDay INTO StudInfoBack FROM StudInfo 【例 3.34】 选择学生信息表(StudInfo)前10 条记录插入新表中。 SELECT TOP 10 StudNo AS 学号,StudName 姓名,StudSex AS 性别 INTO ChineseStudInfo FROM StudInfo
第3章 SQL的基础知识 3.7.3 FROM 子句 FROM 子句主要用来指定检索数据的来源,指定数据来源的数据表和视图的列表,该列表中的数据表名和视图名之间使用逗号分隔。只要SELECT 子句中有要查询的列,就必须使用FROM 子句。 语法: [ FROM { < table_source > } [ ,...n ] ] 【例 3.35】 使用表别名查询学生信息表(StudInfo)记录。 SELECT StudInfo.StudNo,StudInfo.StudName FROM StudInfo SELECT S.StudNo,S.StudName FROM StudInfo AS S SELECT S.StudNo 学号,S.StudName AS 姓名,'班级编号'=ClassID FROM StudInfo S
第3章 SQL的基础知识 3.7.4 WHERE 子句 WHERE 子句指定用于限制返回的行的搜索条件。 语法: 功能: WHERE < search_condition > 功能: 通过使用谓词限制结果集内返回的行。对搜索条件中可以包含的谓词数量没有限制。 查询或限定条件可以是: 比较运算符(如=、<>、<和>)。 范围说明(BETWEEN 和NOT BETWEEN)。 可选值列表(IN、NOT IN)。 模式匹配(LIKE 和NOT LIKE)。 是否为空值(IS NULL 和IS NOT NULL)。 上述条件的逻辑组合(AND、OR、NOT)。
第3章 SQL的基础知识 1. 比较查询条件 比较查询条件由表达式的双方和比较运算符组成,系统将根据该查询条件的真假来决定某一条记录是否满足该查询条件,只有满足该查询条件的记录才会出现在最终结果集中。 注:text、ntext 和image 数据类型不可以与比较运算符组合成查询条件。
第3章 SQL的基础知识 【例 3.36】 查询成绩大于70 的学生成绩信息。 【例 3.37】 查询成绩90 以上的学生成绩信息。 SELECT * FROM StudScoreInfo WHERE StudScore>70 【例 3.37】 查询成绩90 以上的学生成绩信息。 SELECT * FROM StudScoreInfo WHERE StudScore>=90 【例 3.38】 查询学号为“20050319001”的学生信息。 SELECT * FROM StudInfo WHERE StudNo='20050319001' 【例 3.39】 查询学号大于“20050319001”的学生信息。 SELECT * FROM StudInfo WHERE StudNo>'20050319001' 【例 3.40】 查询1985 年1 月1 日以后出生的学生信息。 SELECT * FROM StudInfo WHERE StudBirthDay>='1985/01/01' 【例 3.41】 查询性别不为“男”的学生信息。 SELECT * FROM StudInfo WHERE StudSex<>'男'
第3章 SQL的基础知识 2. 逻辑运算符 (1)逻辑与(AND) (2)逻辑或(OR) 连接两个布尔型表达式并当两个表达式都为TRUE 时返回TRUE。当语句中有多个逻辑运算符时,AND 运算符将首先计算。可以通过使用括号更改计算次序。 【例 3.42】 查询学生成绩60 到70 之间的所有记录。 SELECT * FROM StudScoreInfo WHERE StudScore>=60 AND StudScore<=70 (2)逻辑或(OR) 将两个条件结合起来。当在一个语句中使用多个逻辑运算符时,在 AND 运算符之后求OR 运算符的值。但是,通过使用括号可以更改求值的顺序。 【例 3.43】 查询学号为20050319002 或99070405 的学生信息。 SELECT * FROM StudInfo WHERE StudNo='20050319002' OR StudNo='99070405'
第3章 SQL的基础知识 (3)逻辑非(NOT) 用于反转查询条件的结果,即对指定的条件取反。 【例 3.44】 查询性别为“女”的学生信息。 SELECT * FROM StudInfo WHERE NOT StudSex='男' 注意:括号优先,逻辑运算符的优先级为NOT>AND>OR。 【例 3.45】 查询学号为20050319001,成绩80 分以上的所有成绩记录。 SELECT * FROM StudScoreInfo WHERE StudNo='20050319001' AND StudScore>=80 【例 3.46】 查询学号为20050319001,成绩在90 到100 之间的学生成绩记录。 WHERE StudNo='20050319001' AND StudScore>=90 AND StudScore<=100 【例 3.47】 使用NOT 和AND 运算符查询学生成绩在80 到90 之间的所有记录。 WHERE NOT StudScore < 80 AND StudScore<=90 【例 3.48】 使用NOT 和OR 运算符查询学生成绩表的所有记录。 WHERE NOT StudScore>80 OR StudScore<=90 【例 3.49】 括号优先,查询结果为空集。 WHERE NOT (StudScore>80 OR StudScore<=90)
第3章 SQL的基础知识 3. 范围查询条件 内含范围条件(BETWEEN…AND…):要求返回记录某个字段的值在两个指定值范围内,同时包括这两个指定的值。 排除范围条件(NOT BETWEEN…AND…):要求返回记录某个字段的值在两个指定值范围以外,并不包括这两个指定的值。 【例 3.50】 查询学生成绩在 70 到 80 之间的学生成绩记录。 方法 1:使用BETWEEN…AND… SELECT * FROM StudScoreInfo WHERE StudScore BETWEEN 70 AND 80 方法 2:使用逻辑运算符AND WHERE StudScore>=70 AND StudScore<=80
第3章 SQL的基础知识 【例 3.51】 查询学生成绩不在70 到80 之间的学生成绩记录。 方法1:使用NOT BETWEEN…AND… SELECT * FROM StudScoreInfo WHERE StudScore NOT BETWEEN 70 AND 80 方法 2:使用逻辑运算符OR WHERE StudScore<70 OR StudScore>80 【例 3.52】 查询学号为20050319001,成绩在[90,100]之间的所有记录。 方法 1:使用BETWEEN…AND… WHERE StudNo='20050319001' AND StudScore BETWEEN 90 AND 100 方法 2:使用逻辑运算符AND WHERE StudScore>=90 AND StudScore<=100 AND StudNo= '20050319001'
第3章 SQL的基础知识 【例 3.53】 查询学生成绩在[60,70]或者成绩在[80,90]的记录。 方法 1:使用BETWEEN…AND…和逻辑运算符OR SELECT * FROM StudScoreInfo WHERE StudScore BETWEEN 60 AND 70 OR StudScore BETWEEN 80 AND 90 方法 2:使用逻辑运算符AND 和OR WHERE StudScore>=60 AND StudScore<=70 OR StudScore>=80 AND StudScore<=90
第3章 SQL的基础知识 4. 列表查询条件 包含列表查询条件的查询将返回所有与列表中的任意一个值匹配的记录,通常使用 IN关键字来指定列表查询条件。 IN 关键字的格式为: IN(列表值1,列表值2,…) 列表中的项目之间必须使用逗号分隔,并且括在括号中。
第3章 SQL的基础知识 【例 3.54】 查询学号为20050319001 或学号为99070405 的学生基本信息。 方法 1:使用IN 关键字 SELECT * FROM StudInfo WHERE StudNo IN(‘20050319001’,’99070405’) 方法 2:使用逻辑运算符OR WHERE StudNo='20050319001' OR StudNo='99070405' 【例 3.55】 查询学号不为20050319001 和99070405 的学生基本信息。 WHERE StudNo NOT IN ('20050319001','99070405')
第3章 SQL的基础知识 5. 模式查询条件 模式查询条件常用来返回符合某种格式的所有记录,通常使用LIKE 或NOT LIKE 关键字来指定模式查询条件。 LIKE 关键字使用通配符来表示字符串需要匹配的模式
第3章 SQL的基础知识 【例 3.56】 查询姓名以“胡”字开头的学生基本信息。 【例 3.57】 查询姓名中包含“文”字的学生基本信息。 SELECT * FROM StudInfo WHERE StudName LIKE '胡%‘ 【例 3.57】 查询姓名中包含“文”字的学生基本信息。 SELECT * FROM StudInfo WHERE StudName LIKE '%文%' 【例 3.58】 查询姓名第二个字为“丽”字的学生基本信息。 SELECT * FROM StudInfo WHERE StudName LIKE ‘_丽%’
第3章 SQL的基础知识 6. 空值判断查询条件 空值判断查询条件常用来查询某一字段值为空值的记录,可以使用IS NULL 或IS NOT NULL 关键字来指定这种查询条件。 注:NULL 值表示字段的数据值未知或不可用,它并不表示零(数字值或二进制值)、零长度的字符串或空白(字符值)。 【例 3.59】 查询班级描述为空的班级信息。 SELECT * FROM ClassInfo WHERE ClassDesc IS NULL 【例 3.60】 查询班级描述不为空的班级信息。 WHERE ClassDesc IS NOT NULL
第3章 SQL的基础知识 3.7.5 GROUP BY 子句 按指定的条件进行分类汇总,并且如果SELECT 子句<SELECT list>中包含聚合函数,则计算每组的汇总值。 语法: [GROUP BY [ ALL ] group_by_expression [ ,...n ]] 参数: ALL:包含所有组和结果集,如果访问远程表的查询中有WHERE 子句,则不支持GROUP BY ALL 操作。 group_by_expression:是对其执行分组的表达式,group_by_expression 也称为分组列。 在选择列表内定义的列的别名不能用于指定分组列。注意:在使用GROUP BY 子句,只有聚合函数和GROUP BY 分组的字段才能出现在SELECT 子句中。
第3章 SQL的基础知识 1. 聚合函数 聚合函数(例如SUM、AVG、COUNT、COUNT(*)、MAX 和MIN)在查询结果集中生成汇总值。聚合函数(除COUNT(*)以外)处理单个列中全部所选的值以生成一个结果值。聚合函数可以应用于表中的所有行、WHERE 子句指定的表的子集或表中一组或多组行。应用聚合函数后,每组行都将生成一个值。
第3章 SQL的基础知识 【例 3.61】 统计所有成绩平均分。 【例 3.62】 统计学号为“20050319001”学生成绩平均分。 SELECT AVG(StudScore) FROM StudScoreInfo 【例 3.62】 统计学号为“20050319001”学生成绩平均分。 WHERE StudNo=‘20050319001’ 【例 3.63】 统计学号为“20050319001”学生成绩记录条数(即课程门数)。 SELECT COUNT(*) FROM StudScoreInfo 【例 3.64】 统计学号为“99070401”学生成绩平均分、课程门数,并指定别名。 SELECT AVG(StudScore) AS AvgScore,CourseCount=COUNT(*) FROM StudScoreInfo WHERE StudNo=‘99070401’
第3章 SQL的基础知识 【例 3.65】 统计学号为“99070401”学生成绩总分、最高分、最低分、平均分、课程门数。 SELECT SUM(StudScore),MAX(StudScore),MIN(StudScore), AVG(StudScore) AS AvgScore,CourseCount=COUNT(*) FROM StudScoreInfo WHERE StudNo=‘99070401’ 【例 3.66】 统计学号为“99070401”学生成绩总分、最高分、最低分、平均分、课程门数及计算平均分。 AVG(StudScore),COUNT(*),SUM(StudScore)/COUNT(*) AvgScore
第3章 SQL的基础知识 2. GROUP BY 和聚合函数 【例 3.67】 统计各学生平均分。 SELECT StudNo,AVG(StudScore) AvgScore FROM StudScoreInfo GROUP BY StudNo 【例 3.68】 统计各学生平均分,使用CAST 函数保留小数位数。 SELECT StudNo,CAST(AVG(StudScore) AS Numeric(4,1)) AvgScore
第3章 SQL的基础知识 【例 3.69】 统计各学生所上的课程门数。 【例 3.70】 统计各学生平均分和所上的课程门数。 SELECT StudNo,Count(*) CourseCount FROM StudScoreInfo GROUP BY StudNo 【例 3.70】 统计各学生平均分和所上的课程门数。 SELECT StudNo,COUNT(*) CourseCount,CAST(AVG(StudScore) AS Numeric(4,1)) AvgScore 【例 3.71】 统计各学生总分、课程门数、平均分和计算平均分。 SELECT StudNo,SUM(StudScore) AS SumScore,COUNT(*) CourseCount, CAST(AVG(StudScore) AS Numeric(4,1)) AvgScore1, SUM(StudScore)/COUNT(*) AS AvgScore2
第3章 SQL的基础知识 3.7.6 HAVING 子句 HAVING 子句指定分组搜索条件,是对分组之后的结果再次筛选。HAVING 子句必须GROUP BY 子句一起使用,有HAVING 子句必须有GROUP BY 子句,有GROUP BY 子句但可以没有HAVING 子句。 HAVING 语法与WHERE 语法类似,其区别在于WHERE 子句在进行分组操作之前对查询结果进行筛选;而HAVING 子句搜索条件对分组操作之后的结果再次筛选。同时作用的对象也不同,WHERE 子句作用于表和视图,HAVING 子句作用于组。但HAVING 可以包含聚合函数,HAVING 子句可以引用选择列表中出现的任意项。
第3章 SQL的基础知识 【例 3.72】 查询平均分80 分以上的学生记录,使用HAVING 子句。 SELECT StudNo,SUM(StudScore) AS SumScore,COUNT(*) CourseCount, CAST(AVG(StudScore) AS Numeric(4,1)) AvgScore FROM StudScoreInfo GROUP BY StudNo HAVING AVG(StudScore)>=80 【例 3.73】 统计学生课程成绩为80 分以上的学生平均分,使用WHERE 子句。 WHERE StudScore>=80
第3章 SQL的基础知识 【例 3.74】 统计重修 10 门以上的学生平均分信息,同时使用WHERE 和HAVING子句。 SELECT StudNo,AVG(StudScore) AS AvgScore FROM StudScoreInfo WHERE StudScore<60 GROUP BY StudNo HAVING COUNT(*)>=10
第3章 SQL的基础知识 3.7.7 ORDER BY 子句 ORDER BY 子句指定查询结果的排序方式。根据查询结果中的一个字段或多个字段对查询结果进行排序,升序为ASC,降序为DESC 关键字指定。 语法: ORDER BY {order_by_expression [ ASC | DESC ] } [,...n] 参数: order_by_expression:指定排序的规则order_by_expression 可以是表或视图的列的名称或别名。如果SELECT 语句中没有使用DISTINCT 选项或UNION 操作符,那么ORDER BY子句中可以包含Select_list 中没有出现的列名或别名。ORDER BY 子句中也不能使用TEXT、NTEXT 和IMAGE 数据类型。 ASC:指明查询结果按升序排列这是系统默认值 DESC:指明查询结果按降序排列
第3章 SQL的基础知识 【例 3.75】 查询学号为“99070401”的学生成绩记录,并按成绩高低排序。 SELECT * FROM StudScoreInfo WHERE StudNo=‘99070401’ ORDER BY StudScore DESC 【例 3.76】 查询学号为“20050319001”的学生成绩记录,并按成绩高低排序,成绩相同的按课程编号升序排序。 SELECT * FROM StudScoreInfo WHERE StudNo=‘20050319001’ ORDER BY StudScore DESC,CourseID ASC 【例 3.77】 统计各学生平均分,并按平均分高低排序。 SELECT StudNo , AVG(StudScore) AS 平均分 FROM StudScoreInfo GROUP BY StudNo ORDER BY 平均分 DESC
第3章 SQL的基础知识 本章小结: 掌握SQL的数据类型 SQL的数据定义功能 SQL的数据操作功能 SQL的简单查询功能