3.1关系数据库标准语言SQL
(Structured Query Language )结构化查询语言
数据查询:SELECT
数据定义:CREATE\DROP
数据操纵:INSERT\UPDATE\DELETE
数据控制:GRANT\REVOKE
3.1.1 数据定义
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
3.1.2 模式的定义与删除
定义模式
CREATE SCHEMA 名字 AUTHORIZATION 用户名
create schema "test" authorization wang
CREATE TABLE NAME(SID INT,
SNAME CHAR(20)
);
删除模式
DROP SCHEMA 名字 CASCADE|RESTRICT
CASCADE:级联 RESTRICT:限制
3.1.3 基本表的定义与修改
定义基本表
CREATE TABLE 表名 (列名 数据类型 列级完整性约束条件,
列名 数据类型 约束条件
表级完整性约束条件);
约束条件:UNIQUE\PRIMARY KEY\NOT NULL
表级完整性约束条件:FOREIGN KEY(Sno) REFERENCES Course(Cno)
数据类型:char(n)定长、varchar(n)变长字符串、BLOB二进制大对象、TIME时分秒、Date年月日等
修改基本表
ALTER TABLE 表名
ADD COLUMN 新列名 数据类型 [约束]
ADD [表级完整性约束条件]
DROP COLUMN 列名 CASCADE|RESTRICT
DROP CONSTRAINT 约束 CASCADE|RESTRICT
DROP COLUMN 列名 数据类型
删除基本表
DROP TABLE 表名 CASCADE|RESTRICT
3.1.3 索引的建立与删除
建立索引
CREATE [UNIQUE] [CLUSTER] INDEX 索引名 ON 表名 (列名)
CREATE UNIQUE INDEX Stuno ON Student(Sno);
ASC升序、DESC降序
修改索引
ALTER INDEX 旧索引名 RENAME TO 新索引名
3.2 数据查询
SELECT ALL|DISTINCT 目标列表达式 FROM 表名或视图名 WHERE 条件表达式 GROUP BY 列名 HAVING 条件表达式 ORDER BY 列名 ASC|DESC
DISTINCT:消除重复行
比较运算符=、>、>=、<、<=、!=或<>、!>、!<
逻辑运算符and、or、not
模糊匹配
like
NO LIKE
%表示任意多个任意字符
_表示一个任意字符
查询姓黄的学生
select * from chanpin where name like '%车';
查询名字以车结尾的产品
范围查询
in表示在一个非连续的范围内
not in表示不在一个非连续的范围内
BETWEEN 下限 AND 上限、 NOT BETWEEN AND
空值查询
is null
is not null
3.2.1 聚合函数
- COUNT():统计行数量
- SUM:获取单个列的合计值
- AVG:计算某个列的平均值
- MAX:计算列的最大值
- MIN:计算列的最小值
案例:
(1)查询选修课程的学生人数 SELECT COUNT(DISTINCT Sno) FROM SC;
(2)计算选修1号课程的学生的平均成绩 SELECT AVG(GRADE) FROM SC WHERE Cno='1';
(3)查询学生201507110选修课程的总课程 SELECT SUM(Ccredit) FROM SC,Course WHERE Sno='201507110' AND SC.Sno=Course.Cno
(4)求各个课程号及其相应的选课人数 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
(5)选修三门以上课程的学生学号:SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3;
GROUP BY 将查询结果按某一列或多列的值分组,值相等为一组。
WHERE 子句与HAVING短句的区别在于作用对象不同。WHERE 子句--基本表或视图、HAVING短句--组,后面可以加聚集函数
3.2.2 连接查询
等值与非等值连接查询
连接运算符是=时,称为等值连接。
在等值连接时中把目标列中重复的属性列去掉则为自然连接
自身连接
给表取别名
SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno
外连接
不满足条件的元组也保存,即保存悬浮元组
SELECT * FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
多表查询
SELECT * FROM SC,Student,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
嵌套查询
一个SELECT-FROM-WHERE称为查询块
将查询块嵌套在另一个查询块的WHERE子句或HAVING短句的条件中
注意!!!子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最后的查询结果排序
带有IN谓词的子查询
- 不相关子查询:子查询的查询条件不依赖于父查询
实例:SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname='amber');
- 相关子查询:子查询的查询条件依赖于父查询
带比较运算符的子查询:用=、>、<等代替IN
带ANY(SOME)或ALL的子查询,如<ANY、>SOME等
带EXISTS、NOT EXISTS谓词的子查询,不返回任何数据,只返回true或false
3.2.2 集合查询
UNION:并操作,查询结果列数一定要相同,对应项的数据类型也必须相同
INTERSECT:交操作
EXCEPT:差操作
3.3 数据更新
插入元组在: INSERT INTO 表名 属性列 VALUES()
INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage)FROM Student GROUP BY Sdept;
修改操作
UPDATE Student SET Sage=22 WHERE Sno='201507110';
删除数据
DELETE FROM Student WHERE Sno='201507111';
3.4 视图
3.4.1 建立视图
CREATE VIEW 视图名 (列名,列名,,) AS 子查询 [ WITH CHECK OPTION];
WITH CHECK OPTION:删改查操作时必须满足视图定义的谓词条件(即子查询中的条件表达式)
分组视图:带有聚集函数和GROUP BY 子句的查询来定义视图
删除视图:DROP VIEW 视图名 CASCADE
3.4.2 查询视图
视图消解:从数据字典中取出视图的定义,把定义中的子查询和用户查询结合起来,转换成等价的基本表查询,再执行修改后的查询。(对师徒查询转换成对基本表的查询)
SELECT Sno,Sage FROM IS_Student WHERE Sage <20
转换后:SELECT Sno,Sage FROM Student WHERE Sdept='IS' and Sage <20
3.4.3 更新视图
不是所有试图都是可更新的。由两个以上的基本表导出的,则此视图不允许更新等。
UPDATE Sno,Sage FROM Student WHERE Sdept='IS' and Sage <20
转换为更新基本表