
3.1 SQL 概述 3.1.1 SQL 的特点概述:了解数据库表单的查找、删除、添加、修改
1. 综合统一 1. 高度非过程化 1. 面向集合的操作方式 1. 以同一种语法结构提供多种使用方式 1. 语言简洁. 易学易用
3.2 学生-课程数据库了解即可
这里给出navicat的三个表:Student、Course、Sc
基本格式:CREATE TABLE <表名> (<列名><数据类型> [列级完整性约束条件]
[,<列名><数据类型> [列级完整性约束条件]]
[,<表级完整性约束条件>])
简而言之:CREATE TABLE + 表名 + 列名(也就是属性) + 列级完整性约束条件
CREATE TABLE student ( Sno CHAr ( 9 ) PRIMARY KEY, Sname CHAr ( 20 ) UNIQUE, Ssex CHAr ( 2 ), Sage SMALLINT, 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 SMALLINT, PRIMARY KEY ( Sno, Cno ), FOREIGN KEY ( Sno ) REFERENCES student ( Sno ), FOREIGN KEY ( Cno ) REFERENCES Course ( Cno ) );2. 数据类型
基本格式:INSERT
lNTO<表名> [(<属性列 I>[,<属性列 2>] ···)]
VALUES(<常量l>[,<常量>]…);
简而言之:INSERT + lNTO + 表名 + VALUES()
这里就把上述三个表的数据插入
INSERT INTO `student` VALUES('201215121','李勇','男','20','CS');
INSERT INTO `student` VALUES('201215123','王敏','女','18','MA');
INSERT INTO `student` VALUES('201215122','刘晨','女','19','CS');
INSERT INTO `student` VALUES('202115125','张立','男','19','IS');
INSERT INTO `course` VALUES ('1','数据库', '5', '4');
INSERT INTO `course` VALUES ('2', '数学', NULL, '2');
INSERT INTO `course` VALUES ('3', '信息系统','1', '4');
INSERT INTO `course` VALUES ('4', '操作系统', '6', '3');
INSERT INTO `course` VALUES ('5', '数据结构', '7', '4');
INSERT INTO `course` VALUES ('6', '数据处理', NULL, '2');
INSERT INTO `course` VALUES ('7', 'PASCAL语言', '6', '4');
INSERT INTO `sc`(Sno,Cno, Grade) VALUES ('201215121', '1', '92');
INSERT INTO `sc` VALUES ('201215121', '2', '85');
INSERT INTO `sc` VALUES ('201215121', '3', '88');
INSERT INTO `sc` VALUES ('201215122', '2', '90');
INSERT INTO `sc` VALUES ('201215122', '3', '80');
这里先给出外键的定义,帮助大家理解为什么,插入是这个顺序。后续会精讲
外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
4. 修改数据简而言之:只要只要被作为外键的数据,一定要先存在再能插入
基本格式:UPDATe<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]…
[WHERe<条件>];
(1) 修改某一个元组的值UPDATE student SET Sage=22 WHERe Sno='201215121';(2) 修改多个元组的值
UPDATE student SET Sage=Sage+1;(3) 带子查询的修改语句(后面就讲子查询)
UPDATE sc SET Grade=0 WHERe Sno IN(SELECT Sno FROM student WHERe Sdept='CS';);5. 删除数据
基本格式:DELETe
FROM<表名>
[WHERe<条件>]
基本格式: SELECt [ALL I DISTINCT]<目标列表达式>[,<目标列表达式>J…
FROM<表名或视图名>[,<表名或视图名>···] I (
[WHERe<条件表达式>]
[GROUP BY<列名I>[HAVINg<条件表达式>]]
[ORDER BY<列名2>[ASC I DESC]]
3.4.1 单表查询 1. 选中表中的若干列 (1)查询指定列(属性)简而言之:SELECT + FROM + WHERe + GROUP BY (聚合函数)+ ORDER BY (排序方式)
SELECt Sno,Sname FROM student;(2)查询全部列—— *
SELECt * FROM student;(3)重命名列名(属性)
SELECt Sname NAME, 'year of birth' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) FROM student;
2. 选择表中的若干元组简而言之: 选出目标列(属性)
DISTINCT:该查询结果里包含了许多重复的行。如想去掉结果表中的重复行,必须指定 DISTINCT:
SELECt DISTINCT Sno FROM sc;(2)比较
SELECt Sname, Sdept FROM student WHERe Sdept = 'CS';(3)确定范围
SELECt Sname, Sdept, Sage FROM student WHERe Sage BETWEEN 20 and 23;(4) 确定集合
SELECt Sname, Ssex, Sdept
FROM student
WHERe Sdept IN('CS', 'MA', 'IS');
(5) 字符匹配
谓词 LIKE:
基本语法:[NOT] LIKE’<匹配串>' [ESCAPE '<换码字符>' ]
% (百分号)代表任意长度(长度可以为0) 的字符串。
例如 a%b 表示以 a 开头, 以b 结尾的任意长度 的字符串。如 acb 、addgb 、 ab 等都满足该匹配串。
-(下横线)代表任意单个字符。
例如 a_b 表示以 a 开头, 以 b 结尾的长度 为3的任意字符串。如 acb 、 afb 等都满足该匹配串。
SELECt Sname,Sno,Ssex FROM student WHERe Sname LIKE '刘%';
SELECt Sname,Sno,Ssex FROM student WHERe Sname LIKE '张_';(6)涉及空值的查询
SELECt Sno,Cno FROM sc WHERe Grade IS NULL;(7) 多重条件查询
SELECt Sname,Sno,Ssex FROM student WHERe Sdept = 'CS' AND Sage < 20;
SELECt Sname,Sno,Ssex FROM student WHERe Sdept = 'CS' OR Sage < 20;3. ORDERB子句
SELECt Sno,Grade FROM sc WHERe cno='3' ORDER BY Grade ASC;
SELECt Sno,Grade FROM sc WHERe cno='3' ORDER BY Grade DESC;4. 聚变函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VgyGrkb-1666405040528)(D:大学四年经历数据库图片质料聚变函数.png)]
SELECt COUNT(Sno) FROM sc;
注: WHERe子句中是不能用聚集函数作为条件表达式的。 聚集函数只能用于SELECt子句和GROUP BY中的HAVINg子句。
5. GROUP BY 语句定义:对查询结果分组的目的是为了细化聚集函数的作用对象。 分组后聚集函数将作用千每个组,即每 组都有 个函数值。
SELECT Cno,COUNT(Sno) from sc GROUP BY Cno;
简而言之:GROUP BY 语句是对选中的列(属性)每一个元组,用聚变函数。不用GROUP BY 语句是对选中的列(属性)用聚变函数。
SELECt Cno,COUNT(Sno) from sc GROUP BY Cno HAVINg AVG(Grade) >= 90;3.4.2 连接查询——多表查询 1. 等值与非等值连接
连接查询的WERE子句中用来连接两个表的条件称为连接条件或连接谓词, 其一般格式为
[<表名I>.]<列名1><比较运符符> [<表名2>]<列名2>
其中比较运算符主要有= 、 > 、 <、 >=、 <=、!= (或<>)等。
SELECt student.*,sc.* FROM student,sc WHERe student.Sno=sc.Sno;2. 自身连接——给自己取别名,代表各自信息
SELECtF FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERe FIRST.Cpno=SECOND.Cno;3. 外连接
SELECt student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM student left outer JOIN sc on (student.Sno=sc.Sno)
4. 多表连接这个概念在前面讲过,不多赘述。简而言之,左外——不包含右边集合独有的部分
3.4.3 嵌套查询连接操作除了可以是两表连接、 一个表与其自身连接外, 还可以是两个以上的表进行 连接, 后者通常称为多表连接。
定义:在SQL语言中, 一个SELECt-FROM-WHERe语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERe子句或HAVINg短语的条件中的查询称为嵌套查询(nested query)。
SELECt Sname
FROM student
WHERe Sno IN
(SELECt Sno
FROM sc
WHERe Cno='2');
1. 带有IN谓词的子查询
SELECt Sno,Sname,Sdept
FROM student
WHERe Sdept IN(SELECt Sdept
FROM student
WHERe Sname='刘晨');
2. 带有比较运算守甘子查询
3. 带有ANY(SOME)或ALL谓词的子查询
4. 带有EXISTS谓词的子查询
EXISTS 代表存在量词,带有 EXISTS 谓词的了查询不返回任何数据, 只产生逻辑真“ true ” 或逻辑假值 “ false”。
子查询为真执行父查询,否则不执行
SELECt Sname FROM student WHERe NOT EXISTS (SELECt* FROM sc WHERe sno=student.sno AND Cno='1');3.5 视图
基本格式:CREATE VIEW<视图名> [(<列名> [,<列名>]…)J
AS<子查询>
[WITH CHECK OPTION]
与查询无异,不多赘述
在我看来,视图就是用来,装查询结果的。