oracle for sql

SQL学习笔记 

0、select * from tab; //查询当前用户下有多少张表

1、Select LastName,FirstName from persons; //查找Persons表中LastName、FirstName两列的信息。

2、select * from emp where comm is NOT NULL; //查询emp表中获得奖金的雇员。

3、select * from emp where comm is NULL; //查询emp表中没有奖金的雇员。

4、select * from emp where comm >150; //查询emp表中奖金大于150的雇员。

5、select * from emp where sal>1500 and comm is not null; //工资大于1500且获得奖金的雇员。

6、select * from emp where not (sal>1500 and comm is not null);//查询整体工资大于1500同时不能获得奖金的雇员。注释:在词句中not()表示对括号的的条件取反。

7、条件筛选关键词between、and用法,between 最小值 and 最大值;select * from emp where sal between 1500 and 3000; //查询工资大于1500小于3000的雇员。

8、select * from emp where hiredate between '1-1-81' and '31-12-81'; //查询在1981.1.11981.12.31雇佣的雇员

9、select * from emp where ename='SMITH'; //查询姓名为SMITH的雇员信息。注意:在查询的时候,姓名必须与数据库中保持一致。

10、select * from emp where empno in(7369,7499,7521); //此句考察in的用法,查询编号为73697499,7521雇员的信息

11、select * from emp where job IN('CLERK','SALESMAN'); //查询职位是CLERKSALESMAN雇员的信息。此句考察in关键字

12、select * from emp where ename like 'M%'; //查询以姓名以M开头的雇员,此句考察like模糊匹配关键字

13、select * from emp order by sal ASC; //查询雇员工资由少到多排序,此句考察order by 的用法.ASC表示升序排列,升序为默认排列方式,asc可以不写

14、select * from emp order by sal desc; ///查询雇员工资由多到少排序,DESC表示降序排列

15、select * from emp where ename=UPPER('smith'); //此句考察upper()函数,此函数的功能是将字符串转为大写。

16、select * from emp where job='CLERK' order by sal; //查询工作为CLERK(文员)雇员并且按薪水升序排列

17、select substr('hello',2)from dual; //此句考察substr()函数,结果输出为:ello

18、select substr('hello',1,4)from dual; //截取14中间的字符串部分,输出结果为:hell

19、select sysdate from dual; //sysdate显示当前日期

20、select ENAME,EMPNO,ROUND((SYSDATE-HIREDATE)/7) FROM EMP; //求出雇员入职到现在工作了多少个星期

21select ename,empno,To_CHAR(hiredate,'yyyy') y,

       To_CHAR(hiredate,'mm') m,

       To_CHAR(hiredate,'dd') d

from emp; //此句考察TO_CHAR()函数,让日期以年、月、日分开的形式显示。输出结果如下

22、select to_date('20171119','yyyy-mm-dd') from dual; //此句考察to_date()函数,to_date()函数可以把字符串数字转换成日期的格式。

23、select * from emp where deptno=30; //查出部门编号为30的所有雇员

24、select ename,empno,deptno from emp where job=upper(‘clerk’); //列出工作为CLERK的雇员的姓名、工号、部门编号。

25、select * from emp where comm>sal; //找出佣金大于薪金的雇员

26、select * from emp where comm>sal*0.6; //找出佣金大于薪金60%的雇员

27select * from emp

where (deptno=10 and job=upper('manager'))

or  (deptno=20 and job=upper('clerk')); //查出部门10中所有经理和部门20中所有文员。

28select * from emp

where (deptno=10 and job=upper('manager'))

or  (deptno=20 and job=upper('clerk'))

or (job not in('MANAGER','CLERK') and sal>=2000); //出部门10中所有经理和部门20中所有文员,既不是经理又不是文员且工资大于2000的雇员。

 

29、select distinct job from emp where comm is not null; //找出收取佣金的不同工作。

30、select *from emp where (comm is null or comm<100); //找出不收取佣金或者收取佣金小于100的雇员。

 

31、select *from emp where last_day(hiredate)-2=hiredate; //找出每月倒数第3天入职的雇员。

32、select *from emp where (months_between(sysdate,hiredate)/12)>12; //找出入职年限大于12年的所有雇员

33、select initcap(ename) from emp; //以首字母显示所有雇员的姓名

34、select ename from emp where length(ename)=5 ; //显示姓名长度为5的雇员姓名

35、select ename from emp where ename not like '%R%' ; //查找雇员姓名不带R字母的姓名。

36、select substr(ename,0,3) from emp ; //截取所有雇员姓名的前三个字母。

37、select replace(ename,'A','a') from emp ; //显示所有雇员姓名其姓名含有A的用a替换。

38、select ename,hiredate from emp where (months_between(sysdate,hiredate)/12)>10;//显示工作年限大于10的员工的姓名和入职日期。

39、select * from emp order by hiredate; //按员工入职年限由降序排列。

40、select ename,job,sal from emp order by job DESC,sal; //显示雇员的姓名、工作、薪水排序,若薪水相同则按工作排序。

41、select ename,to_char(hiredate,'yyyy') year,to_char(hiredate,'mm') monthsfrom emporder by year,months ; //显示所有雇员的姓名,按年、月排序,若年相同,则按月升序排列。

42、select ename, round(sal/30)from emp; //显示月份为30天的员工日新。

43、select * from emp where to_char(hiredate,'mm')=2; //查出2月入职的所有雇员

44、select ename,round(sysdate-hiredate) from emp; //显示所有雇员入职的天数。

45、select * from emp where ename like '%A%'; //显示姓名中含有字母A的雇员

46、select ename,trunc(months_between(sysdate,hiredate)/12)year from emp; //显示雇员工作了多少年

47、查询语句总结

SELECT {DISTINCT} *| 查询列1 别名1,查询列2 别名2.....

from 表名称 别名

{where条件(s)}

{order by 排序字段 asc|desc,排序字段 asc|desc,....}

48、单行函数:

to_char()函数、日期函数、nvl()decode()

 

49、多表查询:两张以上的表查联合查询称为多表查询。

50、SELECT COUNT(*)FROM EMP; //此句考察count()函数,查询emp表有多少条数据

51、在使用多表查询的时候会出现笛卡尔积,两张表的数据会交互出现,比如emp表和dept两张表,emp14行数据,dept4行数据,两张一起查询会出现14*4=56行数据。

52、如何去掉笛卡尔积,找出两张表中有相关联的列或相同的列。

 

 

多表关联查询:

53、SELECT e.ename,e.empno,d.deptno,d.dname,d.loc FROM emp e,dept d where e.deptno=d.deptno; //查找雇员的姓名、编号(二者位于emp表中),所在部门编号、部门名称、部门位置(三者位于dept表中)。语句中的e代表emp别名,d代表dept别名。

54SELECT e.ename,e.job,m.ename

from emp e ,emp m

where e.mgr=m.empno; //此句是查出每个雇员的姓名、工作以及雇员的上级领导,此句中用到了本表(EMP)关联(EMP)本表查询,分别用em代表emp表。此句中的难点是e.mgr=m.empno;

55select e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.grade

from 

emp e,dept d,salgrade s,emp m,salgrade ms

where

e.deptno=d.deptno and e.sal between s.losal and s.hisal

and

 e.mgr=m.empno and m.sal between ms.losal and ms.hisal; //查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade,及其领导的姓名及工资所在公司的排名。

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

decode(s.grade,1,'5d',2,'4d',3,'3d',4,'2d',5,'1d'),s.grade,m.ename,

decode(ms.grade,1,'5d',2,'4d',3,'3d',4,'2d',5,'1d'),m.sal,ms.grade

from 

emp e,dept d,salgrade s,emp m,salgrade ms

where

e.deptno=d.deptno and e.sal between s.losal and s.hisal

and

 e.mgr=m.empno and m.sal between ms.losal and ms.hisal; //54语句的基础上增加了工资等级,用到了decode()函数。

 

56、多表查询的左连接、右连接。在表emp与表dept做联合查询的时候,emp表中并没有40部门的雇员,因此40部门在查询中并未显示出来,但40部门在dept中是有的,如何让dept表中的40部门显示出来呢?(就是多张表做联合查询时,有一个数据在做联合查询的表中不全都有,而又需要让这个数据显示出来的意思)。这就要用到左、右连接。所谓左、右连接,就是在去除笛卡尔积的等式某一边加上加号(+),

57select e.empno,e.job,d.loc,d.dname,d.deptno

from emp e,dept d

where e.deptno(+)=d.deptno; //此就用到了右连接,

58、怎么区分是左连接还是右连接呢?e.deptno(+)=d.deptno此为右连接,(+)在等号左边,以右边的表为准),e.deptno=d.deptno+),此为左连接,与右连接相反。

59、左、右连接在开发中的应用。

60、select * from emp cross join dept; //此句考察交叉连接语法,cross join 1999sal版本语法,用于交叉连接查询产生笛卡尔积。

61、select * from emp natural join dept; //本句考察SQL1999版本中的natural join 语法,自然连接。

 

组函数及分组统计:

62、当我们要得出每一组的平均年龄、身高、平均薪水时就要用到分组函数。在sql中经常用到的分组函数有:max()、min()avg()sum()count()

63、select min(sal) from emp; //找出最低工资

64、select max(sal) from emp; //找出最高工资

65、select sum(sal) from emp where deptno=20; //求出20部门员工的工资总和

66、select avg(sal) from emp; //求出emp表中的雇员平均工资。

67、select deptno,count(empno) from emp group by deptno; //求出每个部门的雇员人数。

68、select deptno,avg(sal) from emp group by deptno; //求出每个部门的平均工资

69、分组函数使用记得和分组关键字group by 联合使用,分组函数,使用时就要记得分组。

70、where 后面不能跟分组函数。

71、select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

//求出平均薪水大于2000的部门编号和平均薪水。

72select job,sum(sal)su from emp

where job<>'SALESMAN'group by job

having sum(sal)>5000 order by su desc; //求出非销售员的月工资总和,并且要求按降序显示出总工资大于5000的工作和总工资。

 

子查询:

73、子查定义;在一个查询的内部还包括另外一个查询,则此查询为子查询

74、所有的子查询必须在()里面编写子查询代码,子查询在操作中分为三类:第一类是单列子查询,返回的结果是一列的一个内容,在开发中出现的几率最高;第二类是单行子查询,返回多个列,有可能是一条完整的记录;第三类是多行子查询,返回多条记录。

75、select * from emp where sal>(select sal from emp where empno=7654)and job=(select job from emp where empno=7788); //查出工资大于编号为7654的员工且从事的工作与编号为7788的相同。

76、select * from emp where sal=(select min(sal) from emp); //查出最低工资雇员的信息。

 

转载于:https://www.cnblogs.com/cytb/p/7884405.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值