哎呦 SQL2啦

简单查询

单表查询

关于查找条件

排序

集合函数

分组

分组约束


简单查询
SELECT [ALL|DISTINCT]〈目标列表达式〉[,〈目标列表达式>] …
FROM 〈TableName或视图名〉[,〈表名或视图名〉] …
[WHERE 条件表达式Condition]
[GROUP BY colummName列名〉[,〈列名〉]…
[HAVING <内部函数表达式>] ]
[ORDER BY columnName [ASC│DESC] [,〈列名〉[ASC│DESC]]…]
  • SELECT: 这是SQL语句的开始部分,指示要从数据库中检索数据。
  • [ALL|DISTINCT]: 这是一个可选项,用于指定返回的结果集是否包含重复行。ALL表示返回所有行,而DISTINCT表示返回不重复的行。
  • 〈目标列表达式〉[,〈目标列表达式>] …: 这是指定要检索的列或表达式的部分。你可以列出要返回的列,也可以使用表达式来计算结果。
  • FROM 〈表名或视图名〉[,〈表名或视图名〉] …: 这部分指定了要从哪些表或视图中检索数据。
  • [WHERE <条件表达式>]: 这是一个可选项,用于指定过滤返回结果的条件。
  • [GROUP BY 〈列名〉[,〈列名〉]…: 这也是一个可选项,用于将结果集按照指定的列分组[HAVING <内部函数表达式>]: 这是一个可选项,用于过滤分组后的结果集。

        没有GROUP BY不能有HAVING哦,HAVING是每组应满足的条件

  • [ORDER BY 〈列名〉 [ASC│DESC] [,〈列名〉[ASC│DESC]]…]: 这是一个可选项,用于指定返回结果集的排序顺序。可以指定一个或多个列名,并可选地指定每列的排序顺序(升序或降序)。

子句的概念性的执行步骤

① 计算出现在FROM后面的表之间的笛卡儿积

② 实施由WHERE后面的条件规定的选择操作

③ 根据GROUP BY后面的属性的值进行分组

④ 对于分组出来的每一个小组,实施由HAVING后面 的条件规定的选择操作,保留满足条件的小组

⑤ 将出现在SELECT后面的属性投影成结果表

⑥ 将结果表中的元组根据ORDER BY后面的属性及指 定的顺序(升序或降序)输出

概念性执行步骤并非真正的执行步骤

单表查询

投影、选择

关于查找条件

SELECT DISTINCT staffNo,fName,lName,salary/12 AS monthlySalary
FROM Staff
WHERE salary > 10000 AND salary <= 30000;
SELECT * 
FROM Branch
WHERE city = 'London' OR city = 'Glasgow';
--两WHERE功能相同
WHERE city IN('London','Glasgow');

IN 测试数据是否与集合中的某一值相匹配

NOT IN 测试测试数据是否不在集合中

SELECT ownerNo, fName, lName, address, telNo
FROM PrivateOwner
WHERE address LIKE ‘%Glasgow%’ AND
      ownerNo IS NOT NULL;

SQL中有两种特殊的模式匹配符号

%: 百分号表示零或多个字符序列(通配符)

_: 下划线表示任意单个字符

转义符ESCAPE

[NOT]LINE 字符串 [ESCAPE 转义符]

--查询学号的第二个字符不是“%”的学生信息
SELECT *
FROM S
WHERE S# NOT LIKE ‘_\%%’ ESCAPE ‘\’;

排序

[ORDER BY columnName [ASC│DESC] [, …]]

功能说明: ORDER BY子句让查询结果按照一定顺序显示

ASC ---- 升序(缺省)

DESC ---- 降序

ORDER BY子句必须是SELECT语句的最后一个子句

SELECT staffNo, fName, lName, salary
FROM Staff
ORDER BY salary DESC;
-- 可以用列表中相应列的序号
ORDER BY 4 DESC;
-- 多列排序
ORDER BY staffNo,salary DESC; -- 先按staffNo升序排列,再按salary降序排列

集合函数

函数名 [DISTINCT|ALL] columnName

这些函数遇到空值时,除COUNT(*)外,都跳过空值,只处理非空值

这些函数只能用于SELECT列表和HAVING字句中

eg:

SELECT COUNT(DISTINCT propertyNo) AS myCount,
       SUM(salary) AS mySum
FROM Viewing
WHERE viewDate BETWEEN‘1-May-04’AND‘31-May-04’;

分组

[ GROUP BY columnName [, …] [HAVING condition] ]

当使用GROUP BY时, SELECT子句中除集合函数外, 其它所有列必须在GROUP BY子句中出现;反之, GROUP BY子句出现的列不一定出现在SELECT列表中;

当WHERE子句和GROUP BY同时使用时,必须先使用 WHERE子句,分组由满足WHERE子句的查询条件的那 些行产生;

ISO标准规定,应用GROUP BY时,两个空值被认为 是相等的

分组约束

HAVING

SELECT branchNo, 
 COUNT(staffNo) AS myCount,
 SUM(salary) AS mySum
FROM Staff
GROUP BY branchNo
HAVING COUNT(staffNo) > 1
ORDER BY branchNo;

第一个查询语句:

SELECT S#, AVG(G)

FROM SC

GROUP BY S#

HAVING AVG(G) >= 90;

这个查询首先对表 SC 中的数据按照 S# 进行分组,然后计算每个分组中 G 列的平均值。接着,使用 HAVING 子句过滤出满足条件 AVG(G) >= 90 的分组。最后,返回满足条件的分组的 S# 和对应的平均值。

第二个查询语句:

SELECT S#, AVG(G)

FROM SC

WHERE AVG(G) >= 90

GROUP BY S#;

这个查询由于 WHERE 子句放在 GROUP BY 子句之后,因此无法执行。在 SQL 中,WHERE 子句用于筛选行,而 GROUP BY 子句用于分组聚合。由于 AVG(G) 是在分组后计算的,因此无法在 WHERE 子句中直接使用 AVG(G)。

WHERE 子句和 HAVING 子句都用于筛选数据,但它们的用法和作用范围略有不同:

  1. WHERE 子句

    • WHERE 子句用于在查询中对行进行筛选,它在数据分组之前执行。
    • 它允许你指定条件来过滤返回的行,只有满足条件的行才会被包含在查询结果中。
    • WHERE 子句通常用于过滤行,对单个行级别的条件进行筛选,比如对特定列的值进行比较。
  2. HAVING 子句

    • HAVING 子句用于在查询中对分组后的结果进行筛选,它在数据分组之后执行。
    • 它允许你指定条件来过滤分组后的结果,只有满足条件的分组才会被包含在查询结果中。
    • HAVING 子句通常用于对分组进行条件过滤,对分组级别的条件进行筛选,比如对聚合函数的结果进行比较。

简而言之,WHERE 子句用于对行进行筛选,而 HAVING 子句用于对分组后的结果进行筛选。WHERE 子句在数据分组之前执行,而 HAVING 子句在数据分组之后执行。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值