查询功能主要由 select 语句实现 ,查询命令的基本形式:
select<列名表或*>
from<表名/视图名>
[where<条件>]
[group by<分组内容>]
[having<组内条件>]
[order by<排序方式>]
简单查询(无条件查询,条件查询:多条件查询),
分组查询,
单表查询
多表查询(用连接查询或嵌套查询)等。
例如:查找出10号部门中全体雇员姓名,工资,工种情况
sql>select ename,sal,job
from emp
where deptno=10;
找出其奖金超过其工资的雇员
SQL>select ename,sal,comm
from emp
where comm>sal;
查询20号部门中有多少种不同工种
SQL>select distinct job
from emp
where deptno=20;
ps:若不要保留字distinct则显示每个雇员工种。若要,这样只显示不同的,它只修饰查结果的行
在多条件查询命令中使用的运算符:
SQL语言中,可使用算术,关系,逻辑运算符组成表达
算术符: +,-,*,/,|| 式作条件
先 *, /, 后 +,-,||
关系符: =,!= 或 <> ,> ,>= ,< ,<=
IN:(等价=ANY)
NOT IN:(等价 !=ALL)
BETWEEN… AND: (在两个值之间)
LIKE:(使字符型匹配)
IS NULL
IS NOT NULL (NULL不同于数值0,也不同于空格符)
逻辑符:
NOT, AND, OR
关系、逻辑表达式一般用在where子句中和having子句中
查找20部门中不是服务员雇员的姓名,工种
sql>select ename,job
from emp
where deptno=20 and job!='CLERK';
计算每个销售人员的年度总报酬
sql>select ename,sal,comm, 12*(sal+comm) SUMPRICE
from emp
where job='SALESMAN'
order by 12*(sal+comm) DESC;
查找出全部经理和第10号部门服务员的有关信息
sql>select ename,job,sal,comm,deptno
from emp
where job='MANAGER' or (job='CLERK' and deptno=10);
找出不在30号部门中的所有经理
sql>ename,job,deptno
from emp
where job='MANAGER' and deptno!=30;
列出10号部门中,既不是经理也不是服务员的所有信息
sql>select ename,job,sal,comm,deptno
from emp
where deptno=10 and job NOT IN('MANAGER','CLERK');
sql>select *
from emp
where NOT(job='MANAGER' OR job='CLERK')
AND deptno=10;
查找出工资在$2000与$3000之间职工姓名,工种、工资
SQL>select ename,job,sal
from emp
where sal between 2000 and 3000;
sql>select ename,job,sal
from emp
where sal>2000 and sal<3000;
列出全部服务员、分析员或推销员名字、所在部门号
sql>select ename,deptno,job
from emp
where job IN('CLERK','ANALYST','SLAESMAN');
列出名字以’L1’开头的全部职工姓名及部门号
sql>select ename,deptno
from emp
where ename like 'L1%';
串匹配查找,在信息系统中使用很多,
用’%’表示任意长度的字符串 进行匹配,
用 ‘_’ 下划线表示仅一个字符匹配
若选用’%K’表示以’K’结尾任意长字串, ’K_ _ _’ 以’K’开头,长度为4
在查询命令中集函数应用:
count (<表达式> )
count(* )
avg( )
min( )
max( )
sum( )
这些函数提供对多行统计,汇总功能
计算公司职工最低,最高,平均及总工资
sql>select min(sal),max(sal),avg(sal),sum(sal)
from emp;
计算公司雇员总人数及工种数
sql>select count(*),count(distinct job)
from emp;
计算全部销售员的年平均报酬
sql>select 12*avg(sal+comm) "year aversal"
from emp
where job='SALESMAN';
查找出具有最高月工资的雇员姓名,工种,工资
sql>select ename,job,sal
from emp
where sal=(select max(sal)
from emp);
排序显示查询结果: 命令中选用order by 子句
按工种,同工种按工资降序排列显示全部雇员有关情况:
sql>select ename,job,sal,deptno,comm
from emp
order by job ASC,sal DESC;
查找奖金超过本人基本工资5%的雇员按百分比高低排序显示:
sql>select ename,job,sal,comm,comm/sal pecent
from emp
where comm>0.05*sal
order by comm/sal desc;
分组查询: 分组查询就是将数据库表中的数据按给定条件分类组合,然后再根据需要分别操作
命令中的group by子句
计算公司支付每一种工种的总工资
sql>select job,sum(sal)
from emp
group by job;
计算每个部门中每种工种各有多少职工
sql>select deptno,job,count(*)
from emp
group by deptno,job;
带条件的分组查询:
命令中的having 子句
查找出各工种组年平均工资,要求每组在2人以上
sql>select job,12*avg(sal+comm) "year aversal",count(*)
from emp
group by job
having count(*)>2;
列出至少有两名服务员的所有部门号
sql>select deptno,count(*)
from emp
where job='CLERK'
group by deptno
having count(*)>2;
统计并显示能获取奖金的职工的各部门各工种的工资总数在9000以上非经理的总工资数,按部门排序
sql>select deptno,job,sum(sal)
where comm>0 and job!='MANAGER'
group by deptno,job
having sum(sal)>9000
order by deptno desc;
sql>select deptno,job,sum(sal)
where comm>0
group by deptno,job
having sum(sal)>9000 and job!='MANAGER'
order by deptno desc;
多表连接查询:
在关系数据库中, 各相关表之间的连接关系是通过字段(共有字段)值来体现的
1.等值连接
查找名字为ALLEN雇员在哪工作:
sql>select ename,deptname
from emp,dept
where ename='ALLEN' AND emp.deptno=dept.deptno;
查部门号是 20,30,40 的职工的有关情况
sql>select e.*,d.*
from emp e,dept d
where e.deptno IN(20,30,40) and e.deptno=d.deptno;
2.自连接:
对同一个表做自身连接,使同一表的不同行连接起来
查找出雇员与其经理的名字
sql>select worker.ename employee,manar.ename manager
from emp worker,emp manar
where worker.mar=manar.empno;
3.不等连接
在前面介绍的关系运算符中,除去“=“外的其它运算符所进行 的连接。
查找出比JONES挣钱多的雇员的名字,工资,工种
sql>select obj.ename,obj.sal,obj.job
from emp obj,emp tem
where obj.sal>(select sal from tem where job='JONES');
sql>select obj.ename,obj.sal,obj.job
from emp obj,emp tem
where obj.sal>tem.sal and tem.job='JONES';
4.外连接 外部链接操作符(+)
显示出所有部门名称及其职员姓名:
sql>select d.deptno,d.dname,enmae,job
from emp,dept d
where dept.deptno=emp.deptno(+)
order by d.deptno;
列出无雇员的部门情况
sql>select dept.deptno,dname,loc
from dept,emp
where dept.deptno=emp.deptno(+) and emp.empno IS NULL;
子查询(嵌套查询):
在一个select命令中的where子句中,若又出现一个select命令,该查询称为嵌套查询
where子句中包括的查询称为子查询(或嵌入的 查询块),相应外层的select命令为主查询 在子查询中的where子句中还可包含子查询,一层层嵌套。
仅嵌套一 层的子查询称单层嵌套, 多于一层的称为多层嵌套查询, 使用子查询能 使一系列简单查询构成复杂的查询, 但是子查询结果总是用于建立主 查询(外层查询)的查询条件
1. 单层子查询
查找出与 SMITH 在同一个部门工作的雇员
SQL>select ename,deptno,job
from emp
where deptno=(select deptno from emp where ename='SMITH');
查找出在’BOSTON’工作的雇员
sql>select ename,job,deptno
from emp
where deptno=(select deptno from dept where loc='BOSTON');
找出比30号部门中任意雇员工资高的雇员情况
sql>select *
from emp
where sal > ALL(select sal from emp where deptno='30') and deptno!=30
order by sal desc;
查找部门10中同部门30中工种相同的雇员
sql>select *
from emp
where deptno=10 and job IN(select job from emp where deptno=30);
sql>select *
from emp
where deptno=10 and job=ANY(select job from emp where deptno=30);
找出与”FORD” 工种相同,工资相同的雇员
sql>select ename,job,sal
from emp
where job=(select job from emp where ename='FORD')
AND sal=(select sal from emp where ename='FORD');
子查询的结果可以返回多个列的值
sql>select ename,job,sal
from emp
where (job,sal)=(select job,sal from emp where ename='FORD');
找出工资比 SCOTT 高且在 NEW YORK工作的雇员
sql>select ename,job,sal
from emp,dept
where loc='NEW YORK' AND emp.deptno=dept.deptno AND
sal>(select sal from emp where ename='SCOTT')
order by sal;
ps:在子查询中不能用order by