SQL语言对数据库的操作十分灵活、方便,原因在于 SELECT 语句中成分丰富多样的元组,有许多可选形式,尤其是目标列和条件表达式。

SELECT基本结构
语句格式

注意点:SOL 查询中的子句顺序为 SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDERBY。其中,SELECT、FROM 是必需的,HAVING 条件子句只能与 GROUP BY 搭配起来使用。
- SELECT子句:列出查询的属性、或者对应属性的聚合函数(如AVG、COUNT、MAX、MIN、SUM)。
- FROM子句:指定查询操作的数据表或视图,当存在多个表时,会首先执行笛卡尔积操作。
-
WHERE子句:过滤行数据的条件,常用运算符:
=,<>,>,<,>=,<=,BETWEEN,LIKE,IN,IS NULL等,后面不能跟聚合函数 -
GROUP BY 子句:对结果集进行分组
-
HAVING 子句:对分组后的结果进行过滤,通常与聚合函数一起使用
-
ORDER BY 子句:对结果集进行排序
一个简单示例

对应的关系代数表达式:
![]()
简单查询
仅使用SELECT、FROM、WHERE保留字
如:查询学生-课程数据库中计算机系 CS 学生的学号、姓名及年龄。
SELECT Sno,Sname,Age
FROM S
WHERE SD = 'CS':
连接查询
若查询涉及两个以上的表,则称为连接查询。
如:检索选修了课程号“C1”的学生的学号和姓名
SELECTSno, Sname
FROM S, SC
WHERES.Sno=SC.Sno AND SC.Cno='C1'
内连接(INNER JOIN)
只返回两个表中匹配的行,使用INNER JOIN关键字,不用关键字时默认为内连接。内连接是在笛卡尔积的基础上增加连接条件,连接条件如下:
- 等值连接
表之间通过“等于”关系连接起来。
例如:查询所有学生的姓名、课程号和分数列
SELECT student.姓名, score.课程号, score.分数
FROM student, score
WHERE student.学号 = score.学号
- 非等值连接
与等值连接相反,指表之间的连接关系不是“等于”
例如:查询所有分数大于60的学生的姓名、课程号
SELECT student.姓名, score.课程号, score.分数
FROM student, score
WHERE score.分数>60
- 自连接:表与自身连接,可以使得一个表的某行和同一表中的另一方连接起来。
例如:查询‘3-105课程’的成绩高于‘109’号学生成绩的所有学生记录,并按成绩从高到低排序
SELECT x.课程号, x.学号, x.分数
FROM score x, score y
WHERE x.课程号='3-105' AND x.分数 > y.分数 AND y.学号='109' AND y.课程号='3-105'
ORDER BY x.分数 DESC
外连接(OUTER JOIN)
内连接的话如果某行在其中一个表中没有匹配项,则不会出现在结果中。而外连接会返回至少一个表中的所有行,即使另一个表中没有匹配项。未匹配的部分以NULL填充。
- 左外连接(LEFT JOIN): 返回左表所有记录和右表匹配记录
返回左表的所有行,即使右表无匹配。右表无匹配时显示NULL。
SELECT course.课程名,teacher.姓名
FROM course LEFT JOIN teacher
ON (course.任课教师编号=teacher.教师编号)
执行结果:

- 右外连接(RIGHT JOIN): 返回右表所有记录和左表匹配记录
返回右表的所有行,即使左表无匹配。左表无匹配时显示NULL。
SELECT course.课程名,teacher.姓名
FROM course RIGHT JOIN teacher
ON(course.任课教师编号=teacher.教师编号)
执行结果:

- 全外连接(FULL JOIN): 返回两表所有记录
返回两表的所有行,无匹配的部分以NULL填充。
SELECT course.课程名,teacher.姓名
FROM course FULL JOIN teacher
ON(course.任课教师编号=teacher.教师编号)
执行结果:

交叉连接(CROSS JOIN)
交叉连接(Cross Join)是数据库中的一种连接操作,返回两个表的笛卡尔积。它将第一个表的每一行与第二个表的每一行组合,生成的结果集行数等于两表行数的乘积。交叉连接不依赖任何匹配条件,仅单纯合并数据。
-- 显式语法
SELECT * FROM table1 CROSS JOIN table2;
-- 隐式语法(通过逗号分隔表)
SELECT * FROM table1, table2;
2390

被折叠的 条评论
为什么被折叠?



