oracle数据库基础语句(二)


1.--分组函数,查询条件中的字段要么出现在分组函数中,要么出现子啊group by中
SELECT empno,ename,
MAX(sal) "最高工资",AVG(sal) "平均工资",MIN(sal) "最低工资"
FROM emp GROUP BY empno,ename;

2.--count(*)是不忽略null数据的总数
--count(具体字段会忽略null数据)
SELECT COUNT(*),COUNT(comm) FROM emp;

3.--日期型数据处理,sysdate为当前时间
UPDATE emp SET hiredate = to_date('1598-02-12','yyyy-mm-dd') WHERE empno=7369;
SELECT ename,hiredate FROM emp WHERE to_char(hiredate,'yyyy') BETWEEN '1998' AND '2020';

4.--给当前时间加一个月
SELECT add_months(SYSDATE,1) FROM dual;
5.--表连接(左外,右外,全外(我不怎么用))
--eg:左外链接,以左表为主,右表匹配不上的就为null,右连接则反之.
SELECT e.*,d.* FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
SELECT e.*,d.* FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
6./*内连接(等值连接,非等值连接,自连接)效率低下,若不加等值条件则出现笛卡尔积,
加了等值条件,内部运行也是走了两个表的数据乘积,只是显示正确,效率低*/
--自连接与等值连接合并用
SELECT e.empno,e.ename,e.job "员工工作",e2.empno AS "老板编号" ,e2.ename "上级领导"
FROM emp e INNER JOIN emp e2 ON e.mgr = e2.empno;

7.--非等值链接
SELECT d.dname "部门名称",e.ename,e.sal FROM dept d INNER JOIN emp e
ON e.sal BETWEEN 2000 AND 3500 AND e.deptno = d.deptno;

8.--分页查询(rownum做等于条件,只能等于1,查询第一条数据)
SELECT ROWNUM ,ename FROM emp WHERE ROWNUM=1;
/*rownum查询薪资排名第2-5条的数据,rownum只能做<=不能用来>=,
但是通过子查询把rownum当成一个字段起个别名就可以使用正常的字段排序了
*/
SELECT * FROM (SELECT ROWNUM r,sal FROM emp WHERE ROWNUM <=5) WHERE r>=2;

9.--将多表查询结果合并成一张表(字段数量,类型都要相等)
--union去除重复的,all直接合并
SELECT ename,empno FROM emp
UNION ALL
SELECT dname,deptno FROM dept

10.--去重关键字,只能出现在select紧后边,后方所有字段,联合去重
SELECT DISTINCT ename, deptno FROM emp;







