--在表中添加字段:alter table 表名 add 字段名 字段类型
alter table t_food add contract varchar2(20);alter table t_food drop column t_Produce_time;
--玩家表
create table player(
p_id number(3) primary key,
p_name varchar2(20)
);
--英雄表
create table hero(
h_id number(3) primary key,
h_name varchar2(50)
);
--添加外键
--关联玩家表和中间表
alter table m_main add constraint main_foreign_p_id foreign key(m_p_id) references player(p_id);
--关联英雄表和中间表
alter table m_main add constraint main_foreign_h_id foreign key(m_h_id) references hero(h_id);
--1、选择部门30中的雇员
select * from emp where deptno=30;
--2、列出所有办事员的姓名、编号和部门编号
select ename,empno,deptno from emp where job='办事员';
--3、找出佣金高于薪金的雇员
select * from emp where comm>sal;
--4、找出佣金高于薪金60%的雇员
select * from emp where comm>sal*0.6;
--5、找出部门10中所有程序员和部门20中的所有办事员的详细资料
select * from emp where deptno=10 and job='程序员';
select * from emp where deptno=20 and job='办事员';
select * from emp where (deptno=10 and job='程序员') or (deptno=20 and job='办事员');
--6、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
select * from emp where deptno=10 and job='程序员';
select * from emp where deptno=20 and job='办事员';
select * from emp where job!='经理' and job!='办事员' and sal>=2000;
select * from emp where (deptno=10 and job='程序员') or (deptno=20 and job='办事员')
or(job!='经理' and job!='办事员' and sal>=2000);
--7、找出收取佣金的雇员的不同工作
--distinct 去重复
select distinct job from emp where comm>0;
--8、找出不收取佣金或收取的佣金低于100的雇员
select * from emp where comm<100 or comm is null;
--9、找出早于25年之前受雇的雇员
--(当前时间-入职日期)/365>25
select * from emp where (sysdate-hiredate)/365>25;
--10、显示在一个月为30天的情况下所有雇员的日薪金
select ename,sal/30 from emp,
--11、显示雇员的详细资料,按编号排序
select * from emp order by empno asc;
--12、显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序
select ename,job,sal from emp order by job desc,sal asc;
--创建用户:create user 用户名 identified by "密码";
create user java identified by "123";
--授予权限(角色) :grant 角色|权限 to 用户名;
grant connect to java;
grant resource to java;
--修改密码:alter user 用户名 identified by "新密码";
alter user java identified by "qwe";
--收回权限|角色:revoke 权限|角色 from 用户名;
revoke resource from java;
--锁定用户(解锁):alter user 用户名 account lock|unlock;
alter user java account lock;
alter user java account unlock;
--在表中添加一个字段:alter table 表名 add 字段名 字段类型;
alter table student add s_pone number(11);
--修改表中的字段类型:alter table 表名 modify (字段名 字段类型);
alter table student modify (s_sex char(6));
--修改表中的字段:alter table 表名 rename column 原字段名 to 新字段名;
alter table student rename column s_pone to s_address;
--删除表中的字段:alter table 表名 drop column 字段名;
alter table student drop column s_phone;
--分组查询、聚合函数:
count(*);
max();
min();
avg();
sum();
--多表连接:
--交叉连接、左连接、右连接、内连接、外链接(全连接)
a>交叉连接:得到的总数=两个表的数据的积
select * from emp,dept;
b>左连接:以左表为主,显示是左表所有的数据,只有右表有的数据不显示(数据查询不完整)
select * from 表1 left join 表2 on 连接条件;
select * from emp left join dept on emp.deptno=dept.deptno;
select * from dept left join emp on dept.deptno=emp.deptno;
c>右连接:以右表为主,显示的是右表所有的数据,只有左表有的数据不显示(数据查询不完整)
select * from 表1 right join 表2 on 连接条件;
select * from emp right join dept on emp.deptno=dept.deptno;
select * from dept right join emp on dept.deptno=emp.deptno;
--内连接:查询两张表交集
select * from 表1 inner join 表2 on 连接条件;
select * from emp inner join dept on emp.deptno=dept.deptno;
--外连接:
select * from 表1 full join 表2 on 连接条件;
select * from emp full join dept on emp.deptno=dept.deptno;
--1、列出至少有一个雇员的所有部门
select deptno,count(*) from emp group by deptno having count(*)>=1;
--2、列出薪金比"张三"多的所有雇员
--1.查询张三的薪金
select sal from emp where ename='张三';
--查询薪金大于张三
select * from emp where sal>(select sal from emp where ename='张三');
--3、列出所有雇员的姓名及其工作地点
select a.ename,dept.loc from dept,
(select ename,deptno from emp) a
where dept.deptno=a.deptno
--5、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门
select dept.dname,emp.* from dept left join emp on dept.deptno=emp.deptno;
--6、列出所有“CLERK”(办事员)的姓名及其部门名称
select ename,dname from emp left join dept on emp.deptno=dept.deptno where job='办事员';
--7、列出各种工作类别的最低薪金,显示最低薪金大于1500的记录
select job,min(sal) from emp group by job having min(sal)>1500;
--8、列出从事“SALES”(销售)工作的雇员的姓名,及部的部门编号
select ename,deptno from emp where job='销售';
--9、列出薪金高于公司平均水平的所有雇员
--1.查询公司平均薪资水平
select avg(sal) from emp;
--2.查询高于公司平均薪资的
select * from emp where sal>(select avg(sal) from emp);
--10、列出与“张三”从事相同工作的所有雇员
--查询张三的工作
select job from emp where ename='张三';
--查询工作与张三相同的
select * from emp where job=(select job from emp where ename='张三');
--11、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30中任何一个雇员的薪金
--1.查询部门30中的雇员薪资
select sal from emp where deptno=30;
--2.查询薪资等于30号部门中任意一个的
select ename,sal from emp where sal in (select sal from emp where deptno=30);
--12、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30中所有雇员的薪金
--1.查询30号部门的最高薪资
select max(sal) from emp where deptno=30;
--2.查询工资大于30号部门的最高工资的人
select * from emp where sal>(select max(sal) from emp where deptno=30);
--13、列出每个部门的信息以及该部门中雇员的数量
select dept.*,a.mun from dept left join
(select deptno,count(1) mun from emp group by deptno) a
on dept.deptno=a.deptno;
--14、列出所有雇员的雇员名称、部门名称和薪金
select ename,dname,sal from emp left join dept on emp.deptno=dept.deptno
--16、列出分配有雇员数量的所有部门的详细信息,即使是分配有0个雇员
select dept.*,a.mun from dept left join
(select deptno,count(1) mun from emp group by deptno) a
on dept.deptno=a.deptno;
--17、列出各种类别工作的最低工资
select job,min(sal) from emp group by job;
--18、列出各个部门的MANAGER(经理)的最低薪金
--1.查询所有经理的信息
select * from emp where job='经理';
--2.分组 查询最低工资
select deptno,min(sal) from emp where job='经理' group by deptno;
--19、列出按年薪排序的所有雇员的年薪
select sal*12 yearsal from emp order by yearsal;
--20、列出薪金水平处于第三位的雇员
select * from
(select ename,sal,rank() over(order by sal desc) pm from emp) a where a.pm=3
--1、查询“c001”课程比“c002”课程成绩高的所有学生的学号;
select * from
(select * from sc where cno='c001') a,
(select * from sc where cno='c002') b
where a.sno=b.sno and a.score>b.score;
--2、查询平均成绩大于60 分的同学的学号和平均成绩;
select sno,avg(score) from sc group by sno having avg(score)>60;
--3、查询所有同学的学号、姓名、选课数、总成绩;
select student.sno,student.sname,a.选课数,a.总成绩 from student full join
(select sno,count(1) as 选课数, sum(score) as 总成绩 from sc group by sno) a
on student.sno=a.sno;
--4、查询姓“刘”的老师的个数;
select count(1) from teacher where tname like '刘%';
--5、查询没学过“谌燕”老师课的同学的学号、姓名;
--1.查询谌燕老师的编号
--2.根据老师编号查询她所教的课程
--3.根据课程编号查询所学这些课程的学生
--4.查询没学过该老师课程的学生
select * from student where sno not in(
select distinct sno from sc where cno in
(select cno from course where tno=
(select tno from teacher where tname='谌燕')));
6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名
--1.查询学过C001课程的学号
select sno from sc where cno='c001';
--2.查询学过c002课程的学生
select sno from sc where cno='c002';
--3.查询既学过c001又学过c002课程的学生
select a.sno,student.sname from
(select sno from sc where cno='c001') a,
(select sno from sc where cno='c002') b,student
where a.sno=b.sno and b.sno=student.sno;
7、查询学过“谌燕”老师所教的课的同学的学号、姓名;
--1.查询谌燕老师的编号
select tno from teacher where tname='谌燕';
--2.根据老师的编号查询所教课程
select cno from course where tno=
(select tno from teacher where tname='谌燕');
--3.根据课程编号查询所教学生编号
select distinct sno from sc where cno in
(select cno from course where tno=
(select tno from teacher where tname='谌燕'));
--4.根据学号查询学生姓名
select * from student where sno in
(select distinct sno from sc where cno in
(select cno from course where tno=
(select tno from teacher where tname='谌燕')));
8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;
--1.查询学过c002课程的学号,成绩
select * from sc where cno='c002'
--2.查询学过c001课程的学号,成绩
select * from sc where cno='c001';
--3.查询同时学c001和C002课程的学生,并且课程c002成绩小于课程c001
select a.sno,student.sname,b.score,a.score from
(select * from sc where cno='c002') a,
(select * from sc where cno='c001') b,student
where a.sno=b.sno and a.score
--9、查询所有课程成绩小于60 分的同学的学号、姓名;
select sno,sname from student where sno in
(select sno from sc group by sno having min(score)<60);
--10、查询没有学全所有课的同学的学号、姓名;
--1.查询有多少门课程
--2.查询选课数小于所有课程数
select student.sno,student.sname,a.选课数 from student full join
(select sno,count(*) 选课数 from sc group by sno having count(*)<
(select count(*) from course)) a on student.sno=a.sno;
--聚合函数:
count(1);--记录数
avg();--平均数
max();--最大值
min();--最小值
sum();--求和
-- 查询员工表有多少员工
select count(*) from emp;
--查询整个公司的平均工资水平
select avg(sal) from emp;
--查询最高工资是多少
select max(sal) from emp;
--查询最低工资是多少
select min(sal) from emp;
--查询所有工资的和
select sum(sal) from emp;
--分组查询:分组查询一般与聚合函数一起使用
select 分组依据或聚合函数 from 表名 where 条件 group by 分组依据 having 条件;
--查询男生女生各有多少学生
select s_sex,count(1) from s_student group by s_sex;
--查询每个部门各有多少人
select deptno,count(*) from emp group by deptno;
--查询做每种工作的有几个人
select job,count(*),avg(sal) from emp group by job;
--多字段分组:查询每个班级男生女生各有多少人
select s_class,s_sex,count(1) from s_student group by s_class,s_sex;
--查询至少有2名学生的班级
select s_class,count(*) from s_student group by s_class having count(*)>=2;
--根据不同年龄段分组:统计【16-22】之间有多少人,【23-30】之间有多少人,大于30有多少人
语法:case when ...then... else...end
select
sum(case when s_age between 16 and 22 then 1 else 0 end) as "【16-22】",
sum(case when s_age between 23 and 30 then 1 else 0 end) as "【23-30】",
sum(case when s_age >30 then 1 else 0 end) as"【大于30】"
from s_student;
--请根据不同性别统计:统计【15-22】之间有多少人,【23-30】之间有多少人,大于30有多少人
select s_sex,
sum(case when s_age between 15 and 22 then 1 else 0 end) as "【15-22】",
sum(case when s_age between 23 and 30 then 1 else 0 end) as "【23-30】",
sum(case when s_age >30 then 1 else 0 end) as"【大于30】"
from s_student group by s_sex;
--常用的函数:
--查询员工的姓名和入职日期(只显示年月日)
select ename, to_char(hiredate ,'yyyy-MM-dd') as 入职日期 from emp;
select ename,hiredate as 入职日期 from emp;
--decode用法:
select s_name,decode(s_sex,'男','帅哥','女','靓妹','人妖') as 性别 from s_student;
--nvl用法:判断空值
select s_name,nvl(s_sex,'不详') as 性别 from s_student;
--where 和 having:
where是判断表数据,直接剔除不符合要求的数据
having是判断表中表,剔除表中表中不符合要求数据
--1. 显示平均工资为>2000的职位
select job,avg(sal) from emp group by job having avg(sal)>2000;
--2. 计算工资在2000以上,各种职位的平均工资大于3000的职位及平均工资
select job,avg(sal) from emp where sal>2000 group by job having avg(sal)>3000 ;
--3. 找每个部门的最高和最低的工资
select deptno,max(sal),min(sal) from emp group by deptno;
--4. 找每个部门中每种职位的最高和最低的工资
select deptno,job,max(sal),min(sal) from emp group by deptno,job;
--5. 显示出工作名称(job)中包含"办事"的员工平均工资,最高工资,最低工资及工资的和
select avg(sal),max(sal),min(sal),sum(sal) from emp where job like '%办事%';
--6. 显示出20号部门的员工人数
select count(*) from emp where deptno=20;
--7. 显示出平均工资大于2000的部门名称及平均工资
select dept.dname,a.pjsal from dept,
(select deptno ,avg(sal) pjsal from emp group by deptno having avg(sal)>2000) a
where dept.deptno=a.deptno;
select dept.dname,a.pjsal from dept,
(select deptno,avg(sal) as pjsal from emp group by deptno having avg(sal)>2000) a
where dept.deptno=a.deptno;
--8. 显示每个部门每种工作平均工资大于2500的部门名称及工作
select dept.dname,a.job,a.pjsal from dept,
(select deptno,job,avg(sal) pjsal from emp group by deptno,job having avg(sal)>2500) a
where dept.deptno=a.deptno;
--9. 列出最低工资大于1500的各种工作
select job,min(sal) from emp group by job having min(sal)>1500;
--10. 列出各部门的员工数量及平均工作年限
--入职时间 avg((sysdate-入职时间)/365) sum(sysdate-入职时间)/count(1)
select deptno,count(*),avg((sysdate-hiredate)/365) from emp group by deptno;
--约束:
好处:保证了数据的准确性和完整性
缺点:降低了操作效率
--创建表:create table 表名( 字段名 数据类型, 字段名 数据类型);
--数据类型: 数字型 number(3) number(6,2)
--字符串 char(3)存放固定长度的字符串 varchar2(20) 存放可变长度的字符串
--时间类型 date 年月日时分秒 timestamp 年月日十分秒 时区 秒后6位
--clob 存放大文本 blob 存放二进制 图像 视频 音频
create table users(
u_id number(3),
u_name varchar2(20),
u_sex char(3),
u_age number(3)
);
--1.非空约束
--1.创建表时,设置非空
create table aaa(
a_id number(3) not null,
a_name varchar2(20) not null
);
insert into aaa(a_id,a_name) values(1,'XXX');
insert into aaa(a_id) values(2);
create table ccc(
c_id number(3) not null,
c_name varchar2(20) not null,
c_sex char(3) default '男'
);
insert into ccc(c_id,c_name) values(1,'XXX');
--2.建表之后,设置非空:alter table 表名 modify(字段名 not null);
alter table student modify (s_age not null);
--2.唯一约束:1.唯一,不能重复,可以为空 2. 自动创建索引,快速查找 3.可以设置多个列为唯一
--1.创建表时,设置唯一约束
create table aaa(
a_id number(3) unique,
a_name varchar2(20)
);
insert into aaa(a_name) values('XXX');
--2.表创建后,设置唯一约束:alter table 表名 add constraint 约束标识名 unique(字段名);
alter table aaa add constraint aaa_unique_name unique(a_name);
insert into aaa(a_id,a_name) values(2,'XXX');
--3.主键约束:1.唯一,不能重复,不能为空 2.自动创建索引,快速查询
--3.一张表只能有一个主键(不止有一个列,也可以由多个列组成,复合主键)
--1.创建表时,设置主键约束
create table bbb(
b_id number(3) primary key,
b_name varchar2(20)
);
insert into bbb values (1,'XX');
--2.在创建表之后,设置主键:alter table 表名 add constraint 约束标示名 primary key(字段名);
alter table student add constraint student_primary_id primary key(s_id);
alter table bbb add constraint bbb_primary_id_name primary key(b_id,b_name);
--4.check约束:某一个字段的值按着一定的格式,在一定的范围中
--创建表的时候,设置check约束
create table ccc(
c_id number(3) primary key,
c_name varchar2(20),
c_sex char(3),
c_age number(3) check(c_age >=0 and c_age<=130)
);
create table ccc(
c_id number(3) primary key,
c_name varchar2(20),
c_sex char(3),
c_age number(3) check(c_age between 0 and 130)
);
--添加数据:insert into 表名(字段名) values(' 对应的值');
insert into ccc(c_id,c_name,c_age) values(2,'XXX',30);
--创建表之后,设置check约束:alter table表名 add constraint 约束标识名 check(字段条件);
alter table ccc add constraint ccc_check_sex check(c_sex ='男' or c_sex='女' );
alter table ccc add constraint ccc_check_sex check(c_sex in('男','女'));
insert into ccc(c_id,c_name,c_sex) values(4,'XXX','男');
--5.外键约束
--1.创建表时,设置外键
create table c_class(
c_id number(3) primary key,--设置主键
c_name varchar2(20)
);
create table s_student(
s_id number(3) primary key,
s_name varchar2(20),
s_class number(3),
constraint student_foreign_class foreign key(s_class) references c_class(c_id)
);
insert into c_class values(1,'java1703');
insert into s_student values(1,'XX',1);
--创建表之后,设置外键:alter table 从表 add constraint 约束标识名 foreign key(外键) references 主表(主键);
alter table s_student add constraint student_foreign_class foreign key(s_class) references c_class(c_id);
--序列:用来生成连续整数数据类型的对象(通常用来作为主键中增长列)
-- Create sequence 创建
create sequence USERS_SEQUENCES
minvalue 1 --最小值
maxvalue 999999999999999999999999999--最大值
start with 1 --初始值
increment by 1 --增量
cache 20;--缓存
--1>在select中使用
select users_sequences.nextval from dual;--dual伪表
select users_sequences.currval from dual;--当前序列值 注意:currval和nextval要同一个会话中
--2>在insert中使用
insert into users values(users_sequences.nextval,'XX','男',21);
insert into s_student values(users_sequences.nextval,'XX',1);
--不同的表可以使用同一个序列,但是一般情况一张表对应一个序列
--插入
--1>单行插入
--insert into 表名(字段名,字段名) values (对应的值);
--注意:字符串要用单引号,如果值与字段一一对应,可以省略字段名
insert into s_student(s_id,s_name) values(2,'XXX');
insert into s_student(s_id,s_class,s_name) values (4,1,'XX');
--2>多行插入
--a>将其他表中的数据插入到本表中 注意:不需要values
insert into s_student(s_id,s_name) select u_id,u_name from users;
--b>复制表(不复制约束)
-->复制表结构和数据
create table student_beifen as select *from s_student;
-->复制表结构
create table student_beifen1 as select * from s_student where 1=6;
--删除
--delete from 表名 where 条件
delete from student_beifen where s_name='XX';
delete from s_student where s_name='XX';
--删除表所有记录
delete from student_beifen;--执行效率低,可以回滚
truncate table student_beifen;--执行效率高,不可以回滚
commit;--提交
--修改
--update 表名 set 字段名=修改后的值,字段名=修改后的值 where 条件;
--把id为31的学生姓名改为曾勇
update s_student set s_name='XX' where s_id=31;
--把id为21的姓名改为曾勇 班级编号改为1
update s_student set s_name='XX', s_class=1 where s_id=21;
--把所有的学生班级编号都改为1
update s_student set s_class=1;
--在表中添加一个字段:alter table 表名 add 字段名 数据类型;
alter table s_student add s_birth date;
--把所有的学生生日都改为今天的日期
update s_student set s_birth=sysdate;
select sysdate from dual;
--把其他表中的值设置到本表中( 把学生表里id为21的姓名改成 英雄表里id为1的姓名)
update s_student set s_name=(select h_name from hero where h_id=1) where s_id=21;
--查询
--select * from 表名 where 查询条件 order by 排序的列名 ASC或DESC
--查询班级编号为1班的所有学生信息
select * from s_student where s_class=1;
--查询班级编号为1或者为2的所有学生信息
select * from s_student where s_class=1 or s_class=2;
--查询班级编号为1 id也为1的学生信息
select * from s_student where s_class=1 and s_id=1;
--没有班级的学生信息(不能用=)
select * from s_student where s_class is null;
--like 模糊查询 _:一个字符 %:任意个字符
--查询姓张的所有学生信息
select * from s_student where s_name like '张%';
--查询名字有两个字并且姓张的所有学生信息
select * from s_student where s_name like'张__';
--名字中有袁字的学生信息
select * from s_student where s_name like '%袁%';
--查询特定的列:查询所有学生的姓名和班级编号
select s_name,s_class from s_student;
--查询所有学生的姓名和班级编号 并且列名用中文显示
--列名:as可以省略 ,双引号也可以省略,但是有特殊字符的时候不能省略双引号
select s_name "【姓名】",s_class "【班级编号】" from s_student;
--常量:字符型要用单引号,数值型可以省略单引号
select s_name "【姓名】",s_class "【班级编号】",10086 as "【地址】" from s_student;
--查询年龄在18到30岁之间的学生信息
select * from s_student where s_age>=18 and s_age<=30;
select * from s_student where s_age between 18 and 30;
--查询所有女学生的学生信息,并且按照年龄的升序排序,如果年龄相同,按照学号的降序排序
select * from s_student where s_sex='女' order by s_age asc, s_id desc;
--子查询:查询java1703班的所有学生信息
select c_id from c_class where c_name='java1703';
select * from s_student where s_id=(select c_id from c_class where c_name='java1703');
--聚合函数:
count(1);--记录数
avg();--平均数
max();--最大值
min();--最小值
sum();--求和
-- 查询员工表有多少员工
select count(*) from emp;
--查询整个公司的平均工资水平
select avg(sal) from emp;
--查询最高工资是多少
select max(sal) from emp;
--查询最低工资是多少
select min(sal) from emp;
--查询所有工资的和
select sum(sal) from emp;
--分组查询:分组查询一般与聚合函数一起使用
select 分组依据或聚合函数 from 表名 where 条件 group by 分组依据 having 条件;
--查询男生女生各有多少学生
select s_sex,count(1) from s_student group by s_sex;
--查询每个部门各有多少人
select deptno,count(*) from emp group by deptno;
--查询做每种工作的有几个人
select job,count(*),avg(sal) from emp group by job;
--多字段分组:查询每个班级男生女生各有多少人
select s_class,s_sex,count(1) from s_student group by s_class,s_sex;
--查询至少有2名学生的班级
select s_class,count(*) from s_student group by s_class having count(*)>=2;
--根据不同年龄段分组:统计【16-22】之间有多少人,【23-30】之间有多少人,大于30有多少人
语法:case when ...then... else...end
select
sum(case when s_age between 16 and 22 then 1 else 0 end) as "【16-22】",
sum(case when s_age between 23 and 30 then 1 else 0 end) as "【23-30】",
sum(case when s_age >30 then 1 else 0 end) as"【大于30】"
from s_student;
--请根据不同性别统计:统计【15-22】之间有多少人,【23-30】之间有多少人,大于30有多少人
select s_sex,
sum(case when s_age between 15 and 22 then 1 else 0 end) as "【15-22】",
sum(case when s_age between 23 and 30 then 1 else 0 end) as "【23-30】",
sum(case when s_age >30 then 1 else 0 end) as"【大于30】"
from s_student group by s_sex;
--常用的函数:
--查询员工的姓名和入职日期(只显示年月日)
select ename, to_char(hiredate ,'yyyy-MM-dd') as 入职日期 from emp;
select ename,hiredate as 入职日期 from emp;
--decode用法:
select s_name,decode(s_sex,'男','帅哥','女','靓妹','人妖') as 性别 from s_student;
--nvl用法:判断空值
select s_name,nvl(s_sex,'不详') as 性别 from s_student;
--where 和 having:
where是判断表数据,直接剔除不符合要求的数据
having是判断表中表,剔除表中表中不符合要求数据
--1. 显示平均工资为>2000的职位
select job,avg(sal) from emp group by job having avg(sal)>2000;
--2. 计算工资在2000以上,各种职位的平均工资大于3000的职位及平均工资
select job,avg(sal) from emp where sal>2000 group by job having avg(sal)>3000 ;
--3. 找每个部门的最高和最低的工资
select deptno,max(sal),min(sal) from emp group by deptno;
--4. 找每个部门中每种职位的最高和最低的工资
select deptno,job,max(sal),min(sal) from emp group by deptno,job;
--5. 显示出工作名称(job)中包含"办事"的员工平均工资,最高工资,最低工资及工资的和
select avg(sal),max(sal),min(sal),sum(sal) from emp where job like '%办事%';
--6. 显示出20号部门的员工人数
select count(*) from emp where deptno=20;
--7. 显示出平均工资大于2000的部门名称及平均工资
select dept.dname,a.pjsal from dept,
(select deptno ,avg(sal) pjsal from emp group by deptno having avg(sal)>2000) a
where dept.deptno=a.deptno;
select dept.dname,a.pjsal from dept,
(select deptno,avg(sal) as pjsal from emp group by deptno having avg(sal)>2000) a
where dept.deptno=a.deptno;
--8. 显示每个部门每种工作平均工资大于2500的部门名称及工作
select dept.dname,a.job,a.pjsal from dept,
(select deptno,job,avg(sal) pjsal from emp group by deptno,job having avg(sal)>2500) a
where dept.deptno=a.deptno;
--9. 列出最低工资大于1500的各种工作
select job,min(sal) from emp group by job having min(sal)>1500;
--10. 列出各部门的员工数量及平均工作年限
--入职时间 avg((sysdate-入职时间)/365) sum(sysdate-入职时间)/count(1)
select deptno,count(*),avg((sysdate-hiredate)/365) from emp group by deptno;
//登陆数据库
cmd ->sqlplus /nolog->不登录数据库->进行sqlplus管理工具
conn / as sysdba 管理员登陆数据库 本机可以省略账号和密码
//意思是:任意(空的也行)密码和账号都可以登录 即使不存在的账号和密码
单行注释:--
多行注释:/*......*/
conn / 用户名/密码 as sysdba 登陆其他主机上的数据库
//conn /用户名/密码 以普通身份登陆数据库
select * from dual; select sysdate from dual; 查看日期
--------------------------------------------------------------
//管理员->创建用户 create user 用户名 identified by 密码;
密码数字开头 用双引号
//;结束一条命令
grant 权限 to 用户; grant create session to 用户名 ->将会话权限授权给用户
grant 角色|权限 to 用户名; 不同角色->不同权限 多个角色或权限 用逗号
//常用角色 dba管理员-> 具备数据库的所有权限
connect -> 只具备连接数据库的权限 一般授权给临时用户
resource -> 具备数据库的基本操作
grant connect,resource to user; 具备连接权限和操作权限;
//一个窗口->一个用户使用
查看所有用户:
select * from dba_users;
select * from all_users;
select * from user_users;
-------------------------------
//删除用户
drop user 用户名 cascade; cascade 级联删除->删除用户所有数据
若该用户连接数据库时不允许删除
-------------------------------
//收回权限|角色
revoke 权限|角色 from 用户名;
例:revoke create session from 用户名;
//修改密码:alter user 用户名 identified by "新密码";
//锁定用户(解锁):alter user 用户名 account lock|unlock;
//普通身份->normal->connect resource 管理员身份->sysdba 数据库操作员->sysoper->create view
//配置连接其它主机上的数据库:
1.查看ip地址
2.找配置文件 D:\oracle\app\oracle\product\10.2.0\server\NETWORK\ADMIN\tnsnames.ora
XE =
//数据库连接字符串,可以随便命名,不能出现中文字符
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Hasee-PC)(PORT = 1521))
//HOST=本地主机名称或本地主机localhost或者环回地址127.0.0.1
//也可以是主机地址
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)//XE不能修改
)
)
3.修改HOST
4.关闭防火墙
//数据库中哪些用户拥有DBA权限
select * from dba_role_privs where granted_role='DBA'
//收回某用户的DBA权限则执行
revoke dba from user_Name
//as sysdba方式登录的数据库?如果是这样,并且sqlnet中设置了操作系统认证,那么即使用户已经被删除了,
还是可以登录到数据库,因为这时as sysdba实际上就是说我以sys这个用户登录!
--------------------------------------------------------------------
//二维表:关系数据库
姓名 性别 年龄
张三 男 18
User user=new User();
user.setName("张三");
列:java成员属性
行:一个实例化对象
-------------------------------------------------------
1.创建表结构
create table 表名 ( 字段名 数据类型(长度), 字段名 数据类型(长度));
2.表的命名 t_student
3.Oracle不区分大小写 系统会默认转化为大写
----------------------------------------------------------
结构化查询语言 SQL语言的分类:
DDL 数据定义语言 create alter drop truncate
DDM 数据操作语言 insert update delete
DQL 数据查询语言 select
DCL 数据控制语言 grant revoke
TCL 事务控制语言 commit rollback savepoint
----------------------------------------------------------------
1.对表添加注释
comment on table 表名 is '注释内容'
2.对字段添加注释
comment on column 表名.属性名 is '注释内容'
----------------------------------------------------------------
1.数据类型
数值类型:number 可以存储整数和小数
number(p,s): p->整个长度 s->小数长度 默认0;
小数可以超过最大长度,小数部分自动45
number 可以不指定长度 默认最大长度是38位
字符类型:
varchar2 可以存储4000个字节以内的数据 必须指定长度
根据数据大小分配相应的内存空间
数据大小不固定 使用varchar2类型
char 可以存储2000个字节以内的数据 不指定时默认为1
根据数据定义大小分配内存空间,不足空格填充
数据大小固定 使用char类型
char类型执行效率比varchar2高
日期类型:
date 年月日时分秒
timestamp 时间戳 年月日时分秒毫秒(秒的后6位)
-----------------------------表结构操作-------------------------------------
1.添加字段
alter table 表名 add 字段名 类型(长度);
2.修改字段类型
alter table 表名 modify 字段名 新类型(长度);
3.修改字段的名称
alter table 表名 rename column 原名称 to 新名称
4.删除字段
alter table 表名 drop column 字段名称
5.删除表
drop table 表名 cascade constraints 删除表同时删除表中相关的约束
--------------------------添加数据---------------------------
添加数据:insert into 表名(字段名) values(' 对应的值');
注意:1.字符要用单引号 2.添加的值和字段一一对应的时候可以省略字段名
insert into student(s_id,s_name,s_sex,s_age) values (1,'汪鹏','男',20);
insert into student values(2,'汪鹏','男',20);
insert into student(s_id,s_age,s_name) values(4,30,'邹老板');
-----------------------------约束-------------------------------
1.not null 非空
2.default 默认 精简版对数字有效 企业版对数字和字符都有效
3.unique 唯一性约束 属性字段唯一性 可为空值并且可以多个
每个属性都可以设置
自动创建索引 提升查询效率
alter table 表名 add constraint 约束的标示名 unique(字段名);
4.primary kye 主键约束 不能为空 表中只能有一个主键
alter table 表名 add constraint 约束标示名 primary key(字段名);
自动创建索引 提升查询效率
5.复合主键 alter table 表名 add constraint 约束标示名 primary key(字段名,字段名);
6.外键约束
子表 主表
学生表 班级名属性 | 班级表 班级名属性
java01 java01
若修改
每个需要改 < - j1701
1 1 java01
2 -> 设置外键关联 2 java02 关联班级
3 3 java03
外键:主表中的主键
表中进行关联,称之为主键关联
可以避免数据库字段的冗余->多余的字段
cascade 删除java01班 对应学生表的数据删除 级联删除:
no action 子表有数据,不能删除
set null 删除java01班 对应学生表的相应信息设置为空
---表中添加--
子表中添加外键:constraint 约束标示名 foreign key(字段) references 主表(字段);
--表建立后添加--
alter table 子表 add constraint 约束标示名 foreign key(字段) references 主表(字段);
-----------------------------总结--------------------------------------
当一个字段为空时不能修改
alter table s_studentcopy modify s_sex not null;
当一个字段属性为空时不能设置主键约束
alter table s_studentcopy add constraint pk_s_id primary key(s_sex);
当一个字段有唯一约束不能同时设置主键约束
alter table s_studentcopy add constraint unique_s_id unique (s_id);
alter table s_student add constraint pk_s_id primary key(s_id);
7.check 设定字段取值范围
check (sex='男' or sex='女')
check (sex in('男','女)) varchar2(3)->一个汉字
check (sex not in('男','女))
check(age>=19 and age<=23)
check (age betweent 19 and 23)
check (age not betweent 19 and 23)
!= <> -----> 不等于
commit 提交
rollback 回滚
--DML 数据操作语言
--插入
insert into 表名(字段名,...字段名n)values(值,...值n);
sysdate 系统时间
to_date() 字符串类型日期数据 转化为 日期类型
--java中MM标示月份
select to_date('2015-09-06 13:30:24' 'yyyy-mm-dd HH:mi:ss') 12小时制
select to_date('2015-09-06 13:30:24' 'yyyy-mm-dd HH24:mi:ss') 24小时制
--dual 伪表 临时创建 客户端查看
--DATE 插入数据 需要转化
--last_day() 最后一天
--trunc() 第一天
--序列->一般用于主键插入数据 保证主键唯一性 seq+表名
select 序列名.nextval from dual; 下一个序列数值
select 序列名.currval from dual; 当前序列数值
----------------------------------------------------------
多行插入
复制表结构及相关数据
create table 复制的表名 as select * from 表名
--相当于备份了,但是约束没有复制过来,只复制表结构和数据;
复制表结构
create table 复制的表名 as select * from 表名 where 1<>1;
表数据插入到->另外一张表
insert into 要插入的表名(字段名,...)
select 相关字段名 from 表名;
commit;
字段类型相同时:
insert into student_1 select * from student_2;
修改
表数据设置到->另外一张表
update student_1 set (sname,ssex)=(select username,usersex from t_user where userid=3)
where sid in(36,23,24);
删除
delete from 表名 where 条件 需要提交和回滚
truncate table 表名
truncate 不需要提交 快速删除
--只是删除表数据,没有删除表结构
-------------------------------------------------
ascii码值范围
a-z:97-122
A-Z:65-90
0-9:48-57
substr(char,m,n):取字符串的子串,m表示起点,n 代表取 n 个字符的意思->注:第一个字符串起点是1
ascii()函数将字符转换为ASCII码:字符 – > ASCII码;
查询出 首字母是大写 的 字段名
WHERE ASCII(SUBSTR(要截取的字段名,1,1)) >= 65 AND ASCII(SUBSTR(要截取的字段名,1,1))<=90;
-------------------------------------------------------------------------------------------
lengthb(string) 计算string所占的字节长度:返回字符串的长度,单位是字节
length(string) 计算string所占的字符长度:返回字符串的长度,单位是字符
select length('票') from dual; 结果是 1
select lengthb('票') from dual; 结果是 3
--对于单字节字符,LENGTHB和LENGTH是一样的.
--如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文。
--------------------------------------------------------------------------
upper(字符串):转换为大写
lower(字符串):转换为小写
initcap(字符串):首字母大写
内容替换:replace()
SELECT replace('Hello', 'l', 'x') FROM DUAL
---------------------------------------------
where sex=null 性别值为null 和 sex is null 性别是null;
------------------------------------------------------------
DQL
-----------------------------------------------------
select 字符名 3
from 表 1 ->执行顺序
where 条件 2
group by 分组字段
having 过滤分组条件
order by 排序
-------------------------------------------------------------
select sid,sname,1 from student
-> 1表示常量列,一般都有加单引号,
数值类型可以省略
则该列属性值都为1
------------------------------------------------------------------------
修改 类表名:as 可以省略,双引号也可以省略;有特殊字符时候不可以省略双引号
as 学号 as "[学号]"
学号 "[学号]"
-------------------------------------------------------------
拼接字符(||)
select sid||'_'||sname from student; 显示 -> 1_康盼
'是一个转义字符
'''' -> '\''
'\''||snam||'\'' -> 'sname'
--------------------------------------------------------------
like '康%' 康||'多个字符'
--匹配任意个数的任意字符
like '%康%' '多个字符'||康||'多个字符'
like '康_'
-------------------------------
asc 升序 默认
desc 将序
----------------聚合函数------------------------
count(*) select 匹配+统计*(任意字段) 统计 未分组不能出现字段,可以出现常量
count(sex),1 统计sex字段的个数,为空不统计
-----------------------------
select 1 from student;
select count(1) from student; 统计
---------------------------------------->
--效率高 常量列来统计 count(1)比count(*)高
sum()
avg()
max()
min()
-----------------------------------
select sex,count(1) 3------------列出信息->分组字段,不能出现其它字段
from student 1--------查找表
group by sex 2-------对性别分组
分组单独使用--取消重复行----------使用distinct
select sex select distinct sex
from student from student
group by sex
having 分组条件
select sex,count(1)
from student
group by sex
having count(1)>10
------------------------------执行顺序
select sex,count(1) 4
from student 1
where age>20 2
group by sex 3
--------------------------------------
多字段分组
--先按城市分组,再按性别分组,统计人数
select add,sex,count(1)
from student
group by add,sex
--------------------------
分组和聚合函数一起使用时,先分组,在统计