NOT NULL:限制列取值非空。
DEFAULT:给定列的默认值。
UNIQUE:限制列取值不重复。
CHECK:限制列的取值范围。
PRIMARY KEY:指定本列为主码。
FOREIGN KEY:定义本列为引用其他表的外码。
使用形式为:[FOREIGN KEY(<外码列名>)]REFERENCES <外表>(<外表列名>)
语法:
CREATE TABLE <表名>(<列名> <数据类型>[ <列级完整性约束条件>],<列名> <数据类型>[ <列级完整性约束条件>] ] …,<表级完整性约束条件> ] );
ALTER TABLE <表名>[ ALTER COLUMN <列名> <新数据类型>]|[ ADD <列名> <数据类型>| [ DROP COLUMN <列名> ] ;
DROP TABLE <表名>[RESTRICT|CASCADE];
RESTRICT:删除表是有限制的。欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除
示例:
(1)、创建Student表:
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY, //列级完整性约束条件
Sname CHAR(20) UNIQUE, // Sname取唯一值
Ssex CHAR(2) Default '男',
Sage SMALLINT,
Sdept CHAR(20)
);
(2)、修改Student表:
①向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DateTime
注:不论基本表中原来是否已有数据,新增加的列一律为空值
②将年龄的数据类型由字符型改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
③删除所在系。
ALTER TABLE drop column Sdept;
语法:
(1)、建立索引
CREATE [UNIQUE|CLUSTER] INDEX <索引名>ON<表名>(<列名>[<次序>]),<列名>[<次序>]);
(2)、删除索引
DROP INDEX <表名>.<索引名>;
注解:
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。一个表只能建立一个聚簇索引。
ASC 升序,DESC降序。缺省值为ASC。
(3)、删除Student表
DROP TABLE Student CASCADE ;
或DROP TABLE Student RESTRICT ;
示例:
(1)、建立索引
create unique index num on Student (Sno DESC) ;
(2)、删除索引
drop index Student.num;
语法:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式1> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
注解:
ALL查询选择表中所有符合要求的元祖。
DISTINCT取消取值重复的行。两个本来并不完全相同的元祖,投影到指定的某些列上后,可能变成相同的行,可以用DISTINCT取消它们。
若有GROUP BY子句,则将结果按列名1分组,该属性列值相等的元祖为一个组。
若GROUP BY子句带有HAVING短语,则只有满足条件组输出;
若有ORDER BY子句,则结果表还要按列名2来升或降序排列输出。
分类:
I、选择表中的若干列
①查询指定列
select Sno,Sdept from Student;
②查询全部列
select Sno,Sname,Sage,Ssex,Sdept from Student;
或select * from Student;
③查询经过计算的值
1、查全体学生的姓名及其出生年份。
select Sno,2015-Sage from Student;
或select Sno,YEAR(GETDATE())-Sage from Student;
2、查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
select Sname,year(getDate())-Sage,Lower(Sdept) from Student;
3、使用列别名改变查询结果的列标题:
select Sname 姓名,year(getDate())-Sage 出生年份,Lower(Sdept) 系别 from Student;
或select Sname as 姓名,year(getDate())-Sage as 出生年份,Lower(Sdept) as 系别 from Student;
注:2015-Sage中的2015不具有普遍性,而YEAR(GETDATE())动态变化(获得系统时间)。
II、选择表中的若干元组
①消除取值重复的行
注:若没有指定DISTINCT关键词,则缺省为ALL
1、select distinct Cno from SC;
②查询满足条件的元组
(1)、比较大小
语法:
=(等于),>(大于),<(小雨),>=(大于等于),<=(小于等于),!=或<>(不等于),!>(不大于),!<(不小于) 示例:
1、查询计算机科学系全体学生的名单。
select * from Student where Sdept = 'CS';
2、查询所有年龄在20岁以下的学生姓名及其年龄。
select Sname,Sage from Student where Sage<'20';
3、查询考试成绩有不及格的学生的学号。
select Sno from SC where Grade < '60';
(2)、确定范围(BETWEEN...AND...;NOT BETWEEN...AND...)
语法:
谓词BETWEEN...AND...和NOTBETWEEN...AND...可以用来查询属性在(或不在)确定范围内的元组,其中BETWEEN后是范围的下限
(即低值),AND后是范围的上限(即高值);包括上下限。
示例:
1、查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
select Sname,Sage,Sdept from Student where Sage between 20 and 23;
或select Sname,Sage,Sdept from Student where Sage>=20 and Sage<=23;
2、查询年龄不在20~23岁之间的学生姓名、系别和年龄
select Sname,Sage,Sdept from Student where Sage not between 20 and 23;
(3)、确定集合(IN;NOT IN)
语法:
谓词IN可以用来查找属性值等于指定集合的元组谓词NOT IN可以用来查找不属性值等于指定集合的元组
示例:
1、查询信息系(IS)、数学系(MA)和计算机科学系CS)学生的姓名和性别。
select Sname,Ssex from Student where Sdept in('IS','MA','CS');
或select Sname,Ssex from Student where Sdept='IS'or Sdept='MA'or Sdept= 'CS';
2、查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
select Sname,Ssex from Student where Sdept not in('IS','MA','CS');
(4)、字符匹配(LIKE;NOT LIKE)
语法:
谓词: [NOT] LIKE‘<匹配串>’[ESCAPE ‘<换码字符>’]
式中:<匹配串> 可是固定字符串或通配符 ’%’或 ’_’。
其中:%(百分号)代表任意长度(长度可为0)的字符串, _(下横线)代表任意单个字符。
示例:
1、查询学号为'200215121'的学生的详细情况。
select * from Student where Sno like 200215121;
2、查询所有姓刘学生的姓名、学号和性别。
select Sno,Sname,Ssex from Student where Sname like '刘%';
3、查询姓"欧阳"且全名为三个汉字的学生的姓名。
select Sname from Student where Sname like '欧阳_';
4、查询名字中第2个字为"阳"字的学生的姓名和学号。
select Sno,Sname,Ssex from Student where Sname like '_阳%';
5、查询所有不姓刘的学生姓名。
select Sno,Sname,Ssex from Student where Sname not like '刘%';
6、查询DB_Design课程的课程号和学分。
select Cno,Ccrediy from Course where Cname like 'DB\_Design' escape '\';
7、查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
select Cno,Ccrediy from Course where Cname like 'DB\_%i__' escape '\';
(5)、涉及空值的查询(IS NULL;IS NOT NULL)
1、某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
select Sno,Cno from SC where Grade is null;
2、查所有有成绩的学生学号和课程号。
select Sno,Cno from SC where Grade is not null;
(6)、多重条件查询
1、查询计算机系年龄在20岁以下的学生姓名。
select Sname from Student where Sdept = 'CS' and Sage < 20;
2、查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
select Sname,Ssex from Student where Sdept in('CS','MA','IS');
(1)等值与非等值连接查询
语法:
当运算连接符为=时,成为等值连接,使用其他运算符成为非等值连接
示例:
1、查询每个学生及其选修课程的情况
select Student.*,SC.* from Student,SC where SC.Sno=Student.Sno;
2、自然连接(去掉连接中的重复列)
select Student.*,Cno,Grade from Student,SC where SC.Sno=Student.Sno;
(2) 自身连接
示例:
1、查询每一门课的间接先修课(即先修课的先修课)
select First.Cno,Second.Cpno from Course First,Course Second where First.Cpno=Second.Cno;
(3)外连接
示例:
1、左外连接
select Student.*,Cno,Grade from Student LEFT JOIN SC on(Student.Sno=SC.Cno);
2、右外连接
select Student.*,Cno,Grade from Student RIGHT JOIN SC on(Student.Sno=SC.Cno);
注:在SQL server中 left out join...on中的out不写
(1)、并操作UNION
语法:
UNION将多个查询结果合并起来,系统会自动去掉重复元组,若要保留重复的元组则用UNION ALL操作符
示例:
1、查询计算机科学系的学生及年龄不大于19岁的学生。
select * from Student where Sage <=19 or Sdept = 'CS';
或select * from Student where Sage <=19 UNION select * from Student where Sdept='CS';
(2)、交操作INTERSECT
示例:
1、查询计算机科学系的学生与年龄不大于19岁的学生信息
select * from Student where Sage <=19 and Sdept = 'CS';
或select * from Student where Sage <=19 INTERSECT select * from Student where Sdept='CS';
(3)、差操作EXCEPT
示例:
1、查询计算机科学系的学生与年龄不大于19岁的学生的信息
select * from Student where Sage <=19 EXCEPT select * from Student where Sdept='CS';
语法:
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)]VALUES (<常量1> [,<常量2>] …
I、插入元组
示例:
1、将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
insert into Student(Sno,Sname,Ssex,Sdept,Sage) values('95020','陈冬','男','IS',18);
或 insert into Student values('95020','陈冬','男','IS',18);
注:若只指出表名,没有指出属性名,则属性列的次序要与GREATE TABLE 中的次序相同,空值用NULL表示
II、插入子查询结果
示例:
1、对每一个系,求学生的平均年龄,并把结果存入数据库。
INSERT INTO Deptage(Sdept,Avgage) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;
语法:
UPDATE <表名>SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>];
示例:
1、将学生95020的年龄改为22岁。
update Student set Sage=22 where Sno='95020';
2、将所有学生的年龄增加1岁。
update Student set Sage=Sage+1;
3、将信息系所有学生的年龄增加1岁。
update Student set Sage=Sage+1 where Sdept='IS';
4、将计算机科学系全体学生的成绩置零。
update SC set Grade=0 where Sno in (select Sno from Student where Sdept='CS');
或 UPDATE SC SET Grade=0 WHERE 'CS'=(SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno);
语法:
DELETE FROM <表名> [WHERE <条件>];
示例:
1、删除学号为95020的学生记录。
delete from Student where Sno='95020';
2、删除所有的学生选课记录。
delete from SC;
3、 删除计算机科学系所有学生的选课记录。
DELETE FROM SC WHERE 'CS'=(SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno);