SQL子查询

本文详细介绍了SQL查询中的子查询概念,包括独立子查询、相关子查询、ANY和ALL运算符的使用,以及测试存在的子查询。此外,还探讨了全关系操作,如消除重复、聚集函数的运用以及GROUP BY和HAVING字句在分组查询中的作用。通过对多关系查询的阐述,解释了如何进行笛卡尔积、自然连接和外连接等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库语言SQL

1.SQL中的简单查询

1.1 select-from-where

  • from:给出查询所引用的关系
  • where:条件字句,类似于关系代数中的选择条件
  • select:决定满足条件的元组的哪些属性应该在结果中列出

1.2 SQL查询具有过程
对from字句关系中的每个元组,使用where字句中指定的条件进行筛选,然后投影到select字句中的属性或表达式列表上(注:SQL大小写无关)
示例:
去掉重复元组:

SELECT DINTINCT Sno FROM SC;

起别名:

SELECT title as name, length as duration FROM movies where studioname=“Disney” AND year=“1990”

计算:

SELECT title AS name, length*0.0166 as lengthHours FROM movies where studioname=“Disney” AND year=“1990”;

加新列加常量:

SELECT title AS name, length*0.0166 as lengthHours, “hrs.” AS inHours FROM movies where studioname=“Disney” AND year=“1990”;

1.3 SQL的选择
关系代数中的选择操作符在SQL中是通过SQL的WHERE字句表示
运算符/关键

  • 比较: =, >, <, >=, <=, <>, !>, !<
  • 确定范围:[NOT] BETWEEN…AND…
  • 确定集合:[NOT] IN
  • 逻辑:AND NOT OR
  • 字符匹配:[NOT] LIKE
  • 空值:IS [NOT] NULL
  • 串的拼接:||

范围示例:

SELECT Sname, Sdept, Sage FROM Students WHERE Sage BETWEEN 20 AND 30;

集合示例:

SELECT Sname, Sdept, Sage FROM Students WHERE Sdept IN (“计算机”,“信息”)

字符匹配:LIKE 匹配串
通配符:
(1)%:任意长度为n的字符串n>=0
(2)_:任意字符
(3)[ ]:指定范围内的任意单个字符
(4)[^]:不在指定范围内的任意单个字符
示例

LIKE ‘%been%’
LIKE ‘Ma%’
LIKE ‘[CK]%’ 第一个是C或K
LIKE ‘[^A-D]%’ 第一个不是A-D之间的字符
LIKE ‘%ea_’
LIKE ‘_en’

除此之外还有换码/转义字符

LIKE ‘X% % X%’ ESCAPE ‘X’
表示%…%(X可为任意字符)

1.4 SQL排序
格式 ORDER BY (list of attribute) [ASC | DESC]
ASC升序(默认),DESC降序

SELECT Sno, Grade FROM SC WHERE Cno=‘3’ ORDER BY Grade DESC

SELECT * FROM Students ORDER BY Sdept ASC, Sage DESC

2.多关系查询

  1. FROM 后面接多个关系,关系之间用“ ,”隔开表示关系之间进行笛卡尔积连接

SLECT Students.* , SC.Cno , SC.Grade FROM Students, SC WHERE Students.Sno=SC.Sno
// 自然连接 对两个关系进行笛卡尔积连接,经WHERE字句筛选得到的新关系正是自然连接后得到的关系

  1. 集合查询
    2.1 集合操作:
  • 并:UNION
  • 交:INTERSECT
  • 差:EXCEPT

这些查询结果提供的关系具有相同的属性和属性类型列表,默认情况下去掉重复元组

(SELECT name, address FROM MovieStars WHERE gender = ‘F’)
INTERSECT
(SELECT name, address FROM MovieExecs WHERE netWordth>=10000000)

3.子查询

3.1 当某个查询是另一个查询的一部分时,称之为子查询。可以根据需要拥有多级子查询。子查询又可分为独立子查询和相关子查询(关联子查询)

子查询的几种形式:

  1. 比较运算符(子查询)
  2. [NOT] IN(子查询)
  3. 比较运算符+[ANY | ALL](子查询)
  4. 测试存在的子查询

SELECT Sno, Sname, Sdept
FROM Students
WHERE Sdept IN //若是子查询得到的是单值,则可直接使用“=”
(SELECT Sdept FROM Students WHERE Sname=‘刘雪’)

3.2 比较运算符+ANY | ALL
ANY——某一个,有一个(存在),ALL——所有
ANY——比最大的小,比最小的大
ALL——比最大的大,比最小的小
示例

SELECT DINTINCT title FROM Movies as Old WHERE year<ANY (SELECT year FROM Movies WHERE title=Old.title)

查询其他系比经管系某一学生年龄小的学生姓名、年龄

SELECT Sname, Sage FROM Students WHERE Sage<ANY( SELECT Sage FROM Students WHERE Sdept=“经管系”) AND Sdept<>“经管系”

3.3 测试存在的子查询EXISTS
EXISTS(子查询)——子查询结果集行数>0时为真
NOT EXISTS(子查询)——子查询结果集行数>0时为假,行数=0时为真

3.5 关联子查询
子查询要计算多次,主要针对ANY/ALL

SELECT title FROM movie old WHERE year<ANY( SELECT year FROM movie WHERE title = old.title)

子查询可以在WHERE字句里作为条件的一部分
也可以在FROM字句里,作为新关系,如

SELECT name FROM MoviesExecs, (SELECT producerC# FROM Movies, StarsIn WHERE title=movieTitle AND year =movieYear AND starName=“Harrison Ford”) Prod
WHERE CERT#=Prod.prodercerC#

3.6 SQL的连接表达式
(1)笛卡尔积:“,”
(2)条件连接:关系1 JOIN 关系2 ON 条件
(3)自然连接:NATURAL JOIN
(4)外连接:NOTURAL FULL/LEFT/RIGHT OUTER JOIN(全、左外、右外连接)

4 全关系操作

关系执行顺序:
FROM—>WHERE—>GROUP BY—>HAVING—>SELECT—>ORDER BY

4.1 消除重复
方式一:DISTINCT
方式二(并、交、差中的重复):必须在UNION, INTERSECT, EXCEPT后加上ALL,如 >> R UNION ALL S

4.2 使用聚集函数

  • AVG ([ALL | DINTINCT] 列名)
  • COUNT([ALL | DINTINCT] 列名)
  • COUNT(*)
  • MAX()
  • MIN()
  • SUM([ALL | DINTINCT] 列名)

4.3 分组ORDER BY
分组是对关系进行分块,关系默认情况下是一块,而聚集函数是对块进行操作

SELECT name, SUM(length) FROM MovieExecs, Movies WHERE prodecerC#=cer# AND netWorth>10000000 GROUP BY name

HAVING字句:用于GROUP BY 字句后,选择满足条件的分组。尤其如果分组时需要考虑某些聚焦操作,就只能用HAVING字句,而不能用WHERE字句
查询经管系选修3门课程以上的学生姓名

SELECT Students.Sname FROM SC, Students WHERE SC.Sno = Students.Sno AND Students.Sdept = “经管系” GROUP BY Students.Sno HAVING COUNT(*)>3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值