SQL数据库学习重点(1—24页)
SQL的组成
核心SQL主要有四个部分:
(1) 数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索
DROP,DECLARE) 引等结构。(CREATE,ALTER,
(2) 数据操纵语言,即SQL DML。数据操纵分成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。(SELECT,DELETE,UPDATE,INSERT)
(3) 嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。
(4) 数据控制语言,即SQL DCL,...
重点(1—24页)
SQL的组成
核心SQL主要有四个部分:
(1) 数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索
DROP,DECLARE) 引等结构。(CREATE,ALTER,
(2) 数据操纵语言,即SQL DML。数据操纵分成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。(SELECT,DELETE,UPDATE,INSERT)
(3) 嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。
(4) 数据控制语言,即SQL DCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。(GRANT,REVOKE,COMMIT,ROLLBACK)
T-SQL语言创建数据库:
CREATE DATABASE my_library ON
PRIMARY( NAME = my_library_data,
FILENAME =‘c:\mssql7\data\my_library.mdf’,
SIZE = 10 MB, //10 MB的主要数据库文件
MAXSIZE = 15 MB,
FILEGROWTH = 20 % )
LOG ON
(NAME = my_library_log,
FILENAME =‘c:\mssql7\data\my_library.ldf’,
SIZE = 3 MB , //3 MB的日志文件
MAXSIZE = 5 MB ,
FILEGROWTH = 1 MB )
1
T-SQL创建数据库的语句
:
CREATE DATABASE database_name
[ ON [PRIMARY]
[
[,…n] ]
[, [,…n] ]
]
[ LOG ON { [,…n] } ]
[ FOR LOAD ? FOR ATTACH ]
:: =
( [ NAME = logical_file_name, ]
FILENAME = „os_file_name‟
[,SIZE = size]
[,MAXSIZE = { max_size , UNLIMITED } ]
[,FILEGROWTH = growth_increment]) [,…n]
:: =
FILEGROUP filegroup_name [,…n]
, PRIMARY:指定主数据文件。主要数据文件含有所有的数据库系统表,一个数据
库有一个主要文件,缺省时主数据文件为给定的数据库文件。
, FILENAME :指定操作系统文件名和文件的路径。
, SIZE :指定文件的大小(缺省为xxMB)
, MAXSIZE :指定文件扩展的最大值。
, FILEGROWTH :指定文件的增长的增量。增长量可以为xx MB、KB或百分比(%)。
缺省是10%,最小是64KB 。
, LOG ON:开始定义日志文件;
, FOR LOAD 表示将备份数据直接装入新建的数据库;
, FOR ATTACH 表示从一组已经存在的文件中建立一个新数据库。
使用 DROP DATABASE语句
语句格式:
DROP DATABASE database_name[,…n]
可以同时删除多个数据库。
2
使用系统存储过程sp_renamedb可以修改数据库的名称,语句格式:
sp_renamedb old_dbname, new_dbname
例如:sp_renamedb „zzg‟, „zzg1‟
注意:
只有属于sysadmin服务器角色的成员可以给数据库更名。
在给数据库更名前,必须在企业管理器中设置该数据库为单用户状态。在单用户状态下,只能有一个用户使用该数据库,这时就不能同时打开企业管理器和查询分析器。
输入T-SQL语句,修改数据库zzg1,增加一个数据文件 alter database cc1
add file(
name=test1dat2,
filename='c:\t1dat2.ndf',
size=2mb,
maxsize=5mb,
filegrowth=1mb)
表是数据库中最重要的数据库对象,是数据库的基本组成部分,是储存数据的逻辑载体。关系型数据库中的表都是二维的,表的一列称为一个字段;表的一行称为一个记录 。
SQL Server 2000有两类表,一类是永久表,这类表一旦创建将一直存储在硬盘上,除非被用户删除;另一类是临时表,这类表在用户退出时自动被系统删除。临时表又分为局部临时表与全局临时表。局部临时表的名称以,开头,仅可由创建者本人在创建后立即使用,一旦创建者断开连接,该表将会消失;全局临时表的名称以,,开头,创建者在创建后可以由多个授权用户立即使用,一旦最后使用的用户断开连接,该表将会消失。
对于表中的每一列,应该为其指定数据类型。
, 1(整数数据类型
, 2(货币数据类型
, 3(位数据类型
, 4(精确数值类型
, 5(近似数值类型
, 6(日期时间类型
3
, 7(字符数据类型
, 8(二进制数据类型
, 9(统一码数据类型
, 10(时间戳数据类型
, 11(sql_variant数据类型
, 12(表数据类型
CREATE TABLE 表名
(列名 数据类型[缺省值][NOT NULL]
[,列名 数据类型[缺省值][NOT NULL]]….
[,UNIQUE(列名[,列名]….)]
[,PRIMARY KEY(列名[,列名]…)]
[,FOREIGN KEY (列名[,列名]…)
REFERENCES 表名(列名[,列名]…)]
[,CKECK (条件)])
, 缺省值(DEFAULT):指定列的缺省值;
, NOT NULL:列值不能为空值;
, UNIQUE:取值唯一的列名;
, PRIMARY KEY:主关键字(主码)列名;
, FOREIGN KEY:外部码列名;
, REFERENCES:引用的外部码的表名和列名 CKECK :指定表约束条件。
例如:产生表 student, class
产生系表:
CREATE TABLE class
(classno CHAR(8) NOT NULL,
classname CHAR(20) NOT NULL,
PRIMARY KEY (classno) )
CREATE TABLE student
(sno CHAR(8) NOT NULL, Sname CHAR(20) NOT NULL, Ssex CHAR(1),
Sage INT check (sage>=14), Sclass CHAR(8) ,
PRIMARY KEY (sno) ,
FOREIGN KEY(sclass)
REFERENCES class(classno) )
4
使用ALTER TABLE命令修改表结构
, ALTER TABLE table_name
, { [ ALTER COLUMN column_name
ew_data_type [ NULL | NOT NULL ]} , { n
, ]
, | ADD column_name data_type [NULL|DEFAULT]
, | DROP COLUMN column_name [ ,...n ]
, }
, 命令说明:
, (1)ALTER TABLE :该关键字表示本命令将修改表的结构。
, (2)table_name:指定需要修改的表名称。
, (3)ALTER COLUMN column_name:关键字ALTER COLUMN表示该
命令将修改表中已经存在的列属性。column_name指定需要修改的列名
称。
, (4)new_data_type[NULL|NOT NULL ]:将表中已存在列的数据类型修
改为一个新的数据类型,并可以修改其非空属性。
, (5)ADD column_name data_type [NULL|DEFAULT]:指明要对表中添加
的列的名称column_name及其数据类型data_type,只允许添加可包含空
值NULL或指定为DEFAULT的非空值列。
, (6)DROP COLUMN column_name [ ,...n ]:关键字DROP COLUMN指
明将要删除表中已存在的一列或多列,column_name表示列名,[ ,...n ]表
示可以同时删除多列。如果列存在默认值约束或其他约束,则必须先删除
它们,否则无法删除列。删除约束的方法见第10章。
, (7)除DROP 外,该命令一次只允许更改表的一个属性或修改一列。
表的修改示例?
增加外部关键字约束,例如,修改表COUSE,增加外部关键字说明,语句如下: ALTER TABLE COUSE
ADD FOREIGN KEY (cdept)
REFERENCES DEPT [deptno]
ADD FOREIGN KEY (ctno)
REFERENCES TEACHER [tno]
5
表的修改示例?
, 例2,修改学生的年龄为出生日期(日期类型)。
ALTER TABLE STUDENT
ALTER sage DATETIME
, 例3,增加学生的电话属性:
ALTER TABLE STUDENT
ADD sphno CHAR(12)
, 例4,增加学生的国家属性
ALTER TABLE STUDENT
ADD country CHAR(30)
重新命名表
用系统存储过程修改表的名称
, 命令格式:
, sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name „
查看表属性
, 使用系统存储过程查看表属性
, 使用几个有关的系统存储过程查询视图、表、存储过程等对象信息。
, (1)显示对象的名称、列名、拥有者、创建时间、列的属性等信息。
, 命令格式:
, sp_help [ [ @objname = ] name ]
, 命令说明:
, name为对象的名称,如果是表,则为表名称。要查询对象必须在当前数
据库中。省略[ @objname = ] name项时显示数据库中所有对象的信息。
, (2)查看指定表与其他相关数据库对象的关联信息。
, 命令格式:
, sp_depends [ @objname = ] name
, (3)查看数据库或表的存储空间的信息,如分配(保留)的空间量、数
据使用的空间量、索引使用的空间量以及由数据库对象保留的未用空间
量。
, 命令格式:
, sp_spaceused table_name
, 命令说明:
, table_name表示要查看的表名称。
6
删 除 表
, 命令格式:
, DROP TABLE table_name
, 命令说明:
, (1)table_name表示要删除的表的表名称。
, (2)删除表的权力仅属于表的拥有者,且不能转移。
, (3)不能使用DROP TABLE命令删除系统表。
添 加 数 据
, 在SQL Server中,可以使用INSERT命令向指定的表或视图添加数据,语
法如下。
, 命令格式:
, INSERT [ INTO ] {table_name | view_name}
, { (column_name [ ,...n] )
, { VALUES({ DEFAULT | NULL | expression } [ ,...n] )| derived_table }
, }
, 命令说明:
, (1)INSERT [ INTO ]:指定要向表中插入数据,INTO可以省略。
, (2){table_name | view_name}:表示要插入数据的表或视图的名称。
, (3)(column_name [ ,...n]):表示要插入数据的表或视图的列名清单。
, (4)VALUES :该关键字指定要插入数据的列表清单。
, (5){ DEFAULT | NULL | expression } [ ,...n]:该数据列表清单中包括默
认值、空值和表达式的数量、次序和数据类型必须与列清单中指定列的定
义相匹配。如果在VALUES清单中按表中定义的列的顺序提供每列的值,
则可以省略列清单。
(6)derived_table:这是一个导入表中数据的SELECT子句。通常INSERT命令一次只能在表中插入一行数据,但可以采用SELECT子句替代VALUES子句,将一张表中的多行数据导入到要插入数据的表中。
(7)尽管有时可能仅仅需要向表中插入某一(或某几)个字段数据,但是该字段所在行的其他字段一定是自动取空值、默认值和自动编号值之一,亦即插入数据是一次插入一行的。如果表中包含具有非空属性的列,则进行插入操作时必须向该字段插入数据,即在列各清单及数据列表清单中必须有其对应项,除非该列设置了默认值或自动编号等由系统自动插入数据的属性。
7
插入单个元组:
例1:按顺序给出表中每个列值,插入一个完整的新元组,可省略表的列名。
INSERT INTO DEPT VALUES
( „CS‟, „计算机‟, „888‟, „10区‟ )
例2:插入一个学生的部分列值,必须在表名后给出要输入值的列名。
INSERT INTO STUDENT
(sno ,sname)
VALUES( „J20045‟, „刘琉‟)
例3,建立一个新表,存放每个学生的学号、姓名和平均成绩。利用查询结果插入新表中。
CREATE TABLE savg
( sno CHAR(8),sname CHAR(20),
avage REAL )
INSERT INTO savg (sno,sname,avage)
( SELECT sc.sno,sname,AVG(grade)
FROM SC,STUDENT
WHERE SC.sno = STUDENT.sno
GROUP BY sc.sno )
更 新 数 据
, 在SQL Server中,可以使用UPDATE命令在指定的表或视图中更新现有
的数据,语法如下。
, 命令格式:
, UPDATE table_name
, SET
, { column_name = { expression | DEFAULT | NULL }
, | @variable = expression
, | @variable = column_name = expression
, } [ ,...n ]
, [ FROM { < table_source > } [ ,...n ] ]
, [ WHERE < search_condition > ]
, 命令说明:
, (1)UPDATE table_name:指定需要更新的表的名称为table_name所表
示的名称。
8
, (2)SET:该子句表示对指定的列或变量名称赋予新值。
, (3)column_name = { expression | DEFAULT | NULL}:将变量、字符、表
达式的值,或默认值,或空值替换column_name所指定列的现有值。不
能修改标识列数据。
4)@variable = expression:指定将变量、字符、表达式的值赋予一个已, (
经声明的局部变量。
, (5)@variable = column_name = expression:指定将变量、字符、表达式
的值同时赋予一列和一个变量。
, (6)FROM { < table_source >:表示要依据一个表(可以是本表或其他表)
中的数据进行更新操作。
, (7)WHERE < search_condition >:指定修改数据的条件,如果省略此选
项,则修改每一行中的该列数据。有WHERE子句时,仅修改符合WHERE
条件的行。
, (8)在一个UPDATE中,可以一次修改多列的数据,只要在SET后面
写入多个列名及其表达式,每个用逗号隔开。
, (9)UPDATE不能修改具有IDENTITY属性的列值。
例1,把 DEPT 中的计算机系的电话号码改为“9888”。
UPDATE DEPT
SET deptphno = „9888‟
WHERE deptno = ‟cs'
例2,所有课程的学分都加1
(1) UPDATE COUSE
SET credit = credit+1
用子查询进行更新操作
例3,将数据库课程的成绩提高10%。
(3) UPDATE SC
SET grade = grade*110%
WHERE cno = „g008‟
例4,将JS2001班学生的成绩提高10%。
(4) UPDATE SC
SET grade = grade*110%
WHERE SNO in
(SELECT SNO
FROM STUDENT
WHERE 班集编号=„JS2001‟)
9
删 除 数 据
删除表中数据的方法有两种,在指定的表或视图中删除满足给定条件的数据可以使用DELETE语句;如果要清除表中全部数据,则还可以使用TRUNCATE TABLE语句。DELETE语句的语法如下。
, 命令格式:
, DELETE[ FROM ] { table_name | view_name }
, [ FROM { < table_source >}]
, [ WHERE < search_condition >]
, 命令说明:
, (1)DELETE语句中的语法项目含义与UPDATE语句相同。
2)WHERE子句给出删除数据所必须满足的条件,省略WHERE子句, (
时将删除所有数据。
, TRUNCATE TABLE语句用于清空表中所有数据,语法如下。
, 命令格式:
, TRUNCATE TABLE table_name
, TRUNCATE TABLE table_name与DELETE table_name都可以删除表中全
部记录。
, 二者的相同点是都不删除表的结构、索引、约束、规则和默认,如果希望
删除表的定义,必须使用DROP TABLE语句。TRUNCATE TABLE语句
与DELETE语句的区别是,如果表中含有自动编号列,则使用TRUNCATE
TABLE语句后,该列将复位为其初始seed值,而使用DELETE语句将不
会复位。另外,使用TRUNCATE TABLE语句不记录日志,而DELETE
语句每删除一条记录,都要记入日志,因此TRUNCATE TABLE语句的操
作速度要快于DELETE语句。
例1,只涉及单个元组,从数据库中删除某个学生李楷:
DELETE FROM STUDENT
WHERE sname = „李楷‟
例2,删除操作涉及多个元组,从数据库中删除某门课程的所有元组:
DELETE FROM SC
WHERE cno = „E001‟
10
SELECT查询
, 命令格式:
[ PERCENT ]] select_list , SELECT [ ALL | DISTINCT ][TOP n
, [ INTO new_table ]
, FROM table_source
, [ WHERE search_condition ]
, [ GROUP BY group_by_expression ]
, [ HAVING search_condition ]
, [ ORDER BY order_expression [ ASC | DESC ] ]
, 命令说明:
, (1)ALL | DISTINCT:DISTINCT关键字用于禁止在查询结果数据集中
显示重复的行。ALL关键字允许在查询结果数据集中显示查询到的全部
行。默认值为ALL关键字。
, (2)TOP n [ PERCENT ]:TOP n用于在查询结果数据集中显示查询到的
前n行数据(n为自然数);TOP n PERCENT用于在查询结果数据集中显
示查询到的前百分之n行的数据。
, (3)select_list:查询所涉及到的列清单。
, (4)INTO new_table:将查询结果集保存到新表中。
, (5)FROM table_source:查询所涉及到的源表,即从中查询数据的表。 , (6)WHERE search_condition:查询条件。
, (7)GROUP BY group_by_expression:查询的分组汇总表达式。 , (8)HAVING search_condition:分组汇总结果的筛选条件。 , (9)ORDER BY order_expression [ ASC | DESC ]:查询结果集的排序准
则。ASC表示查询结果升序排列,DESC表示降序排列。
使用TOP关键字
TOP子句只将前面一定的行数返回到结果集,当查询到的数据非常庞大而又没
有必要对所有的数据进行浏览时,使用TOP关键字将极大地减少查询所消耗的
时间。
, 命令格式:
, TOP n [PERCENT]
, 命令说明:
, (1)TOP 关键字用于在查询结果数据集中显示查询到的前n行数
据(n为整数)。
, (2)PERCENT关键字用于在查询结果数据集中显示查询到的指
11
定百分比为n%的行数据。
, 举例
, Select top 10 * from employee
, Select top 10% * from employee
使用DISTINCT关键字
, 这是因为SELECT语句默认使用ALL关键字,ALL关键字允许在查询结
果数据集中显示查询到的全部行。但有时往往不需要重复的记录,此时可
SELECT 语句的结果中除去重复的行。 以使用DISTINCT关键字从
Select distinct * from employee
使用计算列
, 如果需要对查询到的数据进行再次计算处理,可以在SELECT语句中使
用计算列,计算列是一个虚拟列,它并不存在于表中,而是使用运算符对
表中某一列或几列进行计算,构成计算列(列表达式)来获取经过计算的
查询结果。
, 举例:
, select firstname+” “ +lastname from employee
, Select avg(job_lvl) from employee
使用列的别名
, 在上一节使用计算列时,计算列没有显示列名,只能被系统标识成无列名。
如果希望为他们加一个列名的话,可以为它加上一个别名。通过使用列的
别名,可以对查询数据的列名进行修改,或是为没有名称的列加上列名。 , 举例:
select firstname+” “ +lastname as name from employee
使用WHERE子句
, 用户在查询数据库时往往不需要检索全部的数据,而只需要查询其中一部
分满足给定条件的信息,此时需要在SELECT语句中加入条件,以选择
其中的部分记录。
, WHERE子句用来指定查询返回行的条件。
, 命令格式:
, WHERE < search_condition > , 命令说明:
, (1)定义查询时要返回的行记录所应满足的条件表达
式。SQL Server对中的查询条件数目没有限制。
12
, (2)使用时需注意,WHERE子句必须紧跟在FROM子句的后面。
例:查询全部的列,列出年龄大于20岁的学生的信息:
Select * from student where age>20
SELECT *
FROM employee
WHERE hire_date> „2005-01-01‟
使用比较运算符
搜索pubs数据库中的title表,返回书的价格打了8折后仍然大于12美元的书名、书的类型和价格。
USE pubs
Go
SELECT title_id , type , price FROM titles
WHERE price * 0.8 >12
Go
使用逻辑运算符
查询所有在美国加利福尼亚州的出版社
Use pubs
Go
SELECT pub_id, pub_name, city, state, country
FROM publishers
WHERE country=„USA‟ and state=„CA‟
Go
使用BETWEEN关键字
例如,查询年龄在20至30之间的学生:
SELECT *
FROM student
WHERE 年龄 BETWEEN 20 AND 30 ; 例如,查询年龄不在20至30之间的学生:
SELECT *
FROM student
WHERE 年龄 NOT BETWEEN 20 AND 30 ;
13
使用IN关键字
, 灵活的使用IN,NOT IN,ANY,ALL这些关键字,可以用简洁的语言实现较
为复杂的查询,同时整个程序的可读性也会变得更好。
, 例子:
Use pubs
Go
SELECT au_id, au_lname, au_fname FROM authors
WHERE state IN („CA‟,‟KS‟,‟MI‟,‟IN‟)
Go
使用LIKE关键字 在实际的应用中,如果无法给出精确的例子,只能根据较为模糊的情况来查询
数据,比如:只知道数据中含有某几个特定的字符,在这种情况下,T-SQL提
供了LIKE子句和通配符进行模糊查询。
通配符的使用:
1. %:表示从0到n个任意字符。
2. _:表示单个的任意字符。
3. [ ]:表示方括号里面列出的任意一个字符。
4. [^]:表示任意一个没有在方括号里面列出的字符
使用LIKE关键字举例 查询所有以D开头的作家的名字:
Use pubs
Go
SELECT au_lname +‟,‟ +au_fname
FROM authors
WHERE au_fname LIKE „D%‟
Go
//+‟,‟ + 表示在lname 和fname之间增加一个逗号。
输出结果如下:
Straight , Dean
Stringer , Dirk
例如,查询电话号码本中含有5737的电话号码:
14
SELECT *
FROM calltable
WHERE callno LIKE „%5735%‟ ;
例如,查询电话号码本中最后一位数是8的电话号码:
SELECT *
FROM calltable
WHERE callno LIKE „%8‟ ;
下面的例子查询所有满足au_id的前两个字母为‟72„,第四个字母为‟,„的作家的姓名和电话号码:
Use pubs
Go
SELECT au_lname ,au_fname, phone, au_id FROM authors
WHERE au_id like‟72_-%‟
Go
如果在LIKE表达式中包含字符,或_,可以采用加上换码字符的方法解决。例如,下面的例子将匹配所有以„,‟开始并以„,‟结束的字符串: s LIKE „x%%x%‟ ESCAPE „x‟
ESCAPE „x‟ 声明:x作为„x%%x%‟的换码字符,x%指的是单独的字符,,x只起标记作用,不再表示字符。
在SQL中用两个连续的单引号表示一个单独的单引号,下面的例子表示电影名中含有„s的电影。
Title LIKE „%‟‟s%‟
使用IS测试空值
使用IS操作符测试空值的例子,例如,从STUDENT表中查找学生电话是空值的学生名字和班级号码:
SELECT sname, sclass
FROM STUDENT
WHERE sphno IS NULL; 输出结果如下:
sname, sclass
王 者 JS2001
赵 良 DZ2001
使用ORDER BY子句
数据库中的记录一般是按插入数据的顺序来排列的。使用ORDER BY子句可以对查询后的结果集进行排序。
, 命令格式:
15
, ORDER BY { order_by_expression [ ASC|DESC ] } [,…n]
, 命令说明
, (1)order_by_expression是用于排序的列的名字,如果需按多列进行排
序,则根据ORDER BY后各列的次序先后决定排序的优先级。
, (2)ASC指定按递增顺序,DESC指定按递减顺序,ASC为默认值。
, (3)在ORDER BY子句中不能使用text、ntext和image类型的字段。
, (4)在ORDER BY子句中所引用列的数量不能大于SELECT语句中列
的数量,否则,系统显示超出SELECT清单中列数的错误。
ORDER BY子句示例
查询所有以D开头的作家的信息,并按au_lname列降序排列: Use pubs
Go
SELECT * FROM Authors
WHERE au_lname LIKE „D%‟
Order by au_lname desc
SQL高级查询
使用表的别名
, 当表的名称太长时,为了书写上的方便简单,在SQL语言的查询语句中
可以定义表的别名。
, 命令格式:
, SELECT {table_alias.column}[,… n]
, FROM table_name [AS] table_alias [,… n]
, 命令说明:
, (1)table_alias 是表的别名。
, (2)在一个SELECT 语句中,系统首先执行FROM子句,然后执行
SELECT,所以一旦在FROM子句中定义了表的别名,尽管SELECT子
句在FROM前面,也要使用别名。
(3)在一个定义了别名的SELECT 语句中,从FROM子句向后是依次执行的,因此,FROM后的每一个子句只有在其前面定义了别名后才能够并且只能够使用别名。别名的作用范围仅限于本T-SQL语句中,而其他独立的T-SQL语句无权使用这个别名。
举例:
SELECT
s.sno, s.sname,sc.grade
FROM student s, sc, course c
WHERE sc.cname = „DATA STRUCTURE‟
AND sc.grade < 60
16
AND couse.cno = sc.cno ,
AND sc.sno = s.sno;
多 表 查 询
如果希望从多个表中获取查询结果,例如从Student表中获取学生的姓名,从Score表中获取学生的成绩,那么就需要在多个表中选择和操作数据,这正是SQL的特色之一。
内连接
, 内连接(Inner Join)也叫自然连接,是指将另一个表内的行数据与本表内
的数据相互连接,产生的结果行数取决于参加连接的行数,也就是说在将
两个表中的指定列进行比较时,仅将两个表中满足连接条件的行组合起来
作为结果集。在内连接中,只有在两个表中匹配的行才能在结果集中出现。
1(在WHERE子句中指定连接
, 在WHERE子句中可以使用比较运算符(=、<、>等)指定连接的条件。
在两个表之间进行内连接的语法如下。
, 命令格式:
, SELECT select_list
, FROM table1, table2
, WHERE table1.column1= table2. column2
, 命令说明:
, (1)select_list表示查询内容的列表。
, (2)在FROM子句中指定查询数据的两个表table1与table2 ,表的顺序
可以任意排列。
, (3)在WHERE子句中指定了连接的条件,当使用“=”连接时,通常也称
为等值连接,它只显示第一个表和第二个表中满足连接条件的数值。
例1:列出所有任课教师的名字,去掉重复值:
SELECT DISTINCT tname 任课教师
FROM COUSE, TEACHER
WHERE COUSE.tno = TEACHER.tno 输出结果如下:
任课教师
王 学
李 力
张 三
查询JS2001班学生和其选修课程情况:
17
SELECT STUDENT.sno,sname,ssex, sage, sclass,cno,grade
FROM SC, STUDENT
WHERE STUDENT.sno = SC.sno
AND sclass = “JS2001”
输出结果如下:
J20001 李 楷 m 19 JS2001 G001 78 J20002 张 会 f 20 JS2001 G002 85 J20003 王 者 m 20 JS2001 E001 86
自然连接
例2:统计各科成绩的最低、最高分和平均成绩,及课程名。
SELECT
CNAME, MIN(grade),MAX(grade),AVG(grade)
FROM SC,COUSE
WHERE SC.cno = COUSE.cno
GROUP BY cname
输出结果如下:
CNAME,MIN(grade),MAX(grade),AVG(grade)
Vc 60 92 75
汇编 65 90 78
数据结构 60 94 72
2(使用JOIN和ON关键字指定连接条件
, 在使用SELECT语句时,还可以使用JOIN和ON关键字建立连接条件。
, 命令格式:
, SELECT select_list
, FROM table1 [INNER] JOIN table2
, ON table1.column1= table2. column2
, 命令说明:
, (1)FROM 子句指定连接的两个表。
, (2)[INNER] JOIN表示两个表的连接方式为内连接。INNER是默认方
式,可以省略。
, (3)ON 用于给出这两个表之间的连接条件。
举例:
使用JOIN连接不同的表,使用ON给出两个表之间的连接条件。这是ANSI92标准进行多表查询的书写方式。例如,前面的例子可以改写如下: SELECT s.sno, s.sname, sc.grade
FROM student s JOIN sc
ON sc.sno = s.sno
JOIN course c
ON c.cno = sc.cno
18
WHERE sc.cname = „DATA STRUCTURE‟
AND sc.grade < 60
,价格: 选择出大于平均销售数量的书的名字
SELECT titles.title, titles.price FROM titles JOIN sales ON sales_id = titles_id
WHERE sales.qty >
(SELECT AVG(qty)
FROM sales)
使用UNION子句
使用UNION子句的查询称为联合查询,它可以将两个或更多查询的结果集组合为一个单个结果集,该结果集包含联合查询中所有查询结果集中的全部行数据。联合查询不同于对两个表中的列进行连接查询,前者是组合两个表中的行,后者是匹配两个表中的列数据。
, 联合查询必须注意两个问,首先是每一个查询结果集都必须与第一个查
询结果集具有相同数量的列,其次是各个查询结果集中的列数据类型必须
与第一个查询结果集中对应的列数据类型相兼容。
, 命令格式:
, select_statement
, UNION [ ALL ] select_statement
, [ UNION [ ALL ] select_statement] [... n]
, 命令说明:
, (1)本命令将多条查询语句的查询结果按照查询语句select_statement的
先后次序显示。
, (2)查询结果的标题为第一个select_statement的标题。
, (3)UNION子句会自动删除查询结果中重复的行。如果希望获得所有的
行,可在UNION的后面加上关键字ALL。
, (4)UNION子句只是要求每一个查询中的列与第一个查询的列的数据类
型兼容,并不要求完全相同。例如:Student表中的name列是varchar(20),
而Score表中subject id列是char(4),这两列也可以正常地进行联合查询。
, (5)如果要对查询后的组合结果集排序的话,必须把ORDER BY子句写
在最后一个select_statement后,但排序必须依据第一个select_statement
中的列。
举例:
SELECT 查询的结果是元组的集合,多个查询结果可以进行集合的并(UNION)操作。
例如,查询选修了课程G001和选修了课程E001的学生的学号。
SELECT sno
FROM sc
WHERE cno = “ G001 ”
19
UNION
SELECT sno
FROM sc
WHERE cno = “ E001 ”
使用统计函数
, 在SELECT语句中除了可以使用算术表达式进行列计算外,还可以使用
一系列的统计函数对表中的所有数据进行汇总、统计等多种运算,统计函
数属于聚合函数(Aggregate Function)。
, 统计函数通常用于SELECT语句中,作为结果集中的返回列。在SELECT
语句中使用统计函数的语法如下。
, 命令格式:
, SELECT function_name({column_name | @variable }[,... n])[,... n]
, FROM table_List
, 命令说明:
, (1)function_name表示函数的名称。
2)(column_name |@variable)表示针对其进行函数运算的列名称或变, (
量名称。如果函数需要一个以上的自变量,则用逗号进行分隔。
SUM函数
, SUM函数返回列或表达式中所有值的总和,此函数只能用于数值型的字
段。当列中的值为NULL时,该空值在计算求和时将被忽略。
, 命令格式:
, SUM ( [ ALL | DISTINCT ] expression )
, 命令说明:
, (1)ALL表示对所有的值进行聚合函数运算,是默认设置。
, (2)DISTINCT表示仅对不同的值进行聚合函数运算,而不管该值出现
了多少次。
, (3)expression表示对数字数据类型的表达式进行运算。
AVG函数
, AVG函数返回列或表达式中的算术平均值,此函数只能用于数值型的字
段。
, 命令格式:
, AVG ( [ ALL | DISTINCT ] expression )
, 命令说明:各语法项目与SUM类同。
COUNT函数
, COUNT函数返回列中的记录个数。
, 命令格式:
, COUNT ( [ ALL | DISTINCT ] column_name | *)
, 命令说明:
20
, (1)在COUNT函数中引用一个列名column_name时,将返回该列中行
记录的个数。
, (2)COUNT函数默认使用ALL参数,它将重复计算相同的值,但不包
含值为NULL的行。
, (3)使用DISTINCT时,相同的值只计数一次,且不包含NULL值。
, (4)在COUNT函数中可以使用 * 做参数,它表示返回表中的所有行数,
包括含有NULL值的行。
MAX函数与MIN函数
, MAX函数返回某一列中的最大值,它可用于数字列、字符列和datetime
列,但不能用于BIT列。
, 命令格式:
, MAX( [ ALL | DISTINCT ] expression )
, MIN函数返回某一列中数据的最小值,其使用方法与MAX函数相同。
使用GROUP BY子句
, 如果希望将查询结果按某一列或几列进行分类统计,即不同的列值被放到
不同的组中时,可以使用GROUP BY子句。基本命令结构如下。
, 命令结构:
SLETCT column_name[,... n] ,
, FROM table_name
, GROUP BY [ ALL ] column_name[,... n]
, 命令说明:
, (1)在SELECT语句中所指定的列必须是GROUP BY子句中的列名,
或是被聚合函数所使用的列。
, (2)ALL 关键字,它指定返回由 GROUP BY 子句产生的所有组,即使
某些组没有符合WHERE子句中指定条件的行。
, (3)text、ntext 和 image 类型的列不能用于GROUP BY子句。
, (4)分组的列中包含多个NULL时,这些空值将放入一个组中进行显示。
, (5)在 GROUP BY 子句中必须使用列的名称,而不是使用 AS 子句指
定的列别名 。
例如1:查询学生的总人数,
SELECT COUNT(*)
FROM student;
例如2:查询选修了课程的学生总人数,
SELECT COUNT(DISTINCT sno)
FROM sc;
使用聚合函数查询,统计某个列中值的个数
例如,求每个班级男生的人数,必须按班号分组,而后按班统计学生人数: SELECT 班号,COUNT(*)
21
FROM student
WHERE 性别=‘男’
GROUP BY 班号
输出结果如下:
班号, COUNT(*)
js9901 21
js9902 22
js9903 25
js9904 20
使用聚合函数查询,求列的最大最小值
例如,列出所有学生的最小和最大年龄:
SELECT MIN(sage),MAX(sage)
FROM STUDENT
输出结果如下:
MIN(sage),MAX(sage)
14 25
使用聚合函数查询,查询结果分组
例如,统计各科成绩的最低、最高分和平均成绩。
SELECT
CNO, MIN(grade),MAX(grade),AVG(grade)
FROM SC
GROUP BY cno
输出结果如下:
CNO,MIN(grade),MAX(grade),AVG(grade)
G006 60 92 75
G007 65 90 78
G002 60 94 72
使用HAVING子句
, 在完成指定条件的查询后,还可以使用HAVING子句来对分组的结果进
行进一步的筛选。下面是HAVING 子句的语法结构。
, 命令格式:
, HAVING
, 命令说明:
, (1) 指定分组所应满足的条件。
, (2)用HAVING子句对GROUP BY子句设置条件的方式与WHERE子
句对SELECT语句设置条件的方式类似,但HAVING可以包含聚合函数。
如果HAVING中包含多个条件,那么这些条件将通过AND、OR或NOT
组合在一起。
举例:
例如,查询学分不到20分的学生的学号和学分总数。
22
SELECT 学号,SUM(credit)
FROM SC,COURSE
WHERE grade >= 60 AND grade NOT NULL
AND SC.cno = COURSE.cno
GROUP BY 学号
HAVING SUM(credit) < 20
例2:统计平均成绩大于75分的科目的最低、最高分和平均成绩,及课程名。
SELECT
CNAME, MIN(grade),MAX(grade),AVG(grade)
FROM SC,C
WHERE SC.cno = C.cno
GROUP BY cname
HAVING AVG(GRADE)>75
输出结果如下:
CNAME,MIN(grade),MAX(grade),AVG(grade) 汇编 65 90 78
使用嵌套查询
, 在一个SELECT语句中嵌入另一个完整的SELECT语句称为嵌套查询。
嵌入的SELECT语句称为子查询,而包含子查询的SELECT语句称为外
部查询。子查询自身可以包括一个或多个子查询,也可以嵌套任意数量的
子查询。
, 但子查询中返回的数据类型是有限制的,它不能使用image和text等数据
类型,并且子查询返回的数据类型还必须和外部查询WHERE子句中的数
据类型相匹配。
, 子查询既可以嵌套在SELECT 语句中,也可以嵌套在 UPDATE、DELETE
和 INSERT 语句中。
举例:
例1,列出与李楷同班的同学的全部信息:
SELECT *
FROM STUDENT
WHERE sclass =
( SELECT sclass
FROM STUDENT
WHERE sname=“李楷”);
输出结果如下:
sno sname ssex sage sclass J20001 李 楷 m 19 JS2001
J20002 张 会 f 20 JS2001
J20003 王 者 m 20 JS2001
例2,查找高于职工平均工资的职工信息:
23
SELECT *
FROM emptable
WHERE salary >
( SELECT AVG(salary)
FROM emptable)
查询本学期选课超过8门的学生人数,没有成绩的选课表示本学期正在选修的课程。
SELECT COUNT(*)
FROM student
WHERE sno IN 注:选课>8的学号集
( SELECT sno 选课的学号
FROM sc
WHERE grade IS NULL
GROUP BY sno 注:按学号分组
HAVING COUNT(*) > 8);
使用比较运算符的子查询
, 子查询可由一个比较运算符(=、< >、>、> =、<、!>、! < 或 < =)引入
做为比较运算符的条件,子查询必须返回单个值做为外部查询中WHERE
子句的比较参数。
使用IN的子查询
, 使用IN(或 NOT IN)关键字引入子查询时,允许子查询返回一列零值
或多个结果值。它判断IN关键字前所指定的列值是否在子查询的结果中,
IN是嵌套查询中最常用的关键字。
举例:
SELECT dname, deptno
FROM dept
WHERE deptno NOT IN
(SELECT deptno FROM emp);
使用EXISTS的子查询
使用EXISTS关键字引入一个子查询时,就相当于进行一次数据是否存在的测试。为了便于理解,我们可以把EXISTS想象为一个函数,而子查询是这个EXISTS函数的参数。它的作用是在WHERE子句中测试子查询返回的行是否存在。EXISTS子查询实际上不产生任何数据,它只返回TRUE或FALSE值。 举例:
, SELECT dname, deptno
FROM dept
WHERE NOT EXISTS
(SELECT dept.deptno
FROM emp,dept
24
WHERE dept.deptno = emp.deptno);
非重点
视图的创建和撤销
, 视图的创建
创建视图可用“CREATE VIEW”语句实现。其句法如下:
CREATE VIEW <视图名>(列表名)
AS
本文档为【SQL数据库学习】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。