SELECT查询总结

SELECT查询总结:

1、WHERE子句不能用聚集函数作为条件表达式。而HAVING子句可以。。WHERE子句作用于基本表或视图,HAVING子句作用于组,选择满足条件的组。

2、使用GROUP BY子句进行分组时,聚集函数作用对象为每个组,当SELECT映射中有聚集函数同时又有列名,则一定有GROUP BY子句,并且GROUP BY后的字段名和SELECT后的字段名相同。

3、HAVING的使用:

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 3;


聚集函数遇到空值时,除了COUNT(*)外,都跳过空值而处理非空值。

4、NATURAL JOIN--自然连接:合并同名列。相对于直接笛卡尔积然后WEHERE等值连接要效率高。

SELECT SUM(qty),sno
FROM spj NATURAL JOIN s
GROUP BY sno
HAVING SUM(qty)>1000
ORDER BY SUM(qty) DESC;


5、外连接:等值连接和自然连接都会将属性列不同的结果舍弃,比如S1表有个记录字段学号为025135,在S2表中没有这个学号,则 025135这个记录在S1与S2做等值连接或自然连接的时候就会自动舍弃。外连接则将无匹配结果项也显示,笛卡尔积中无匹配列的值以NULL代替。

6、ORDER BY子句不能用在子查询的SELECT语句中,ORDER BY子句只能对最后结果排序。

7、相关子查询:有点类似如下的嵌套的循环:

for(int i = 0 ; i < NUM ; i++)
{
for (int j = 0 ; j < i ;j++)
{do..something;}
}


内层根据外层的i,得到j的范围,比如:

SELECT Sno, Cno
FROM SC x
WHERE Grade >= (SELECT AVG(Grade)
FROM SC y
WHERE y.Sno = x.Sno);


这里的Sno相当于i,Grade就相当于j了。可能的过程是:从外层查询中取出SC的一个元祖x,将元祖x的Sno值传送给内层查询,执行内层查询,得到值,用该值代替内层查询,得到外层查询。

8、不相关子查询:

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname = '¨¢?3¨¦';

=ANY等价于IN,<>ALL等价于NOT IN,

用聚集函数实现子查询通常比直接用ANY或ALL查询效率高。

由EXISTS引出的子查询,其目标列表达式通常都用*,因为EXISTS的子查询只返回真值或假值,给出列名无实际意义。

参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。

使用UNION将多个结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符。

9、几种查询之间的转换:

集合运算与AND

[实例]

1.查询计算机科学系的学生与年龄不大于19岁的学生的交集。

集合运算:

SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;

用AND:

SELECT *
FROM Student
WHERE Sdept = 'CS' AND
Sage <= 19;

2.查询计算机科学系的学生与年龄不大于19岁的学生的差集。

集合查询:

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;

用AND(相当于查询计算机系中年龄大于19岁的学生):

SELECT *
FROM Student
WHERE Sdept = 'CS' AND Sage > 19;

子查询与连接:

[实例]

1.查询与刘晨同一个系的学生

子查询:

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨');

//当然这边IN可以用=号代替

连接:

SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname='刘晨';

//可能的过程是:Student表跟自身做笛卡尔积,S1|S2,得到的结果中筛选S2.Sname是刘晨的记录,再在记录中筛选S1.Sdept=S2.Sdept的记录。

带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换:

[实例]

题目同上一个:

用EXISTS:

SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
(SELECT *
FROM Student S2
WHERE S2.Sdept=S1.Sdept AND
S2.Sname='刘晨');

//可能的过程是:从S1中取一条记录,得到他的Sdept,然后找S2中有同样Sdept并且Sname为刘晨的记录是否存在,存在则输出S1中的匹配项。

<think>好的,我现在需要回答用户关于Oracle数据库中SELECT查询的用法和示例的问题。首先,用户提到他们想查找SELECT语句的语法和示例,所以我要确保覆盖基本语法、常用子句以及实际例子。 根据用户提供的引用资料,特别是引用[2]和[4],SELECT语句的基本结构包括选择列、FROM子句,以及可选的WHERE、ORDER BY等。我需要先整理出这些部分,并按照逻辑顺序呈现,比如从最简单的SELECT开始,逐步增加条件、排序、分组等。 接下来是示例部分。用户可能希望看到具体的代码示例,比如查询特定列、使用WHERE过滤数据、排序结果等。引用[3]提到了REPLACE函数的例子,这可能可以作为一个示例,展示函数在SELECT中的应用。另外,引用[1]提到了WITH子句,虽然用户主要问的是SELECT,但可以简要提到高级用法,如WITH子句,作为扩展内容。 需要确保每个示例都正确,并且符合Oracle的语法。比如,在WHERE子句中使用字符串比较时,注意单引号的使用;在ORDER BY中指定排序方向等。同时,要提醒用户关于性能的注意事项,比如索引的使用,避免全表扫描,这可以引用[2]中提到的复杂查询操作部分。 还要检查是否有高级用法需要提及,比如连接查询、子查询,但根据引用[4],用户目前可能需要的是基础用法,所以高级部分可以简要提及,或者建议后续学习。同时,注意使用正确的LaTeX格式,例如在提到语法结构时,使用$...$包裹关键字,如SELECT $column1, column2$ FROM $table$。 最后,生成相关问题,需要围绕SELECT语句的扩展应用、性能优化、函数使用等方面提问,帮助用户进一步学习。确保问题与已提供的信息相关,比如函数应用可以参考引用[3],性能优化可以参考引用[2]中的复杂查询操作。 总结步骤: 1. 介绍SELECT的基本语法结构。 2. 分点讲解各个子句(SELECT, FROM, WHERE, ORDER BY, GROUP BY, HAVING)。 3. 提供基础到复杂的示例,每个示例说明用途。 4. 提及高级用法如WITH子句和连接查询。 5. 注意事项,强调索引和性能。 6. 生成相关问题,覆盖函数、优化、高级查询等。 需要确保每个部分引用正确的来源,比如引用[2]和[4]用于基本语法,引用[1]用于WITH子句,引用[3]用于函数示例。同时,按照用户要求,使用中文回答,正确应用LaTeX格式,行内公式用$...$,独立公式用$$...$$,但此处可能较少涉及复杂公式,更多是代码示例,所以代码部分用代码块包裹。 现在开始组织内容,确保结构清晰,示例正确,引用恰当,并自然添加引用标识。</think>### Oracle SELECT 查询语法及示例 #### 一、基本语法结构 Oracle的SELECT语句用于从数据库中检索数据,其核心语法如下: ```sql SELECT [DISTINCT] column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column [ASC|DESC]] [GROUP BY column] [HAVING condition]; ``` - **SELECT**:指定要查询的列,`DISTINCT`用于去重[^2][^4]。 - **FROM**:指定数据来源的表或视图[^2]。 - **WHERE**:过滤符合条件的记录[^2]。 - **ORDER BY**:按列排序结果,支持升序(`ASC`)或降序(`DESC`)[^4]。 - **GROUP BY**:对结果分组,常与聚合函数(如`SUM`、`COUNT`)结合使用。 - **HAVING**:对分组后的结果进行过滤。 --- #### 二、基础用法示例 1. **查询所有列** ```sql SELECT * FROM employees; ``` 2. **查询特定列并去重** ```sql SELECT DISTINCT department_id FROM employees; ``` 3. **使用WHERE过滤数据** ```sql SELECT employee_name, salary FROM employees WHERE salary > 5000 AND department_id = 10; ``` 4. **使用ORDER BY排序** ```sql SELECT employee_name, hire_date FROM employees ORDER BY hire_date DESC; ``` --- #### 三、高级用法示例 1. **聚合函数与GROUP BY** 统计各部门的平均工资: ```sql SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id HAVING AVG(salary) > 6000; ``` 2. **字符串函数(如REPLACE)** 替换字段中的字符: ```sql SELECT REPLACE(employee_name, 'Mr.', 'Ms.') AS modified_name FROM employees; ``` 输出示例:将名称中的“Mr.”替换为“Ms.”[^3]。 3. **WITH子句(公共表表达式)** 临时存储复杂查询结果: ```sql WITH dept_budget AS ( SELECT department_id, SUM(salary) AS total FROM employees GROUP BY department_id ) SELECT * FROM dept_budget WHERE total > 100000; ``` 此语法适用于多层嵌套查询[^1]。 --- #### 四、注意事项 1. **性能优化** - 为频繁查询的列(如`WHERE`条件中的列)添加索引[^2]。 - 避免在WHERE子句中对字段进行函数操作(如`UPPER(column)`),可能导致全表扫描[^4]。 2. **扩展功能** Oracle SELECT支持多表连接(`JOIN`)、子查询、分析函数(如`ROW_NUMBER()`)等高级功能[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值