实验五:Oracle中的SQL使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yansky58685/article/details/79761603

实验五:Oracle中的SQL使用

一、       实验目的

1.掌握SQL语言中常用系统函数;

2.掌握SQL语言的应用。

二、   实验内容

1. 查询SQL中如下常用函数的使用,并举例说明(完成格式参考Length)。

l 字符< LtrimReplaceRtrimSubstrTrim>

l 日期< SysdateCurrent_datenext_day>

l 转换< To_charto_dateto_number>

l 统计函数<SumAvgMaxMinCount>

l 其他< UserDecodeNvl>

例如:Length

函数形式Length(X)  

函数说明:返回字符串X的长度

举例selectlength(‘hello world’) from dual;

运行结果

LENGTH('HELLOWORLD')

一、字符

1)     Ltrim

函数形式:Ltrim(X,trim_string)

函数说明:删除字符串X左边的字符。

举例:selectltrim('***Welcome***','*') from dual;

运行结果:

LTRIM('***

----------

Welcome***

2)     Replace

函数形式:Replace(X,search_string,replace_string)

函数说明:在字符串X中搜索search_string,如果找到则使用replace_string替换。

举例:select replace('HelloWelcome','Welcome','World') from dual;

运行结果:

REPLACE('HE

-----------

Hello World

3)     Rtrim

函数形式:Rtrim(X,trim_string)

函数说明:去掉字符串X右边trim_string指定的字符

举例:select rtrim('***Welcome***','*')from dual;

运行结果:

RTRIM('***

----------

***Welcome

4)     Substr

函数形式:Substr(X,srart,length)

函数说明:返回字符串X的子串,开始位置是start,可选的子串长度为length

举例:selectsubstr('***Welcome***',4,7) from dual;

运行结果:

SUBSTR(

-------

Welcome

5)     Trim

函数形式:Trim(trim_char from X)

函数说明:删除字符串X中左右两端的一些字符,如果提供可选择的trim_string则删除,否则删除空格。

举例:select trim('*' from'***Welcome***') from dual;

运行结果:

TRIM('*

-------

Welcome

二、日期

1)     Sysdate

函数形式:Sysdate()

函数说明:返回当前系统的日期

举例:select sysdate from dual;

运行结果:

SYSDATE

--------------

28-3 -18

2)     Current_date

函数形式:Current_date()

函数说明:返回本地时区当前日期

举例:select current_date fromdual;

运行结果:

CURRENT_DATE

--------------

28-3 -18

3)     Next_day

函数形式:Next_day(X,day)

函数说明:返回紧接着X的下一天,day是一字符串

举例:select next_day(sysdate,6)from dual;

运行结果:

NEXT_DAY(SYSDA

--------------

06-4 -18

三、转换

1)     To_char

函数形式:Tochar(X,format)

函数说明:把指定的表达式转变成字符串,format用于指定X的表达式的格式。

举例:select To_char(sysdate,'HH12-MI-SS') 时间 from dual;

运行结果:

时间

--------

03-27-23

2)     to_date

函数形式:to_date(c,fmt)

函数说明:将字符串转化为Oracle中的一个日期。如果参数fmt不为空时,则按照fmt指定的格式进行转换,如果fmtJ则表示按照公元制转换,c则必须为大于0小于5373484的正整数。

举例:select to_date('2018-3-3015:38:19','yyyy-mm-dd hh24:mi:ss')

from dual;

运行结果:

TO_DATE('2018-

--------------

30-3 -18

3)     to_number

函数形式:to_number(c,fmt)

函数说明:把某个表达式转变成数字。

举例:select to_number('19f','xxx'),to_number('f','xxx')from dual;

运行结果:

TO_NUMBER('19F','XXX')TO_NUMBER('F','XXX')

------------------------------------------

                   415                   15

四、统计

1)     Sum

函数形式:Sum(X)

函数说明:汇总值

举例:select sum(sal) from emp;

运行结果:

 SUM(SAL)

----------

    29025

2)     Avg

函数形式:Avg(X)

函数说明:平均值

举例:select Avg(sal) from emp

   group by empno

   having empno=7369;

运行结果:

 AVG(SAL)

----------

      800

3)     Max

函数形式:Max(X)

函数说明:求最大值

举例:select max(sal) from emp;

运行结果:

MAX(SAL)

----------

     5000

4)     Min

函数形式:min(X)

函数说明:求最小值

举例:select min(sal) from emp;

运行结果:

 MIN(SAL)

----------

      800

5)     Count

函数形式:Count(X)

函数说明:统计数量

举例:select count(empno) from emp;

运行结果:

COUNT(EMPNO)

------------

         14

五、其他

1)     User

函数形式:user()

函数说明:查找当前用户名

举例:select user from dual;

运行结果:

USER

------------------------------

SCOTT

2)     Decode

函数形式:decodecolumnname,值1,翻译值1,2,翻译值2,...n,翻译值n,缺省值)

函数说明:将查询结果翻译成其他值(即以其他形式表现出来)

举例:select sal,decode(sal,5000,'工资最高')from emp;

运行结果:

      SAL DECODE(S

---------- --------

      800

     1600

     1250

     2975

     1250

     2850

     2450

     3000

     5000 工资最高

     1500

     1100

3)     Nvl

函数形式:NVL(表达式1,表达式2

函数说明:一个空值转换函数,如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。

举例:select   ename,NVL(TO_char(comm), ename||' is not asalesperson!') AS COMMISSION

from emp

运行结果:

ENAME      COMMISSION

--------------------------------------------------

SMITH      SMITH is not a salesperson!

ALLEN      300

WARD       500

JONES      JONES is not a salesperson!

MARTIN     1400

BLAKE      BLAKE is not a salesperson!

CLARK      CLARK is not a salesperson!

SCOTT      SCOTT is not a salesperson!

KING       KING is not a salesperson!

TURNER     0

ADAMS      ADAMS is not a salesperson!

 

ENAME      COMMISSION

--------------------------------------------------

JAMES      JAMES is not a salesperson!

FORD       FORD is not a salesperson!

MILLER     MILLER is not a salesperson!

     

2. 在使用SQL的内置函数时,经常用到关键词dual,查询dual的含义,并举例说明其使用方法。

答:mysql和oracle下的一个虚拟表,其实就是“空表”的意思

有时候想在查询中用到子查询做临时表,就要用到这个东西。

eg.

select * from(select 10 co1 from dual) tmp

就和

select * from(select 10 co1) tmp 一样。

3.练习SQL事务处理

(参见教材p112- p113中的示例内容,自己举例使用保存点进行事务回退操作,将练习所执行的SQL记录下来)

SQL> insertinto emp(empno,ename,job,sal) values(7901,'ZHY','IT',8000);

 

已创建 1 行。

 

SQL>savepoint s1;

 

保存点已创建。

 

SQL> insertinto emp(empno,ename,job,sal) values(7911,'KXM','Teacher',3000);

 

已创建 1 行。

SQL> selectempno,ename,job,sal from emp

  2 where empno>7900 and empno<7920;

 

     EMPNO ENAME      JOB              SAL

-------------------- --------- ----------

      7901 ZHY        IT              8000

      7902 FORD       ANALYST         3000

      7911 KXM        Teacher         3000

 

SQL>rollback to savepoint s1;

 

回退已完成。

 

SQL> selectempno,ename,job,sal from emp

  2 where empno>7900 and empno<7920;

 

     EMPNO ENAME      JOB              SAL

-------------------- --------- ----------

      7901 ZHY        IT              8000

      7902 FORD       ANALYST         3000

4. SQL语言的应用(根据题目的写出执行正确的SQL语句):

1)解锁HR模式,对HR模式下的表进行操作(此操作不用记录);

2)以HR身份登录数据库后进行如下操作:

    查询HR.EMPLOYEES表的表结构;

    SQL> desc employees

 名称                                      是否为空? 类型

 ------------------------------------------------- ----------------------------

 EMPLOYEE_ID                               NOT NULLNUMBER(6)

 FIRST_NAME                                        VARCHAR2(20)

 LAST_NAME                                 NOT NULLVARCHAR2(25)

 EMAIL                                     NOT NULL VARCHAR2(25)

 PHONE_NUMBER                                      VARCHAR2(20)

 HIRE_DATE                                 NOT NULL DATE

 JOB_ID                                    NOT NULLVARCHAR2(10)

 SALARY                                             NUMBER(8,2)

 COMMISSION_PCT                                    NUMBER(2,2)

 MANAGER_ID                                        NUMBER(6)

 DEPARTMENT_ID                                      NUMBER(4)

    查询EMPLOYEES表中每个雇员的姓名(要求将first_namelast_name字段连接在一起显示)、职位、工薪、部门编号;

SQL> selectfirst_name|| ' '||last_name "姓名",job_id "职位",salary "工薪",department_id"部门编号" from employees;

    查询HR.DEPARTMENTS表的表结构;

SQL> descdepartments

 名称                                      是否为空? 类型

 ------------------------------------------------- ----------------------------

 DEPARTMENT_ID                             NOT NULL NUMBER(4)

 DEPARTMENT_NAME                           NOT NULLVARCHAR2(30)

 MANAGER_ID                                        NUMBER(6)

 LOCATION_ID                                       NUMBER(4)

    使用子查询查询属于某一部门员工的姓名、职位、工薪、部门编号的信息(已知的信息为部门名称,部门名称由用户自己给出);

SQL> select first_name|| ' '||last_name "姓名",job_id "职位",salary "工薪",

  departments.department_id "部门编号"

  from employees,departments

  where employees.department_id=departments.department_id

  and departments.department_name='Sales';

    统计某一部门的雇员的最高和最低工薪;

SQL> select max(salary),min(salary)

  from employees,departments

  where employees.department_id=departments.department_id

  and departments.department_name='Sales';

 

MAX(SALARY) MIN(SALARY)

----------- -----------

     14000        6100

    向EMPLOYEES表添加一组数据:

values600,’LISI’,’[email protected]’,sysdate,’SH_CLERK’,50

通过SELECT查询语句,查看是否在EMPLOYEES表中添加了相应的记录;

SQL> insert into

 employees(employee_id,first_name,last_name,email,hire_date,job_id,

   department_id)

   values(600,'LI','SI','[email protected]',sysdate,'SH_CLERK',50);

 

已创建 1 行。

SQL> selectemployee_id,first_name,last_name,email,hire_date,job_id,

    department_id

    fromemployees

    whereemployee_id=600;

 

EMPLOYEE_ID FIRST_NAME           LAST_NAME

----------- ---------------------------------------------

EMAIL                     HIRE_DATE      JOB_ID    DEPARTMENT_ID

------------------------- ------------------------ -------------

       600 LI                   SI

[email protected]              30-3 -18     SH_CLERK              50

使用UPDATE语句更新该记录的SALARY列,为部门编号80的员工上调工薪10%

SQL> update employees

     set salary=salary*1.1

     where department_id=80;

 

已更新34行。

    删除操作⑥中新增加的那条记录。

SQL> delete from employees

   where employee_id=600;

 

已删除 1 行。

 

作业提交

将本文档存盘(文件名保存为:本人学号姓名.doc)后关闭,再将其复制后提交(即粘贴)到服务器中:ftp://172.16.3.220/作业提交/本人班级/本次实验项目  对应的文件夹中!

 

 

实验五:Oracle中的SQL使用

一、       实验目的

1.掌握SQL语言中常用系统函数;

2.掌握SQL语言的应用。

二、   实验内容

1. 查询SQL中如下常用函数的使用,并举例说明(完成格式参考Length)。

l 字符< LtrimReplaceRtrimSubstrTrim>

l 日期< SysdateCurrent_datenext_day>

l 转换< To_charto_dateto_number>

l 统计函数<SumAvgMaxMinCount>

l 其他< UserDecodeNvl>

例如:Length

函数形式Length(X)  

函数说明:返回字符串X的长度

举例selectlength(‘hello world’) from dual;

运行结果

LENGTH('HELLOWORLD')

一、字符

1)     Ltrim

函数形式:Ltrim(X,trim_string)

函数说明:删除字符串X左边的字符。

举例:selectltrim('***Welcome***','*') from dual;

运行结果:

LTRIM('***

----------

Welcome***

2)     Replace

函数形式:Replace(X,search_string,replace_string)

函数说明:在字符串X中搜索search_string,如果找到则使用replace_string替换。

举例:select replace('HelloWelcome','Welcome','World') from dual;

运行结果:

REPLACE('HE

-----------

Hello World

3)     Rtrim

函数形式:Rtrim(X,trim_string)

函数说明:去掉字符串X右边trim_string指定的字符

举例:select rtrim('***Welcome***','*')from dual;

运行结果:

RTRIM('***

----------

***Welcome

4)     Substr

函数形式:Substr(X,srart,length)

函数说明:返回字符串X的子串,开始位置是start,可选的子串长度为length

举例:selectsubstr('***Welcome***',4,7) from dual;

运行结果:

SUBSTR(

-------

Welcome

5)     Trim

函数形式:Trim(trim_char from X)

函数说明:删除字符串X中左右两端的一些字符,如果提供可选择的trim_string则删除,否则删除空格。

举例:select trim('*' from'***Welcome***') from dual;

运行结果:

TRIM('*

-------

Welcome

二、日期

1)     Sysdate

函数形式:Sysdate()

函数说明:返回当前系统的日期

举例:select sysdate from dual;

运行结果:

SYSDATE

--------------

28-3 -18

2)     Current_date

函数形式:Current_date()

函数说明:返回本地时区当前日期

举例:select current_date fromdual;

运行结果:

CURRENT_DATE

--------------

28-3 -18

3)     Next_day

函数形式:Next_day(X,day)

函数说明:返回紧接着X的下一天,day是一字符串

举例:select next_day(sysdate,6)from dual;

运行结果:

NEXT_DAY(SYSDA

--------------

06-4 -18

三、转换

1)     To_char

函数形式:Tochar(X,format)

函数说明:把指定的表达式转变成字符串,format用于指定X的表达式的格式。

举例:select To_char(sysdate,'HH12-MI-SS') 时间 from dual;

运行结果:

时间

--------

03-27-23

2)     to_date

函数形式:to_date(c,fmt)

函数说明:将字符串转化为Oracle中的一个日期。如果参数fmt不为空时,则按照fmt指定的格式进行转换,如果fmtJ则表示按照公元制转换,c则必须为大于0小于5373484的正整数。

举例:select to_date('2018-3-3015:38:19','yyyy-mm-dd hh24:mi:ss')

from dual;

运行结果:

TO_DATE('2018-

--------------

30-3 -18

3)     to_number

函数形式:to_number(c,fmt)

函数说明:把某个表达式转变成数字。

举例:select to_number('19f','xxx'),to_number('f','xxx')from dual;

运行结果:

TO_NUMBER('19F','XXX')TO_NUMBER('F','XXX')

------------------------------------------

                   415                   15

四、统计

1)     Sum

函数形式:Sum(X)

函数说明:汇总值

举例:select sum(sal) from emp;

运行结果:

 SUM(SAL)

----------

    29025

2)     Avg

函数形式:Avg(X)

函数说明:平均值

举例:select Avg(sal) from emp

   group by empno

   having empno=7369;

运行结果:

 AVG(SAL)

----------

      800

3)     Max

函数形式:Max(X)

函数说明:求最大值

举例:select max(sal) from emp;

运行结果:

MAX(SAL)

----------

     5000

4)     Min

函数形式:min(X)

函数说明:求最小值

举例:select min(sal) from emp;

运行结果:

 MIN(SAL)

----------

      800

5)     Count

函数形式:Count(X)

函数说明:统计数量

举例:select count(empno) from emp;

运行结果:

COUNT(EMPNO)

------------

         14

五、其他

1)     User

函数形式:user()

函数说明:查找当前用户名

举例:select user from dual;

运行结果:

USER

------------------------------

SCOTT

2)     Decode

函数形式:decodecolumnname,值1,翻译值1,2,翻译值2,...n,翻译值n,缺省值)

函数说明:将查询结果翻译成其他值(即以其他形式表现出来)

举例:select sal,decode(sal,5000,'工资最高')from emp;

运行结果:

      SAL DECODE(S

---------- --------

      800

     1600

     1250

     2975

     1250

     2850

     2450

     3000

     5000 工资最高

     1500

     1100

3)     Nvl

函数形式:NVL(表达式1,表达式2

函数说明:一个空值转换函数,如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。

举例:select   ename,NVL(TO_char(comm), ename||' is not asalesperson!') AS COMMISSION

from emp

运行结果:

ENAME      COMMISSION

--------------------------------------------------

SMITH      SMITH is not a salesperson!

ALLEN      300

WARD       500

JONES      JONES is not a salesperson!

MARTIN     1400

BLAKE      BLAKE is not a salesperson!

CLARK      CLARK is not a salesperson!

SCOTT      SCOTT is not a salesperson!

KING       KING is not a salesperson!

TURNER     0

ADAMS      ADAMS is not a salesperson!

 

ENAME      COMMISSION

--------------------------------------------------

JAMES      JAMES is not a salesperson!

FORD       FORD is not a salesperson!

MILLER     MILLER is not a salesperson!

     

2. 在使用SQL的内置函数时,经常用到关键词dual,查询dual的含义,并举例说明其使用方法。

答:mysql和oracle下的一个虚拟表,其实就是“空表”的意思

有时候想在查询中用到子查询做临时表,就要用到这个东西。

eg.

select * from(select 10 co1 from dual) tmp

就和

select * from(select 10 co1) tmp 一样。

3.练习SQL事务处理

(参见教材p112- p113中的示例内容,自己举例使用保存点进行事务回退操作,将练习所执行的SQL记录下来)

SQL> insertinto emp(empno,ename,job,sal) values(7901,'ZHY','IT',8000);

 

已创建 1 行。

 

SQL>savepoint s1;

 

保存点已创建。

 

SQL> insertinto emp(empno,ename,job,sal) values(7911,'KXM','Teacher',3000);

 

已创建 1 行。

SQL> selectempno,ename,job,sal from emp

  2 where empno>7900 and empno<7920;

 

     EMPNO ENAME      JOB              SAL

-------------------- --------- ----------

      7901 ZHY        IT              8000

      7902 FORD       ANALYST         3000

      7911 KXM        Teacher         3000

 

SQL>rollback to savepoint s1;

 

回退已完成。

 

SQL> selectempno,ename,job,sal from emp

  2 where empno>7900 and empno<7920;

 

     EMPNO ENAME      JOB              SAL

-------------------- --------- ----------

      7901 ZHY        IT              8000

      7902 FORD       ANALYST         3000

4. SQL语言的应用(根据题目的写出执行正确的SQL语句):

1)解锁HR模式,对HR模式下的表进行操作(此操作不用记录);

2)以HR身份登录数据库后进行如下操作:

    查询HR.EMPLOYEES表的表结构;

    SQL> desc employees

 名称                                      是否为空? 类型

 ------------------------------------------------- ----------------------------

 EMPLOYEE_ID                               NOT NULLNUMBER(6)

 FIRST_NAME                                        VARCHAR2(20)

 LAST_NAME                                 NOT NULLVARCHAR2(25)

 EMAIL                                     NOT NULL VARCHAR2(25)

 PHONE_NUMBER                                      VARCHAR2(20)

 HIRE_DATE                                 NOT NULL DATE

 JOB_ID                                    NOT NULLVARCHAR2(10)

 SALARY                                             NUMBER(8,2)

 COMMISSION_PCT                                    NUMBER(2,2)

 MANAGER_ID                                        NUMBER(6)

 DEPARTMENT_ID                                      NUMBER(4)

    查询EMPLOYEES表中每个雇员的姓名(要求将first_namelast_name字段连接在一起显示)、职位、工薪、部门编号;

SQL> selectfirst_name|| ' '||last_name "姓名",job_id "职位",salary "工薪",department_id"部门编号" from employees;

    查询HR.DEPARTMENTS表的表结构;

SQL> descdepartments

 名称                                      是否为空? 类型

 ------------------------------------------------- ----------------------------

 DEPARTMENT_ID                             NOT NULL NUMBER(4)

 DEPARTMENT_NAME                           NOT NULLVARCHAR2(30)

 MANAGER_ID                                        NUMBER(6)

 LOCATION_ID                                       NUMBER(4)

    使用子查询查询属于某一部门员工的姓名、职位、工薪、部门编号的信息(已知的信息为部门名称,部门名称由用户自己给出);

SQL> select first_name|| ' '||last_name "姓名",job_id "职位",salary "工薪",

  departments.department_id "部门编号"

  from employees,departments

  where employees.department_id=departments.department_id

  and departments.department_name='Sales';

    统计某一部门的雇员的最高和最低工薪;

SQL> select max(salary),min(salary)

  from employees,departments

  where employees.department_id=departments.department_id

  and departments.department_name='Sales';

 

MAX(SALARY) MIN(SALARY)

----------- -----------

     14000        6100

    向EMPLOYEES表添加一组数据:

values600,’LISI’,’[email protected]’,sysdate,’SH_CLERK’,50

通过SELECT查询语句,查看是否在EMPLOYEES表中添加了相应的记录;

SQL> insert into

 employees(employee_id,first_name,last_name,email,hire_date,job_id,

   department_id)

   values(600,'LI','SI','[email protected]',sysdate,'SH_CLERK',50);

 

已创建 1 行。

SQL> selectemployee_id,first_name,last_name,email,hire_date,job_id,

    department_id

    fromemployees

    whereemployee_id=600;

 

EMPLOYEE_ID FIRST_NAME           LAST_NAME

----------- ---------------------------------------------

EMAIL                     HIRE_DATE      JOB_ID    DEPARTMENT_ID

------------------------- ------------------------ -------------

       600 LI                   SI

[email protected]              30-3 -18     SH_CLERK              50

使用UPDATE语句更新该记录的SALARY列,为部门编号80的员工上调工薪10%

SQL> update employees

     set salary=salary*1.1

     where department_id=80;

 

已更新34行。

    删除操作⑥中新增加的那条记录。

SQL> delete from employees

   where employee_id=600;

 

已删除 1 行。

 

 

猜你喜欢

转载自blog.csdn.net/Yansky58685/article/details/79761603