1 查询语句基础知识:
select
列 "别 名",列,... (显示列)
from 表名
where 条件
group by 分组列,分组列
having 聚合函数条件
order by 列 desc , 列 asc
条件:
比较运算符 =,<>,>,<,>=,<=
逻辑运算符 not 非 ,and 并且,or 或者
列名 > 值 and 列名< 值
not(列名=值)
等值范围判断 (数字,日期 ,文字)
列名 in(值1,值2,值3) <--------> 列 = 值1 or 列=值2 or 列=值3
值1和值2之间范围判断包含边界 (数字,日期)
列名 begin 值1 and 值2 <--------> 列 >=值1 and 列 <=值2
模糊查询 (文字)
通配符的种类 % 0到多个任意字符 , _ 1个任意字符
列名 like '通配符'
select * from emp
where hiredate between to_date('1981-1-1','yyyy-mm-dd')
and to_date('1981-12-31','yyyy-mm-dd')
排序
排序方式
asc 升序(默认),desc 降序,紧跟列名不能跨越逗号
order by 列
主排序列,次要排序列
select * from emp
order by job ,sal desc
备注:不区分大小写('值'例外)
单引号表示字符串: '字符串'
逗号:分割列
能用列名的地方,就可使用函数,计算列
2 聚合函数 (统计分析,表):
count条数,sum某列和,avg某列平均,min某列最小值,max某列最大值
-- select ename, to_char(hiredate,'yyyy'),nvl(comm,0) from emp
select count(*),sum(comm),avg(nvl(comm,0)) from emp
注意:1 count 对记录行来说的,其他对应具体列(数值列)
2 所有函数空行不记录在内
3 聚合函数旁边存在非聚合函数列,该列必须放入group by 中
4 排序列,having 非聚合函数条件列 必须在select中列出来的列才能排序
5 非聚合函数条件放where中,聚合函数条件放having中
select to_char(hiredate,'yyyy'),
min(sal+nvl(comm,0)),max(sal+nvl(comm,0)),avg(sal+nvl(comm,0)) from emp
--where to_char(hiredate,'yyyy')='1981'
group by to_char(hiredate,'yyyy')
having count(*)>1
3表关联: 查多的一方,条件在1 的一方
select * from 表1 ,表2,表3
where 表1.主键=表2.外键
and 表1.键=表3.键
1 1
2 2
----------------------------a-------
1 1
1 2
2 1
2 2
select * from dept
select ename from dept ,emp where emp.deptno=dept.deptno and dname='ACCOUNTING'
4表链接:(从多个表里查内容,要显示多个表的数据)
内链接:查多的一方,条件在1 的一方
select * from 表1
inner join 表2 on 表1.主键=表2.外键
inner join 表3 on 表1.主键=表3.外键
select dname,count(*) from dept inner join emp on emp.deptno=dept.deptno
group by dname
外联接:在inner join 基础上+关联不上的数据
left 以 join 左边表为准
right 以 join 右边为准
full 在inner join 基础上+左,右表关联不上的数据
select * from 表1
left outer join 表2 on 表1.主键=表2.外键
right outer join 表3 on 表1.主键=表3.外键
full outer join 表4 on 表4.主键=表3.外键
select * from dept full outer join emp on dept.deptno=emp.deptno
where emp.ename is null or dept.deptno is null
select count(yg.ename), jl.ename from emp yg inner join emp jl on
yg.mgr=jl.empno
group by jl.ename
5 示例 语句
--显示 部门名称 为Accounting 的员工 及 其经理的名字
select yg.ename,jl.ename from emp yg
inner join dept on dept.deptno=yg.deptno
left join emp jl on yg.mgr=jl.empno
where dname='ACCOUNTING'
--查询员工名字包含A的所有员工及所在部门名称
select ename,dname from emp left join dept on dept.deptno=emp.deptno
where ename like'%A%'
--查询部门的平均工资大于2000的部门名字
select dname,avg(nvl(sal,0)) from emp right join dept on dept.deptno=emp.deptno
group by dname
having avg(nvl(sal,0))<2000
--查询1981-1-1至 1982-12-31之间雇佣员工人数大于2的部门名称
select dname,count(ename) from emp right join dept on dept.deptno=emp.deptno
where hiredate between to_date('1981-1-1','yyyy-mm-dd')
and to_date('1982-12-31','yyyy-mm-dd')
group by dname
having count(ename)>2
--查询没有员工的部门名称
select dname from emp right join dept on dept.deptno=emp.deptno
where ename is null
--查询各个经理的名字及所在部门名字
--distinct去重复行
select jl.ename,dname,count(*) from emp yg inner join emp jl on yg.mgr=jl.empno
inner join dept on jl.deptno=dept.deptno
group by jl.ename,dname
--查询 有佣金(列名 comm ) 的部门名字 及 人数
select dname,Count(*) from emp right join dept on dept.deptno=emp.deptno
where comm is not null
group by dname
--查询所有部门人数
select dname ,count(emp.ename) from emp
right outer join dept on emp.deptno=dept.deptno
group by dname
--各岗位,各部门(显示部门名)的平均工资
select job,dname ,avg(sal+nvl(comm,0)) from emp
right outer join dept on emp.deptno=dept.deptno
group by job,dname