数据库系统原理的第一部分讲完了,也就是SQL语言基础,先做总结如下:
下面主要说以下标准SQL的语法部分,也就是新建,查询,更新,视图,安全性,完整性。
创建如下对象的方法:
模式: CREATE SCHEMA
表:CREATE TABLE
视图:CREATE VIEW
索引:CREATE INDEX
同样的,有创建就有删除,删除这些对象的方法如下:
模式: DROP SCHEMA
表:DROP TABLE
视图:DROP VIEW
索引:DROP INDEX
例:建立一个学生表:
CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );
这其中还包含后面完整性的东西,例如PRIMARY KEY主键的定义。
数据类型 | 含义 |
---|---|
CHAR (n) | 定长为n的字符串 |
INT | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
DOUBLE PRECISION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n为数字 |
DATE | 日期,包含年月日,格式为YYYY-MM-DD |
TIME | 时间,包含一日的时,分,秒格式为HH:MM:SS |
例:向Student表中增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
例:删除Student表:
DROP TABLE Student CASCADE;
其中CASCADE是级联的意思,在删除该基本表的同时,相关的依赖对象比如视图,都将一并被删除。
数据查询是数据库的核心操作,SQL所提供的是SELECT语句。
经常搭配FROM WHERE GROUP BY语句使用。
例:查询学生表中全体学生的学号
SELECT Sno, FROM Student;
例:查询Student整表
SELECT *, FROM Student;
其中,*表示所有属性,也可改成,罗列出所有属性,Sname,Sno,Sage,Ssex等,但是肯定麻烦一些。
可以用DISTINCT来消除重复行
例:
SELECT DISTINCT Sno FROM SC;
查询条件 | 谓词 |
---|---|
比较 | =,<,>,>=,<=,!=; |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件 | AND,OR,NOT |
GROUP BY子句:
可以对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,默认值为升序
聚集函数:
COUNT 统计元组个数
SUM 计算一列值的个数
AVG 计算一列值的平均值
MAX 求一列值中的最大值
MIN 求一列值中的最小值
连接查询:
即涉及到两个及两个以上的表的查询。
一般使用连接运算符,分为等值查询(使用=连接的)和非等值查询(不使用等号连接的)
例:查询选修2号课且成绩在90分以上的所有学生的学号和姓名:
SELECT Student,Sno,Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>90;
当然,也可以进行自身连接查询,但是需要对表分别命名,如SC X,SC Y
嵌套查询:
和C语言中的嵌套差不多意思。
例:
SELECT Sname/*外层查询或父查询*/ FROM Student WHERE Sno IN (SELECT Sno/*内层查询或子查询*/ FROM SC WHERE Cno='2');
需要注意的是:子查询的条件不依赖父查询,叫做不相关子查询,也可以理解为由里向外,而由外向里的叫做相关子查询。
集合查询
多个SELECT语句的结果可以进行集合操作,包括并操作UNION,交操作INTERSECT,差操作EXCEPT。
例:查询选修了课程1的学生集合和选修2号课程的学生集合的并集
SELECT Sno FROM SC WHERE Cno=‘1’ UNION SELECT Sno FROM SC WHERE Cno=‘2’;
上例也可以用AND语句,更简单一些。使用的时候要学会视情况而选择最简便最适合的方法。
3.更新
更新操作主要分3种,插入,修改和删除
插入
INSERT语句
例:将一个新的学生元组插入到Student表中
INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage) VALUES('201215128','陈东',‘男’,‘IS’,18);
修改
UPDATE语句
例:将学生201215121的年龄改为22岁
UPDATE Student SET Sage=22 WHERE Sno='201215121';
删除
DELETE语句,需要注意的是,DROP语句也有删除的作用,但是后者一般用于删除结构,比如TABLE,而DELETE一般适用于删除数据。
例:删除学号为201215128的学生记录
DELETE FROM Student WHERE Sno='201215128';
ps:原来我都是建表之后手打数据,但是直接删掉太心疼了,所以学会了INSERT的用法。
4.视图
视图类似表,但是是“虚”的,数据库只存放其定义,不存放其显示的数据
定义:
建立视图
例:建立信息系学生的视图
CERATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';
删除视图
例:删除视图BT_S和视图IS_S1
DROP VIEW BT_S; DROP VIEW IS_S1 CASCADE;
查询视图
语句和普通的查询一致
例:在信息系学生的视图中找出年龄小于20岁的学生:
SELECT Sno,Sage FROM IS_Student WHERE Sage<20;
更新视图
和表的更新操作一致,改成VIEW就行了
例:删除信息系学生视图IS_Student中学号为“201215129”的记录
DELETE
FROM IS_Student
WHERE Sno=‘201215129’;
总结,SQL语言要多练习,熟悉之后还是可以发现很多共同点。
加油