SQL常用命令概述
上一篇 / 下一篇 2008-04-20 13:26:42 / 个人分类:软件测试基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
一、定义基本表
SQL语言使用CREATE TABLE语句定义基本表,其一般格式如下:
CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]……
[,<表级完整性约束条件>]);
例1 建立一个“学生”表student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE, /*列级完整性约束条件,Sno取值唯一,不许取空值*/
Sname CHAR(20) UNIQUE,
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
定义表的各个属性时需要指明其数据类型及长度。
SMALLINT 半字长二进制整数。
INTEGER或INT 全字长二进制整数。
DECIMAL(p[,q]) 压缩十进制数,共P位,其中小数后有q
或DEC(p[,q]) 位。0<=q<=p<=15,q=0时可以省略不写。
FLOAT 双字长浮点数。
CHARTER(n)或CHAR(n) 长度为n的定长字符串。
VARCHAR(n) 最大长度为n的变长字符串。
GRAPHIC(n) 长度为n的定长图形字符串。
VARGRAPHIC(n) 最大长度为n的变长图形字符串。
DATE 日期型,格式为YYYY-MM-DD。
TIME 时间型,格式为HH.MM.SS。
TIMESTAMP 日期加时间。
二、修改基本表
SQL语言使用ALTER TABLE 语句修改基本表,其一般格式如下:
ALTER TABLE <表名>
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];
例2 向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD Scome DATE;
例3 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage SMALLINT;
三、删除基本表
当某个基本表不再使用时,可以使用DROP TABLE语句删除它。其一般格式为:
DROP TABLE <表名>;
例4 删除Student表。
DROP TABLE Student;
一、建立索引
SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为:
CREATE[UNIOUE][CLUSTER]INDEX<索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]……);
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表示要建立的索引是聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
二、删除索引
SQL语言中,删除索引使用DROP INDEX语句,其一般格式为:
DROP INDEX <索引名>
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
3.3.1 单表查询
一、选择表中若干列
1.查询指定列
例7:查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
2.查询全部列
例8 查询全体学生的详细记录。
SELECT *
FROM Student; 等价于: SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
3.查询经过计算的值
例9 查全体学生的姓名及其出生年份
SELECT Sname,1996-Sage
FROM Student;
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
二、选择表中的若干元组
1.消除取值重复的行
两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了。
例 10 查询选修了课程的学生学号。
SELECT Sno
FROM SC;
该查询结果里包含了许多重复的行。如果想去掉结果表中的重复项,必须指定DISTINCT短语:
SELECT DISTINCT Sno
FROM SC;
如果没有指定DISTINCT短语,则缺省为ALL,即保留结果表中的重复的行。
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
二、选择表中的若干元组
2.查询满足条件的元组。
(1)比较大小
查询满足条件的元组可以通过WHERE子句实现。
用与进行比较的运算符一般包括:
=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于)。
还包括:!>(不大于),!<(不小于)。
例11 查询所有年龄在20岁以下的学生姓名及年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
或 SELECT Sname,Sage
FROM Student
WHERE NOT Sage>=20;
(2)确定范围
谓词BETWEEN……AND……和NOT BETWEEN……AND……可以用来查询属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
例12 查询年龄不在20 ~23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3)确定集合
谓词IN可以用来查找属性值属于指定集合的元组。
例13 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('IS','MA','CS')
(4)字符匹配
谓词LIKE可以进行字符串的匹配。其一般格式如下:
[NOT]LIKE奇<匹配串>‘[ESCAPE奇<换码字符>']
.%(百分号) 代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。
._(下横线) 代表任意单个字符。
例14 查询学号为95001的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE'95001';
等价于:SELECT *
FROM Student
WHERE Sno ='95001';
例15 查询名字第二个字为“阳”字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE'_ _阳%';
如果用户查询的字符串的字符串本身就含有%或_ _,这时就要使用ESCAPE '<换码字符>'短语对通配符进行转义了。
例16 查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _'ESCAPE'\';
(5)涉及空值的查询
例17 查询所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
(6)多重条件查询
逻辑运算符AND和OR可用来联结多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。
例18 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept='cs'AND Sage<20;
四、使用集函数
SQL提供的集函数主要有:
COUNT([DISTINCT|ALL]*) 统计元组个数
COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数(空值不计)
SUM ([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值
五、对查询结果分组
GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。如果
分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的
组,则可以使用HAVING短语指定筛选条件。
连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询。
一、等值与非等值连接
当连接运算符为=时,称为等值连接。
若在等值连接中把目标列中重复的属性列去掉则为自然连接。
例:查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
二、外连接
例:SELECT Student.Sno,SNAME,Cno,Grade
FROM Student LEFT JOIN SC
WHERE Student.Sno=SC.Sno;
三、复合条件连接
WHERE子句中可以有多个连接条件,称为复合条件连接。
例:查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno,SNAME
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=奇2奇 AND SC.Grade>90;
3.4 数 据 更 新
SQL中数据更新包括插入数据、修改数据和删除数据三条语句。
3.4.1 插入数据
SQL的数据插入语句INSERT通常有两种形式。
一、插入单个元组
插入单个元组的INSERT语句的格式为:
INSERT
INTO<表名>[<属性列1>[,<属性列2>...)]
VALUES(<常量1>[,<常量2>]...)
例1 插入一条选课记录('95020','1')
INSERT
INTO SC(Sno,Cno)
VALUES('95020','1')
新插入的记录在Grade列上取空值。
二、插入子查询结果
插入子查询结果的INSERT语句的格式为:
INSERT
INTO<表名>[<属性列1>[,<属性列2>...)]
子查询;
例3 对每一个系,求学生的平均年龄,并把结果存入数据库。
CREATE TABLE Deptage
(Sdept CHAR(15)
Avgage SMALLNT);
然后对表按系分组求平均年龄,再把系名和平均年龄存入新表中。
INTERT
INTO Deptage(Sedpt,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
修改数据
修改操作语句的一般格式为:
UPDATE <表名>
SET<列名>=<表达式>[,<列名>=<表达式>]...
[WHERE<条件>];
一、 修改某一个元组的值
例4 将学生95001的年龄改为22岁。
UPDATE Student
SET Sage=22;
WHERE Sno='95001';
二、修改多个元组的值
例5 将所有学生的年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;
三、带子查询的修改语句
子查询也可以嵌套在UPDATE语句中。
例6 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELECT Sdept
FROM Student
GROUP Student.Sno=SC.Sno);
删除数据
删除语句的一般格式为:
DELETE
FROM<表名>
[WHERE<条件>];
一、删除某一个元组的值
例7 删除学号为95019的学生记录。
DELETE
FROM Student
WHERE Sno='95019';
二、删除多个元组的值
例8 删除所有的学生的选课记录
DELETE
FROM SC;
三、带子查询的删除语句
例9 删除计算机科学所有学生的选课记录。
DELETE
FROM SC
WHERE 'CS'=
(SELECT Sdept
FROM Student
GROUP Student.Sno=SC.Sno);
建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW[<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION];
子查询不允许含有ORDER BY 子句和DISTINCT短语。
例1 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。
二、删除视图
该语句的格式为:
DROP VIEW <视图名>;
例8 删除视图IS_S1
DROP VIEW IS_S1;
执行此语句后, IS_S1视图的定义将从数据字典中删除。
视图的作用
视图最终是定义再基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而
且对于非行列子集视图进行查询和更新时还有可能出现问题。既然如此,为什么还要定义视图
呢?这是因为合理使用视图能够带来许多好处。
1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
一、定义基本表
SQL语言使用CREATE TABLE语句定义基本表,其一般格式如下:
CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]……
[,<表级完整性约束条件>]);
例1 建立一个“学生”表student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE, /*列级完整性约束条件,Sno取值唯一,不许取空值*/
Sname CHAR(20) UNIQUE,
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
定义表的各个属性时需要指明其数据类型及长度。
SMALLINT 半字长二进制整数。
INTEGER或INT 全字长二进制整数。
DECIMAL(p[,q]) 压缩十进制数,共P位,其中小数后有q
或DEC(p[,q]) 位。0<=q<=p<=15,q=0时可以省略不写。
FLOAT 双字长浮点数。
CHARTER(n)或CHAR(n) 长度为n的定长字符串。
VARCHAR(n) 最大长度为n的变长字符串。
GRAPHIC(n) 长度为n的定长图形字符串。
VARGRAPHIC(n) 最大长度为n的变长图形字符串。
DATE 日期型,格式为YYYY-MM-DD。
TIME 时间型,格式为HH.MM.SS。
TIMESTAMP 日期加时间。
二、修改基本表
SQL语言使用ALTER TABLE 语句修改基本表,其一般格式如下:
ALTER TABLE <表名>
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];
例2 向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD Scome DATE;
例3 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage SMALLINT;
三、删除基本表
当某个基本表不再使用时,可以使用DROP TABLE语句删除它。其一般格式为:
DROP TABLE <表名>;
例4 删除Student表。
DROP TABLE Student;
一、建立索引
SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为:
CREATE[UNIOUE][CLUSTER]INDEX<索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]……);
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表示要建立的索引是聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
二、删除索引
SQL语言中,删除索引使用DROP INDEX语句,其一般格式为:
DROP INDEX <索引名>
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
3.3.1 单表查询
一、选择表中若干列
1.查询指定列
例7:查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
2.查询全部列
例8 查询全体学生的详细记录。
SELECT *
FROM Student; 等价于: SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
3.查询经过计算的值
例9 查全体学生的姓名及其出生年份
SELECT Sname,1996-Sage
FROM Student;
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
二、选择表中的若干元组
1.消除取值重复的行
两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了。
例 10 查询选修了课程的学生学号。
SELECT Sno
FROM SC;
该查询结果里包含了许多重复的行。如果想去掉结果表中的重复项,必须指定DISTINCT短语:
SELECT DISTINCT Sno
FROM SC;
如果没有指定DISTINCT短语,则缺省为ALL,即保留结果表中的重复的行。
3.3 查询
查询的一般格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>[,<表名或视图名>]……
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
二、选择表中的若干元组
2.查询满足条件的元组。
(1)比较大小
查询满足条件的元组可以通过WHERE子句实现。
用与进行比较的运算符一般包括:
=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于)。
还包括:!>(不大于),!<(不小于)。
例11 查询所有年龄在20岁以下的学生姓名及年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
或 SELECT Sname,Sage
FROM Student
WHERE NOT Sage>=20;
(2)确定范围
谓词BETWEEN……AND……和NOT BETWEEN……AND……可以用来查询属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
例12 查询年龄不在20 ~23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3)确定集合
谓词IN可以用来查找属性值属于指定集合的元组。
例13 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('IS','MA','CS')
(4)字符匹配
谓词LIKE可以进行字符串的匹配。其一般格式如下:
[NOT]LIKE奇<匹配串>‘[ESCAPE奇<换码字符>']
.%(百分号) 代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。
._(下横线) 代表任意单个字符。
例14 查询学号为95001的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE'95001';
等价于:SELECT *
FROM Student
WHERE Sno ='95001';
例15 查询名字第二个字为“阳”字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE'_ _阳%';
如果用户查询的字符串的字符串本身就含有%或_ _,这时就要使用ESCAPE '<换码字符>'短语对通配符进行转义了。
例16 查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _'ESCAPE'\';
(5)涉及空值的查询
例17 查询所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
(6)多重条件查询
逻辑运算符AND和OR可用来联结多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。
例18 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept='cs'AND Sage<20;
四、使用集函数
SQL提供的集函数主要有:
COUNT([DISTINCT|ALL]*) 统计元组个数
COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数(空值不计)
SUM ([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值
五、对查询结果分组
GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。如果
分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的
组,则可以使用HAVING短语指定筛选条件。
连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询。
一、等值与非等值连接
当连接运算符为=时,称为等值连接。
若在等值连接中把目标列中重复的属性列去掉则为自然连接。
例:查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
二、外连接
例:SELECT Student.Sno,SNAME,Cno,Grade
FROM Student LEFT JOIN SC
WHERE Student.Sno=SC.Sno;
三、复合条件连接
WHERE子句中可以有多个连接条件,称为复合条件连接。
例:查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno,SNAME
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=奇2奇 AND SC.Grade>90;
3.4 数 据 更 新
SQL中数据更新包括插入数据、修改数据和删除数据三条语句。
3.4.1 插入数据
SQL的数据插入语句INSERT通常有两种形式。
一、插入单个元组
插入单个元组的INSERT语句的格式为:
INSERT
INTO<表名>[<属性列1>[,<属性列2>...)]
VALUES(<常量1>[,<常量2>]...)
例1 插入一条选课记录('95020','1')
INSERT
INTO SC(Sno,Cno)
VALUES('95020','1')
新插入的记录在Grade列上取空值。
二、插入子查询结果
插入子查询结果的INSERT语句的格式为:
INSERT
INTO<表名>[<属性列1>[,<属性列2>...)]
子查询;
例3 对每一个系,求学生的平均年龄,并把结果存入数据库。
CREATE TABLE Deptage
(Sdept CHAR(15)
Avgage SMALLNT);
然后对表按系分组求平均年龄,再把系名和平均年龄存入新表中。
INTERT
INTO Deptage(Sedpt,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
修改数据
修改操作语句的一般格式为:
UPDATE <表名>
SET<列名>=<表达式>[,<列名>=<表达式>]...
[WHERE<条件>];
一、 修改某一个元组的值
例4 将学生95001的年龄改为22岁。
UPDATE Student
SET Sage=22;
WHERE Sno='95001';
二、修改多个元组的值
例5 将所有学生的年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;
三、带子查询的修改语句
子查询也可以嵌套在UPDATE语句中。
例6 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELECT Sdept
FROM Student
GROUP Student.Sno=SC.Sno);
删除数据
删除语句的一般格式为:
DELETE
FROM<表名>
[WHERE<条件>];
一、删除某一个元组的值
例7 删除学号为95019的学生记录。
DELETE
FROM Student
WHERE Sno='95019';
二、删除多个元组的值
例8 删除所有的学生的选课记录
DELETE
FROM SC;
三、带子查询的删除语句
例9 删除计算机科学所有学生的选课记录。
DELETE
FROM SC
WHERE 'CS'=
(SELECT Sdept
FROM Student
GROUP Student.Sno=SC.Sno);
建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW[<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION];
子查询不允许含有ORDER BY 子句和DISTINCT短语。
例1 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。
二、删除视图
该语句的格式为:
DROP VIEW <视图名>;
例8 删除视图IS_S1
DROP VIEW IS_S1;
执行此语句后, IS_S1视图的定义将从数据字典中删除。
视图的作用
视图最终是定义再基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而
且对于非行列子集视图进行查询和更新时还有可能出现问题。既然如此,为什么还要定义视图
呢?这是因为合理使用视图能够带来许多好处。
1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
相关阅读:
- SQL Server字符串处理函数大全 (coffeexl, 2008-4-08)
- SQL Server仍占据数据库市场主导地位 (coffeexl, 2008-4-08)
- 在SQL中删除重复记录(多种方法) (coffeexl, 2008-4-08)
- 在SQL Server中快速删除重复记录 (coffeexl, 2008-4-08)
- SQL简略教程 (51testing, 2008-4-09)
- PL/SQL基础小结 (51testing, 2008-4-10)
- 第2章 软件测试基础 (tiansm, 2008-4-11)
- 2.2 软件测试分类 (tiansm, 2008-4-13)
- sql基础 (srb66, 2008-4-15)
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 18431
- 日志数: 26
- 图片数: 2
- 文件数: 1
- 建立时间: 2008-04-20
- 更新时间: 2009-07-14