澳门新葡亰信誉平台游戏SQL练习四

by admin on 2020年1月31日

1.查询语句的使用
使用
select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.
 
1.1相关子查询
可以将子查询(as
subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询
  .where中可以包含一个select语句的子查询
  .where中可以包含in,exists语句
  .最多可以嵌套16层
  .层次过多会影响性能
  [例]简单子查询实例
 
查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目
  (按规定只能以一个单位来申请)
  SQL> create table univ_subject
  2    (
  3       name                 varchar2(12) not null,
  4       per_id                number     not null,
  5      dept_name       varchar2(20)            
  6    );
  SQL> insert into univ_subject 
values(‘gaoqianjing’,1001,’信息工程系’);
  SQL> insert into univ_subject  values(‘wangbing’,1002,’物理系’);
  SQL> insert into univ_subject  values(‘liming’,1003,’化学系’);
  ===============
   SQL> create table  colle_subject
  2     (
  3              colle_name    varchar2(20),
  4              per_id              number
  5     );
  SQL> insert into colle_subject values(‘电子研究所’,1001);
  SQL>  insert into colle_subject values(‘物理研究所’,1005);
  ================
  SQL> select name,per_id,dept_name from univ_subject where
per_id in
  2    (select per_id from colle_subject);

1.ROWNUM的使用——TOP-N分析

  NAME            PER_ID   DEPT_NAME
  ————          ———     ——————–
  gaoqianjing  1001      信息工程系

使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。

1.2外连接
 [例]外连接实例
 招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生
 的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果
 某个学生没有特长就显示特长问空.
 SQL>  create table students
  2    (
  3       st_id    varchar2(20),
  4       name  varchar2(10),
  5       age      number(2),
  6       tol_score   number(3)
  7    ) ;
SQL>   insert into students values(‘973231′,’wangbindu’,22,501);
SQL>   insert into students values(‘973232′,’zhuzhijing’,21,538);

01
子查询: A表是外来专家申请的学院系研究表
         B表是外来专家申请的研究所研究表
—查询是否有外来人员违规申请学院系又申请研究所的相关人员信息

ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列
(强调:先要有结果集)。简单的说ROWNUM是符合条件结果的序列号。它总是从1开始排起的。

SQL>  insert into students values(‘973233′,’gaojing’,21,576);

SQL>  create table student_skill
  2   (
  3      st_id  varchar2(20),
  4      skill    varchar2(20)
  5  );
SQL>  insert into student_skill values(‘973231′,’篮球’);
SQL>  insert into student_skill(st_id) values(‘973232’);

create table univ_subject(name varchar2(12) not null,
 per_id number not null,dept_name varchar2(20));

使用ROWNUM时,只能使用<、<=、!=符号。

SQL>  insert into student_skill values(‘973233′,’足球’);

SQL>   select a.* , b.skill from students a,student_skill b where
a.st_id=b.st_id(+

insert into univ_subject values(‘gaoqianjing’,1001,’xinxixi’);

 

insert into univ_subject values(‘wangbing’,1002,’wulixi’);

举例:

insert into univ_subject values(‘liming’,1003,’huaxuexi’);

student(学生)表,表结构为:

create table colle_subject(colle_name varchar2(20),per_id number);

ID       char(6)      –学号

insert into colle_subject values(‘dianziyanjiu’,1001);
insert into colle_subject values(‘wuliyanjiu’,1005);

name    VARCHAR2(10)   –姓名


SQL> select name, per_id from univ_subject where per_id in(select
per_id from colle_subject);

–建表

02A学生表,B学生特长表=》查询所有学生的特长是啥,无特产空值;外连接
 SQL>  create table students
      (
         st_id    varchar2(20),
         name  varchar2(10),
         age      number(2),
         tol_score   number(3)
      ) ;
   insert into students values(‘973231′,’wangbindu’,22,501);
   insert into students values(‘973232′,’zhuzhijing’,21,538);

create table student (ID char(6), name VARCHAR2(10));

   insert into students values(‘973233′,’gaojing’,21,576);

SQL>  create table student_skill
     (
        st_id  varchar2(20),
        skill    varchar2(20)
    );
  insert into student_skill values(‘973231′,’lanqiu’);
  insert into student_skill(st_id) values(‘973232’);

–添加测试记录

  insert into student_skill values(‘973233′,’zuqiu’);

select a.name,b.skill from students a left join student_skill b on
 (a.st_id=b.st_id);

03集合运算:UNION/UNION ALL /INTERSECT/MINUS

还是上表:使用union,

SQL> delete student_skill where st_id=973232;
SQL> select st_id from students;
973231
973232
973233

SQL> select st_id from student_skill;
973231
973233

SQL> select st_id from students
  2   union
  3   select st_id from student_skill;

insert into student values(‘200001′,’张一’);

ST_ID

973231
973232
973233        union  union all区别,都是交集+自己本身独有的,
union交集去重复,取一个值,all不去重复

SQL> select st_id from students
  2   union all
  3   select st_id from student_skill;

insert into student values(‘200002′,’王二’);

ST_ID

973231
973232
973233
973231
973233

———————————-intersect:只取交集,重复
SQL> select st_id from students
     intersect
     select st_id from student_skill;

insert into student values(‘200003′,’李三’);

ST_ID

973231
973233

select st_id from students
     minus
     select st_id from student_skill;
A-B

–反向:no rows selected  空值

select st_id from student_skill
     minus
     select st_id from students;

04:自我连接+连接符》查询员工表,员工 work for (经理名) manager_name
SQL> select a.ename||’ work for ‘||b.ename from scott.emp  
     a join scott.emp b on (a.mgr=b.empno);

05:简单视图,查询部门工资+名称;
create or replace view bumengongzi as 
 select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b
where a.deptno=b.deptno group by a.dname;
insufficient privileges
SQL> grant select any table to yang;
SQL> select * from bumengongzi;

DEPT            TOTAL_SAL


ACCOUNTING          16650
RESEARCH             8675
SALES                9400

06:合计视图:   显示部门工资,奖金,所有发的钱
SQL> update emp set comm=0 where comm is null;

create or replace view emp_he as select deptno,sum(sal)
gongzi,sum(comm)
 jiangjin,sum(sal)+sum(comm) zonghe from scott.emp group by deptno;
SQL> grant create view to scott;
SQL> select * from emp_he;

    DEPTNO     GONGZI   JIANGJIN     ZONGHE


        30       9400       2200      11600
        20       8675          0       8675
        10      16650        300      16950

07:描述父子关系:
select lpad(‘ ‘,4*(level-1))||ename name,empno,mgr from emp start with
mgr is null connect by prior empno=mgr
NAME                      EMPNO        MGR
KING                       7839
    JONES                  7566       7839
        SCOTT              7788       7566
            ADAMS          7876       7788

SQL> select lpad(”,4*(level-1))||ename ename,empno,mgr from
scott.emp
  2   start with mgr is not null
  3   connect by empno=prior mgr;

08:
设三个关系:
学生表S( SNO学号, SNAME名字  , AGE出生日期 , SEX性别)
成绩SC(SNO学号,  CNO 课程编号  , GRADE 成绩 )
课程表 C (CNO课程编号,课程名称  CNAME ,教师编号 TEACHER)

1/查询所有科目都及格的学生学号?
select sno from sc having(min(grade))>=60 group by sno;

2/查询:分数》90又有不及格的学生学号?
select sno from sc where grade>90 and sno in (select sno from sc
 where grade <60);

3/查询平均分不及格的课程号和平均成绩
 select cno,avg(grade) from sc having(avg(grade))< 60 group by cno;

4/查询至少选修过2号学生选修的全部课程,的学生号;
select distinct sno,sname from s where 
 exists(select sno from sc where 
 exists( select cno from sc where sno=2) ) and sno not in(2);

只知道学号;第一步根据学号,找出选修课程
            第二步,根据选秀的课程编号,找出选修了该课程的学生学号
            第三步,根据课程的学生学号,排除2号自己所有学生

有人提供答案看不懂:select distinct sno from sc as scx
 where not exists (select * from sc as scy 
    where scy.sno=’2′ and not exists (select * from sc scz
        where scz.sno=scx.sno and scz.sno=scy.cno));

5:求各门课程去掉一个最高分和最低分后的平均分;
正常情况: select avg(grade) from sc group by cno;
select avg(grade) from sc where grade not in(select
 min(grade) from sc group by cno)
and  not in(select
 max(grade) from sc group by cno));

6:查询七号课程没有考试成绩的学生学号?
select sno from sc where cno=’7′ and grade is null;

7:查询7号课程成绩在90分以上或60分以下的学生学号。
select sno from sc where cno=’7′ and grade >90 or grade <60;

select sno from sc where cno=’7′ and grade not between 90 and 60;

8:查询每个学生所有课程的平均成绩,输出学生学号和平均成绩;
select sno,cno,avg(grade) from sc group by sno,cno;

9:查询每门课程的选修人数,输出课程号和选修人数。
select count(*),cno from sc group by cno;

10:查询7号课程的学生的学号、姓名、性别。
select sno,sname,sex from s where exists(select * from sc
 where cno=’7′);

11:查询选修7号课程的学生的平均年龄:

select avg(sysdate-sex) from s where exists(select * from sc
 where cno=’7′);

12:查询有30名以上学生选修的课程号
select cno from sc having(count(*))>30 group by cno;

13:查询至今没有考试不及格的学生学号:
select sno from sc where exists
(select count(sno) from sc where grade>60  
 having(count(sno)>(select count(distinct cno) from sc)  group by
sno);

14:查询所有考试成绩的平均分相同的学生学号分组
select sno,sum(grade) from sc group by sno;

学生表S( SNO学号, SNAME名字  , AGE出生日期 , SEX性别)
成绩SC(SNO学号,  CNO 课程编号  , GRADE 成绩 )
课程表 C (CNO课程编号,课程名称  CNAME ,教师编号 TEACHER)

exists

15:找出选修课程号为C2的学生学号与成绩
select sno,grade,cno from sc where cno=’C2′;

16:找出选修课程号为C4的学生学号与姓名
select a.sno,a.sname from s a join sc on (a.sno=sc.sn0 and cno=’C4′);

17:找出选修课程名为maths的学生学号与名称;
select a.sno,a.sname from s a join sc b on (a.sno=b.sno) join
 c on (b.cno=c.cno and c.cname=’Maths’);

18:找出选修课程为C2或C4的学生学号
select distinct sno from sc where cno in (c2,c4);
select distinct sno from sc where cno=’c2′ or cno=’c4′;

19:找出选修课程号C2和C4的学生学号
select distinct sno from sc where cno=’C2′ and cno=’C4′;xxxxxx

select distinct sno from sc where cno=’C2′ and sno in(
select sno from sc where cno=’C4′);

20:找出不学C2课程的学生姓名和年龄
select a.sname,(sysdate-age)/365 from s a join sc b on (a.sno=b.sno and
b.cno not in(‘C2’));

转换可以通过hr,查询验证信息
select a.last_name,trunc((sysdate-hire_date)/365) from employees a
join departments b
 on(a.department_id=b.department_id and b.department_id not in
(20));
相减,天数,

21:找出选修了数据库课程的所有学生姓名;
select distinct a.sname from s join sc on(s.sno=sc.sno )
 join c on (sc.sno=c.sno and c.name=’shujuku’);

22:找出数据库课程不及格的女生姓名;
select  a.sname from s join sc on(s.sno=sc.sno and a.sex=’nv’and
s.grade<60)
 join c on (sc.sno=c.sno and c.name=’shujuku’);

23:找出各门课程的平均成绩,输出课程名和平均成绩
select c.cname,avg(grade) from c join sc on (sc.cno=c.cno) group by
c.cname;

24:找出各个学生的平均成绩,输出学生姓名和平均成绩
select s.sname,avg(grade) from s join sc on (s.sno=sc.sno) group by
sname,sno;

25:找出至少30个学生选修的课程名
select cname from c where cno in (select cno from sc
having(count(*))>=30 group by cno where sc.cno=c.cno);

26:找出选修了不少于三门课程的学生姓名;
select sname from s join sc on (s.sno=sc.sno and sc.sno in(select sno
 from sc having(count(*))>3 group by sno));

select sname from s where sno in (select sno from sc where
having(count(*))>3 group by sno);

27:找出各门课程的成绩均不低于90分的学生姓名;
select sname from s join sc on (s.sno=sc.sno) group by sc.sno
having(min(grade))>=90;

28:找出数据库课程成绩不低于该门课程平均分的学生姓名;

找出每门课程的平均分;
select sname from s;
select avg(grade) from sc group by cno;
select cno from c where cname=’shujuku’;

select sname from s join sc on(s.sno=sc.sno) join c on (sc.cno=c.cno and
c.cname=’shujuku’)
 where sc.sno in(select sno from sc grade>(select avg(grade) from sc
group by cno));

或者
select sname from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and
cname=’shujuku’ and
 grade > (select avg(grade) from sc,c where sc.cno=c.cno and
c.name=’shujuku’);

29:找出每个课程的男女学生平均年龄和人数;

–男多少
select count(*) from s where sex=’nan’;

–平均年龄
 select   avg(trunc((sysdate-hire_date)/365)) from s;

select avg(trunc((sysdate-hire_date)/365)),count(*) 
 from s join sc on (s.sno=sc.sno) group by cno,sex;

30:查询每门课程的及格率:

-课程及格的人数;
select cno,count(*) a from sc  where grade>=60 group by cno;

-课程总人数;
select cno,count(*) b from sc  group by cno;


select cno,a/b from (select cno,count(*) a from sc  where
 grade>=60 group by cno) a join (select cno,count(*) b 
from sc  group by cno) b on (a.cno=b.cno);

这种情况经常查询,可以建立视图;
create view v_a(cno,cren) as select cno,count(*) from sc group by
cno;

create view v_b(cno,cren_jige) as select cno,count(*) from sc
 where grade>=60 group by cno;

–select v_a.cno,cren_jige/cren from v_a,v_b where
v_a.cno=v_b.cno;

31:查询平均分不及格的学生的学号,姓名,平均分;
select sc.sno,s.sname,avg(grade) from sc join s on(sc.sno=s.sno)
 havging(avg(grade))<60 group by sc.sno,s.sname;

select sno,avg(grade) from sc where sno in(select sno from sc
 having(avg(grade))<60 group by sno);

32:查询平均分不及格的学生人数;

select count(*) from sc
 having(avg(grade))<60 group by sno; —-每个学生几门不及格的科目;

select count(*) from sc where sno in(select sno from sc
 having(avg(grade))<60 group by sno);

33:表:YWY
列:yname 业务员姓名
    ono 办公室编号
    ysex性别
    salary工资
    yno 业务员编号

FP
    fdate 时间
    kno 客户号
    fmoney 金额
    yno 业务员编号

KH客户信息表
    客户号 kno
    客户姓名kname
    客户电话 phone

 34:–查询工资在1000到3000元之间男性业务员姓名和办公室编号;
 35:–查询各个办公室的业务员人数,输出办公室编号和对应的人数;
 36:–查询每个客户在2002年5月份购买的总金额,输出客户号和对应的总金额;
select kno,sum(fmoney) from fp where 
 fdate between to_date(‘2002/05/01′,’yyyy/mm/dd’) and
(‘2002/05/31′,’yyyy/mm/dd’)
 group by kno;
 37:–查询每个在2002年5月购买次数超过5次的所有客户号
select kno from fp having(count(*))>5 and fdate  between to_date
(‘2002/05/01′,’yyyy/mm/dd’) and to_date(‘2002/05/31′,’yyyy/dd/dd’)
  group by kno;

38:查询各办公室男性和女性业务员的平均工资
select ono,ysex,avg(salary) from ywy group by ono,ysex;

39:查询2002年5月曾经在王海亮业务员手中购买过商品的客户号、客户姓名和联系电话;
select yno from ywy where yname=’wanghailiang’;
select distinct kno from fp where yno=(select yno from ywy where
yname=’wanghailiang’)
 and fdate between to_date(‘2002/05/01′,’yyyy/mm/dd’) and
 to_date(‘2002/05/31′,’yyyy/mm/dd’);

select kno,kname,phone from kh where kno in (上方+);

40:查询所有工资比1538高的业务员编号、姓名、工资;
select salary from ywy where yno=1538;
select yno,yname,salary from ywy where salary > (上);

41:查询所有与1538号业务员在同一个办公室的其他业务员的编号和姓名;
42:查询销售金额最高的业务员的编号;
select yno from ywy from yno =(select yno from fp having(fmoney)>=
all(select sum(fmoney)) group by yno);

43:查询所有业务员的编号、姓名、工资及工资比他高的其它业务员的平均工资;
select a.yno,a.yname,a.salary,avg(b.salary) from ywy a join ywy b
 on (a.yno=b.yno) where a.salary<b.salary group by
a.ynoa.yname,a.salary
;

——————以下开始练习子查询、exists用法——————–
44:
已知关系模式:
S(sno,sname,sex,sage,sdept);
学号、姓名、性别、出生日期
sc(sno,cno,grade)
学号、课程编号、成绩
c(cno,cname,teacher)
课程编号、课程名称、教师

44:查询选修了数据库课程的学生学号和姓名;
select sno,sname from s where sno in(select sno from sc
 where cno=(select cno from c where cname=’SHUJUKU’));

=使用exists;
select sno,sname from s where exists(select * from sc where
sc.sno=s.sno
 and exists(select * from c where c.cno=sc.cno and
c.cname=’SHUJUKU’));

45:查询没有选修数据库课程的学生学号和姓名:

select sno,sname from s where sno not in(select sno from sc
 where cno=(select cno from c where cname=’SHUJUKU’));

=使用exists;
select sno,sname from s where not exists(select * from sc where
sc.sno=s.sno
 and exists(select * from c where c.cno=sc.cno and
c.cname=’SHUJUKU’));

46:查询只选修了数据库课程的学生学号和姓名;
select sno,sname from s where sno not in(sno from sc where cno not in(
select cno from c where cname=’SHUJUKU’));
–找出数据库的课程编号,选取除了数据库之外的所有课程编号;
–找出选取了除数据库之外的任一课程的学生学号
–排除这些选取了任一课程的学生学号,剩下的唯一+空值;
–需要cno课程编号Not null;

–EXISTS

select sno,sname from s where not exists(
select * from sc where sc.sno=s.sno and not exists(
select * from c where cname=’SHUJUKU’ and c.cname=sc.cno))

47:查询选修了全部课程,而且每门课程都在80分以上的学生学号+姓名;

选择了全部课程的学号,
select sno from sc having(count(*))=(select count(distinct cno) from
c)

insert into student values(‘200004′,’赵四’);

 group by sno;

select sno from sc having(min(grade))>80 group by sno;

select department_id from employees having(min(salary))>2000 group
by department_id;
select department_id from employees having(count(*))=5 group by

commit;

department_id;

select sno,sname from s where sno in
(select sno from sc having(count(*))=(select count(distinct cno) from
c)
 group by sno 
 intersect
 select sno from sc having(min(grade))>80 group by sno);
OK

–测试

SQL> select * from student;

ID     NAME


200001 张一

200002 王二

200003 李三

200004 赵四

 

⑴ rownum 对于等于某值的查询条件

如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断时认为都是false条件,所以无法查到rownum
= n(n>1的自然数)。

SQL> select rownum,id,name from student where rownum=1;

    ROWNUM ID     NAME


         1 200001 张一

 

SQL> select rownum,id,name from student where rownum =2;

未选定行

 

⑵ rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle
认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

SQL> select rownum,id,name from student where rownum >2;

未选定行

 

那如何才能找到第二行以后的记录呢?可以使用子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>select * from(select rownum no ,id,name from student) where
no>2;

        NO ID     NAME


         3 200003 李三

         4 200004 赵四

 

SQL> select * from(select rownum,id,name from student)where
rownum>2;

未选定行

 

⑶ rownum对于小于某值的查询条件

如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。

SQL> select rownum,id,name from student where rownum <3;

    ROWNUM ID     NAME



1 200001 张一

               2 200002 王二

 

综上几种情况,可能有时候需要查询rownum在某区间的数据,可以看出rownum对小于某值的查询条件是为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们可以写以下语句,先让它返回小于等于3的记录行,然后在主查询中判断新的rownum的别名列大于等于2的记录行。但是这样的操作会在大数据集中影响速度。

SQL> select * from (select rownum no,id,name from student where
rownum<=3 ) where no >=2;

        NO ID     NAME


         2 200002 王二

         3 200003 李三

 

⑷ rownum和排序

Oracle中的rownum是在取数据的时候产生的序号,所以想对指定排序的数据指定rowmun行数据就必须注意了。

SQL> select rownum ,id,name from student order by name;

    ROWNUM ID     NAME


         3 200003 李三

         2 200002 王二

         1 200001 张一

         4 200004 赵四

 

可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询

SQL> select rownum ,id,name from (select * from student order by
name);

    ROWNUM ID     NAME


         1 200003 李三

         2 200002 王二

         3 200001 张一

         4 200004 赵四

 

这样就成了按name排序,并且用rownum标出正确序号(由小到大)。order by
name 如果name是主键或有索引 ,查询出来的rownum完全按照1,2,3…..的次序。

SQL> alter table student add constraint pk_stu primary key(name);

SQL> select rownum ,id,name from student order by name;

ROWNUM ID NAME


1 200003 李三

2 200002 王二

3 200001 张一

4 200004 赵四

 

 

2. ROWID的使用——快速删除重复的记录

ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。

ROWID可以分为物理rowid和逻辑rowid两种。普通的表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。

当表中有大量重复数据时,可以使用ROWID快速删除重复的记录。

举例:

–建表tbl

SQL> create table stu(no number,name varchar2(10),sex char(2));

–添加测试记录

SQL> insert into stu values(1, ‘ab’,’男’);

SQL> insert into stu values(1, ‘bb’,’女’);

SQL> insert into stu values(1, ‘ab’,’男’);

SQL> insert into stu values(1, ‘ab’,’男’);

       SQL>commit;

 

删除重复记录方法很多,列出两种。

⑴ 通过创建临时表

可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:

SQL>create table stu_tmp as select distinct* from stu;

SQL>truncate table
sut;                                                   //清空表记录

SQL>insert into stu select * from stu_tmp;                       
//将临时表中的数据添加回原表

 

这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

 

⑵ 利用rowid结合max或min函数

使用rowid快速唯一确定重复行结合max或min函数来实现删除重复行。

SQL>delete from stu a where rowid not in (select max(b.rowid) from
stu b where a.no=b.no and a.name = b.name and a.sex =
b.sex);                                          //这里max使用min也可以

或者用下面的语句

SQL>delete from stu a where rowid < (select max(b.rowid) from stu
b where a.no=b.no and a.name = b.name and a.sex = b.sex);      
//这里如果把max换成min的话,前面的where子句中需要把”<“改为”>”

 

跟上面的方法思路基本是一样的,不过使用了group
by,减少了显性的比较条件,提高效率。

SQL>delete from stu where rowid not in (select max(rowid) from stu t
group by t.no, t.name, t.sex );

 

delete from stu where rowid=(select rowid from stu where rowid != 1);

思考:若在stu表中唯一确定任意一行数据(1,
‘ab’,’男’),把sex字段更新为”女”,怎么做?

       SQL>update stu set sex=’女’ where rowid=(select min(rowid)
from stu where no=1 and name=’ab’ and sex=’男’);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图