当确信不再需要某个表时,可以将其删除
删除表时会将与表有关的所有对象一起删掉,包括表中的数据。
删除表的语句格式为:
DROP TABLE <表名> { [, <表名> ] … }
例:删除test表的语句为:
DROP TABLE test
在定义完表之后,如果需求有变化,比如添加列、删除列或修改列定义,可以使用
ALTER TABLE语句实现。
ALTER TABLE语句可以对表添加列、删除列、修改列的定义、定义主码、外码,也可以添加和删除约束。
ALTER TABLE <表名>
[ ALTER COLUMN <列名> <新数据类型>]
| [ ADD [COLUMN] <列名> <数据类型>
| [ DROP COLUMN <列名> ]
| [ADD PRIMARY KEY(列名 [,… n ] )]
| [ADD FOREIGN KEY(列名)
REFERNECES 表名(列名)]
例2.为SC表添加“修课类别”列,此列的定义为:XKLB char(4)
ALTER TABLE SC
ADD XKLB char(4) NULL
例3.将新添加的XKLB的类型改为
char(6)。
ALTER TABLE SC
ALTER COLUMN XKLB char(6)
例4.删除Course表的Period列。
ALTER TABLE Course
DROP COLUMN Period
SELECT <目标列名序列> --需要哪些列
FROM <数据源> --来自于哪些表
[WHERE <检索条件>] --根据什么条件
[GROUP BY <分组依据列>]
[HAVING <组提取条件>]
[ORDER BY <排序依据列>]
查询表中用户感兴趣的部分属性列。
例5:查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student
例6:查询全体学生的姓名、学号和所在系。
SELECT Sname,Sno,Sdept
FROM Student
例7.查询全体学生的记录
SELECT Sno,Sname,Ssex, Sage, Sdept FROM Student
等价于:
SELECT * FROM Student
例8.查询全体学生的姓名及其出生年份。
SELECT Sname,2006 - Sage
FROM Student
例9.查询全体学生的姓名和出生年份所在系,并在出生年份列前加入一个列,此列的每行数据均为‘出生年份’常量值。
SELECT Sname,‘出生年份’, 2006-Sage
FROM Student
语法:
列名 | 表达式 [ AS ] 列标题
或:
列标题 =列名 | 表达式
例:
SELECT Sname 姓名,‘Year of Birth’ 出生年份,
2006 - Sage 年份,
FROM Student
例10.在修课表中查询有哪些学生修了课程,要求列出学生的学号。
SELECT Sno FROM SC
结果中有重复的行。
用DISTINCT关键字可以去掉结果中的重复行。
DISTINCT关键字放在SELECT词的后边、目标列名序列的前边。
SELECT DISTINCT Sno FROM SC
例11.查询计算机系全体学生的姓名。
SELECT Sname FROM Student
WHERE Sdept = '计算机系'
例12.查询年龄在20岁以下的学生的姓名及年龄。
SELECT Sname, Sage FROM Student
WHERE Sage < 20
例13.查询考试成绩有不及格的学生的学号
SELECT DISTINCT Sno FROM SC
WHERE Grade < 60
用BETWEEN…AND和NOT BETWEEN…AND
是逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后边指定范围的下限,AND后边指定范围的上限。
BETWEEN…AND…的格式为:
列名 | 表达式 [ NOT ] BETWEEN 下限值 AND 上限值
如果列或表达式的值在[不在]下限值和上限值范围内,则结果为True,表明此记录符合查询条件。
例14.查询年龄在20~23岁之间的学生的姓名、所在系和年龄。
SELECT Sname, Sdept, Sage FROM Student
WHERE Sage BETWEEN 20 AND 23
例15.查询年龄不在20~23之间的学生姓名、所在系和年龄。
SELECT Sname, Sdept, Sage FROM Student
WHERE Sage NOT BETWEEN 20 AND 23
使用IN运算符。
用来查找属性值属于指定集合的元组。
格式为:
列名 [ NOT ] IN (常量1, 常量2, … 常量n)
当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录;
NOT IN:当列中的值与某个常量值相同时,则结果为False,表明此记录为不符合查询条件的记录
例16.查询信息系、数学系和计算机系学生的姓名和性别。
SELECT Sname, Ssex FROM Student
WHERE Sdept IN ('信息系', '数学系', '计算机系')
例17.查询既不是信息系、数学系,也不是计算机系学生的姓名和性别。
SELECT Sname, Ssex FROM Student
WHERE Sdept NOT IN ('信息系', '数学系', '计算机系')
使用LIKE运算符
一般形式为:
列名 [NOT ] LIKE <匹配串>
匹配串中可包含如下四种通配符:
_:匹配任意一个字符;
%:匹配0个或多个字符;
[ ]:匹配[ ]中的任意一个字符;
[ ^ ]:不匹配[ ]中的任意一个字符
例18.查询姓‘张’的学生的详细信息。
SELECT * FROM Student
WHERE Sname LIKE '张%'
例19.查询学生表中姓‘张’、‘李’和‘刘’的学生的情况。
SELECT * FROM Student
WHERE Sname LIKE ' [张李刘]%'
例20.查询名字中第2个字为‘小’或‘大’的学生的姓名和学号
SELECT Sname, Sno FROM Student
WHERE Sname LIKE '_[小大]%'
例21.查询所有不姓“刘”的学生。
SELECT Sname FROM Student
WHERE Sname NOT LIKE '刘%‘
例22.查询学号的最后一位不是2、3、5的学生情况。
SELECT * FROM Student
WHERE Sno LIKE '%[^235]'
空值(NULL)在数据库中表示不确定的值。
例如,学生选修课程后还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成绩为空值。
判断某个值是否为NULL值,不能使用普通的比较运算符。
判断取值为空的语句格式为:
列名 IS NULL
判断取值不为空的语句格式为:
列名 IS NOT NULL
例23.查询无考试成绩的学生的学号和相应的课程号。
SELECT Sno, Cno FROM SC
WHERE Grade IS NULL
例24.查询所有有考试成绩的学生的学号和课程号。
SELECT Sno, Cno FROM SC
WHERE Grade IS NOT NULL
在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。
用AND连接的条件表示必须全部满足所有的条件的结果才为True;
用OR连接的条件表示只要满足其中一个条件结果即为True。
例25.查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student
WHERE Sdept = 'CS' AND Sage < 20
可对查询结果进行排序。
排序子句为:
ORDER BY <列名> [ASC | DESC ] [,<列名> … ]
说明:按<列名>进行升序(ASC)或降序(DESC)排序。
例26.将学生按年龄的升序排序。
SELECT * FROM Student ORDER BY Sage
例27.查询选修了‘c02’号课程的学生的学号及其成绩,查询结果按成绩降序排列。
SELECT Sno, Grade FROM SC
WHERE Cno='c02' ORDER BY Grade DESC
例28.查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。
SELECT * FROM Student
ORDER BY Sdept, Sage DESC
SQL提供的计算函数有:
COUNT( * ):统计表中元组个数;
COUNT([DISTINCT] <列名> ):统计本列列值个数;
SUM([DISTINCT] <列名> ):计算列值总和;
AVG([DISTINCT] <列名> ):计算列值平均值;
MAX([DISTINCT] <列名> ):求列值最大值;
MIN([DISTINCT] <列名> ):求列值最小值。
上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。
例29.统计学生总人数。
SELECT COUNT(*) FROM Student
例30.统计选修了课程的学生的人数。
SELECT COUNT (DISTINCT Sno)
FROM SC
例31 计算9512101号学生的考试总成绩之和。
SELECT SUM(Grade) FROM SC
WHERE Sno = '9512101'
例32.计算’C01’号课程学生的考试平均成绩。
SELECT AVG(Grade) FROM SC
WHERE Cno='C01'
例33.查询选修了’C01’号课程的学生的最高分和最低分。
SELECT MAX(Grade) , MIN(Grade)
FROM SC WHERE Cno='C01'
注意:计算函数不能出现在WHERE子句中
作用:可以控制计算的级别:对全表还是对一组。
目的:细化计算函数的作用对象。
分组语句的一般形式:
[GROUP BY <分组条件>]
[HAVING <组过滤条件>]