zoukankan      html  css  js  c++  java
  • oracle初级(续)

                              有志者、事竟成,破釜沉舟,百二秦关终属楚;
                              苦心人、天不负,卧薪尝胆,三千越甲可吞吴。

    oracle基本简单的用法,之前的笔记稍作整理一下,希望对各位有用,如有问题可在下方留言,所有SQL都是经过oracle环境测试的,可复制可粘贴。

      1 select * from emp order by deptno asc ;
      2 
      3 select * from dept;
      4 --oracle 拼接字符串
      5 --oracle中字符串需要在英文或其他文字两端用单引号包含
      6 select empno, ename, '职位是' || job, sal from emp;
      7 
      8 --列名的别名起别名利用空格
      9 select empno, ename, '职位是' || job haha, sal from emp;
     10 --如果使用双引号声明别名,则可以区分大小写
     11 select empno, ename, '职位是' || job "haha", sal from emp;
     12 --如果想在别名中显示空格,一定要有双引号
     13 
     14 --–关键字AS
     15 select empno, ename, '职位是' || job as "ha ha", sal from emp;
     16 --–注意:推荐使用as声明别名,容易区分表达式与别名的界限
     17 
     18 --  去掉重复行
     19 select distinct deptno from emp;
     20 -注意:distinct只能放在select与列名之间的位置
     21 -- select distinct 列1,列2,..列n
     22 --select和from 书写顺序 select…from
     23 执行顺序 fromselect
     24 
     25 --不等于
     26 select * from emp where deptno != 20;
     27 select * from emp where deptno <>20;--推荐这种写法
     28 
     29 --查询条件中的 与关系
     30 问题一:
     31 查询在10号部门工作,并且月薪高于2000,
     32 并且职位是MANAGER的员工信息
     33 
     34 select * from emp where deptno = 10 and sal>2000 and job = 'MANAGER';
     35 --或关系or
     36 问题一:
     37 查询在10号部门工作或者工资高于2000的员工
     38 
     39 select * from emp where deptno =10 or sal>2000;
     40 --如果and与or一起使用
     41 –and的优先级要比or高(重要)
     42 如果要想修改优先级,加括号查询在10号部门工作或者工资高于2000,并且职位是MANAGER的员工
     43 
     44 
     45 select * from emp where (deptno = 10 or sal > 2000) and job = 'MANAGER';
     46 
     47 -- 特殊的比较运算符
     48 
     49 --beetween ... and
     50 
     51 --beetween 上限 and 下限
     52 
     53 查询emp表中,20号部门月薪在1000~2000之间的员工信息
     54 
     55 select * from emp where (sal between 1000 and 2000) and deptno = 20;
     56 
     57between and 使用范围 数值和日期
     58 –数据库的常见数据类型:
     591)文字
     602)数值
     613)日期/时间
     62 
     63 select * from emp where hiredate between '1-1月-1982' and '31-12月-1982';
     64 
     65 --between and 也可以比较字符串,比较顺序是按照字典的顺序比较
     66 
     67 
     68 select * from emp where ename between 'A' and 'C';
     69 
     70 --上下限反着写 
     71 select * from emp where sal between 2000 and 1000;
     72 -- 语句不报错,但是逻辑关系没有,没有结果
     73 --关键字in 格式 列 in(值1,值2,值3…值n)列的取值是值1或值2或值3…或值n
     74 select ename, mgr from emp where mgr in(7902, 7698, 7788);
     75 --like… 像…(重点)
     76 模糊查询
     77 通配字符
     78 % :0­n个任意字符
     79 _:1一个任意字符
     80 --查询所有员工首字母为B的员工信息
     81 select * from emp where ename like 'B%';
     82 --–练习:查询倒数第二个字符是R的员工信息
     83 
     84 --like只能用于文字类型的模糊查询匹配。
     85 select * from emp where ename like '%R_';
     86 
     87 --is null
     88 用于筛选空值
     89 因为=null的逻辑关系是null,不能筛选出空值
     90 查询没有奖金的人
     91 
     92 
     93 select * from emp where comm = 0 or comm is null;
     94 
     95 --NOT
     96 逻辑非关系,表示取反
     97 
     98 --not between and
     99 
    100 查询月薪不在1000~2000之间的员工信息
    101 
    102 select * from emp where sal not between 1000 and 2000;
    103 列名在not前后结果一致,保证列名在between前即可
    104 --not in
    105 
    106 查询其上司的员工编号不是7902,7698,7788的员工的信息
    107 
    108 select * from emp where mgr not in(7902, 7698, 7788);
    109 
    110 --not like 
    111 
    112 查询所有不姓张的员工
    113 
    114 select * from emp
    115 where ename not like '张%';
    116 --is not null
    117 select * from emp
    118 where comm is not null;
    119 
    120 
    121 排序
    122order by
    123 –升序 由小到大
    124 –数值:由小到大
    125 –日期:由早到晚
    126 –文字:字典顺序
    127 
    128 
    129 查询所有10号部门的员工信息,按照月薪升序进行排序
    130 
    131 
    132 select * from emp where deptno = 10 order by sal ;
    133 
    134 有的环境下不加升序排列,环境默认的是升序,
    135 oracle默认的是升序
    136 
    137 select * from emp where deptno = 10 order by sal asc ;
    138 
    139 推荐写法
    140 
    141 SQl语句执行顺序
    142 书写顺序:selectfromwhereorder by
    143 执行顺序:fromwhereselectorder by
    144 where不能使用别名,因为select中尚未执行,
    145 所以还没有创建出别名,order by可以使用别名,
    146 因为order by在select之后执行,列的别名已经被创建
    147 --多列排序
    148 查询员工信息,按照部门编号排序,月薪降序
    149 select * from emp order by deptno asc, sal desc;
    150 
    151 --oracle函数
    152 单行函数、多行函数(分组函数)
    153 单行函数
    154 dual
    155 --系统显示当前日期
    156 select sysdate from dual;
    157 
    158 使用的单行函数,对查询结果的每一行记录都有效,
    159 会影响到每一行的记录
    160 dual表为了补全sql语句
    161 
    162 --转大写 upper(str) 将str字符串转成大写
    163 
    164 select upper('hAHa') as 描述 from dual;
    165 
    166 可以为列增加别名
    167 
    168 --转小写lower(str) 将str字符串转成小写
    169 
    170 select lower('hAHa') from dual;
    171 
    172 --首字母转大写,其余字母小写initcap(str)
    173 
    174 select initcap('hAHa') from dual;
    175 
    176 select initcap('i LiKe GIRL') from dual;
    177 
    178 --以单词为单位,每个单词的首字母大写,其余的小写
    179 
    180 select * from emp where lower(ename) = lower('ScOTT');
    181 --lower()替换为upper()效果一样
    182 
    183 字符截取函数
    184 --substr(str,n1,n2)
    185 str:被截取的字符串
    186 n1:开始截取的位置(以1的位置开始)
    187 n2:截取字符的个数
    188 将str字符串从n1位置起,截取n2个字符
    189 结果:字符型类
    190 
    191 
    192 select substr('0123456', 3, 3) from dual;
    193 
    194 从n1的位置开始,要包含该位置的字符
    195 
    196 字符查找函数
    197 --instr(str1,str2,n1,n2)
    198 在str1中寻找str2的字符串,
    199 从n1的位置起,第n2次出现的位置
    200 结果是一个位置,位置是一个数值
    201 
    202 select instr('I LIKE GIRL', 'I', 2, 1) from dual;
    203 
    204 --字符拼接函数
    205 select 'haha' || 'xixi' || 'hehe' from dual;
    206 –将str1和str2拼接组成一个字符串,功能等同于 ||
    207 --concat(str1,str2)
    208 select concat('haha', 'xixi') from dual;
    209 
    210 select concat(concat('haha', 'xixi'),'hehe') from dual;
    211 
    212 字符替换函数
    213 --replace(str1,str2,str3)
    214 在str1字符串中,使用str3来替换全部的str2
    215 
    216 select replace('ABCDECD', 'CD', 'HAHA') from dual;
    217 
    218 字符串的长度函数
    219 --length(str)
    220 返回str字符串的文字的个数
    221 
    222 select length('abcde'), length('哈哈') from dual;
    223 
    224 字符串补齐函数
    225 lpad(str1,n1,str2)
    226 rpad(str1,n1,str2)
    227 lpad:将str1字符串,使用str2在左侧补充到n1个长度
    228 rpad:将str1字符串,使用str2在右侧补充到n1个长度
    229 
    230 select lpad('abc', 6, '哈呵'), rpad('abc', 2, '*')
    231 from dual;
    232 
    233 --trunc(n1,n2)
    234 –将n1数字舍弃,精确到小数点后n2位
    235 select trunc(3.1415, 3), trunc(3.14, 0), trunc(6.14, -1)from dual;
    236 --MOD(n1,n2)
    237 求n1除以n2后得到的余数 取余
    238 
    239 select mod(5, 3), mod(5, -3), mod(-5, 3), mod(-5, -3)
    240 from dual;
    241 取余运算区分正负值,看被除数 编程也是遵循这样原则
    242 
    243 日期函数(重要)
    244 --sysdate(函数)
    245 获取数据库所在服务器的当前系统时间
    246 select sysdate from dual;
    247 
    248 
    249 --months_between(date1,date2) date1与date2之间的月数差
    250 假设emp表中,所有员工至今未辞职,计算他们现在的司龄
    251 months_between(date1,date2)与between and上下限不是对应的
    252 
    253 
    254 select ename, hiredate,trunc(months_between(sysdate, hiredate) / 12, 0) as 司龄 from emp;
    255 用于计算年龄,司龄,工龄
    256 这些类似的随着时间流逝而改变的数据
    257 
    258 
    259 --add_months(date1,d1)
    260 为date1的时间,追加d1个月,结果还是一个日期
    261 设公司的试用期为6个月,计算emp表中员工的转正日期
    262 
    263 
    264 select ename, hiredate, add_months(hiredate, 6)as 转正日期 from emp;
    265 
    266 --last_day(date1)
    267 date1所在月份最后一天的日期(结果的类型还是日期)
    268 
    269 select ename, hiredate, last_day(hiredate)
    270 from emp;
    271 
    272 两个日期之间的天数(重要)
    273 
    274 差值就是天数,没有小数点
    275 
    276 --next_day(date1,n1)
    277 返回date1起之后周几的日期
    278 1:周日 2:周一 … 7:周六
    279 
    280 select next_day(sysdate,7) from dual;
    281 
    282 
    283 转换函数(重点)
    284 --to_number(str)
    285 将str字符串转为数字
    286 
    287 select to_number('1234') from dual;
    288 
    289 按照特定格式转换
    290 --to_number(str1,fmt) fmt格式也一定要是一个字符串 fmt也叫做格式码
    291 –$ : 美元符号
    292 –, :三位分隔符或者千位分割符 100,222,119.00
    2939 :一位数字
    2940 :一位数字或者前导0(补全前面的位置)(了解)
    295 
    296 
    297 如果实际数据超过fmt定义的长度,则数值无法显示
    298 实际数据小于fmt定义的长度,数值可以显示
    299 
    300 
    301 --to_char(n1,fmt)
    302 将数值转换为fmt表示的文字
    303 
    304 select to_number('$23,412,123.34','$99,999,999.99')from dual;
    305 
    306 select to_char(2236778,'$9,999,999.99') from dual;
    307 
    308 –日期转字符 to_char(date1,fmt)
    309 –日期的格式码:
    310 –YYYY 年
    311 –MM 月
    312 –DD 日
    313 –HH24 24进制的小时
    314 –HH12 12进制的小时
    315 –MI 分
    316 –SS 秒
    317 – ­ / 常规日期分割符
    318 –: 常规时间分割符
    319 DATE类型 精确到秒
    320 查询员工姓名和入职日期
    321 入职日期按照”年//日 时:分:秒”的格式显示
    322 
    323 select ename, to_char(hiredate, 'YYYY/MM/DD HH24:MI:SS')from emp;
    324 YY,RR 也是表示年
    325 
    326 --to_date
    327 
    328 select to_date('2017-4-7','YYYY-MM-DD') from dual;
    329 
    330 查询在1982年期间入职的员工 按照规定格式显示
    331 XXXX­XX­XX
    332 select * from empwhere hiredate between to_date('1982-1-1','YYYY-MM-DD')and to_date('1982-12-31','YYYY-MM-DD');
    333 
    334 
    335 通用函数
    336 --nvl(expr1,expr2)
    337 当expr1值不是null时,函数结果是expr1
    338 当expr1值是null时,函数的结果是expr2
    339 计算员工月收入,如果员工有奖金,则奖金+500
    340 如果员工没有奖金,则不发奖金
    341 
    342 select ename, comm, sal + nvl(comm + 500,0) from emp;
    343 --nvl2(expr1,expr2,expr3)
    344 判断expr1的值是否为null
    345 如果是null使用expr3的值
    346 如果不是null使用expr2的值
    347 
    348 select comm, nvl2(comm, 1, 2) from emp;
    349 给员工发节日福利,有奖金的人节日福利是1000,没有奖金的人节日福利是800
    350 select comm, nvl2(comm, 1000, 800) from emp;
    351 
    352 多行函数(分组函数)
    353 由多行记录为一组统计出的数据,利用的是分组函数(多行函数)
    354 常见的统计型数据
    355 求和
    356 --sum()
    357 –查询emp表中,所有月薪的总和
    358 select sum(sal) from emp;
    359 求平均
    360 --avg()
    361 求emp中平均司龄
    362 select avg(months_between(sysdate,hiredate) / 12)from emp;
    363 最大值
    364 --max()
    365 –查询emp表中,最高月薪
    366 select max(sal) from emp;
    367 最小值
    368 --min()
    369 –查询emp表中,最低月薪
    370 select min(sal) from emp;
    371 计数
    372 --count()
    373 查询emp表中,有多少个员工
    374 select count(empno) from emp;
    375 select count(distinct deptno) from emp;
    376 去掉重复数据用distinct,在count函数内部
    377 查询每个部门的平均工资
    378 --group by 依据XX分组 不是分组函数
    379 只有使用了分组函数,才能使用group by
    380 
    381 select deptno ,avg(sal) from emp group by deptno;
    382 
    383 只有在group by中出现的列,才能写在select之后(必须记住)
    384 多次分组,第二次分组是在第一次分组的基础上进行的
    385 查询10号和20号部门的平均工资
    386 
    387 select deptno,avg(sal)from emp where deptno in(10,20)group by deptno order by deptno asc;
    388 --书写顺序
    389 --执行顺序 from...where...group by...select...order by...
    390 分组函数是在group by 执行位置进行计算
    391 查询平均工资高于2500的部门id和其平均工资
    392 select deptno, avg(sal)from emp where avg(sal) > 2500  --错误写法group by deptno
    393 -- where 后面不允许使用分组函数
    394 --having
    395 –专门处理分组函数的筛选
    396group byhaving397 
    398 –查询平均工资在2000~2500之间的部门ID和其平均工资
    399 select deptno, avg(sal)from emp group by deptno having avg(sal) between 2000 and 2500;
    400 select deptno, avg(sal)from emp group by deptno having avg(sal) >= 2000 and avg(sal) <= 2500;
    401 select deptno, avg(sal)from emp group by deptno having avg(sal) > 2500;
    402 --执行顺序
    403 
    404 --from ...where... group by ... having... select ...order ...by

    今天先写这些,未完,待续。。。。

  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/shandouji1121/p/7901150.html
Copyright © 2011-2022 走看看