数据库中的insert,select,update,delete都是根据一行一行的查找,符合where条件的数据,
符合的就进行相关操作,不符合的就忽略掉,
注意:当在where中用等号做条件的时候返回的是单值,做嵌套子查询的时候可以直接=.
例如:
select * from student where id = (select id from g where student.id = g.id);
如果返回的是多个值在id=中把=换成in
学生表
ID NAME SCORE GRADE
---------- -------------------- ---------- ----------
1 张三 90
2 李四 80
3 王五 91
4 赵六 86
5 孙七 88
6 王八 60
班级表
ID GRADE
---------- ----------
1 2001
2 2002
3 2001
4 2001
5 2002
6 2002
1.select查询
要熟练掌握嵌套子查询:
例如:
更新当class中的id等于student中的id时,更新student表中的数据
select * from student;
select *from class;
update student set(name,score) = (select name,score from
(select rownum r ,name,score from class) where r = student.id);
2.update的用法
update student set grade = (select grade from g where g.id = student.id);
根据班级中的数据更新到学生表中,实现一次性更新.
update student set(列名,列名) =(查询语句);
实现两张表的结合,
查找出成绩前两名的学生,分别是由什么老师带领的
学生表
ID NAME SCORE GRADE
---------- -------------------- ---------- ----------
1 王八 56 2002
2 刘亮 65 2002
3 孟超伟 88 2001
4 周龙潮 88 2001
5 张明 91 2002
6 张林燕 73 2001
班级表
GRADE TEACHER
---------- --------------------
2001 张教授
2002 孙教授
select id,name,score,grade,teacher from (select al.*,
rank() over(partition by grade order by score desc) as rw from
(select s.id,s.name,s.score,s.grade,c.teacher from
student s left outer join class c
on s.grade = c.grade order by id) al) where rw <= 2;
关于用dense_rank ()/rank () over(partition by 列名 order by 列名)
的区别:
dense_rank()不会跳过重复的,比如11之后会是2,
而rank()直接跳过重复的,11之后就变成3;