• 4、高级查询和函数


    一、DML、函数、高级查询


    --为scott用户解锁
    SQL> alter user scott account unlock;
    用户已更改。

    --为scott设置密码
    SQL> alter user scott identified by tiger;
    用户已更改。

    --切换用户连接
    SQL> conn scott;
    输入口令: tiger
    已连接。


    --删除学生成绩表中成绩列
    alter table stuinfo drop column score;

    --添加班级列
    alter table stuinfo add(classno varchar2(12));

    --查看表结构
    desc stuinfo;

    --查询序列
    select sequence_name from user_sequences;

    --插入语句
    SQL> insert into stuinfo values(seq_stuinfo.nextval,'holly','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'汤帅','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'陆毅文','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'张宗奇','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'周强','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'董演','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'薛东','TB07');

    已创建 1 行。

    SQL> insert into stuinfo values(seq_stuinfo.nextval,'钱涛','TB07');

    已创建 1 行。

    --修改学生成绩表结构
    SQL> alter table stuscore modify(english number(3,1),chain number(3,1),history number(3,1));

    SQL> desc stuscore;
    名称 是否为空? 类型
    ----------------------------------------- -------- ----------------------------
    ID NOT NULL NUMBER
    SID NOT NULL NUMBER
    ENGLISH NUMBER(3,1)
    CHAIN NUMBER(3,1)
    HISTORY NUMBER(3,1)
    EXAMTIME DATE

    --插入学生成绩信息
    SQL> insert into stuscore values(seq_stuscore.nextval,1,50.5,34.5,35.5,to_date('2014-4-4','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,2,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,3,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,4,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,5,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,6,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,7,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    SQL> insert into stuscore values(seq_stuscore.nextval,8,70.5,64.5,85.5,to_date('2014-4-8','yyyy-mm-dd'));

    已创建 1 行。

    二、简单查询、模糊查询、条件查询、单行函数

    --切换sqlplus
    >sqlplus
    Enter user-name: system
    Enter password:accp
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options

    --解锁scott测试用户
    SQL> alter user scott account unlock;

    User altered.

    --为scott用户设置密码
    SQL> alter user scott identified by tiger;

    User altered.

    --切换scott用户登录
    SQL> conn scott;
    Enter password:tiger;
    Connected.
    --1.基本查询
    --1.1查询员工职位
    SQL> select distinct job from emp;

    --1.2查询每个员工的职位(员工是唯一的,职位是可以重复的)
    SQL> select ename,job from emp;


    --2.算术操作符
    --2.1查询每一个员工的姓名、职位、年薪
    SQL> select ename,job,sal*12 from emp;

    --2.2查询每一个员工的姓名、职位、年薪(每个员工奖金300)
    SQL> select ename,job,(sal+300)*12 as income from emp;

    --2.3公司每年年给大家奖金300同时,年底都会多发一个月基本工资
    SQL> select ename,job,(sal+300)*12+sal as income from emp;

    --2.4.数据类表显示中文字段
    SQL> select '员工编号:'|| empno||';员工姓名:'||ename from emp;

    --3..限定查询
    --3.1查询员工编号为7839员工
    SQL> select empno,ename,job ,sal from emp where empno=7839;

    --4.关系运算
    --4.1查询工资高于1500的员工信息
    select empno,ename,job ,sal from emp where sal>1500;

    --4.2查询工资在1500到300之间的员工信息
    select empno,ename,job ,sal from emp where sal>=1500
    and sal<=3000;

    --4.3查询职位是办事员CLERK 或销售人员SALESMAN的全部信息
    SQL> select empno,ename,job,sal from
    emp where job='CLERK' or job='SALESMAN';

    --4.4查询职位是办事员CLERK或销售人员SALESMAN的信息,并且要求这些员工的工资大于1500
    select empno,ename,job,sal from emp
    where (job='CLERK' or job='SALESMAN') AND sal>1500;

    --4.5查询所有不是办事员CLERK的员工信息
    select empno,ename,job,sal from emp where job !='CLERK';

    select empno,ename,job,sal from emp where job <>'CLERK';

    select empno,ename,job,sal from emp where not job='CLERK';

    --5.判断是否为空:is (not) null
    --5.1查询所有领取奖金的员工信息
    select empno,ename,job,sal,comm from emp
    where comm is not null;

    select empno,ename,job,sal,comm from emp
    where not comm is null;

    --6.指定范围的判断:in操作符

    --6.1查询所有不领取奖金的员工信息
    SQL> select empno,ename,job,sal,comm from emp
    where comm is null;

    --6.2查询员工编号是7369,7566,7788的员工信息
    select empno,ename,job,sal,comm from emp
    where empno=7369 or empno=7566 or empno=7788;

    select empno,ename,job,sal,comm from emp
    where empno in(7369 ,7566 ,7788 );

    --7.模糊查询like
    --7.1查询员工姓名中以字母A开头的全部信息
    select empno,ename,job,sal,comm from emp
    where ename like 'A%';

    --7.2查询员工姓名中第二个字母为A的全部信息
    select empno,ename,job,sal,comm from emp
    where ename like '_A%';

    --7.3查询员工姓名中包含字母为A的全部信息
    select empno,ename,job,sal,comm from emp
    where ename like '%A%';

    --7.4查询员工姓名中不包含字母为A的全部信息
    select empno,ename,job,sal,comm from emp
    where ename not like '%A%';

    --8.数据排序:默认升序asc,降序desc
    --8.1 查询所有员工信息,要求工资升序排列
    select empno,ename,job,sal,comm from emp
    order by sal;

    select empno,ename,job,sal,comm from emp
    order by sal asc;

    --8.2 查询所有员工信息,要求工资降序排列
    select empno,ename,job,sal,comm from emp
    order by sal desc;

    --8.2 查询所有员工信息,要求工资sal降序排列,雇佣日期hiredate升序
    select empno,ename,job,sal,comm from emp
    order by sal desc,hiredate asc;

    --9.单行函数
    --9.1 字符函数
    --(1)转换为大写:
    select upper('hello') from dual;

    --(2)转换为小写:
    select lower(ename),sal from emp;

    --(3)动态输入
    SQL> select empno,ename,sal from emp where ename='&str';
    Enter value for str: SMITH
    old 1: select empno,ename,sal from emp where ename='&str'
    new 1: select empno,ename,sal from emp where ename='SMITH'

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7369 SMITH 800

    --输入时通过upper转换成大写
    SQL> select empno,ename,sal from emp where ename=upper('&str');
    Enter value for str: smith
    old 1: select empno,ename,sal from emp where ename=upper('&str')
    new 1: select empno,ename,sal from emp where ename=upper('smith')

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7369 SMITH 800

    --(4)将每个员工的首字母大写,其余全部小写
    select initcap(ename) from emp;

    INITCAP(EN
    ----------
    Smith
    Allen
    Ward
    Jones

    -(5)查询每个员工姓名的长度
    SQL> select ename,length(ename) from emp

    ENAME LENGTH(ENAME)
    ---------- -------------
    SMITH 5
    ALLEN 5

    --(6)将姓名中所有的A替换为_
    SQL> select replace(ename,'A','_') from emp;

    REPLACE(EN
    ----------
    SMITH
    _LLEN;

    --(7)截取字符串
    --substr(字段,开始点); 开始点是从1开始,表示从开始点开始截取到最后
    SQL> select ename,substr(ename,3) from emp;

    ENAME SUBSTR(ENAME,3)
    ---------- ----------------
    SMITH ITH
    ALLEN LEN

    ----substr(字段,开始点,长度);开始点是从1开始,
    SQL> select ename,substr(ename,2,3) from emp;

    ENAME SUBSTR
    ---------- ------
    SMITH MIT
    ALLEN LLE

    --要求截取雇员姓名的后三个字母
    select ename,substr(ename,-3) from emp;

    select ename,substr(ename,length(ename)-2) from emp;

    SQL> select ename,substr(ename,-3,3) from emp;

    ENAME SUBSTR
    ---------- ------
    SMITH ITH

    --(8)数字函数
    --round(数字|列[,保留的小数的位数] :四舍五入
    SQL> select round(903.53) from dual;

    ROUND(903.53)
    -------------
    904

    --取模(取余数)
    SQL> select mod(10,3) from dual;

    MOD(10,3)
    ----------
    1

    SQL> select mod(9,3) from dual;

    MOD(9,3)
    ----------
    0
    --舍去小数部分
    SQL> select trunc(93.6) from dual;

    TRUNC(93.6)
    -----------
    93

    --(9)日期函数
    --获取每个雇员到今天为止的雇佣天数
    select ename,hiredate,TRUNC(sysdate-hiredate) from emp;

    --获取本月最后一天
    SQL> select last_day(sysdate) from dual;

    LAST_DAY(SYSDA
    --------------
    31-12月-15

    --获取下一个指定星期的日期
    SQL> select next_day(sysdate,'星期一') from dual;

    NEXT_DAY(SYSDA
    --------------
    07-12月-15

    --求出四个月后日期
    select add_months(sysdate,4) from dual;

    --求出每个雇员到今天为止的雇佣月份
    --select ename, trunc(months_between(sysdate,hiredate)) from emp;

    (10)转换函数
    --to_char()转成字符串
    SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;

    TO_CHAR(SY
    ----------
    2015-12-03

    --分别截取年月日
    SQL> select to_char(sysdate,'yyyy-mm-dd') as 日期,to_char(sysdate,'yyyy') as 年
    2 to_char(sysdate,'mm') as 月,to_char(sysdate,'dd') as 日
    3 from dual;

    日期 年 月 日
    ---------- ---- -- --
    2015-12-03 2015 12 03

    SQL> select to_char(sysdate,'yyyy-mm-dd') 日期,to_char(sysdate,'yyyy') 年
    2 to_char(sysdate,'mm') 月,to_char(sysdate,'dd') 日
    3 from dual;

    日期 年 月 日
    ---------- ---- -- --
    2015-12-03 2015 12 03
    --获取字符串的年月日 时分秒 ,单个值有0
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY
    -------------------
    2015-12-03 11:55:35

    --获取字符串的年月日 时分秒,单个值没有0
    SQL> select to_char(sysdate,'fmyyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY
    -------------------
    2015-12-03 11:55:35

    --查询的带金钱符号¥
    SQL> select to_char(9999999999,'L999,999,999,999') from dual;

    TO_CHAR(9999999999,'L999,9
    --------------------------
    ¥9,999,999,999

    --将字符串转换为date
    SQL> select to_date('1999-12-2','yyyy-mm-dd') from dual;

    TO_DATE('1999-
    --------------
    02-12月-99

    --将字符串转为数字
    SQL> select to_number('1')+to_number('2') from dual;

    TO_NUMBER('1')+TO_NUMBER('2')
    -----------------------------
    3

  • 相关阅读:
    Openjudge-2694-逆波兰表达式
    POJ-3984-迷宫问题
    HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋
    LiberOJ-#6000. 「网络流 24 题」搭配飞行员 (二分图匹配)
    BZOJ-3172: [Tjoi2013]单词 (AC自动姬 fail树)
    BZOJ-1036: [ZJOI2008]树的统计Count(树链剖分+线段树)
    HDU-3966 Aragorn's Story(树链剖分+线段树)
    hihoCoder-1036 Trie图(AC自动姬)
    WHYZOJ-#14 数列(矩阵快速幂)
    WHYZOJ-#66 穿越七色虹(二分)
  • 原文地址:https://www.cnblogs.com/holly8/p/5668452.html
Copyright © 2020-2023  润新知