数据库SQL语言
CREATE SCHEMA A AUTHORIZATION WANG; 创建模式A授权给WANG,没有模式名时默认为WANG(用户名),模式名有时用""括起来
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20)
);
DROP SCHEMA TEST <CASCADE|RESTRICT>; 级联 限制
DROP SCHEMA ZHANG CASCADE;
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, 主码 PRIMARY KEY (Sno,Cno),
Sname CHAR(20) UNIQUE, Sname取唯一值
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
Cno CHAR(4),
FOREIGN KEY (Cno) REFERENCES Course(Cno) Cno是外码,被参照表是Course,被参照列是Cno
);
ALTER TABLE TAB2 ADD S_entrance DATE; 向student表中增加“入学时间”列,其数据类型为日期型
ALTER TABLE TAB2 DROP COLUMN Sage CASCADE 删除Sage这列 级联删除
ALTER TABLE TAB2 DROP CONSTRAINT<完整性约束名>[CASCADE|RESTRICT] 用于删除指定的完整性约束条件
ALTER TABLE TAB2 ALTER COLUMN Sage INT; ALTER COLUMN用于修改原有列定义,包括修改列名和数据类型
将年龄的数据类型改为整数
ALTER TABLE TAB2 ADD UNIQUE(Cname); 增加课程名称必须取唯一值的约束条件
DROP TABLE TAB2 RESTRICT; 欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),
不能有视图,不能有触发器(trigger),不能有存储过程或函数等。
如果存在这些依赖该表的对象,则此表不能被删除
CREATE VIEW IS_Student Student表上建立视图
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept=‘IS’;
索引
CREATE [UNIQUE] [CLUSTER] INDEX<索引名> 索引可以建立在该表的一列或多列上,各列之间用,隔开、
ON<表名>(<列名>[<次序>] [,<列名>[<次序>]]…); 次序是指排列次序可选ASC(升序)或DESC(降序),默认值为ASC、
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表明要建立的索引是聚簇索引。相同放一起。
CREATE UNIQUE INDEX Stusno ON Student(Sno); 为表Student建立索引,其中Student表按学号升序建立唯一索引
CREATE UNIQUE INDEX Coucno ON Course(Cno); 为表Course按课程号 升序建立唯一索引。
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); SC表按学号升序和课程号降序建立唯一索引
ALTER INDEX<旧索引名>RENAME TO <新索引名>;
ALTER INDEX SCno RENAME TO SCSno; 将SC表的SCno索引名改为SCSno
DROP INDEX <索引名>;
DROP INDEX Stusname; 删除Student表中的Stusname索引。
数据查询
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>…] |(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]] 将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
[ORDER BY<列名2>[ASC|DESC]]; 如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果表 还要按照<列名2>的值的升序或降序排序。
SELECT语句可单表查询还可连接查询和嵌套查询
例子:
SELECT Sno,Sname SELECT *
FROM Student; FROM Student
SELECT Sname,2019-Sage Sname 2019-Sage
FROM Student; 小明 1997
SELECT Sname,‘Year of Birth:’,2019-Sage,LOWER(Sdept) Sname ‘Year of Birth:’ 2019-Sage LOWER(Sdept) 小写字母表示系名
FROM Student; 小强 ‘Year of Birth:’ 1997 cs
用户可通过指定别名来改变查询结果的列标题
SELECT Sname NAME,‘Year of Birth:’ BIRTH,2019-Sage BIRTHDAT,LOWER(Sdept) DEPARTMENT
FROM Student;
结果: NAME BIRTH BIRTHDAY DEPARTMENT
小刚 ‘Year of Birth’ 1997 cs
SELECT DISTINCT Sno 去掉结果表中的重复行,必须指定DISTINCT
FROM SC; 无DISTINCT 默认为ALL
WHERE子句
确定范围 BETWEEN AND 在、、之间 NOT BETWEEN AND 除了
确定集合 IN NOT IN
字符匹配 LIKE NOT LIKE
空值 IS NULL IS NOT NULL
多重条件(逻辑运算) AND OR NOT
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;
用索引有可能会避免全表扫描 加快查询速度
BETWEEN 低值 AND 高值
SELECT Sname Sno CS 计算机科学系 MA数学系 IS信息系 查询这三个系的学生的姓名和学号
FROM Student
WHERE Sdept IN(‘CS’,‘MA’,‘IS’);
LIKE 匹配串 通配符 % _ a%b 表示以a开头,以b结尾的任意长度的字符串、
a_b 表示以a开头,以b结尾的长度为3的任意字符串。 代表任意单个字符
SELECT * 注意数据库字符集为ASCII时一个汉字需要两个;当字符集为GBK时只需要一个_
FROM Student
WHERE Sno LIKE ‘201215121’; LIKE后的匹配串不含通配符时可用=代替,用!=和<>代替NOT LIKE
查询姓刘的学生的学号
SELECT Sno
FROM Student
WHERE Sname LIKE ‘刘%’;
如果用户要查询的字符串本身就含有通配符%或_ 这时就要使用 ESCAPE ‘<换码字符>’ 短语对通配符进行转义
例: 查询DB_Design课程的课程号和学分
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE’’;
例: 查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE ‘DB_%i__’ ESCAPE’’;
SELECT Sno,Cno
FROM Student
WHERE Grade IS NULL; IS 不能用=代替
AND 优先级高与 OR
IN 谓词实际上是多个OR运算符的缩写
例子:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno=‘3’
ORDER BY Grade DESC;
对于空值,排序时显示的次序由具体系统实现来决定,各个系统的实现可以不同,只要保持一致就行。
例子:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
SQL提供的聚集函数 当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。
聚集函数只能用于SELECT子句和GROUP BY 中的HAVING子句。
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值
MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值
查询学生总人数
SELECT COUNT(*)
FROM Student;
查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
计算选修1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno=‘1’;
查询选修1号课程的学生最高分
SELECT MAX(Grade)
FROM SC
WHERE Cno=‘1’;
查询学生201215012选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;
GROUP BY 子句
分组后聚集函数将作用于每一组,即每一组都有一个函数值
求各个课程号及相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询选修了三门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
WHERE子句与HAVING短语的区别在于作用对象不同。
WHERE子句作用于基本表或视图,从中选择满足条件的元组。
HAVING语句作用于组,从中选择满足条件的元组
查询平均成绩大于等于90分的学生学号和平均成绩;
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
连接查询