运算符优先级,算术运算符>比较运算符>not>and>or,()提升优先级。
查询语句,基本语句结构:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
联合查询:内连接(N个表内有相同数据列)
语法:SELECT table.column, table.column FROM table1, table2 WHERE table1.column1 = table2.column2;(或者where其他条件)
where子句中的连接条件,一般要满足数据类型相符,含义一致。
如果设置别名,则只能使用别名:
SELECT 别名.column, 别名.column FROM table1 别名1, table2 别名2 WHERE 别名.column1 = 别名.column2;(或者where其他条件)
——不等值连接(连接条件不是以=连接)(内连接的一种)
例子:select e.ename,e.sal,s.grade,s.losal,s.hisal from emp e,salgrade s
where e.sal between s.losal and s.hisal;--包含边界值
联合查询:外连接
——左外连接
例子:SELECT table.column, table.column FROM table1, table2 WHERE table1.column(+) = table2.column;
+在左边,代表左边需要扩展/删除。左边是从表,右边是主表。主表显示全部项目,从表跟随主表扩展/删除。
——右外连接
例子:SELECTtable.column, table.column FROMtable1, table2 WHEREtable1.column = table2.column(+);
+在右边,代表右边需要扩展/删除。右边是从表,左边是主表。主表显示全部项目,从表跟随主表扩展/删除。
左右外连接用起来是一样的,只是表格书写位置的区别。
——自连接
例子:select w.ename,w.empno,m.ename,m.empno from emp w,emp m
where w.mgr=m.empno;
同一张表,设置两个别名,进行同一张表内的互联,如同一个人既是下属又是上级。
联合查询:另一种写法:join on
——join on内连接
表1 [inner] join 表2 on 表1.列1=表2.列2。
例子:select e.empno,e.deptno,d.loc
from emp e inner join dept d
on e.deptno=d.deptno;
inner可以省略,效果一样的。
——join on 左外连接,主表在左边
主表 left outer join 从表 on 主表.列1=从表.列2
例子:select d.deptno,d.loc,e.empno,e.ename from dept d left outer join emp e
on d.deptno=e.deptno;
——join on 右外连接,主表在右边
从表 right outer join 主表 on 从表.列1=主表.列2
例子:select e.empno,e.ename,d.deptno,d.loc from emp e right outer join dept d
on e.deptno=d.deptno;
子查询
——单行子查询
例:查询工资高于Jones的员工信息 (也可用自连接查询)
select * from emp where sal>(select sal from emp where ename='JONES') order by sal;
注意:子查询要用括号括起来,子查询中不要加ORDER BY子句。
——多行子查询(关键字:not,in,any,all)
例子:查询哪个部门没有员工 in(列表)
select deptno from dept where deptno not in(select distinct deptno from emp);
例子:查询工资小于任何办事员,且职位不是办事员的员工信息
any任意值 >any 大于最小值 <any 小于最大值
select ename,sal from emp
where sal<any(select sal from emp where job='CLERK')
and job<>'CLERK';
例子:查询工资大于最高平均工资的员工信息
all所有值 >all 大于最大值 <all 小于最小值
select ename,sal from emp
where sal>all(select avg(sal) from emp group by deptno);
限定分组结果
语法:SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression]
[HAVING group_condition] [ORDER BY column];
例:查询部门平均工资大于2000的部门信息
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
网友评论