oracle

本文介绍了SQL查询的基础语法,包括去除重复记录、日期格式设置、条件筛选、字符串匹配等,并探讨了SQL优化策略,如合理使用where子句提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去掉重复的:select distinct job from emp;--distinct 作用于后面所有的列

--dual表:伪表

--字符串大小写敏感

SQL> alter session set NLS_DATE_FORMAT='yyyy-mm-dd';

会话已更改。

SQL> select *
  2  from emp
  3  where hiredate='1981-11-17';

     EMPNO ENAME    JOB              MGR HIREDATE     SAL       COMM     DEPTNO                                                                       
---------- -------- --------- ---------- ---------- ----- ---------- ----------                                                                       
      7839 KING     PRESIDENT            1981-11-17  5000                    10     


SQL> --between  and 在。。。。之间
SQL> --查询薪水1000~2000之间的员工                           


SQL> --查询部门号不是10和20的员工

  1  select *
  2  from emp
  3* where deptno not in (10,20)           

--null值 3. 如果集合中含有null,不能使用not in;但可以使用in


SQL> select *
  2  from emp
  3  where ename like 'S%';

 

 --查询名字中含有下划线的员工          --转意字符

  1  select *
  2  from emp
  3* where ename like '%\_%' escape '\'


--SQL 优化 2. where解析的顺序: 右--》 左

--order by作用于后面所有的列;desc只作用于离他最近的列


--substr(a,b) 从a中,第b位开始取

--substr(a,b,c) 从a中,第b位开始取,取c位


SQL> select e.empno,e.ename,e.sal,d.dname
  2  from emp e,dept d
  3  where e.deptno=d.deptno;


SQL> 左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含在最后的结果中
SQL>     写法:where e.deptno=d.deptno(+)
SQL> 右外连接:当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含在最后的结果中
SQL>     写法: where e.deptno(+)=d.deptno
SQL> */
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
  2  from emp e,dept d
  3  where e.deptno(+)=d.deptno
  4  group by d.deptno,d.dname;


    部门号 部门名称             人数                                            
---------- -------------- ----------                                            
        10 ACCOUNTING              3                                            
        40 OPERATIONS              0                                            
        20 RESEARCH                5                                            
        30 SALES                   6                  


SQL> --平均工资
SQL> select sum(sal)/count(*) 一,avg(sal) 二 from emp;


备注:在select列表中所有未包含在组函数中的列都应该包含在group by 子句中


  select a,b,c,组函数(d)
  from emp
  group by a,b,c;   
                                                                                                           
  如果这里没有group by这一行内容,则是错误的;当然,by后面只写了a或者a,b也都不对,而必须把a,b,c都写上


相反:包含在group by子句中的列不必包含在select列表中,也就是上面的group by后面除了写a,b,c之外,还可以写e,f等列


SQL> --多个列的分组
SQL> select deptno,job,sum(sal)
    from emp
    group by deptno,job
    order by 1;


SQL> select deptno,avg(sal)
  2  from emp
  3  group by deptno
  4  having avg(sal) > 2000;


    DEPTNO   AVG(SAL)                                                                                                                                 
---------- ----------                                                                                                                                 
        20       2175                                                                                                                                 
        10 2916.66667                                                                                                                                 


SQL> --where和having的区别:where后面不能使用多行函数(组函数)

SQL> --SQL优化 原则:3. 尽量使用where  (因为where是先过滤再分组,数据量降低了,而having是先分组再过滤,数据量大)


insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);


SQL> delete和truncate的区别:
SQL> 1. delete逐条删除;truncate先摧毁表 再重建
SQL> 2. (*)delete是DML(可以回滚) truncate是DDL(不可以回滚)
SQL> 3. delete不会释放空间 truncate会
SQL> 4. delete可以闪回(flashback)  truncate不可以
SQL> 5. delete会产生碎片 truncate不会
     注意:mysql中truncate的效率比delete高
           oracle中delete的效率比truncate高,因为oracle的delete不是真正的删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值