一、简单查询语句
1、    查看表结构
desc emp;
2、    查询所有列
select * from emp;
3、    查询指定列
select empmo, ename, mgr FROM emp;
select distinct mgr FROM emp;--显示非重复的数据
4、    查询指定行
SELECT * FROM emp WHERE job='CLERK';
5、    使用算术表达式
SELECT ename, sal*13+nvl(comm,1)    FROM emp;
nvl(comm,1)的意思是,如果 comm 中有值,则 nvl(comm,1)=comm; comm 中无值,贝U nvl(comm,
1)=0
SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal 为别名,可按别名排序)
SELECT * FROM emp WHERE hiredate>'01-1 -82';
6、    使用like操作符(%, _)
Acharlist]或者[!ch
%表示一个或多个字符,表示一个字符,[charlist]表示字符列中的任何单一字符, arlist]不在字符列中的任何单一字符。
SELECT * FROM emp WHERE ename like 'S_T%';
7、    在where条件中使用in
select * from emp WHERE job in ('clerk', 'an alyst');
&查询字段内容为空/非空的语句
select * from emp where mgr is/is not null;
9、    使用逻辑操作符号
select * from emp where (sal>500 or job='MANGE') and ename like 'j%';
10、    将查询结果按字段的值进行排序
select * from emp order by dept no, sal DESC;(按部门升序,并按薪酬降序)
】、复杂查询
1、数据分组( max ,min ,avg ,sum ,count )
select max(sal), min(age), avg(sal), sum(sal) from emp;
select * from emp where sal = (select max(sal) from emp);
select count(*) from emp;
2group by (用于对查询结果的分组统计)和    having子句(用
户限制分组显示结果)
select dept no, max(sal), avg(sal), from emp group by dept no;
select dept no, job ,avg(sal), min( sal) from emp group by dept no,job hav ing avg(sal)<2000;
对于数据分组的总结:
« a.分组函数只能出现在选择列表、    havingorder by子句中(不能出现在where中)
« b.如果select语句中同时包含有 group by,having,order by    ,那么它们的顺序是 group
by,havi ng ,order by.
* c.在选择列中如果有列,表达式,和分组函数,那么这些列和表达式必须出现在    group
by子句中,否则就是会出错。    注:使用group by不是使用having的前提条件
havingwhere最大的区别是having 能带聚合函数,而 where不可以
select emp_id from t group by emp_id having count(*) = 1 --正确
select emp_id from t group by emp_id where count(*) = 1 --辛错误
如果用where要达到这个,估计这样
p_id from (select emp_id,count(*) as ent from t group by emp_id)t1 where t1t
=1
3常用的sql查询语句有哪些、多表查询
SELECT e.name,e.sal,d.dname    FROM emp e, dept d WHERE e.deptno=d.deptno orde
r by d.
dept no;
ame,e.ade FROM emp e,salgrade s WHER e.sal BETWEEN s.losal AN
D s.hisal;
4、    自连接(指同一张表的连接查询)
ame, ee.ename mgr_name from emp er, emp ee = ee.empno;
5、    子查询(嵌入到其他 sql语句中的select语句,也叫做嵌套 查询)
5.1单行子查询
select en ame from emp where dept no=(select dept no from emp where en ame='SMITH');
查询表中与Smith同部门的人员名字。因为返回结果只有一行,所以用    =”连接子查询语句
5.2多行子查询
select en ame,job,sal,dept no from emp where job in (select dist inct job from emp where dept n o=10);
查询表中与部门编号为10的工作相同的员工的姓名、工作、薪水、部门号。因为返回结果又多行, 所以用In ”连接子查询语句
inexists的区别:exists()后面的子查询被称做相关子查询,它是不返回列表 的值的。值是返回一个truefalse的结果,其运行方式是先运行主查询一次, 再去子查询与其对应的结果。如果是 true则输出,反之则不输出。再根据主查 询中的每一行去子查询里去查询。in()后面的子查询,是返回结果集的,换句话
说执行次序和exists()不一样。子查询先产生结果集,然后主查询再去结果集里
去符合要求的字段列表去。符合要求的输出,反之则不输出
5.3使用ALL
select en ame,sal,dept no from emp where sal>ALL(select sal from emp where dept no=30);
select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptnp=3 0);
查询工资比部门号为30的所有员工工资都高的员工的姓名、薪水和部门号。以上两个语句在功能上 是一样的,但执行效率上,函数会高很多。
5.4使用ANY
select en ame,sal,dept no from emp where sal> ANY(select sal from emp where dept no=30);
select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno=3 0);
查询工资比部门号为30号的任意一个员工工资高(只要比某一员工工资高即可)的员工的姓名、薪 水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高得多。
5.5多列子查询
select * from emp where (job,deptno)=(select job,deptno from emp where ename='SMITH');
5.6from子句中使用子查询
select emp.deptno ,ame ,emp.sal ,t_avgsal.avgsal from emp, (select emp.deptno ,avg (emp.sal) avgsal from emp group by emp.deptno)t_avgsal where emp.deptno=t_avgsal.deptno

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。