??xml version="1.0" encoding="utf-8" standalone="yes"?>国产高清精品在线,久久精品亚洲热,99热99re6国产在线播放http://www.aygfsteel.com/stevenjohn/category/51105.html那些青春的岁?/description>zh-cnWed, 14 Oct 2015 01:24:24 GMTWed, 14 Oct 2015 01:24:24 GMT60mysql oraclehttp://www.aygfsteel.com/stevenjohn/archive/2015/10/11/427690.htmlabinabinSun, 11 Oct 2015 14:05:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/10/11/427690.htmlhttp://www.aygfsteel.com/stevenjohn/comments/427690.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/10/11/427690.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/427690.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/427690.htmlmysql?nbsp;innoDB 引擎支持事务的概念,多用于web|站后台{实时的中小型事务处理后台?br />
而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>

abin 2015-10-11 22:05 发表评论
]]>
事务q发、事务隔ȝ?http://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422617.htmlabinabinSat, 31 Jan 2015 10:20:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422617.htmlhttp://www.aygfsteel.com/stevenjohn/comments/422617.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422617.html#Feedback1http://www.aygfsteel.com/stevenjohn/comments/commentRss/422617.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/422617.htmlq发问题可归Uؓ以下几类:

 

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.Serializable
Q串行化Q:一个事务在执行q程中完全看不到其他事务Ҏ据库所做的更新Q事务执行的时候不允许别的事务q发执行。事务串行化执行Q事务只能一个接着一个地执行Q而不能ƈ发执行。)?/span>

B.Repeatable Read
Q可重复读)Q一个事务在执行q程中可以看到其他事务已l提交的新插入的记录Q但是不能看到其他其他事务对已有记录的更新?/span>

C.Read Commited
Q读已提交数据)Q一个事务在执行q程中可以看到其他事务已l提交的新插入的记录Q而且能看到其他事务已l提交的对已有记录的更新?/span>

D.Read Uncommitted
Q读未提交数据)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 ); 
COMMIT;
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 */ 


abin 2015-01-31 18:20 发表评论
]]>
isolation levelhttp://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422616.htmlabinabinSat, 31 Jan 2015 10:15:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422616.htmlhttp://www.aygfsteel.com/stevenjohn/comments/422616.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/01/31/422616.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/422616.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/422616.htmlANSI/ISO  SQL的四个isolation level

SERIALIZABLE

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

Range lock记录Serializable Transaction所d的keyD_L其他在这个keyD围内的记录被插入到表中。Range lock位于Index上,记录一个v始Index和一个终止Index。在Range lock锁定的Index范围内,MUpdate、Insert和Delete操作都是被禁止的Q从而保证了Serializable中的操作每次都在同样的数据集上进行?/p>

REPEATABLE READS

在基于锁的DBMS中,Repeatable Reads直到事务l束才释放select数据集上的读、写锁。但不会使用range lockQ因此会产生Phantom Read?/span>

READ COMMITTED

在基于锁的DBMS中,Read Committed直到事务l束才释放select数据集上的写锁,但读锁会在一个select完成后才被释放。和Repeatable Read一PRead Committed不用range lockQ会产生Phantom read和Unrepeatable read。(注:q段主要参考wikipediaQ我也搜索过Read CommittedQ基本都采用了这U说法。但我有一个疑问,既然write锁直C务提交才释放Q那么在q个阶段是不会发生update操作的,在一个事务中的多个读应该也不会生不同的l果才对。望知之者指点一二,弟不胜感激。)

READ UNCOMMITTED

q是Isolation Level的最底层Q不仅会产生Phantom Read、Unrepeatable ReadQ还会有Dirty Read的风险?/span>

Read phenomena

SQL 92标准事务T1dT2的操作分ZU,Phantom Read、Unrepeatable Read和Dirty Read         Users
idnameage
1Joe20
2Jill25

Dirty reads (Uncommitted Dependency)

事务T1在读取事务T2已经修改、但T2q未提交的数据时会发生Dirty Read。这个Isolation Level唯一能保证的是Update操作按顺序执行,即事务中前面的update一定比后面的update先执行?/p>

下面的这个例子是一个典型的Dirty Read

Transaction 1Transaction 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 */

Non-repeatable reads

在一个事务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 1Transaction 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 reads

Phantom read是指在一个事务中Q执行两个或多个同样的查询返回的l果集却不相同的现象。这U现象发生在没获得range lock卌行select... where....操作Ӟ解决Ҏ是用range lock?br />

Transaction 1Transaction 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



abin 2015-01-31 18:15 发表评论
]]>
sql 解释执行计划http://www.aygfsteel.com/stevenjohn/archive/2013/12/28/408142.htmlabinabinFri, 27 Dec 2013 17:40:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/12/28/408142.htmlhttp://www.aygfsteel.com/stevenjohn/comments/408142.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/12/28/408142.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/408142.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/408142.html//oracle解释执行计划
SQL> explain plan for select t.* from abin1 t where t.id<200;
 
Explained
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1270356885
---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |    98 |  1862 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| ABIN1 |    98 |  1862 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("T"."ID"<200)
 
13 rows selected
 
SQL> 


//mysql解释执行计划
explain select t.* from user_rest t where id<>8 

//oracle攉表的l计信息
analyze table abin1 compute statistics;



abin 2013-12-28 01:40 发表评论
]]>
SQL 注入查看表接?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2013/04/25/398384.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 25 Apr 2013 06:29:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2013/04/25/398384.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/398384.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2013/04/25/398384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/398384.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/398384.html</trackback:ping><description><![CDATA[<div>查看oracle表结构:<br />desc ABIN_LEE;<br />select * from user_tab_columns where table_name='ABIN_LEE';<br />select dbms_metadata.get_ddl('TABLE','ABIN_LEE') from dual;<br />select * from cols where table_name= 'ABIN_LEE';<br /><br /><br /><br /><br /><br /></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/398384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2013-04-25 14:29 <a href="http://www.aygfsteel.com/stevenjohn/archive/2013/04/25/398384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库连接池参数http://www.aygfsteel.com/stevenjohn/archive/2013/03/27/397039.htmlabinabinWed, 27 Mar 2013 02:32:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/03/27/397039.htmlhttp://www.aygfsteel.com/stevenjohn/comments/397039.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/03/27/397039.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/397039.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/397039.html
 数据库连接池在初始化的时候会创徏initialSize个连接,当有数据库操作时Q会从池中取Z个连接。如果当前池中正在用的q接数等于maxActiveQ则会等待一D|_{待其他操作释放掉某一个连接,如果q个{待旉过了maxWaitQ则会报错;如果当前正在使用的连接数没有辑ֈmaxActiveQ则判断当前是否I闲q接Q如果有则直接用空闲连接,如果没有则新建立一个连接。在q接使用完毕后,不是其物理q接关闭Q而是其攑օ池中{待其他操作复用?br />  对于一个数据库q接池,一般包括一下属性?br />  
  
  名称   说明   备注
minIdle 最活跃数 可以允许的空闲连接数?br />maxActive 最大连接数 相当于池的大?br />initialSize 初始化连接大?
maxWait 获取q接的最大等待时?
timeBetweenEvictionRunsMillis I闲q接的最大生存时?指定I闲q接在空闲多长时间后Q关闭其物理q接
testWhileIdle 是否在空闲时连接可用?׃|络或者数据库配置的原因(比如mysqlq接?时限制Q,开启这个开兛_以定期检连接的可用?br />


abin 2013-03-27 10:32 发表评论
]]>
sql去除重复语句http://www.aygfsteel.com/stevenjohn/archive/2012/11/21/391719.htmlabinabinWed, 21 Nov 2012 15:20:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/11/21/391719.htmlhttp://www.aygfsteel.com/stevenjohn/comments/391719.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/11/21/391719.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/391719.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/391719.html

sql 单表/多表查询去除重复记录

单表distinct

多表group by

group by 必须攑֜ order by ?limit之前Q不然会报错

************************************************************************************

1、查找表中多余的重复记录Q重复记录是Ҏ单个字段QpeopleIdQ来判断

select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录Q重复记录是Ҏ单个字段QpeopleIdQ来判断Q只留有rowid最的记录
delete from people
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>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)

4、删除表中多余的重复记录Q多个字D)Q只留有rowid最的记录
delete from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
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  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
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>

abin 2012-11-21 23:20 发表评论
]]>
一道关于员工与部门查询的SQLW试?http://www.aygfsteel.com/stevenjohn/archive/2012/07/18/383395.htmlabinabinWed, 18 Jul 2012 06:05:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/07/18/383395.htmlhttp://www.aygfsteel.com/stevenjohn/comments/383395.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/07/18/383395.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/383395.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/383395.html

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 />


http://blog.csdn.net/shiyuntian_wang/article/details/4636799





Q?/p>

DEPARTMENTS: DEPARTMENT_ID(primary key), DEPARTMENT_NAME, LOCATION
EMPLOYEES: EMPLOYEE_ID(primary key), EMPLOYEE_NAME, EMPLOYEE_JOB, MANAGER, SALARY, DEPARTMENT_ID
  1. 列出EMPLOYEES表中各部门的部门P最高工资,最低工?/li>
  2. select max(SALARY) as 最高工?min(SALARY) as 最低工?DEPARTMENT_ID from EMPLOYEES group by DEPARTMENT_ID;
  3. 列出EMPLOYEES表中各部门EMPLOYEE_JOB?CLERK'的员工的最低工资,最高工?/li>
  4. select max(SALARY) as 最高工?min(SALARY) as 最低工?DEPARTMENT_ID as 部门?from EMPLOYEES where EMPLOYEE_JOB = 'CLERK' group by DEPARTMENT_ID;
  5. 对于EMPLOYEES中最低工资小?000的部门,列出EMPLOYEE_JOB?CLERK'的员工的部门P最低工资,最高工?/li>
  6. 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
  7. Ҏ部门L高而低Q工资有低而高列出每个员工的姓名,部门P工资
  8. select DEPARTMENT_ID as 部门?EMPLOYEE_NAME as 姓名,SALARY as 工资 from EMPLOYEES order by DEPARTMENT_ID desc,SALARY asc
  9. 列出'张三'所在部门中每个员工的姓名与部门?/li>
  10. select EMPLOYEE_NAME,DEPARTMENT_ID from EMPLOYEES where DEPARTMENT_ID = (select DEPARTMENT_ID from EMPLOYEES where EMPLOYEE_NAME = '张三')
  11. 列出每个员工的姓名,工作Q部门号Q部门名
  12. select EMPLOYEE_NAME,EMPLOYEE_JOB,EMPLOYEES.DEPARTMENT_ID,DEPARTMENTS.DEPARTMENT_NAME from EMPLOYEES,DEPARTMENTS where EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
  13. 列出EMPLOYEES中工作ؓ'CLERK'的员工的姓名Q工作,部门P部门?/li>
  14. select EMPLOYEE_NAME,EMPLOYEE_JOB,DEPARTMENTS.DEPARTMENT_ID,DEPARTMENT_NAME from EMPLOYEES,DEPARTMENTS where DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID and DEPARTMENT_JOB = 'CLERK'
  15. 对于EMPLOYEES中有理者的员工Q列出姓名,理者姓名(理者外键ؓMANAGERQ?/li>
  16. 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
  17. 对于DEPARTMENTS表中Q列出所有部门名Q部门号Q同时列出各部门工作?CLERK'的员工名与工?/li>
  18. 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'
  19. 对于工资高于本部门^均水q的员工Q列出部门号Q姓名,工资Q按部门h?/li>
  20. 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
  21. 对于EMPLOYEESQ列出各个部门中q_工资高于本部门^均水q的员工数和部门P按部门号排序
  22. 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
  23. 对于EMPLOYEES中工资高于本部门q_水^Qh数多?人的Q列出部门号Qh敎ͼ按部门号排序
  24. 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
  25. 对于EMPLOYEES中低于自己工资至?人的员工Q列出其部门P姓名Q工资,以及工资于自己的h?/li>
  26. 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

http://blog.sina.com.cn/s/blog_4979ec3e0100r574.html



abin 2012-07-18 14:05 发表评论
]]>
sql 常见面试题一http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382513.htmlabinabinSun, 08 Jul 2012 02:39:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382513.htmlhttp://www.aygfsteel.com/stevenjohn/comments/382513.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382513.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/382513.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/382513.html l常会看到这LSQL面试题,L一条SQL语句l计出学生的LLl,L一条sql语句删除表中重复的内容,但第一条保留。最q得Ԍp着写了q么个demoQ今天来q和大家分n下,如果大家有其他的sql题也可以拿出来大家一赯论,一起分享?

     先创Z个表Q?/p>

CREATE TABLE [dbo].[Score](
    [ID] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,
    [Name] [nvarchar](50) NULL,
    [CID] [int] NULL,
    [Score] [int] NULL
 Q?br />
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('张三',1,60)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('张三',2,70)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('张三',3,80)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('张三',4,90)

INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('李四',1,60)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('李四',2,70)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('李四',3,80)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('李四',4,90)

INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('王五',1,60)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('王五',2,70)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('王五',3,80)
INSERT INTO [Test].[dbo].[Score]([Name],[CID],[Score])VALUES('王五',4,90)


好了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 ID 
 not in (select MIN(id) from Score group by Name having COUNT(Name)>0)
好了Q两条语句解决了两个问题.


abin 2012-07-08 10:39 发表评论
]]>
Sql常见面试?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382511.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 08 Jul 2012 02:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382511.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/382511.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/382511.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/382511.html</trackback:ping><description><![CDATA[<div>Sql常见面试题(ȝQ?br />1.用一条SQL语句 查询出每门课都大?0分的学生姓名  <br />name   kecheng   fenshu <br />张三     语文       81<br />张三     数学       75<br />李四     语文       76<br />李四     数学       90<br />王五     语文       81<br />王五     数学       100<br />王五     p       90<br /><br />A: select distinct name from table  where  name not in (select distinct name from table where fenshu<=80)<br /><br />2.学生?如下:<br />自动~号   学号   姓名 评~号 评名称 分数<br />1        2005001  张三  0001      数学    69<br />2        2005002  李四  0001      数学    89<br />3        2005001  张三  0001      数学    69<br />删除除了自动~号不同,其他都相同的学生冗余信息<br /><br />A: delete tablename where 自动~号 not in(select min(自动~号) from tablename group by 学号,姓名,评~号,评名称,分数)<br />一个叫department的表Q里面只有一个字Dname,一共有4条纪录,分别是a,b,c,d,对应四个球对Q现在四个球对进行比赛,用一条sql语句昄所有可能的比赛l合.<br />你先按你自己的想法做一下,看结果有我的q个单吗Q?br />{:select a.name, b.name <br />from team a, team b <br />where a.name < b.name<br /><br />LSQL语句实现Q从TestDB数据表中查询出所有月份的发生额都?01U目相应月䆾的发生额高的U目。请注意QTestDB中有很多U目Q都?Q?2月䆾的发生额?br />AccIDQ科目代码,OccmonthQ发生额月䆾QDebitOccurQ发生额?br /><span >数据?/span>名:JcyAuditQ数据集QSelect * from TestDB<br />{:select a.*<br />from TestDB a <br />,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b<br />where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur<br />************************************************************************************<br />面试题:怎么把这样一个表?br />year  month amount<br />1991   1     1.1<br />1991   2     1.2<br />1991   3     1.3<br />1991   4     1.4<br />1992   1     2.1<br />1992   2     2.2<br />1992   3     2.3<br />1992   4     2.4<br />查成q样一个结?br />year m1  m2  m3  m4<br />1991 1.1 1.2 1.3 1.4<br />1992 2.1 2.2 2.3 2.4 <br /><br />{案一?br />select year, <br />(select amount from  aaa m where month=1  and m.year=aaa.year) as m1,<br />(select amount from  aaa m where month=2  and m.year=aaa.year) as m2,<br />(select amount from  aaa m where month=3  and m.year=aaa.year) as m3,<br />(select amount from  aaa m where month=4  and m.year=aaa.year) as m4<br />from aaa  group by year<br /><br />q个是ORACLE  中做的:<br />select * from (select name, year b1, lead(year) over<br />(partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(<br />partition by name order by year) rk from t) where rk=1;<br />************************************************************************************<br />_֦的SQL语句Q?br />_֦SQL语句  <br />作者:不详 发文旉Q?003.05.29 10:55:05 <br /><br />说明Q复制表(只复制结?源表名:a 新表名:b) <br /><br />SQL: select * into b from a where 1<>1 <br /><br />说明Q拷贝表(拯数据,源表名:a 目标表名Qb) <br /><br />SQL: insert into b(a, b, c) select d,e,f from b; <br /><br />说明Q显C文章、提交h和最后回复时?<br /><br />SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b <br /><br />说明Q外q接查询(表名1Qa 表名2Qb) <br /><br />SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c <br /><br />说明Q日E安排提前五分钟提醒 <br /><br />SQL: select * from 日程安排 where datediff('minute',f开始时?getdate())>5 <br /><br />说明Q两张关联表Q删除主表中已经在副表中没有的信?<br /><br />SQL: <br /><br />delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) <br /><br />说明Q?- <br /><br />SQL: <br /><br />SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE <br /><br />FROM TABLE1, <br /><br />(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE <br /><br />FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND <br /><br />FROM TABLE2 <br /><br />WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, <br /><br />(SELECT NUM, UPD_DATE, STOCK_ONHAND <br /><br />FROM TABLE2 <br /><br />WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = <br /><br />TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, <br /><br />WHERE X.NUM = Y.NUM Q?Q?<br /><br />AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B <br /><br />WHERE A.NUM = B.NUM <br /><br />说明Q?- <br /><br />SQL: <br /><br />select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and pdU?'"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源?高考Ll?<br /><br />说明Q?<br /><br />从数据库中去一q的各单位电话费l计(电话费定额贺电化肥清单两个表来源Q?<br /><br />SQL: <br /><br />SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, <br /><br />SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC <br /><br />FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration <br /><br />FROM TELFEESTAND a, TELFEE b <br /><br />WHERE a.tel = b.telfax) a <br /><br />GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') <br /><br />说明Q四表联查问题: <br /><br />SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... <br /><br />说明Q得到表中最的未用的ID?<br /><br />SQL: <br /><br />SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID <br /><br />FROM Handle <br /><br />WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)<br /><br />*******************************************************************************<br />有两个表A和BQ均有key和value两个字段Q如果B的key在A中也有,把B的value换ؓA中对应的value<br />q道题的SQL语句怎么写?<br />update   b   set   b.value=(select   a.value   from   a   where   a.key=b.key)   where   b.id   in(select   b.id   from   b,a   where   b.key=a.key);<br />***************************************************************************<br />高sql面试?br />原表: <br />courseid coursename score <br />------------------------------------- <br />1 java 70 <br />2 oracle 90 <br />3 xml 40 <br />4 jsp 30 <br />5 servlet 80 <br />------------------------------------- <br />Z便于阅读,查询此表后的l果昑ּ如下(及格分数?0): <br />courseid coursename score mark <br />--------------------------------------------------- <br />1 java 70 pass <br />2 oracle 90 pass <br />3 xml 40 fail <br />4 jsp 30 fail <br />5 servlet 80 pass <br />--------------------------------------------------- <br />写出此查询语?br />没有装OQԌQLQ,没试q?<br />select courseid, coursename ,score ,decodeQsign(score-60),-1,'fail','pass') as mark from course<br />完全正确 <br /><br />SQL> desc course_v <br />Name Null? Type <br />----------------------------------------- -------- ---------------------------- <br />COURSEID NUMBER <br />COURSENAME VARCHAR2(10) <br />SCORE NUMBER <br /><br />SQL> select * from course_v; <br /><br />COURSEID COURSENAME SCORE <br />---------- ---------- ---------- <br />1 java 70 <br />2 oracle 90 <br />3 xml 40 <br />4 jsp 30 <br />5 servlet 80 <br /><br />SQL> select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course_v; <br /><br />COURSEID COURSENAME SCORE MARK <br />---------- ---------- ---------- ---- <br />1 java 70 pass <br />2 oracle 90 pass <br />3 xml 40 fail <br />4 jsp 30 fail <br />5 servlet 80 pass<br />*******************************************************************************<br />原表: <br /><br />id proid proname <br />1 1 M <br />1 2 F <br />2 1 N <br />2 2 G <br />3 1 B <br />3 2 A <br />查询后的? <br /><br />id pro1 pro2 <br />1 M F <br />2 N G <br />3 B A <br />写出查询语句<br />解决Ҏ <br /><br />sql求解 <br />表a <br />?a1 a2 <br />记录 1 a <br />1 b <br />2 x <br />2 y <br />2 z <br />用select能选成以下l果吗? <br />1 ab <br />2 xyz <br />使用pl/sql代码实现Q但要求你组合后的长度不能超出oracle varchar2长度的限制?<br />下面是一个例?<br />create or replace type strings_table is table of varchar2(20); <br />/ <br />create or replace function merge (pv in strings_table) return varchar2 <br />is <br />ls varchar2(4000); <br />begin <br />for i in 1..pv.count loop <br />ls := ls || pv(i); <br />end loop; <br />return ls; <br />end; <br />/ <br />create table t (id number,name varchar2(10)); <br />insert into t values(1,'Joan'); <br />insert into t values(1,'Jack'); <br />insert into t values(1,'Tom'); <br />insert into t values(2,'Rose'); <br />insert into t values(2,'Jenny'); <br /><br />column names format a80; <br />select t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table)) names <br />from (select distinct id from t) t0; <br /><br />drop type strings_table; <br />drop function merge; <br />drop table t; <br /><br /><br /><br /><br />用sqlQ?<br /><br />Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundreds of employees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky. <br /><br />This example uses a max of 6, and would need more cut n pasting to do more than that. <br /><br />SQL> select deptno, dname, emps <br />2 from ( <br />3 select d.deptno, d.dname, rtrim(e.ename ||', '|| <br />4 lead(e.ename,1) over (partition by d.deptno <br />5 order by e.ename) ||', '|| <br />6 lead(e.ename,2) over (partition by d.deptno <br />7 order by e.ename) ||', '|| <br />8 lead(e.ename,3) over (partition by d.deptno <br />9 order by e.ename) ||', '|| <br />10 lead(e.ename,4) over (partition by d.deptno <br />11 order by e.ename) ||', '|| <br />12 lead(e.ename,5) over (partition by d.deptno <br />13 order by e.ename),', ') emps, <br />14 row_number () over (partition by d.deptno <br />15 order by e.ename) x <br />16 from emp e, dept d <br />17 where d.deptno = e.deptno <br />18 ) <br />19 where x = 1 <br />20 / <br /><br />DEPTNO DNAME EMPS <br />------- ----------- ------------------------------------------ <br />10 ACCOUNTING CLARK, KING, MILLER <br />20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH <br />30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD <br /><br />also <br />先create function get_a2; <br />create or replace function get_a2( tmp_a1 number) <br />return varchar2 <br />is <br />Col_a2 varchar2(4000); <br />begin <br />Col_a2:=''; <br />for cur in (select a2 from unite_a where a1=tmp_a1) <br />loop <br />Col_a2=Col_a2||cur.a2; <br />end loop; <br />return Col_a2; <br />end get_a2; <br /><br />select distinct a1 ,get_a2(a1) from unite_a <br />1 ABC <br />2 EFG <br />3 KMN<br />*******************************************************************************<br />一个SQL 面试?<br />d应聘一个职位未?光被考了一个看似简单的?但我没有扑ֈ好的大案.<br />不知各位大虾有无好的解法?<br /><br /><br />题ؓ:<br />有两个表, t1, t2,<br />Table t1:<br /><br />SELLER | NON_SELLER<br />----- -----<br /><br />A B<br />A C<br />A D<br />B A<br />B C<br />B D<br />C A<br />C B<br />C D<br />D A<br />D B<br />D C<br /><br /><br />Table t2:<br /><br />SELLER | COUPON | BAL<br />----- --------- ---------<br />A 9 100<br />B 9 200<br />C 9 300<br />D 9 400<br />A 9.5 100<br />B 9.5 20<br />A 10 80<br /><br /><br /><br />要求用SELECT 语句列出如下l果:------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......<br />且用的方法不要增加数据库负担,如用临时表等.<br /><br />NON-SELLER| COUPON | SUM(BAL) ------- --------<br />A 9 900<br />B 9 800<br />C 9 700<br />D 9 600 <br />A 9.5 20<br />B 9.5 100<br />C 9.5 120<br />D 9.5 120<br />A 10 0<br />B 10 80<br />C 10 80<br />D 10 80<br />关于论坛上那个SQL微Y面试?br />问题Q?br /><br />一百个账户各有100$Q某个̎h天如有支出则d一条新记录Q记录其余额。一癑֤后,误出每天所有̎L余额信息<br /><br /><br />q个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有Q不包括W一天)<br /><br />q回的记录集是一?00?100个用LU录?br /><br />下面是我的思\Q?br /><br />1.创徏表ƈ插入试数据Q我们要求username?-100<br />CREATE TABLE [dbo].[TABLE2] (<br />[username] [varchar] (50) NOT NULL , --用户?br />[outdate] [datetime] NOT NULL , --日期<br />[cash] [float] NOT NULL --余额<br />) ON [PRIMARY<br /><br />declare @i int<br />set @i=1<br />while @i<=100<br />  begin<br />    insert table2 values(convert(varchar(50),@i),'2001-10-1',100)<br />    insert table2 values(convert(varchar(50),@i),'2001-11-1',50)<br />    set @i=@i+1<br />  end<br />insert table2 values(convert(varchar(50),@i),'2001-10-1',90)<br /><br />select * from table2 order by outdate,convert(int,username)<br /><br />2.l合查询语句Q?br />a.我们必须q回一个从W一天开始到100天的U录集:<br />如:2001-10-1Q这个日期是L的) ?2002-1-8<br />׃W一天是L一天,所以我们需要下面的SQL语句Q?br />select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate<br />from table2<br />group by username<br />order by convert(int,username)<br />q里的奥妙在于:<br />convert(int,username)-1Q记得我们指定用户名?-100 :-))<br />group by username,min(outdate):W一天就可能每个用户有多个纪录?br />q回的结果:<br />outdate                                                <br />------------------------------------------------------ <br />2001-10-01 00:00:00.000<br />.........<br />2002-01-08 00:00:00.000<br /><br />b.q回一个所有用户名的纪录集Q?br />select distinct username from table2 <br />q回l果Q?br />username                                          <br />-------------------------------------------------- <br />1<br />10<br />100<br />......<br />99<br /><br />c.q回一?00天记录集?00个用戯录集的笛卡尔集合Q?br />select * from<br />(<br />select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate<br />from table2<br />group by username<br />order by convert(int,username)<br />) as A<br />CROSS join <br />(<br />select distinct username from table2 <br />) as B<br />order by outdate,convert(int,username)<br />q回l果100*100条纪录:<br />outdate                            username<br />2001-10-01 00:00:00.000            1<br />......<br />2002-01-08 00:00:00.000            100<br /><br />d.q回当前所有用户在数据库的有的U录Q?br />select outdate,username,min(cash) as cash from table2<br />group by outdate,username<br /><br />order by outdate,convert(int,username)<br />q回U录Q?br />outdate                            username    cash<br />2001-10-01 00:00:00.000            1          90<br />......<br />2002-01-08 00:00:00.000            100        50<br /><br />e.c中返回的W卡集和d中返回的U录做left join:<br />select C.outdate,C.username,<br />D.cash<br />from<br />(<br />select * from<br />(<br />select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate<br />from table2<br />group by username<br />order by convert(int,username)<br />) as A<br />CROSS join <br />(<br />select distinct username from table2 <br />) as B<br />) as C<br />left join<br />(<br />select outdate,username,min(cash) as cash from table2<br />group by outdate,username<br />) as D<br />on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)<br /><br />order by C.outdate,convert(int,C.username)<br />注意Q用户在当天如果没有U录Qcash字段q回NULLQ否则cashq回每个用户当天的余?br />outdate                            username    cash<br />2001-10-01 00:00:00.000            1          90<br />2001-10-01 00:00:00.000            2          100<br />......<br />2001-10-02 00:00:00.000            1          90<br />2001-10-02 00:00:00.000            2          NULL  <--注意q里<br />......<br /><br />2002-01-08 00:00:00.000            100        50<br /><br />f.好了Q现在我们最后要做的是Q如果cash为NULLQ我们要q回于当前U录日期的第一个用户余?׃我们使用order by cash,所以返回top 1U录卛_Q用min应该也可?Q这个余额即为当前的余额Q?br />case isnull(D.cash,0)<br />when 0 then <br />(<br />select top 1 cash from table2 where table2.username=C.username<br />and datediff(d,C.outdate,table2.outdate)<0 <br />order by table2.cash<br />)<br />else D.cash<br />end as cash<br /><br />g.最后组合的完整语句是<br />select C.outdate,C.username,<br />case isnull(D.cash,0)<br />when 0 then <br />(<br />select top 1 cash from table2 where table2.username=C.username<br />and datediff(d,C.outdate,table2.outdate)<0 <br />order by table2.cash<br />)<br />else D.cash<br />end as cash<br />from<br />(<br />select * from<br />(<br />select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate<br />from table2<br />group by username<br />order by convert(int,username)<br />) as A<br />CROSS join <br />(<br />select distinct username from table2 <br />) as B<br />) as C<br />left join<br />(<br />select outdate,username,min(cash) as cash from table2<br />group by outdate,username<br />) as D<br />on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)<br /><br />order by C.outdate,convert(int,C.username)<br /><br />q回l果Q?br />outdate                                 username        cash<br />2001-10-01 00:00:00.000    1                    90<br />2001-10-01 00:00:00.000    2                   100<br />......<br />2002-01-08 00:00:00.000    100                50<br />***********************************************************************************<br />取出sql表中W?1?0的记录(以自动增长IDZ键)<br />*从数据表中取出第n条到Wm条的记录*/ <br /><br />declare @m int <br />declare @n int <br />declare @sql varchar(800) <br />set @m=40 <br />set @n=31 <br />set @sql='select top '+str(@m-@n+1) + '* from idetail where autoid not in( <br />select top '+ str(@n-1) + 'autoid from idetail)' <br />exec(@sql)<br /><br /><br />select top 10 * from t where id not in (select top 30 id from t order by id ) orde by id<br />--------------------------------------------------------------------------------<br />select top 10 * from t where id in (select top 40 id from t order by id) order by id desc<br /><br />*******************************************************************************<br />一道面试题,写sql语句<br /><br />有表a存储二叉树的节点,要用一条sql语句查出所有节点及节点所在的?<br />表a <br />c1 c2 A ----------1 <br />---- ---- / \<br />A B B C --------2<br />A C / / \<br />B D D N E ------3<br />C E / \ \<br />D F F K I ---4<br />E I<br />D K<br />C N<br /><br /><br />所要得到的l果如下<br /><br />jd cs<br />----- ----<br />A 1<br />B 2<br />C 2<br />D 3<br />N 3<br />E 3<br />F 4<br />K 4<br />I 4<br />有高手指g?我只能用pl/sql写出?h用一条sql语句的写?br />SQL> select c2, level + 1 lv<br />2 from test start<br />3 with c1 = 'A'<br />4 connect by c1 = prior c2<br />5 union<br />6 select 'A', 1 from dual<br />7 order by lv;<br /><br />C2 LV<br />-- ----------<br />A 1<br />B 2<br />C 2<br />D 3<br />E 3<br />N 3<br />F 4<br />I 4<br />K 4<br /><br />已选择9行?/div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/382511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-07-08 10:26 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l典的SQL语句面试?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382512.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 08 Jul 2012 02:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382512.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/382512.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/382512.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/382512.html</trackback:ping><description><![CDATA[<div><p>Student(S#,Sname,Sage,Ssex) 学生?br /> Course(C#,Cname,T#) 评?br /> SC(S#,C#,score) 成W?br /> Teacher(T#,Tname) 教师?</p> <p>问题Q?br /> 1、查?#8220;001”评?#8220;002”评成W高的所有学生的学号Q?br /> select a.S#<br /> from (select s#,score from SC where C#=’001′) a,<br /> (select s#,score from SC where C#=’002′) b<br /> where a.score>b.score and a.s#=b.s#; </p> <p>2、查询^均成l大?0分的同学的学号和q_成WQ?br /> select S#,avg(score)<br /> from sc<br /> group by S# having avg(score) >60; </p> <p>3、查询所有同学的学号、姓名、选课数、Ll;<br /> select Student.S#,Student.Sname,count(SC.C#),sum(score)<br /> from Student left Outer join SC on Student.S#=SC.S#<br /> group by Student.S#,Sname </p> <p>4、查询姓“?#8221;的老师的个敎ͼ<br /> select count(distinct(Tname))<br /> from Teacher<br /> where Tname like ‘?’; </p> <p>5、查询没学过“叶^”老师评同学的学受姓名;<br /> select Student.S#,Student.Sname<br /> from Student<br /> 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=’叶^’); </p> <p>6、查询学q?#8220;001”q且也学q编?#8220;002”评的同学的学号、姓名;<br /> select Student.S#,Student.Sname<br /> from Student,SC<br /> 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′);<br /> 7、查询学q?#8220;叶^”老师所教的所有课的同学的学号、姓名;<br /> select S#,Sname<br /> from Student<br /> where S# in<br /> (select S#<br /> from SC ,Course ,Teacher<br /> 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=’叶^’)); </p> <p>8、查询所有课E成l小?0分的同学的学受姓名;<br /> select S#,Sname<br /> from Student<br /> where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); </p> <p>9、查询没有学全所有课的同学的学号、姓名;<br /> select Student.S#,Student.Sname<br /> from Student,SC<br /> where Student.S#=SC.S#<br /> group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); </p> <p>10、查询至有一门课与学号ؓ“1001”的同学所学相同的同学的学号和姓名Q?br /> select S#,Sname<br /> from Student,SC<br /> where Student.S#=SC.S# and C# in Qselect C# from SC where S#='1001'Q?</p> <p>11、删除学?#8220;叶^”老师评SC表记录;<br /> Delect SC<br /> from course ,Teacher<br /> where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶^'; </p> <p>12、查询各U成l最高和最低的分:以如下Ş式显C:评IDQ最高分Q最低分<br /> SELECT L.C# 评ID,L.score 最高分,R.score 最低分<br /> FROM SC L ,SC R<br /> WHERE L.C# = R.C#<br /> and<br /> L.score = (SELECT MAX(IL.score)<br /> FROM SC IL,Student IM<br /> WHERE IL.C# = L.C# and IM.S#=IL.S#<br /> GROUP BY IL.C#)<br /> and<br /> R.Score = (SELECT MIN(IR.score)<br /> FROM SC IR<br /> WHERE IR.C# = R.C#<br /> GROUP BY IR.C# ); </p> <p>13、查询学生^均成l及其名?br /> SELECT 1+(SELECT COUNT( distinct q_成W)<br /> FROM (SELECT S#,AVG(score) q_成W<br /> FROM SC<br /> GROUP BY S# ) T1<br /> WHERE q_成W > T2.q_成W) 名次, S# 学生学号,q_成W<br /> FROM (SELECT S#,AVG(score) q_成W FROM SC GROUP BY S# ) T2<br /> ORDER BY q_成W desc;</p> <p>14、查询各U成l前三名的记?(不考虑成Wq列情况)<br /> SELECT t1.S# as 学生ID,t1.C# as 评ID,Score as 分数<br /> FROM SC t1<br /> WHERE score IN (SELECT TOP 3 score<br /> FROM SC<br /> WHERE t1.C#= C#<br /> ORDER BY score DESC)<br /> ORDER BY t1.C#; </p> <p>15、查询每门功成W最好的前两?br /> SELECT t1.S# as 学生ID,t1.C# as 评ID,Score as 分数<br /> FROM SC t1<br /> WHERE score IN (SELECT TOP 2 score<br /> FROM SC<br /> WHERE t1.C#= C#<br /> ORDER BY score DESC )<br /> ORDER BY t1.C#;</p> <p>补充Q?br /> 已经知道原表<br /> year salary<br /> ——————<br /> 2000 1000<br /> 2001 2000<br /> 2002 3000<br /> 2003 4000</p> <p>解:<br /> select b.year,sum(a.salary)<br /> from salary a,salary b<br /> where a.year<=b.year<br /> group by b.year<br /> order by b.year;</p> <p>在面试过E中多次到一道SQL查询的题目,查询A(ID,Name)表中W?1?0条记录,ID作ؓ主键可能是不是连l增长的列,完整的查询语句如下:<br /> Ҏ一Q?br /> select top 10 *<br /> from A<br /> where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID<br /> Ҏ二:<br /> select top 10 *<br /> from A<br /> where ID not In (select top 30 ID from A order by ID)<br /> order by ID</p></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/382512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-07-08 10:26 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/07/08/382512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʢ</a>| <a href="http://" target="_blank">°Ͷ</a>| <a href="http://" target="_blank">ڻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">⿪</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">첼</a>| <a href="http://" target="_blank">ɼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͤ</a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">µ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>