基础篇——4.SQL
1 数据库基本对象DDL
(数据库定义语言)
sql 不提供修改模式定义和修改视图定义的操作。如果想要更改,智能删除重建。
数据库中操作的基本对象主要有以下内容:模式、表、视图、索引
1.1 基本对象概述
主要包括增删改。没有针对基本对象的查询。就像你会查询表中的数据,但是不会查询存在的某一张表。查询表不存在,应该是查询表中的数据。
| 操作对象 | 创建 | 删除 | 修改 |
|---|---|---|---|
| 模式SCHEMA | CREATE SCHEMA | DROP SCHEMA | |
| 表TABLE | CREATE TABLE | DROP TABLE | ALTER TABLE |
| 视图VIEW | CREATE VIEW | DROP VIEW | |
| 索引INDEX | CREATE INDEX | DROP INDEX | ALTER INDEX |
| 字段COLUMN | ADD COLUMN | DROP COLUMN | ALTER COLUMN |
1 | graph LR |
- 基本对象的创建、删除、修改。
其中表的修改包括对字段的增减、删除、修改等。其实我觉得这里也可以把字段看做数据库的基本对象,也有增删查改。基本对象和数据对象是相互独立的。字段作为基本对象的时候,必须指明属于哪一张表。
1.2 模式SCHEMA
创建
1 | ``` |
1 |
|
1 |
|
1 |
|
1 |
|
CREATE VIEW <视图名>[列名,列名,…]
AS <子查询>
[WITH CHECK OPTION];
1 |
|
行列子集视图-单个基本表视图。示例(建立信息系学生的视图)
CREATE VIEW IS_Student
AS SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept=’IS’
[WITH CHECK OPTION];
1 | > 添加WITH CHECK OPTION ,对视图进行插入、修改和删除操作时,关系数据库管理系统会自动添加 满足视图条件的内容(Sdept='IS'). |
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept=’IS’
AND Student.Sno=SC.Sno
AND SC.Cno=’1’;
1 | > 视图可以建立在一个或多个已经定义好的基本表或者视图上。 |
添加了虚拟的计算列
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS SELECT Sno,Sname,2014-Sage
FROM Student;
使用了聚集函数
CREATE VIEW S_G(Sno,Gavg)
AS SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
1 | > 总的来说,由SELECT语句进行查询形成的结果都能够构成一个单一的视图。 |
DROP VIEW <视图名> [CASCADE]
DROP VIEW BT_S;
1 | > 删除了已经建立的视图 |
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
1 |
|
插入
INSERT INTO IS_Student
VALUES(‘2015’,’zx’,20);
转化为
INSERT INTO Student(Sno,Sname,Sage,Sdept)
VALUES(‘2015’,’zx’,20,’IS’)
1 |
|
删除
DELETE FROM IS_Student
WHERE Sno=’2012’;
转化为
DELETE FROM Student
WHERE Sno=’2012’
AND Sdept=’IS’;
1 |
|
修改
UPDATE IS_Student
SET Sname=’lc’
WHERE Sno=’2012’
转化为
UPDATE Student
SET Sname=’lc’
WHERE Sno=’2012’
AND Sdept=’IS’;
1 |
|
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>],…)
实例
CREATE UNIQUE INDEX SCno ON SC(Sno,Cno DESC);
1 |
|
DROP INDEX <索引名>;
实例
DROP INDEX <索引名>;
1 |
|
ALTER INDEX <旧索引名> RENAME TO <新索引名>
实例
ALTER INDEX SCno RENAME TO SCSno
1 |
|
INSERT
INTO
1 |
|
INSERT
INTO
1 |
|
DELETE
FROM
1 |
|
DELETE
FROM Student
WHERE Sno=’20125128’
1 |
|
DELETE
FROM SC
1 |
|
DELETE FROM SC
WHERE Sno In
(SELECT Sno
FROM Student
WHERE Sdept=’CS’)
1 | ## 2.3 修改 |
UPDATE
1 |
|
UPDATA Student
SET Sage=Sage+1
1 |
|
UPDATE SC
SET Grade = 0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept=’CS’)
1 |
|
指定列
SELECT sno,sname FROM Student;
全部列
SELECT * FROM Student;
计算列
SELECT Sname,2014-Sage FROM Student;
字符串列
SELECT Sname,’Year of Birth:’,2014-Sage FROM Student;
函数列
SELECT LOWER(Sdept) FROM Student;
列别名
SELECT Sname NAME,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student
1 |
|
取消重复元组
SELECT DISTINCT Sno FROM SC;
满足附加条件的元组-比较
SELECT Sname FROM Student WHERE Sdept=’CS’
确定范围
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage NOT BETWEEN 20 AND 23
确定集合
SELECT Sname,Ssex FROM Student
WHERE Sdept IN (‘CS’,’MA’,’IS’);
字符串匹配
SELECT Sname,Sno FROM Student
ERE Sname LIKE ‘_阳%’
涉及空值的查询
SELECT Sno,Cno From SC
WHERE Grade IS NULL
多重条查询
SELECT Sname FROM Student
WHERE Sdept=’CS’ AND Sage<20
1 |
|
ORDER BY 排序
SELECT Sno,Grade FROM SC
WHERE Cno = ‘3’
ORDER BY Grade DESC;
1 | > 空值的排序根据具体的系统来决定。 |
普通的分组查询
SELECT Cno,COUNT(Sno) FROM SC
GROUP BY Cno;
带有分组条件的分组查询
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(*)>3
1 |
|
SELECT Student.,SC.
FROM Student, SC
WHERE Student.Sno=SC.Sno
1 | > 嵌套循环连接查询的基本步骤:首先扫描第一个表的第一个元组,然后从头扫描SC,查找满足条件的元组就进行拼接。 |
SELECT first.Cno,second.Cpno
FROM Course first,Course second
WHERE first.Cpno=second.Cno;
1 |
|
SELECT student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC on(Student.Sno=SC.Sno);
1 |
|
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Cource
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
1 |
|
不相关子查询_选修了“信息系统”的学生姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname=’信息系统’
)
);
1 |
|
相关子查询_超过自己选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
1 |
|
1 |
|
SELECT Sname
FROM Student
WHERE EXISTS
(SELSECT *
FROM SC
WHERE Sno=Student.Sno AND Cno=’1’);
等价于
SELECT Sname
FROM Student
WHERE Student.Sno IN
(SELECT SC.Sno
FROM SC
WHERE SC.Cno=’1’)
1 |
|
查询结果集合的并集
SELECT * FROM Student
WHERE Sdpt=’CS’
UNION
SELECT * FROM Student
WHERE Sage<=19
查询结果集合的交集
SELECT * FROM Student
WHERE Sdept=’CS’
INTERSECT
SELECT * FROM Student
WHERE Sage<=19
查询结果的差集
SELECT * FROM Student
WHERE Sdept=’CS’
EXCEPT
SELECT * FROM Student
WHERE Sage<=19
1 |
|
相关子查询改为基于派生表的查询
SELECT Sno,Cno
FROM SC,(SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno) AS AVG_sc(avg_sno,avg_grade)
WHERE SC.sno=avg_sc.avg_sno and SC.Grade >= AVG_sc.avg_grade
1 | > 必须为派生关系指定一个别名。 |
IS NULL //空值
IS NOT NULL// 非空值
### 4.3 空值的约束条件
* 如果在字段定义中使用了NOT NULL、Primary Key、UNIQUE,则该属性不能使用空值。
### 4.4 空值的算术运算、比较运算和逻辑运算
* 空值与另一个值的算术运算结果为空值。
* 空值与另外一个值的比较运算结果为UNKNOWN
* 空值与另外一个值的逻辑运算遵循逻辑运算的法则。如果需要考虑空值,则为UNKNOWN,如果不虚要考虑空值就能得到结果,则为已经得到的结果。




