Oracle --分组,函数查询


--查询所有表信息
SELECT * FROM EMP;

--使用的是scott用户下的emp 和dept表进行操作
 --1.查询姓名为SMITH的员工信息(注意大小写)
  -- 注意:在oracle中内容区分大小写.关键字,表名字段名称不区分大小写.
  SELECT * FROM EMP WHERE ENAME = 'SMITH';
  
 --2.查询20部门的所有员工信息
 SELECT * FROM EMP WHERE DEPTNO =20;
 
 --3.查询所有JOB为CLERK的员工的员工号、员工姓名和部门号。
 SELECT EMPNO,ENAME,DEPTNO FROM EMP WHERE JOB = 'CLERK';
 
 --4.查询奖金(COMM)高于工资(SAL)的员工信息。
 SELECT * FROM EMP WHERE COMM > SAL;

 
 -- 5.查询奖金高于工资的20%的员工信息。
 SELECT * FROM EMP WHERE COMM > SAL * 0.2;
 
 
-- 6.查询10号部门中JOB为MANAGER和 20部门中JOB为CLERK的员工的信息。
 SELECT * FROM EMP WHERE (DEPTNO = 10 AND JOB = 'MANAGER') OR (DEPTNO = 20 AND JOB = 'CLERK');
 
 --7.查询所有工种(job)不是MANAGER和CLERK,
  --且工资大于或等于2000的员工的详细信息。
 SELECT * FROM EMP WHERE JOB != 'MANAGER' AND JOB != 'CLERK' AND SAL >= 2000;
 
 -- 2
 SELECT * FROM EMP WHERE JOB NOT IN ('MANAGER','CLERK') AND SAL >= 2000;
 
 --7.2查询所有工种(job)是MANAGER和CLERK,
  --且工资大于或等于2000的员工的详细信息。
  SELECT * FROM EMP WHERE JOB IN('MANAGER','CLERK')  AND SAL >= 2000;
  
 --8. 查询有奖金的员工的不同工种(job)。
 -- distinct: 去除重复行
  SELECT DISTINCT * FROM EMP WHERE COMM > 0;
 
 --9.查询没有奖金或奖金低于100的员工信息。
 -- %:匹配任何数量的任何字符
  SELECT * FROM EMP WHERE COMM < 100 OR COMM IS NULL;
 
 --10. 查询员工名字中包含字母"S"的员工。
  SELECT * FROM EMP WHERE ENAME LIKE '%S%';
 
 --10.2 查询员工名字中以字母"S"开头的员工。
 SELECT * FROM EMP WHERE ENAME LIKE 'S%';
 
 --10.3 查询员工名字中以字母"S"结尾的员工。
  SELECT * FROM EMP WHERE ENAME LIKE '%S';
 
 --11.查询员工名字中不包含字母"S"的员工。 
  SELECT * FROM EMP WHERE ENAME NOT LIKE '%S%';
 
 --12.查询员工姓名的第二字母为"M"的员工信息。
 -- _(下划线):代表任意单个字符
  SELECT * FROM EMP WHERE ENAME LIKE '_M%';
 
 --13.接收用户输入的员工姓名并且根据姓名查询该员工信息。
  SELECT * FROM EMP WHERE ENAME = '&员工姓名';
 
 --desc:降序排序
 --asc(默认):升序排序
 --14.查询员工的姓名和薪水,并且按照薪水从高到低排序
 SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC;
 
 --15.查询员工的姓名和入职日期,并按入职日期从先到后进行排序。
 SELECT ENAME,HIREDATE FROM EMP ORDER BY  HIREDATE;
 
 --16.显示所有员工的姓名、工种、工资和奖金,
 --按JOB降序排序,若JOB相同则按工资升序排序。
 SELECT ENAME,JOB,SAL,COMM FROM EMP  ORDER BY  JOB DESC,SAL ASC;
 
 -- 1.查询雇员表的员工总数
-- count: 返回匹配指定条件的行数,会忽略
--值为null的行
SELECT COUNT(*) FROM EMP;
SELECT COUNT(COMM) FROM EMP;

-- 求员工表中职务的个数
SELECT COUNT(DISTINCT JOB) FROM EMP;

--2.查询最高工资的员工的名字和工作岗位(Job)
--先求出最高工资
SELECT MAX(SAL) FROM EMP;
-- 把求出的最高工资作为条件查询
SELECT ENAME,JOB FROM EMP WHERE SAL=(SELECT MAX(SAL) FROM EMP);

--3.查询工资高于平均工资的员工信息。
-- 先求平均工资
SELECT AVG(SAL) FROM EMP;
-- 将求出的平均工资作为条件查询
SELECT * FROM EMP WHERE SAL>(SELECT AVG(SAL) FROM EMP);

--group by 对查询的结果进行分组统计

--having 对分组统计的结果进行筛选(限制)
--4.查询每个部门的员工总数
SELECT DEPTNO,COUNT(*) DEPT_EMP_NUM FROM EMP GROUP BY DEPTNO;

--5.显示每个部门的最高工资和最低工资
SELECT DEPTNO,MAX(SAL),MIN(SAL),SUM(SAL) FROM EMP GROUP BY DEPTNO;

--6.显示每个部门的每个岗位的最高工资和最低工资
SELECT DEPTNO,JOB,MAX(SAL),MIN(SAL),SUM(SAL) FROM EMP GROUP BY DEPTNO,JOB  ORDER BY DEPTNO,JOB;

--7.显示每个部门的平均工资并且
 --筛选出平均工资大于等于2000的部门
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO  HAVING AVG(SAL)>2000;

--如果一个语句里面有 order by, group by ,having 
--那么这些顺序是 [where] group by, having order by,
--如果一个查询语句使用了 
--group by 那么该语句查询的列只能是分组函数
--或者 被分组的列(group by 列名称)

-- 8.查询每个部门的总工资
SELECT DEPTNO,SUM(SAL) FROM EMP GROUP BY DEPTNO;

-- 9.如果使用了分组函数,没有被分组的列不能查询

二、数字函数

--10.求绝对值
 select abs(100),abs(-100) from dual;

--11.求平方根
select sqrt(64),sqrt(10) from dual;

--12.求幂
select power(3,2),power(2,3) from dual;

--13.四舍五入
select round(5555.6666,2),round(5555.6666,1),round(5555.6666) from dual;

三、字符函数

--14.连接两个字符串
select concat('010-','88888888') from dual;

--15.替换字符串
select replace('he love you','he','i') test from dual;

--16.截取字符串
/*
  SUBSTR(c1,n1[,n2])
 【参数】在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第y个字符直到结束的字串
*/
select substr('13088888888',3,8) test from dual;

--17.转大写
select upper('AaBbCcDd') isupper from dual;

--18.转小写
select lower('AaBbCcDd') islower from dual;

四、转换函数

-- 19.将字符串转换成日期
-- to_date(值,格式)
select to_date('201508','yyyymm'),
to_date('2015.05.20','yyyy.mm.dd'),
to_date('2008-12-31 12:31:30','yyyy-mm-dd hh24:mi:ss')
from dual;
--20.将将日期或数据转换为char数据类型
--转换得到日期的年份
select to_char(to_date('2015-08-26','yyyy-mm-dd'),'yyyy') from dual; 
--转换得到日期的月份
select to_char(to_date('2015-08-26','yyyy-mm-dd'),'mm') from dual; 
--转换得到日期的日(几号)
select to_char(to_date('2015-08-26','yyyy-mm-dd'),'dd') from dual; 
--转换得到日期的星期
select to_char(to_date('2015-08-26','yyyy-mm-dd'),'day') from dual; 

五、日期函数
--21.返回在日期d1基础上再加n1个月后新的日期。
select sysdate,add_months(sysdate,3)  hz from dual;

--22.返回日期d1所在月份最后一天的日期
select sysdate,last_day(sysdate)  hz from dual;

--23.返回日期d1到日期d2之间的月数。
select sysdate,
months_between(sysdate,to_date('2015-01-01','YYYY-MM-DD')),
months_between(sysdate,to_date('2016-01-01','YYYY-MM-DD')) from dual;

--24.截取日期的指定部分
select extract (YEAR from date '2001-2-16' ) from dual; 


-- 综合案例
select 
extract(hour from timestamp '2015-2-16 2:38:40 ' ) 小时,
extract(minute from timestamp '2015-2-16 2:38:40 ' ) 分钟,
extract(second from timestamp '2015-2-16 2:38:40 ' ) 秒,
extract(DAY from timestamp '2015-2-16 2:38:40 ' ) 日,
extract(MONTH from timestamp '2015-2-16 2:38:40 ' ) 月,
extract(YEAR from timestamp '2015-2-16 2:38:40 ' ) 年
from dual;



你可能感兴趣的:(Oracle)