当前位置:Gxlcms > 数据库问题 > java:Oracle()

java:Oracle()

时间:2021-07-01 10:21:17 帮助过:11人阅读

--max,min,sum,avg,count,nvl(,)
-- 聚合函数
-- max:最大值
-- max既能取数字的最大值,也可以取字符串的最大值(英文字母排列顺序),根据场景实际意义来看,最好一条sql中只出现一次
select max(age) ,max(name) from teacher;
--min:最小值
select min(age) from teacher;
select min(name) from teacher;
--sum:求和:在求和函数中,只能计算数字类型, 并不能计算字符串类型
select sum(age) from teacher;
select sum(name) from teacher;
--avg:平均值:也只能用于计算数字类型
select avg(age) from teacher;
select avg(name) from teacher;
--count(*),count(任意数字):获取某张表的数据总条数
-- 在实际开发岗位中,一定要使用 count(1)不要去使用count(*)
select count(*) counts from teacher;
-- count(*)和select *执行效率很像:首先把所有的数据全部查出来(调用一次select * from xxx),然后进行统计总条数
select count(1) counts from teacher;
-- count(1):首先把表中的所有数据全部换成1,然后在进行统计总条数
-- nvl:如果查询出的数据有null值,就给一个默认值
select name, age, nvl(description,‘我是默认值‘) from teacher;

 

-- 多表查询
-- 首先把数据多的表全部查询出来---->开始对应数据量少的表,然后把数据量少的表进行分组
select * from classes;
select * from teacher;
select * from teacher, classes;
-- 以classes为基准,查询遍数:classes有多少条数据,就会查询多少遍
-- 在实际开发中,from xxx,xxx,xx这种多表查询决绝使用,因为效率非常低
select c.*, t.* from classes c, teacher t;
select t.id teahcer_id, t.description teacher_description, t.age teacher_age, t.name teahcer_name, t.hire_date teacher_hire_date, c.id classes_id, c.name classes_name, c.description classes_description from classes c, teacher t;
-- 多表查询中,一旦给表起了一个别名,必须要使用别名来进行点列名(只有两张表同时存在相同字段的时候要使用别名点列名)
-- 字典表中 是不存在主键的
select c.*, t.* from classes c, teacher t where age = 33;
-- 查询出两张表id相同的数据内容
select c.* , t.* from classes c, teacher t where c.id = t.id;
-- 冒泡排序:把小的冒上来,大的压下去
-- oracle也有自己的排序规则,类似于冒泡排序
select c.* , t.* from classes c, teacher t where c.id > t.id;
select c.name, t.name from classes c, teacher t group by c.name, t.name;
select * from teacher;
select * from classes;

 

-- 一对一,一对多,多对多
-- 这两张表或多张表就必然存在一个联系

-- 一对一
--第一步:建立两张表
--第二步:找这两张表的关系(一对一,一对多,或者多对多)
-- 发现籍贯和人民存在一对一的关系
--第三步:建立外键(就是和另一张进行关联的列),必须要指向另一张关联表的主键,并且外键的列的类型一定要和指向主键的那一列的类型保持一致
-- 一对一关系的两张表,外键是可以随意建的,换句话说,外键建立在哪一张表都没有关系
-- person表,id主键,native_place_id外键(外键的列类型一定要和native_place表中的主键id类型(长度)相同)
-- native_place表,id主键
select p.name, np.area from person p, native_place np where p.native_place_id = np.id;

-- 一对多
-- 第一步:建两张表
-- employee/staff 员工表
-- department 部门表
-- 第二步:寻找这两张表的关系(一对多,部门是一的一方,员工就是多的一方)
-- 第三步:建立外键
-- 外键需要建立在一的一方:以部门和员工表为例:会出现一个bug:一个部门只能拥有一个员工,虽然不违反语法,但是不符合逻辑思维
-- 在一对多的情况下,外键要建立在多的一方
-- 如果我需要查询出所有的员工所属于哪个部门
-- 有部门的员工:
-- select * from department d, staff s where d.staff_id = s.id;
-- 查询所有员工:
select * from department d, staff s where d.id = s.department_id;
-- 查询出各部门的员工人数
-- 第一步:查询出部门
-- 第二步:查询出该部门的关联表
-- 第三步:需要把部门进行分组
select d.name, count(1) from department d, staff s where d.id = s.department_id group by d.name;

-- 多对多
-- 学生和课程
-- 首先建立两张表
-- 分析这两张表之间的关系(多对多)
-- 建立外键:外键建立在哪一张表都不合适
-- 建立外键:重新定义一张表来管理里面的外键关系
-- 控制课程选择的表就在第三张外键表
-- 就以学生表和课程表为例:
-- 第一步:把所有的学生存入学生表(并不知道学生会选择什么课程)
-- 第二步:把所有的课程存入课程表(并不知道这些课程会被哪些学生选择)
-- 第三步:多对多的关系表(确定选择课程的结果):确定哪些学生选择了什么课程,这些课程被哪些学生选择了
-- 多对多关系表(insure):里面只会放两个字段,并且没有主键,这两个字段分别代表两张表的主键(student_id--->stu_students表的id,class_id----->stu_class表的主键id)
select * from stu_students sst, stu_class sc, insure i where i.student_id = sst.id and i.class_id = sc.id;

 

java:Oracle()

标签:最大   同时存在   一对多   长度   有一个   控制   字符   顺序   岗位   

人气教程排行