1、ANSI 美国国家标准局
select e.empno, e.ename, d.loc from emp e, dept d
where e.deptno = d.deptno and substr(e.ename, 1, 1) = ‘S’;
等价于
select empno, ename, loc from emp join dept on emp.deptno =
dept.deptno where substr(emp.ename, 1, 1) = ‘S’;
2、关于排序:
1)ASC 和 DESC
ASC是升序排列
DESC是降序排列
NULL作为最大值存在,如果在降序排列中,NULL排列在第一个,然后依次往下降;
如果在升序排列中,NULL则在最后一个。
没写ASC或者DESC 则默认是升序排列
2)多列排序
当以多列作为排序标准时,首先第一列进行排序,如果第一列数据相同,则以第二列排序,依次类推。
注意:多列排序中,不管是正序还是倒叙,每个列需要单独设置排序方式。
SELECT ename,deptno,sal from emp order by deptno ASC,sal DESC;
3、聚合函数(分组函数、多行函数、集合函数)
在表中不能直接查询得到结果,而需要将现有的数据经过计算得到结果,
这种多行数据参与运算返回一行结果的计算方式就是聚合函数。
AVG和SUM等聚合函数的计算忽略表中的NULL值。
其他数据和NULL计算结果为NULL
4、count
select count(*) total_number from emp;
select count(job) total_job from emp;
5、分组
group by
having
having必须跟在group by的后面才能出现,having不能单独存在。
6、查询语句执行顺序
1.from 从后到前 从右到左。数据量较少的表尽量放在后面
|
2.where 从右到左 将能过滤最大记录的条件写在where子句的最右边
|
3.group by 从左往右分组 在group by之前用where将不需要分组的记录过滤掉。
|
4.having子句 消耗资源 尽量避免使用,having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
|
5.select 少用* 尽量取字段名,oracle在执行号时,会将转换成所有的列名,消耗时间
|
6.order by 执行顺序为从左到右 消耗资源
7、关联查询
1)内连接
内连接返回所有满足条件的记录
2)外连接
1>左外连接
在两表中关联字段中,将左表中的该字段中对应的每一条数据的信息显示出来,可包含重复的
2>右外连接
在两表中关联字段中,将右表中的该字段中对应的每一条数据的信息显示出来,可包含重复的
3>全外连接
在两表中关联字段中,两表中对应的字段都要显示出数据,每个关联都要有数据。
4>自连接
8、分页查询
ROWNUM 伪列
截取结果集中的部分数据
select from (select rownum rn,e* from emp e)
where rn between 8 and 10;
9、排序:
ROW_NUMBER
ROW_NUMBER() over(PARTITION BY col1 ORDER BY col2)
根据col1分组后根据col2排序,ROW_NUMBER()函数计算的值是结果集中每组内部数据排序编号,组内连续且唯一
rownum是伪列,而row_number是可以直接从结果集中查询出的。
跳跃排序
pank 组内如果有相同的排序编号为2 则下一位排序编号为4
连续排序
dense_pank 组内如果有相同的排序编号为2 则下一位排序编号为3
10、mysql和oracle中的行列换置
mysql:
select name,sum(case when course='java' then grade end) java,
sum(case when course='web' then grade end) web
from user
oracle:
decode函数decode(expr,search,result[,search,result...][default])
用于比较字段数据中与查询条件符合的数据,返回result。
11、需要查询那个字段的信息条数 就用count(字段名)
如果需要查询的是特定小组的某个字段信息条数,就在最后加 group by(分组字段名) 即可