oracle sqlselect语法格式讲解

语法格式

select column, group_function(column)

from table

[where condition]

[group by group_by_expression]

[having group_condition]

[order by column];

执行过程:from–where — group by– having– select– order by

对分组查询的结果进行过滤,要使用having从句。

having从句过滤分组后的结果,它只能出现在group by从句之后,而where从句要出现在group by从句之前。

where过滤行,having过滤分组。having支持所有where操作符。

eg:

select deptno, job, avg(sal)

from emp

group by deptno,job

having avg(sal) > 1200

order by deptno,job;

一、sql92的多表连接查询

语法规则:

select table1.column, table2.column

from table1, table2

where table1.column1 = table2.column2;

特点

在 where 子句中写入连接条件

当多个表中有重名列时,必须在列的名字前加上表名作为前缀

连接的类型:

等值连接 — equijoin

非等值连接 — non-equijoin

外连接 — outer join

左外连接

右外连接

自连接 — self join

1.1笛卡尔积

select * from dept;//4条记录

select * from emp; ;//14条记录

select * from dept,emp; ;//4*14=56条记录

总结

检索出的行的数目将是第一个表中的行数乘以第二个表中的行数

检索出的列的数目将是第一个表中的列数加上第二个表中的列数

应该保证所有联结都有where子句,不然返回比想要的数据多得多的数据

1.2:等值查询

select * from dept,emp where dept.deptno=emp.deptno;

select * from dept d,emp e where d.deptno=e.deptno;

select d.deptno,dname,loc,empno,ename,job from dept d,emp e where d.deptno=e.deptno;

select d.deptno,dname,loc,empno,ename,job from dept d,emp e where d.deptno=e.deptno and d.deptno=10

select d.deptno,dname,loc,empno,ename,job from dept d,emp e where d.deptno=e.deptno and loc=’dallas’;

当被连接的多个表中存在同名字段时,须在该字段前加上”表名.”前缀

可使用and 操作符增加查询条件;

使用表别名可以简化查询

使用表名(表别名)前缀可提高查询效率;

1.3:非等值查询

查询员工的工资等级

select empno,ename,job,sal,grade

from emp e,salgrade s

where e.sals.losal;

select empno,ename,job,sal,grade

from emp e,salgrade s

where e.sals.losal and e.job=’manager’;

1.4:外连接

使用外连接可以看到参与连接的某一方不满足连接条件的记录,而不仅仅是满足连接条件的数据。

外连接运算符为(+)

外连接分为左外连接和右外连接两种

左外连接显示左边表的全部行

select table.column, table.column

from table1, table2

where table1.column = table2.column(+);

右外连接显示右边表的全部行

select table.column, table.column

from table1, table2

where table1.column(+) = table2.column;

1.5:自连接

将一个表当两个表使用

使用举例:查询每个员工的工号、姓名、经理姓名

select e1.empno,e1.ename,e1.job,e2.ename

from emp e1 ,emp e2

where e1.mgr=e2.empno

order by e1.empno;

1.6 更多表的连接查询

为了连接n个表,至少需要n-1个连接条件。

sql92的语法规则的缺点:

语句过滤条件和表连接的条件都放到了where子句中 。

当条件过多时,连接条件多,过滤条件多时,就容易造成混淆

二、sql99的多表连接查询

sql99修正了整个缺点,把连接条件,过滤条件分开来,包括以下新的table join的句法结构:

交叉连接(cross join)

自然连接(natural join)

使用using子句建立连接

使用on子句建立连接

外连接( outer join )

左外连接

右外连接

全外连接

sql1999规范中规定的连接查询语法

select 字段列表

from table1

[cross join table2] | //1:交叉连接

[natural join table2] | //2:自然连接

[join table2 using (字段名)] | //3:using子句

[join table2 on (table1.column_name = table2.column_name)] | //4:on子句

[(left | right | full outer) join table2

on (table1.column_name = table2.column_name)]; //5:左/右/满外连接

2.1:交叉连接

cross join产生了一个笛卡尔积,其效果等同于在两个表进行连接时使用where子句限定连接条件;

可以使用where条件从笛卡尔集中选出满足条件的记录。

用法举例

select dept.deptno,dname,ename,job

from dept cross join emp;

等价于

select dept.deptno,dname,ename,job

from dept,emp;

2.2:自然连接

natural join基于两个表中的全部同名列建立连接

从两个表中选出同名列的值均对应相等的所有行

如果两个表中同名列的数据类型不同,则出错

不允许在参照列上使用表名或者别名作为前缀

自然连接的结果不保留重复的属性

举例:

select empno, ename, sal, deptno, dname

from emp natural join dept

where deptno = 10;

2.3:using子句

如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用using子句来设置用于等值连接的列(参照列)名。

using子句引用的列在sql任何地方不能使用表名或者别名做前缀

举例:

select e.ename,e.ename,e.sal,deptno,d. dname

from emp e join dept d

using(deptno)

where deptno=20

2.4:on子句

自然连接的条件是基于表中所有同名列的等值连接

为了设置任意的连接条件或者指定连接的列,需要使用on子句

连接条件与其它的查询条件分开书写

使用on 子句使查询语句更容易理解

select ename,dname

from emp join dept on emp.deptno=dept.deptno

where emp.deptno=30;

select empno, ename, sal, emp.deptno, dname

from emp join dept

on (emp.deptno = dept.deptno and job=’salesman);

2.5:外连接

左外连接

两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外联接。

右外连接

两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外联接。

全外连接(满外连接)

两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的所有行,这种连接称为满外联接。

内连接:在sql99规范中,内连接只返回满足连接条件的数据。

外连接举例

左外连接

select deptno, dname,empno,ename,job

from dept left outer join emp

using(deptno);

右外连接

select deptno, dname,empno,ename,job

from dept right join emp

using(deptno);

满外连接

select deptno, dname,empno,ename,job

from dept full join emp

using(deptno);

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐