时间:2022-04-18 编辑:
五、多表查询
这个时候就会用到多个表一起查询在给大家一个新的表:如图下所示
多表查询还有一个关键点那就是这两个表的关系,要有一定的关系,可以看一下第一个表和第二个表的字段,其中的DEPTNO字段在两个表中都有出现。
1.单行子查询
select * from emp where deptno=(select * from dept where dname='SALES');--通过代码演示单行自查询的语法,查询了通过部门名称查询员工信息。
2.多行子查询
--查询部门名称为:SALES,ACCOUNTING的员工信息
下面直接上演示代码和思路:
思路:通过部门名称查询部门编号
select deptno from dept where dname='SALES' or dname='ACCOUNTING';
--继续通过部门编号查询员工信息
select * from emp where deptno in (20,30);
--两条合为一条便是多行子查询
select * from emp where deptrno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
3.多行子查询
oracle子查询一般都是返回单列,实际上数据库对此并没有进行限制,子查询也可以返回多列;
在select后显示字段的位置加入就可以了。
4.单行函数
下述部分为字符串相关方法,其中的参数可以是字符串也可以是字段名。
(1).lower() 把字符串中的字母变为小写。 把emp表中的人名全部显示为小写 Select lower(ename) from emp
(2).upper()
把字符串中的字母变为大写。 Select upper(ename) from emp;
select upper('aBCd') from dual;
(3).length()
取得给定字符串的长度
Select length(ename) from emp;
select length('aBCd') from dual;
(4).substr()
取得给定字符串的部分字符串,第一个数字表示字符位置,第二个数字表示截取的长度。对于英文字符和中文字符都分别当做单个字符对待。
Select substr(ename, 2, 3) from emp; 经常使用length()方法和substr配合使用来截取字符串。
(5).replace()
替换字符串中的给定内容
select replace(ename, '我', 'I') from emp
(6).initcap
使得首字母大写
select initcap(ename) from emp
(7).trim()
去除字符串开始和结束处的空白。
select trim(ename) from emp
(8).ltrim()
去除字符串左侧(开始处)的空白 select ltrim(' a v c ') from dual;
(9).rtrim()
去除字符串右侧(结尾处)的空白 select rtrim(' a v c ') from dual;
下述部分为数值相关方法,其中的参数可以是字符串也可以是字段名。
(10).数学方法
·cos()求余弦、sin()求正弦、acos()求反余弦、asin()求反正弦,其中参数是使用的弧度,如果需要角度,可以(弧度数 * 3.14159265359 / 180)。 select cos(1) from dual;
select sin(90 * 3.14159265 / 180) from dual; ·round(n , m),执行四舍五入,如果省略了m参数,四舍五入到整数,无论正负都是向靠近的整数四舍五入。如果没有省略m参数,m为正数时,表示四舍五入到小数点后几位即保留几位小数,如果m是负数,表示从小数点前几位四舍五入。 select round(10.6235) from dual; -- 结果是11 select round(10.25) from dual; -- 结果是10 select round(-10.25) from dual; -- 结果是 -10 select round(-10.55) from dual; -- 结果是-11
select round(-15.554612, -1) from dual; --结果是-20 select round(-12.554612, -1) from dual; -- 结果是-10
select round(12.554612, 3) from dual; -- 结果是12.555 select round(-12.554612, 2) from dual; -- 结果是12.55 ·trunc(n, m),截取数字,如果省略掉m参数,就截取小数部分,如果有m参数,当m是正数时,截取小数点后的指定位数,如果是负数,截取小数点前的位数。不论何种情况下都不会产生四舍五入。 select trunc(12.545) from dual; select trunc(12.245) from dual; -- 两者结果都是12
select trunc(-12.245) from dual; select trunc(-12.545) from dual;-- 两者结果都是-12
select trunc(12.241, 2) from dual; select trunc(12.245, 2) from dual; -- 两者结果是12.24
select trunc(-12.241, 2) from dual; select trunc(-12.245, 2) from dual; -- 两者结果是-12.24
select trunc(12.245, -1) from dual; select trunc(16.245, -1) from dual;-- 两者结果是10
select trunc(-12.245, -1) from dual; select trunc(-16.245, -1) from dual;-- 两者结果是-10 ·floor(n),返回小于或等于n的最大整数。 select floor(10.53) from dual; select floor(10.23) from dual; --两者结果是10
select floor(-10.23) from dual; select floor(-10.53) from dual; --两者结果是-11
·ceil(n),返回大于或等于n的最小整数 select ceil(10.53) from dual; select ceil(10.23) from dual; --两者结果是11
select ceil(-10.23) from dual; select ceil(-10.53) from dual; --两者结果是-10 范例: 求一个员工的日薪,结果保留到元,本月假设有30天。 select trunc(sal / 30) as daysal from emp order by daysal; Order by中可以使用别名。 你的朋友过生日了,你计划送份礼物,大概花了多少钱?(礼物包含:iphone5 一部 5288,苹果耳机299, 保护膜 99, 壳 234, 刷卡利率:3‰)。 ·mod(n, m),求 n除以m后的余数。 select mod(10,2) from dual; -- 结果是0 select mod(10,3) from dual; -- 结果是1
select mod(-10,3) from dual;-- 结果是-1 select mod(-10,2) from dual;-- 结果是0
select mod(10.4, 2) from dual; --结果是0.4 select mod(10.4, 3) from dual; --结果是1.4
select mod(-10.4, 2) from dual; --结果是-0.4 select mod(-10.4, 3) from dual; --结果是-1.4
select mod(10.4, -2) from dual; --结果是0.4 select mod(10.4, -3) from dual; --结果是1.4
select mod(-10.4, 2) from dual; --结果是-0.4 select mod(-10.4, 3) from dual; --结果是-1.4
select mod(10.4, -2) from dual; --结果是0.4 select mod(10.4, -3) from dual; --结果是1.4
select mod(-10.4, -3) from dual; --结果是-1.4 select mod(-10.4, -2) from dual; --结果是-0.4 使用mod()时,结果的符号由n决定。 ·abs(),取绝对值。 select abs(12) from dual; select abs(-12) from dual;
select abs(16) from dual; select abs(-16) from dual;
select abs(12.56) from dual; select abs(-12.56) from dual; (11). 日期方法 下面是一些和日期相关函数。 ·sysdate(),返回当前的系统时间。 select sysdate from dual; ·last_day(),返回指定日期所在月份的最后一天。 select last_day('1-3月-2013') from dual; ·to_day(),把指定字符串按照指定的格式返回日期。 select to_date('2013-3-1', 'yyyy-mm-dd') from dual; ·add_months(d, n),和指定的日期d相距n个月的日期 select * from emp where sysdate >= add_months(hiredate, 12 * 10 * 3.5) order by hiredate; -- 取得入职超过35年的员工
select * from emp where sysdate >= add_months(hiredate, 3.2) order by hiredate; --取得入职查过3.2个月的 如果是需要查找大于1年的可以使用12 * 年数,月份可以使用小数表示。 练习: 显示每个员工的入职天数 select trunc(sysdate - hiredate) from emp; 显示每个每个月倒数9天入职的员工 select * from emp where hiredate = last_day(hiredate) - 8 ·next_day(),求从指定日期开始的指定星期的日期 select next_day('2013-1-1','星期六') from dual; select next_day('2013-1-1',7) from dual; -- 两者返回的结果都是2013-1-5
·months_between(n, m),求n和m相差几个月 select trunc(months_between(sysdate, hiredate)), hiredate, ename from emp;
(12).转换函数
以下是一下转换函数。
·to_char(),把日期类型或数值型的数据转换成可变长的字符类型,转变数值型时,指定的格式可以实现四舍五入。 select ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss'), sal from emp;
select ename, to_char(sal, '999999.9'), sal from emp; 转换时用到的格式符 9 表示数字 0 表示0 $ 美元 L 本地货币符号 . 小数点 , 千位符 举例: select to_char(sal, 'L99,999.9') from emp; ·to_number(),把字符串转变成数值。。 select (to_number('1,234.56', '9999.99') + 12) from dual; (13). 通用函数 ·nvl(exp1, exp2),如果exp1为空(null),返回exp2的值 select nvl(comm, 0) from emp; ·nvl2(exp1, exp2, exp3),如果exp1为空(null),nvl2返回exp2,如果exp1为空,nvl2返回exp3,参数exp1可以是任意数据类型。
六、连表查询
链表查询分为四种:内连接(inner join)、外连接:外连接有分两种:右连接(right join)左连接(left join)、全连接(full outer join)、自连接。、
因为查询的语法很多也不固定需要一定的逻辑思维上面就一直在介绍查询的问题,下面我们看一下增、删、改的语法,增删改的语法基本固定没有什么太大的变化。
七.增加、删除、修改表中数据
首先咱们自己也要学会通过代码来创建表。
--创建表语法:
create table 表名(字段名 定义类型 not null,字段名 定义类型,字段名 定义类型...)
--修改表数据语法:
updata 表名 set name=‘更改的数据’,sex=‘更改的数据’;
--删除表语法:
delete grom 表名 where 删除的条件(和查询添加的条件一样);
--修改表结构语法:
create table 表名(
id varchar2(10) not null, -- 定义字符型长度为10不能为空的id字段 student varchar2(20) not null, -- 定义字符型长度为10不能为空的student字段 score number(4,1)-- 定义数值型长度为41位小数能为空的score字段
);
commit; --提交事务按钮
--往表中插入数据语法:
insert into 表名(字段或列名称的列表)values(值列表);
alter table 语句 修改表 调整表的结构。
语法:alter table 表名 操作 操作内容;
--添加字段 类型
alter table 表名
add 字段名 字段类型;
commit;
--修改字段
alter table 表名
modify (字段名 字段类型);
--删除字段 类型
alter table 表名
drop (字段名)
--重命名:可以更改一个表,视图,序列,等名字
--修改表名称
rename 表名 to 新表名;
--删除表
drop table 表名;
--删除某表中的第一行
delete from 表名 where id=1;
这些就是Oracle数据库的简单的增删改查,其中有什么求余弦,求正弦的那些东西去做一个基本的了解就可以了,不用刻意的去背这个东西,用到的时候拿出来看一下就可以了。