综合统一:集模式数据定义语言(DDL)、外模式数据定义语言(SDDL)、数据存储描述语言(DSDL)、数据操纵语言(DML)于一体。
高度非过程化:只需提出“做什么”,而不需给出“怎么做”。
面向集合的操作方式:操作的对象与结果均是集合。
以同一种语法提供多种使用方式:直接使用\(SQL\)以及嵌入式的\(SQL\)。
语言简洁,简单易学。
下列SQL操作使用mysql数据库来执行。
# 建立模式(数据库)
create database learn_sql;
# 删除模式(数据库)
drop database learn_sql;
创建基本表:
# 创建学生表
create table Student(sno VARCHAR(20)
PRIMARY KEY,
Sname VARCHAR(20) UNIQUE, S
sex CHAR(2), Sage TinyINT,
Sdept CHAR(20));
# 创建课程表
create table course(cno char(4) primary key,
cname char(40) NOT null,
cpno CHAR(4),
Ccredit smallint,
foreign key (cpno) references course(cno));
# 创建成绩表
create table sc (sno char(9),
cno char(4),
grade tinyint,
primary key(sno, cno),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno));
每一个基本表都属于某一个模式,一个模式包含多个基本表。
修改基本表:
# 向Student表中增加“入学时间”列
alter table Student add S_entrance date;
# 增加课程名必须取唯一值的约束条件
alter table course add unique(cname);
删除基本表:
# 删除基本表、
# 级联删除
DROP TABLE student CASCADE
# 条件删除
DROP TABLE student CASCADE
# 建立索引
create UNIQUE INDEX Stuno ON Student(sno);
create UNIQUE INDEX coucno ON Course(cno);
create UNIQUE INDEX Scno ON SC(Sno ASC, Cno DESC);
# 删除索引
DROP INDEX Coucno ON Course;
SELECT <列名>
FROM <表名>
WHERE <条件>
GROUP BY <列名>
HAVING <条件>
ORDER BY <列名> <ASC|DESC>
# DISTINCT用于消除重复行
SELECT DISTINCT Sno
FROM SC
# ALL用于保留重复行
SELECT DISTINCT Sno
FROM SC
SELECT Sname
FROM Student
WHERE Sdept=‘SC‘
BEETWEEN value1 AND value2
范围查询语句。
IS NULL, NOT NULL
判空条件
GROUP BY
子句用根据指定属性分组,分组后聚合函数将作用于每一个组。
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno
SELECT S.*, SC.*
FROM Student AS s, SC
WHERE s.Sno = SC.Sno
SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Cno = ‘2‘)
在嵌套查询中,外层查询称父查询,内层查询称子查询;
可使用ANY
或ALL
谓词来比较子查询返回的值:参考博客
SELECT Sname, Sage
FROM Student
WHERE Sage < ANY(SELECT Sage
FROM Student
WHERE Sdept = ‘CS‘)
还可使用EXISTS
谓语来判断子查询是否返回数据:[参考博客
集合查询操作:参考博客
在FROM
语子句中嵌入一个查询:
SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade)
FROM SC
GROUP BY Sno
)AS Avg_sc(avg_sno, avg_grade)
# 两种插入方式
INSERT INTO Sutdent(Sno, Sname, Ssex, Sage)
VALUES(‘201215128‘, ‘张三‘, ‘IS‘, ‘18‘)
INSERT INTO Sutdent VALUES(‘201215128‘, ‘张三‘, ‘IS‘, ‘18‘)
# 插入子查询的结果
ISNERT INTO S1
SELECT *
FROM S2;
# 修改满足条件的元组的值
UPDATE Student
SET Sage = 22
WHERE Sno = ‘14182401708‘
# 修改表中所有元组的值
UPDATE Student
SET Sage = Sage + 1
# 删除满足条件的元组的值
DELETE
FROM Student
WHERE Sno = ‘14182401708‘
# 删除表中所有元组的值
DELETE
FROM Student
空值(NULL)即不存在的、无意义的值。
空值可以使用IS NULL
或IS NOT NULL
来表示,
SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据。
# 创建视图
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept = ‘IS‘
WITH CHECK OPTION
CREATE VIEW只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
DROP VIEW IS_Student
在查询视图时,首先进行有效性检查,例如涉及的表、视图是否存在。若存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后执行修正了的查询。这一转换称为视图消解。
更新视图与查询视图是同样的原理,将对视图的更新转换为对
原文:https://www.cnblogs.com/jmhwsrr/p/14163456.html