注:本学期数据库赵老师课程知识点总结
SQL
SQL
SQL是基于关系代数和关系演算之间的结构化查询语言
⧫功能不仅仅是查询,是通用的功能极强的关系数据库操纵语言。
⧫集数据查询,数据操纵,数据定义,数据控制于一体
特点:
⧫综合统一
⧫数据操纵语言统一
⧫数据结构统一
⧫高度非过程化
⧫无需指明操作路径
⧫只需提出做什么 ,无需指明怎么做
⧫面向集合的操作方式
⧫同一语法两种使用方式
⧫交互方式
⧫嵌入方式
SQL语言的系统结构:
⧫SQL可以对基表和视图进行操作,都是关系
⧫基表是独立存在的表,一个关系对应一个表
⧫一个或多个基表对应1个存储文件
⧫存储文件构成内模式,对用户透明
⧫视图是1个或多个基表导出的表,不独立储存在数据库中
模式和表
⧫1 表名显式标识模式名
⧫2 创建模式同时创建表
⧫3 设置搜索路径
数据查询:SELECT
❖ 语句格式
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
◼ SELECT子句:指定要显示的属性列
◼ FROM子句:指定查询对象(基本表或视图)
◼ WHERE子句:指定查询条件
◼ GROUP BY子句:对查询结果按指定列的值分组,该属性列值相
等的元组为一个组。通常会在每组中作用聚集函数。
◼ HAVING短语:只有满足指定条件的组才予以输出
◼ ORDER BY子句:对查询结果表按指定列值的升序或降序排序
❖查询指定列
查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;
❖查询全部列
◼ 选出所有属性列:
- 在SELECT关键字后面列出所有列名
- 将<目标列表达式>指定为 *
查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;
或
SELECT * FROM Student;
❖查询经过计算的值(“虚”列)
⧫ ◼ SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
查全体学生的姓名及其出生年份。
SELECT Sname,2014-Sage
FROM Student;
Sname | 2014-Sage |
---|---|
李勇 | 1994 |
刘晨 | 1995 |
王敏 | 1996 |
张立 | 1995 |
查询全体学生的姓名、出生年份和所在的院系,要求用小写
字母表示系名。
SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept) FROM
Student;
输出结果:
Sname 'Year of Birth:' 2014-Sage LOWER(Sdept)
李勇 Year of Birth: 1994 cs
刘晨 Year of Birth: 1995 cs
王敏 Year of Birth: 1996 ma
张立 Year of Birth: 1995 is
❖使用列别名改变查询结果的列标题:
SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
输出结果:
NAME BIRTH BIRTHDAY DEPARTMENT
李勇 Year of Birth: 1994 cs
刘晨 Year of Birth: 1995 cs
王敏 Year of Birth: 1996 ma
张立 Year of Birth: 1995 is
❖消除取值重复的行 如果没有指定DISTINCT关键词,则缺省为ALL
查询选修了课程的学生学号。
SELECT Sno FROM SC;
结果为:
Sno
201215121
201215121
201215121
201215122
201215122
❖指定DISTINCT关键词,去掉表中重复的行
SELECT DISTINCT Sno FROM SC;
执行结果:
Sno
201215121
201215122
常用的查询条件
查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>, !>, !<; NOT+上述比较运算符 |
确定范围 | BETWEEN AND, NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多重条件(逻辑运算) | AND, OR, NOT |
1. 比较大小
//查询计算机科学系全体学生的名单。
SELECT Sname FROM Student
WHERE Sdept=‘CS’;
//查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student WHERE Sage < 20;
//查询考试成绩有不及格的学生的学号。
SELECT DISTINCT Sn
FROM SC
WHERE Grade<60;
2. 确定集合
❖谓词:IN <值表>, NOT IN <值表>
[例3.27]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
SELECT Sname, Ssex FROM Student
WHERE Sdept IN ('CS','MA’,'IS' );
[例3.28]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
SELECT Sname, Ssex FROM Student
WHERE Sdept NOT IN ('IS','MA’,'CS' );
3. 字符匹配
❖ 谓词: [NOT] LIKE
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
◼% (百分号) 代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串
◼_ (下横线) 代表任意单个字符。
例如a_b表示以a开头,以b结尾的长度为3的任意字符串
◼ 匹配串为固定字符串
查询学号为201215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE ‘201215121';
//等价于:
SELECT *
FROM Student
WHERE Sno = ' 201215121 ';
◼ 匹配串为含通配符的字符串
查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student
WHERE Sname LIKE '刘%';
查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname FROM Student
WHERE Sname LIKE '欧阳__';
[例3.32] 查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,Sno FROM Student
WHERE Sname LIKE ' 阳%';
[例3.33] 查询所有不姓刘的学生姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student
WHERE Sname NOT LIKE '刘%';
◼ 使用换码字符将通配符转义为普通字符
查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
4. 涉及空值的查询
❖谓词: IS NULL 或 IS NOT NULL
◼ “IS” 不能用 “=” 代替
某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
查询缺少成绩的学生的学号和相应 的课程号。
SELECT Sno,Cno FROM SC
WHERE Grade IS NULL
查所有有成绩的学生学号和课程号。
SELECT Sno,Cno FROM SC
WHERE Grade IS NOT NULL;
5.多重条件查询
❖逻辑运算符:AND和 OR来连接多个查询条件
◼ AND的优先级高于OR
◼ 可以用括号改变优先级
[例3.38] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student
WHERE Sdept= 'CS' AND Sage<20;
❖改写
查询计算机科学系(CS)、数学系&