SELECT查询总结
来源:互联网 发布:layout软件 编辑:程序博客网 时间:2024/05/21 17:31
SELECT查询总结:
1、WHERE子句不能用聚集函数作为条件表达式。而HAVING子句可以。。WHERE子句作用于基本表或视图,HAVING子句作用于组,选择满足条件的组。
2、使用GROUP BY子句进行分组时,聚集函数作用对象为每个组,当SELECT映射中有聚集函数同时又有列名,则一定有GROUP BY子句,并且GROUP BY后的字段名和SELECT后的字段名相同。
3、HAVING的使用:
SELECT SnoFROM SCGROUP BY SnoHAVING COUNT(*) > 3;
聚集函数遇到空值时,除了COUNT(*)外,都跳过空值而处理非空值。
4、NATURAL JOIN--自然连接:合并同名列。相对于直接笛卡尔积然后WEHERE等值连接要效率高。
SELECT SUM(qty),snoFROM spj NATURAL JOIN sGROUP BY snoHAVING SUM(qty)>1000ORDER 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, CnoFROM SC xWHERE Grade >= (SELECT AVG(Grade)FROM SC yWHERE y.Sno = x.Sno);
这里的Sno相当于i,Grade就相当于j了。可能的过程是:从外层查询中取出SC的一个元祖x,将元祖x的Sno值传送给内层查询,执行内层查询,得到值,用该值代替内层查询,得到外层查询。
8、不相关子查询:
SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept IN(SELECT SdeptFROM StudentWHERE Sname = '¨¢?3¨¦';
=ANY等价于IN,<>ALL等价于NOT IN,
用聚集函数实现子查询通常比直接用ANY或ALL查询效率高。
由EXISTS引出的子查询,其目标列表达式通常都用*,因为EXISTS的子查询只返回真值或假值,给出列名无实际意义。
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
使用UNION将多个结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符。
9、几种查询之间的转换:
集合运算与AND
[实例]
1.查询计算机科学系的学生与年龄不大于19岁的学生的交集。
集合运算:
SELECT *FROM StudentWHERE Sdept = 'CS'INTERSECTSELECT *FROM StudentWHERE Sage<=19;
用AND:
SELECT *FROM StudentWHERE Sdept = 'CS' ANDSage <= 19;
2.查询计算机科学系的学生与年龄不大于19岁的学生的差集。
集合查询:
SELECT *FROM StudentWHERE Sdept='CS'EXCEPTSELECT *FROM StudentWHERE Sage <=19;
用AND(相当于查询计算机系中年龄大于19岁的学生):
SELECT *FROM StudentWHERE Sdept = 'CS' AND Sage > 19;
子查询与连接:
[实例]
1.查询与刘晨同一个系的学生
子查询:
SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept IN(SELECT SdeptFROM StudentWHERE Sname='刘晨');
//当然这边IN可以用=号代替
连接:
SELECT S1.Sno,S1.Sname,S1.SdeptFROM Student S1,Student S2WHERE S1.Sdept = S2.Sdept ANDS2.Sname='刘晨';
//可能的过程是:Student表跟自身做笛卡尔积,S1|S2,得到的结果中筛选S2.Sname是刘晨的记录,再在记录中筛选S1.Sdept=S2.Sdept的记录。
带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换:
[实例]
题目同上一个:
用EXISTS:
SELECT Sno,Sname,SdeptFROM Student S1WHERE EXISTS(SELECT *FROM Student S2WHERE S2.Sdept=S1.Sdept ANDS2.Sname='刘晨');
//可能的过程是:从S1中取一条记录,得到他的Sdept,然后找S2中有同样Sdept并且Sname为刘晨的记录是否存在,存在则输出S1中的匹配项。
- SELECT查询总结
- SELECT查询总结
- select 查询心得总结
- hibernate select 查询方式总结
- hibernate select 查询方式总结
- hibernate select 查询方式总结
- hibernate select 查询方式总结
- SQL select查询回顾总结
- Oracle SQL:select各类查询语句总结
- SQL-Select单表查询总结
- 【Mysql】select,数据简单查询整理总结
- select 查询
- SELECT 查询
- SELECT 查询
- select查询
- SELECT查询
- 数据库的一些知识点,select 查询语句复习总结
- LINQ 的select 和where 查询语句总结
- 标准SQL语句
- 使用Google WebP图片格式帮助控制网站页面大小
- C应用
- ELF映像的装入
- Android4.0新的SDK新特性 (汉化)
- SELECT查询总结
- sysfs接口函数到建立_DEVICE_ATTR
- Windows Azure新功能:Hadoop和Web版的移动服务
- 使用plsql将oracle数据库中的数据库结构和数据导出与导入
- 帮助你生成组织结构图的jQuery插件 - jOrgChart
- 电子商务对制造业的影响
- sqlite 移植到2440
- width不同浏览器兼容问题
- DataGuard Real-Time Apply