??xml version="1.0" encoding="utf-8" standalone="yes"?>
而oracle没有引擎的概念,oracle有OLTP和OLAP模式的区分,两者的差别不大Q只有参数设|上的不同?br />oracle无论哪种模式都是支持事务概念的,oracle是一个不允许读脏的数据库pȝ?br />
当今的数据处理大致可以分成两大类Q联Z务处理OLTPQon-line transaction processingQ、联机分析处理OLAPQOn-Line Analytical ProcessingQ。OLTP是传l的关系型数据库的主要应用,主要是基本的、日常的事务处理Q例如银行交易。OLAP是数据仓库系l的主要应用Q支持复杂的分析操作Q侧重决{支持,q且提供直观易懂的查询结?
OLTP:
也称为面向交易的处理pȝQ其基本特征是顾客的原始数据可以立即传送到计算中心q行处理Qƈ在很短的旉内给出处理结果?/span>
q样做的最大优Ҏ可以x地处理输入的数据Q及时地回答。也UCؓ实时pȝ(Real time System)。衡量联Z务处理系l的一个重要性能指标是系l性能Q具体体Cؓ实时响应旉(Response Time)Q即用户在终端上送入数据之后Q到计算机对q个hl出{复所需要的旉。OLTP是由数据库引擎负责完成的?/span>
OLTP 数据库旨在事务应用E序仅写入所需的数据,以便快处理单个事务?/span>
OLAP:
写ؓOLAP,随着数据库技术的发展和应用,数据库存储的数据量从20世纪80q代的兆QMQ字节及千兆QGQ字节过渡到现在的兆兆(TQ字节和千兆兆(PQ字节,同时Q用L查询需求也来复杂,涉及的已不仅是查询或操纵一张关p表中的一条或几条记录Q而且要对多张表中千万条记录的数据q行数据分析和信息综合,关系数据库系l已不能全部满q一要求。在国外Q不Y件厂商采取了发展其前端品来弥补关系数据库管理系l支持的不Q力囄一分散的公共应用逻辑Q在短时间内响应非数据处理专业h员的复杂查询要求?/span>
联机分析处理QOLAPQ系l是数据仓库pȝ最主要的应用,专门设计用于支持复杂的分析操作,侧重对决{h员和高层理人员的决{支持,可以Ҏ分析人员的要求快速、灵zdq行大数据量的复杂查询处理,q且以一U直观而易懂的形式查询结果提供给决策人员Q以便他们准掌握企业(公司Q的l营状况Q了解对象的需求,制定正确的方案?/span>
]]>
A.丢失更新Q撤销一个事务时Q把其他事务已提交的更新数据覆盖Q?/span>A?/span>B事务q发执行Q?/span>A事务执行更新后,提交Q?/span>B事务?/span>A事务更新后,B事务l束前也做了对该行数据的更新操作Q然后回滚,则两ơ更新操作都丢失了)?/span>
B.脏读Q一个事务读到另一个事务未提交的更新数据(A?/span>B事务q发执行Q?/span>B事务执行更新后,A事务查询B事务没有提交的数据,B事务回滚Q则A事务得到的数据不是数据库中的真实数据。也是脏数据,卛_数据库中不一致的数据Q?/span>
C.不可重复读:一个事务读到另一个事务已提交的更新数据(A?/span>B事务q发执行Q?/span>A事务查询数据Q然?/span>B事务更新该数据,A再次查询该数据时Q发现该数据变化了)?/span>
D. 覆盖更新Q这是不可重复读中的特例Q一个事务覆盖另一个事务已提交的更新数据(?/span>A事务更新数据Q然?/span>B事务更新该数据,A事务查询发现自己更新的数据变了)?/span>
E.虚读Q?/span>q读Q:一个事务读到另一个事务已提交的新插入的数据(A?/span>B事务q发执行Q?/span>A事务查询数据Q?/span>B事务插入或者删除数据,A事务再次查询发现l果集中有以前没有的数据或者以前有的数据消׃Q?/span>
数据库系l提供了四种事务隔离U别供用户选择Q?/span>
A.SerializableQ串行化Q:一个事务在执行q程中完全看不到其他事务Ҏ据库所做的更新Q事务执行的时候不允许别的事务q发执行。事务串行化执行Q事务只能一个接着一个地执行Q而不能ƈ发执行。)?/span>
B.Repeatable ReadQ可重复读)Q一个事务在执行q程中可以看到其他事务已l提交的新插入的记录Q但是不能看到其他其他事务对已有记录的更新?/span>
C.Read CommitedQ读已提交数据)Q一个事务在执行q程中可以看到其他事务已l提交的新插入的记录Q而且能看到其他事务已l提交的对已有记录的更新?/span>
D.Read UncommittedQ读未提交数据)Q一个事务在执行q程中可以看到其他事务没有提交的新插入的记录Q而且能看到其他事务没有提交的对已有记录的更新?/span>
| 丢失更新 | 脏读 | 非重复读 | 覆盖更新 | qd?/span> |
未提交读 | Y | Y | Y | Y | Y |
已提交读 | N | N | Y | Y | Y |
可重复读 | N | N | N | N | Y |
串行?/span> | N | N | N | N | N |
隔离U别
数据库系l有四个隔离U别Q大多数数据库默认别ؓread commitedQ。对数据库用何U隔ȝ别要审慎分析Q因?/span>
1. l护一个最高的隔离U别虽然会防止数据的出错Q但是却D了ƈ行度的损失,以及D死锁出现的可能性增加?/span>
2. 然而,降低隔离U别Q却会引起一些难以发现的bug?/span>
SERIALIZABLEQ序列化Q?/span>
d范围锁(比如表锁Q页锁等Q关于range lockQ我也没有很深入的研IӞQ直到transaction Al束。以此阻止其它transaction BҎ范围内的insertQupdate{操作?/span>
q读Q脏读,不可重复ȝ问题都不会发生?/span>
REPEATABLE READQ可重复读)
对于d的记录,d׃n锁直到transaction Al束。其它transaction B对这个记录的试图修改会一直等待直到transaction Al束?/span>
可能发生的问题:当执行一个范围查询时Q可能会发生q读?/span>
READ COMMITTEDQ提交读Q?/span>
在transaction A中读取数据时对记录添加共享锁Q但dl束立即释放。其它transaction B对这个记录的试图修改会一直等待直到A中的dq程l束Q而不需要整个transaction A的结束。所以,在transaction A的不同阶D对同一记录的读取结果可能是不同的?/span>
可能发生的问题:不可重复诅R?/span>
READ UNCOMMITTED(未提交读)
不添加共享锁。所以其它transaction B可以在transaction A对记录的dq程中修改同一记录Q可能会DAd的数据是一个被破坏的或者说不完整不正确的数据?/span>
另外Q在transaction A中可以读取到transaction BQ未提交Q中修改的数据。比如transaction B对R记录修改了,但未提交。此Ӟ在transaction A中读取R记录Q读出的是被B修改q的数据?/span>
可能发生的问题:脏读?/span>
问题
我们看到Q当执行不同的隔ȝ别时Q可能会发生各种各样不同的问题。下面对它们q行ȝqD例说明?/span>
q读
q读发生在当两个完全相同的查询执行时Q第二次查询所q回的结果集跟第一个查询不相同?/span>
发生的情况:没有范围锁?/span>
例子Q?/span>
事务1 | 事务2 |
SELECT * FROM users WHERE age BETWEEN 10 AND 30 | |
INSERT INTO users VALUES ( 3 , 'Bob' , 27 ); | |
SELECT * FROM users WHERE age BETWEEN 10 AND 30; |
如何避免Q实行序列化隔离模式Q在M一个低U别的隔M都可能会发生?/span>
不可重复?/span>
在基于锁的ƈ行控制方法中Q如果在执行select时不d读锁Q就会发生不可重复读问题?/span>
在多版本q行控制机制中,当一个遇到提交冲H的事务需要回退但却被释放时Q会发生不可重复读问题?/span>
事务1 | 事务2 |
SELECT * FROM users WHERE id = 1; | |
UPDATE users SET age = 21 WHERE id = 1 ; COMMIT; /* in multiversion concurrency*/ control, or lock-based READ COMMITTED * | |
SELECT * FROM users WHERE id = 1; | |
COMMIT; /* lock-based REPEATABLE READ */ |
在上面这个例子中Q事?提交成功Q它所做的修改已经可见。然而,事务1已经d了一个其它的倹{在序列化和可重复读的隔ȝ别中Q数据库理pȝ会返回旧|卛_被事?修改之前的倹{在提交d未提交读隔离U别下,可能会返回被更新的|q就?#8220;不可重复?#8221;?/span>
有两个策略可以防止这个问题的发生Q?/span>
1. 推迟事务2的执行,直至事务1提交或者回退。这U策略在使用锁时应用?悲观锁机Ӟ比如用select for update为数据行加上一个排他锁)
2. 而在多版本ƈ行控制中Q事?可以被先提交。而事?Ql执行在旧版本的数据上。当事务1l于试提交Ӟ数据库会验它的结果是否和事务1、事?序执行时一栗如果是Q则事务1提交成功。如果不是,事务1会被回退。(乐观锁机Ӟ
脏读
脏读发生在一个事务Ad了被另一个事务B修改Q但是还未提交的数据。假如B回退Q则事务Ad的是无效的数据。这跟不可重复读cMQ但是第二个事务不需要执行提交?nbsp;
事务1 | 事务2 |
SELECT * FROM users WHERE id = 1Q?/span> | |
UPDATE users SET age = 21 WHERE id = 1 | |
SELECT FROM users WHERE id = 1Q?/span> | |
COMMIT; /* lock-based DIRTY READ */ |
q是最高层ơisolation levelQ这个层ơ的isolation实现了串行化的效果,卻I几个Transcation在执行时Q其执行效果和某个串行序执行q几个Transaction的效果是一L。用Serializable层次的事务,其中的查询语句在每次都必d同样的数据上执行Q从而防止了phantom readQ其实现机制是range lock。与下一个层ơ的不同之处在于range lock?/p>在基于锁的DBMS中,Serializable直到事务l束才释放select数据集上的读、写锁。而且select查询语句必须首先获得range-locks才能执行。在非锁q行的DBMS中,pȝ每当到write collisionӞ一ơ只有一个write能被写入?/span>
Range lock记录Serializable Transaction所d的keyD_L其他在这个keyD围内的记录被插入到表中。Range lock位于Index上,记录一个v始Index和一个终止Index。在Range lock锁定的Index范围内,MUpdate、Insert和Delete操作都是被禁止的Q从而保证了Serializable中的操作每次都在同样的数据集上进行?/p>
id | name | age |
---|---|---|
1 | Joe | 20 |
2 | Jill | 25 |
事务T1在读取事务T2已经修改、但T2q未提交的数据时会发生Dirty Read。这个Isolation Level唯一能保证的是Update操作按顺序执行,即事务中前面的update一定比后面的update先执行?/p>
下面的这个例子是一个典型的Dirty Read
Transaction 1 | Transaction 2 |
---|---|
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 20 */ | |
/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; /* No commit here */ | |
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 21 */ | |
ROLLBACK; /* lock-based DIRTY READ */ |
在一个事务T1中,如果对同一条记录读取两ơ而g一P那么发生了Non-repeatable read?/p>
在基于锁的DBMS中,Non-repeatable read可能在未获得read lock时进行select操作Q或在select操作刚结束就释放read lock时发生。在多版本ƈ行控制的DBMS中,non-repeatable read可能在违?#8220;受commit conflict影响的事务必d?#8220;的原则时发生?br />
Transaction 1 | Transaction 2 |
---|---|
/* Query 1 */ SELECT * FROM users WHERE id = 1; | |
/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency control, or lock-based READ COMMITTED */ | |
/* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT; /* lock-based REPEATABLE READ */ |
有两U方式来防止non-repeatable read。第一U方式用锁T1和T2串行。另外一U方式是在多版本q行控制的DBMS中用的。在q里QT2可以提交Q而先于T2启动的T1则在自己的SnapshotQ快照)里l执行,在T1提交Ӟpȝ会检查其l果是否与T1、T2序执行的l果一P如果一P则T1提交Q否则T1必须回滚q生成一个serialization failure?br />
Phantom read是指在一个事务中Q执行两个或多个同样的查询返回的l果集却不相同的现象。这U现象发生在没获得range lock卌行select... where....操作Ӟ解决Ҏ是用range lock?br />
Transaction 1 | Transaction 2 |
---|---|
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30; | |
/* Query 2 */ INSERT INTO users VALUES ( 3, 'Bob', 27 ); COMMIT; | |
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30; |
参考:
http://msdn.microsoft.com/en-us/library/ms191272.aspx
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
sql 单表/多表查询去除重复记录
单表distinct
多表group by
group by 必须攑֜ order by ?limit之前Q不然会报错
************************************************************************************
1、查找表中多余的重复记录Q重复记录是Ҏ单个字段QpeopleIdQ来判断
select * from people
where peopleId in (select
2、删除表中多余的重复记录Q重复记录是Ҏ单个字段QpeopleIdQ来判断Q只留有rowid最的记录
delete from people
where peopleId
and rowid not in (select min(rowid) from
3、查找表中多余的重复记录Q多个字D)
select * from vitae a
where (a.peopleId,a.seq) in
4、删除表中多余的重复记录Q多个字D)Q只留有rowid最的记录
delete from vitae a
where (a.peopleId,a.seq) in
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
5、查找表中多余的重复记录Q多个字D)Q不包含rowid最的记录
select * from vitae a
where (a.peopleId,a.seq) in
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
(?
比方?br />在A表中存在一个字D?#8220;name”Q?br />而且不同记录之间?#8220;name”值有可能会相同,
现在是需要查询出在该表中的各记录之间Q?#8220;name”值存在重复的;
Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果q查性别也相同大则如?
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1
(?
Ҏ一
declare @max integer,@id integer
declare cur_rows cursor local for select dD?count(*) from 表名 group by dD?having count(*) >Q?1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where dD?= @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
Ҏ?/p>
Q重复记录"有两个意义上的重复记录,一是完全重复的记录Q也x有字D均重复的记录,二是部分关键字段重复的记录,比如Name字段重复Q而其他字D不一定重复或都重复可以忽略?/p>
1、对于第一U重复,比较Ҏ解决Q?/p>
select distinct * from tableName
可以得到无重复记录的结果集?/p>
如果该表需要删除重复的记录Q重复记录保?条)Q可以按以下Ҏ删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生q种重复的原因是表设计不周生的Q增加唯一索引列即可解冟?/p>
2、这c重复问题通常要求保留重复记录中的W一条记录,操作Ҏ如下
假设有重复的字段为Name,AddressQ要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select卛_CNameQAddress不重复的l果集(但多了一个autoID字段Q实际写时可以写在select子句中省L列)
(?
查询重复
select * from tablename where id in (select id from tablename
group by id
having count(id) > 1
)
3、查找表中多余的重复记录Q多个字D)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
q行会生问题,where(a.peopleId,a.seq)q样的写发是通不q的Q!Q?/p>
create table dept
(
deptno varchar(10) primary key,
dname varchar(10)
);
create table emp
(
empno varchar(10) primary key,
ename varchar(10),
job varchar(10),
mgr varchar(10),
sal varchar(10),
deptno varchar(10) references dept(deptno)
);
drop table dept;
drop table emp;
insert into dept values ('1','事业?);
insert into dept values ('2','销售部');
insert into dept values ('3','技术部');
insert into emp values ('01','jacky','clerk','tom','1000','1');
insert into emp values ('02','tom','clerk','','2000','1');
insert into emp values ('07','biddy','clerk','','2000','1');
insert into emp values ('03','jenny','sales','pretty','600','2');
insert into emp values ('04','pretty','sales','','800','2');
insert into emp values ('05','buddy','jishu','canndy','1000','3');
insert into emp values ('06','canndy','jishu','','1500','3');
select * from dept;
select * from emp;
1.列出emp表中各部门的部门P最高工资,最低工?/p>
select e.deptno ,max(sal) ,min(sal) from emp as e group by e.deptno;
解析Q?span style="color: rgb(255,0,0)">各部?/span> 提示Q分l查询,所以用group by
2 列出emp表中各部门job?CLERK'的员工的最低工资,最高工?br /> select e.deptno ,max(sal) ,min(sal) from emp as e where e.job="CLERK" group by e.deptno;
解析Q?span style="color: rgb(255,0,0)">各部?/span> 提示Q分l查询, job提示Q条件查询,所以用?group by ?where
3 对于emp中最低工资小?000的部门,列出job?CLERK'的员工的部门P最低工资,最高工?/p>
select b.deptno ,max(sal) ,min(sal) from emp as b where b.job="CLERK"
and (select min(sal) from emp as a where a.deptno=b.deptno)<2000 group by b.deptno;
解析Q以上面两个题ؓ基础Q?#8220;emp中最低工资小?000的部?/span>”只是一个条件而已?/p>
4 据部门号由高而低Q工资有低而高列出每个员工的姓名,部门P工资 select * from emp as b order by b.deptno desc ,b.sal asc; 解析Q?#8220;部门L高而低Q工资有?/span>”提示Q需要排序,所以用?order by ?desc asc 5 列出'buddy'所在部门中每个员工的姓名与部门?/p>
select * from emp as b where b.deptno=(select a.deptno from emp as a where a.ename="buddy"); 解析Q?#8220;'buddy'所在部?#8221;提示扑և他所在的部门P所以可以理?#8220;扑և所有和buddy在同一部门的所有h” 6 列出每个员工的姓名,工作Q部门号Q部门名 select ename,job,dept.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno; 7 列出emp中工作ؓ'CLERK'的员工的姓名Q工作,部门P部门?/p>
select ename,job,dept.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno where job="CLERK"; 8 对于emp中有理者的员工Q列出姓名,理者姓名(理者外键ؓmgrQ?/p>
select a.deptno,a.ename ,b.ename from emp as a,emp as b where a.mgr is not null and a.mgr=b.ename; 解析Q本句可以理?#8220;一个员工他也是领导Q所以emp.ename,emp.mgr 都有值ƈ且有相等的员?#8221; 9 对于dept表中Q列出所有部门名Q部门号Q同时列出各部门工作?CLERK'的员工名与工?/p>
select a.deptno ,a.dname, b.ename ,b.job from dept as a,emp as b where a.deptno=b.deptno and b.job="clerk"; 解析Q连表即?br /> Q?/p>
http://blog.csdn.net/shiyuntian_wang/article/details/4636799DEPARTMENTS: DEPARTMENT_ID(primary key), DEPARTMENT_NAME, LOCATION
EMPLOYEES: EMPLOYEE_ID(primary key), EMPLOYEE_NAME, EMPLOYEE_JOB, MANAGER, SALARY, DEPARTMENT_ID
http://blog.sina.com.cn/s/blog_4979ec3e0100r574.htmlselect max(SALARY) as 最高工?min(SALARY) as 最低工?DEPARTMENT_ID from EMPLOYEES group by DEPARTMENT_ID;
select max(SALARY) as 最高工?min(SALARY) as 最低工?DEPARTMENT_ID as 部门?from EMPLOYEES where EMPLOYEE_JOB = 'CLERK' group by DEPARTMENT_ID;
select max(SALARY) as 最高工?min(SALARY) as 最低工?DEPARTMENT_ID as 部门?from EMPLOYEES as b where EMPLOYEE_JOB ='CLERK' and 1000>(select min(SALARY) from EMPLOYEES as a where a.DEPARTMENT_ID = b.DEPARTMENT_ID) group by b.DEPARTMENT_ID
select DEPARTMENT_ID as 部门?EMPLOYEE_NAME as 姓名,SALARY as 工资 from EMPLOYEES order by DEPARTMENT_ID desc,SALARY asc
select EMPLOYEE_NAME,DEPARTMENT_ID from EMPLOYEES where DEPARTMENT_ID = (select DEPARTMENT_ID from EMPLOYEES where EMPLOYEE_NAME = '张三')
select EMPLOYEE_NAME,EMPLOYEE_JOB,EMPLOYEES.DEPARTMENT_ID,DEPARTMENTS.DEPARTMENT_NAME from EMPLOYEES,DEPARTMENTS where EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
select EMPLOYEE_NAME,EMPLOYEE_JOB,DEPARTMENTS.DEPARTMENT_ID,DEPARTMENT_NAME from EMPLOYEES,DEPARTMENTS where DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID and DEPARTMENT_JOB = 'CLERK'
select a.EMPLOYEE_NAME as 姓名,b.EMPLOYEE_NAME as 理?from EMPLOYEES as a,EMPLOYEES as b where a.MANAGER is not null and a.MANAGER = b.EMPLOYEE_ID
select DEPARTMENT_NAME as 部门?DEPARTMENTS.DEPARTMENT_ID as 部门?EMPLOYEE_NAME as 员工?EMPLOYEE_JOB as 工作 from DEPARTMENTS,EMPLOYEES where DEPARTMENTS.DEPARTMENT_ID *= EMPLOYEES.DEPARTMENT_ID and EMPLOYEE_JOB = 'CLERK'
select a.DEPARTMENT_ID as 部门?a.EMPLOYEE_NAME as 姓名,a.SALARY as 工资 from EMPLOYEES as a where a.SALARY>(select avg(SALARY) from EMPLOYEES as b where a.DEPARTMENT_ID = b.DEPARTMENT_ID) order by a.DEPARTMENT_ID
select count(a.SALARY) as 员工?a.DEPARTMENT_ID as 部门?from EMPLOYEES as a where a.SALARY>(select avg(SALARY) from EMPLOYEES as b where a.DEPARTMENT_ID = b.DEPARTMENT_ID) group by a.DEPARTMENT_ID order by a.DEPARTMENT_ID
select count(a.EMPLOYEE_ID) as 员工?a.DEPARTMENT_ID as 部门?avg(SALARY) as q_工资 from EMPLOYEES as a where (select count(c.EMPLOYEE_ID) from EMPLOYEES as c where c.DEPARTMENT_ID = a.DEPARTMENT_ID and c.SALARY>(select avg(SALARY) from EMPLOYEES as b where c.DEPARTMENT_ID = b.DEPARTMENT_ID))>1 group by a.DEPARTMENT_ID order by a.DEPARTMENT_ID
select a.DEPARTMENT_ID,a.EMPLOYEE_NAME,a.SALARY,(select count(b.EMPLOYEE_NAME) from EMPLOYEES as b where b.SALARY < a.SALARY) as 人数 from EMPLOYEES as a where (select count(b.EMPLOYEE_NAME) from EMPLOYEES as b where b.SALARY<a.SALARY)>5
先创Z个表Q?/p>
好了Q准备工作做完了Q下面我们来写两条Sql语句Q解军_始提出的那两个问?/p>
A、统计学生的成W
select name,SUM(Score)Score from Score group by Name
B、删除表中重复的记录Q因表中的name是有重复的,所以我们就直接用这表来test
delete from Score where Name in(select Name from Score group by Name having COUNT(name)>0)and IDnot in (select MIN(id) from Score group by Name having COUNT(Name)>0)
Student(S#,Sname,Sage,Ssex) 学生?br /> Course(C#,Cname,T#) 评?br /> SC(S#,C#,score) 成W?br /> Teacher(T#,Tname) 教师?
问题Q?br /> 1、查?#8220;001”评?#8220;002”评成W高的所有学生的学号Q?br /> select a.S#
from (select s#,score from SC where C#=’001′) a,
(select s#,score from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#;
2、查询^均成l大?0分的同学的学号和q_成WQ?br /> select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、Ll;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“?#8221;的老师的个敎ͼ
select count(distinct(Tname))
from Teacher
where Tname like ‘?’;
5、查询没学过“叶^”老师评同学的学受姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶^’);
6、查询学q?#8220;001”q且也学q编?#8220;002”评的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);
7、查询学q?#8220;叶^”老师所教的所有课的同学的学号、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶^’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’叶^’));
8、查询所有课E成l小?0分的同学的学受姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
9、查询没有学全所有课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S#
group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
10、查询至有一门课与学号ؓ“1001”的同学所学相同的同学的学号和姓名Q?br /> select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in Qselect C# from SC where S#='1001'Q?
11、删除学?#8220;叶^”老师评SC表记录;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶^';
12、查询各U成l最高和最低的分:以如下Ş式显C:评IDQ最高分Q最低分
SELECT L.C# 评ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# );
13、查询学生^均成l及其名?br /> SELECT 1+(SELECT COUNT( distinct q_成W)
FROM (SELECT S#,AVG(score) q_成W
FROM SC
GROUP BY S# ) T1
WHERE q_成W > T2.q_成W) 名次, S# 学生学号,q_成W
FROM (SELECT S#,AVG(score) q_成W FROM SC GROUP BY S# ) T2
ORDER BY q_成W desc;
14、查询各U成l前三名的记?(不考虑成Wq列情况)
SELECT t1.S# as 学生ID,t1.C# as 评ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#;
15、查询每门功成W最好的前两?br /> SELECT t1.S# as 学生ID,t1.C# as 评ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;
补充Q?br /> 已经知道原表
year salary
——————
2000 1000
2001 2000
2002 3000
2003 4000
解:
select b.year,sum(a.salary)
from salary a,salary b
where a.year<=b.year
group by b.year
order by b.year;
在面试过E中多次到一道SQL查询的题目,查询A(ID,Name)表中W?1?0条记录,ID作ؓ主键可能是不是连l增长的列,完整的查询语句如下:
Ҏ一Q?br /> select top 10 *
from A
where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID
Ҏ二:
select top 10 *
from A
where ID not In (select top 30 ID from A order by ID)
order by ID