﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-紫蝶∏飛揚↗-文章分类-数据库</title><link>http://www.blogjava.net/algz/category/30644.html</link><description>Purple Butterfly Flying
QQ群:7101519
Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts
http://algz.googlecode.com/svn/trunk/</description><language>zh-cn</language><lastBuildDate>Tue, 20 Dec 2011 10:14:18 GMT</lastBuildDate><pubDate>Tue, 20 Dec 2011 10:14:18 GMT</pubDate><ttl>60</ttl><item><title>[转]Hibernate Annotation几种关联映射 虽然是转载,但仔细看还是很有帮助的.</title><link>http://www.blogjava.net/algz/articles/366838.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 20 Dec 2011 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/366838.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/366838.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/366838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/366838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/366838.html</trackback:ping><description><![CDATA[<div><div>Hibernate Annotation几种关联映射</div><div></div><div>一对一(One-To-One)</div><div></div><div>使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况：(1).关联的实体都共享同样的主键，(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束)，(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。</div><div></div><div>&nbsp;</div><div></div><div>1.共享主键的一对一关联映射：</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_Body")</div><div></div><div>public class Body {</div><div></div><div>&nbsp; &nbsp;private Integer id;</div><div></div><div>&nbsp; &nbsp;private Heart heart;</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer getId() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setId(Integer id) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.id = id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;@OneToOne</div><div></div><div>&nbsp; &nbsp;@PrimaryKeyJoinColumn</div><div></div><div>&nbsp; &nbsp;public Heart getHeart() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return heart;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setHeart(Heart heart) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.heart = heart;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_Heart")</div><div></div><div>public class Heart {</div><div></div><div>&nbsp; &nbsp;private Integer id;</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer getId() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setId(Integer id) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.id = id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>}</div><div></div><div>通过@PrimaryKeyJoinColumn批注定义了一对一关联</div><div></div><div>&nbsp;</div><div></div><div>2.使用外键进行实体一对一关联：</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_Trousers")</div><div></div><div>public class Trousers {</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer id;</div><div></div><div>&nbsp; &nbsp;@OneToOne</div><div></div><div>&nbsp; &nbsp;@JoinColumn(name = "zip_id")</div><div></div><div>&nbsp; &nbsp;public TrousersZip zip;</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_TrousersZip")</div><div></div><div>public class TrousersZip {</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer id;</div><div></div><div>&nbsp; &nbsp;@OneToOne(mappedBy = "zip")</div><div></div><div>&nbsp; &nbsp;public Trousers trousers;</div><div></div><div>}</div><div></div><div>上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip关联，@JoinColumn批注定义了联接列，该批注和@Column批注有点类似，但是多了一个名为referencedColumnName的参数。该参数定义了所关联目标实体中的联接列，注意，当referencedColumnName关联到非主键列的时候，关联的目标类必须实现Serializable，还要注意的是所映像的属性对应单个列（否则映射无效）</div><div></div><div>一对一关联可能是双向的，在双向关联中，有且仅有一端作为主体（owner）端存在：主体端负责维护联接列（即更新），对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中，mappedBy的值为zip。最后，不必也不能再在被关联端（ownedside）定义联接列了，因为已经在主体端声明了。</div><div></div><div>如果在主体没有声明@JoinColumn，系统自动进行处理：在主表（owner table）中将创建联接列，列名为：主体的关联属性名+下划线+被关联端的主键列名。上面的例子中是zip_id,因为Trousers中的关联属性名为zip，TrousersZip的主键是id。</div><div></div><div>&nbsp;</div><div></div><div>3.通过关联表定义一对一关联</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_People")</div><div></div><div>public class People {</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer id;</div><div></div><div>&nbsp; &nbsp;@OneToOne</div><div></div><div>&nbsp; &nbsp;@JoinTable(name ="TestPeoplePassports",</div><div></div><div>&nbsp; &nbsp; &nbsp; joinColumns =@JoinColumn(name="people_fk"),</div><div></div><div>&nbsp; &nbsp; &nbsp; inverseJoinColumns =@JoinColumn(name="passport_fk")</div><div></div><div>&nbsp; &nbsp;)</div><div></div><div>&nbsp; &nbsp;public Passport passport;</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_Passport")</div><div></div><div>public class Passport {</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;public Integer id;</div><div></div><div>&nbsp; &nbsp;@OneToOne(mappedBy = "passport")</div><div></div><div>&nbsp; &nbsp;public People people;</div><div></div><div>}</div><div></div><div>People通过名为TestPeoplePassports的关联表和Passport关联。该关联表拥有名为passport_fk的外键列，该外键指向Passport表，该信息定义为inverseJoinColoumns的属性值，而people_fk外键列指向People表，该信息定义为joinColumns的属性值。</div><div></div><div>这种关联可能是双向的，在双向关联中，有且仅有一端作为主体（owner）端存在：主体端负责维护联接列（即更新），对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中，mappedBy的值为passport。最后，不必也不能再在被关联端（ownedside）定义联接列了，因为已经在主体端声明了。</div><div></div><div>以上是一对一关联的三种形式，下面介绍多对一关联。</div><div></div><div>&nbsp;</div><div></div><div>&nbsp;</div><div></div><div>&nbsp;</div><div></div><div>多对一(Many-to-One)</div><div></div><div>使用@ManyToOne批注来实现多对一关联。</div><div></div><div>@ManyToOne批注有一个名为targetEntity的参数，该参数定义了目标实体名，通常不需要定义该参数，因为在大部分情况下默认值(表示关联关系的属性类型)就可以很好的满足需求了。不过下面这种情况下这个参数就显得有意义了：使用接口作为返回值而不是常见的实体。</div><div></div><div>@ManyToOne(targetEntity=CompanyImpl.class)</div><div></div><div>@JoinColoumn(name=&#8221;COPM_ID&#8221;)</div><div></div><div>Public Company getCompany(){</div><div></div><div>&nbsp; &nbsp;return company;</div><div></div><div>}</div><div></div><div>多对一的配置方式有两种：(1)通过@JoinColoumn映像(2)通过关联表的方式来映像</div><div></div><div>&nbsp;</div><div></div><div>(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过@JoinColoumn映射</div><div></div><div>SRD Framework中Company,Category例子：</div><div></div><div>Company：</div><div></div><div>@ManyToOne</div><div></div><div>&nbsp; &nbsp;@JoinColumn(name = "CATEGORY_OPTION_ID")</div><div></div><div>&nbsp; &nbsp;private Category category = null;</div><div></div><div>&nbsp; &nbsp;Category：</div><div></div><div>@DiscriminatorValue("Category")</div><div></div><div>public class Category extends Option {</div><div></div><div>}</div><div></div><div>(2) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过关联表映射</div><div></div><div>通过@JoinTable批注定义关联表，该关联表包含了指回实体表的外键(通过@JoinTable.joinColoumns)以及指向目标实体表的外键(通过@JoinTable.inverseJoinColoumns)</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_TreeType")</div><div></div><div>public class TreeType {</div><div></div><div>&nbsp; &nbsp;private Integer id;</div><div></div><div>&nbsp; &nbsp;private String name;</div><div></div><div>&nbsp; &nbsp;private ForestType forestType;</div><div></div><div>&nbsp; &nbsp;@ManyToOne(fetch = FetchType.LAZY)</div><div></div><div>&nbsp; &nbsp;@JoinTable(name="Test_Tree_Forest",</div><div></div><div>&nbsp; &nbsp; &nbsp; joinColumns = @JoinColumn(name="tree_id"),</div><div></div><div>&nbsp; &nbsp; &nbsp; inverseJoinColumns = @JoinColumn(name="forest_id") )</div><div></div><div>public ForestType getForestType() {// forestType的getter，setter方法必须在这里，否则会出错</div><div></div><div>&nbsp; &nbsp; &nbsp; return forestType;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setForestType(ForestType forestType) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.forestType = forestType;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;@Id</div><div></div><div>&nbsp; &nbsp;@GeneratedValue</div><div></div><div>&nbsp; &nbsp;public Integer getId() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setId(Integer id) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.id = id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public String getName() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return name;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setName(String name) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.name = name;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>@Table(name="Test_ForestType")</div><div></div><div>public class ForestType {</div><div></div><div>&nbsp; &nbsp;private Integer id;</div><div></div><div>&nbsp; &nbsp;private String name;</div><div></div><div>&nbsp; &nbsp;private Set&lt;TreeType&gt; trees;</div><div></div><div>&nbsp; &nbsp;@OneToMany(mappedBy="forestType")</div><div></div><div>public Set&lt;TreeType&gt; getTrees() {// trees的getter，setter方法必须在这里，否则会出错</div><div></div><div>&nbsp; &nbsp; &nbsp; return trees;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setTrees(Set&lt;TreeType&gt; trees) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.trees = trees;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;@Id @GeneratedValue</div><div></div><div>&nbsp; &nbsp;public Integer getId() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setId(Integer id) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.id = id;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public String getName() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return name;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>&nbsp; &nbsp;public void setName(String name) {</div><div></div><div>&nbsp; &nbsp; &nbsp; this.name = name;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>}</div><div></div><div>&nbsp;</div><div></div><div>一对多(One-to-Many)</div><div></div><div>使用@OneToMany批注可定义一对多关联，一对多关联可以是双向关联。</div><div></div><div>在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端，而一对多这端关联批注为@OneToMany(mappedBy...)</div><div></div><div>@Entity</div><div></div><div>Public class Troop{</div><div></div><div>&nbsp; &nbsp;@OneToMany(mappedBy=&#8221;troop&#8221;)</div><div></div><div>Public Set&lt;Soldier&gt; getSoldiers(){</div><div></div><div>......</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>Public class Soldier{</div><div></div><div>&nbsp; &nbsp;@ManyToOne</div><div></div><div>&nbsp; &nbsp;@JoinColumn(name=&#8221;troop_fk&#8221;)</div><div></div><div>Public Troop getTroop(){</div><div></div><div>......</div><div></div><div>}</div><div></div><div>Troop通过troop属性和Soldier建立一对多的双向关联，在mappedBy端不必也不能再定义任何物理映射。</div><div></div><div>对于一对多的双向映射，如果要一对多这一端维护关联关系，你需要删除mappedBy元素并将多对一这端的@JoinColoumn的insertable和updatabel设置为false。这种方案不会得到什么明显的优化，而且还会增加一些附加的UPDATE语句。</div><div></div><div>&nbsp;</div><div></div><div>单向：</div><div></div><div>通过在被拥有的实体端(owned entity)增加一个外键列来实现一对多单向关联是很少见的，也是不推荐的，建议通过一个联接表来实现这种关联(下面会讲到)。</div><div></div><div>@JoinColoumn批注来描述这种单向关联关系</div><div></div><div>@Entity</div><div></div><div>Public class Customer{</div><div></div><div>&nbsp; &nbsp;@OneToMany</div><div></div><div>@JoinColoumn(name=&#8221;CUST_ID&#8221;)</div><div></div><div>Public Set&lt;ticket&gt; getTickets() {</div><div></div><div>......</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>Public class Ticket{</div><div></div><div>&nbsp; &nbsp;...</div><div></div><div>}</div><div></div><div>Customer通过CUST_ID列和Ticket建立了单向关联关系</div><div></div><div>通过关联表处理单向关联：</div><div></div><div>通过联接表处理单向一对多关联是首选方式，这种关联通过@JoinTable批注进行描述</div><div></div><div>@Entity</div><div></div><div>Public class Trainer{</div><div></div><div>@OneToMany</div><div></div><div>@JoinTable(</div><div></div><div>&nbsp; &nbsp;name = "TrainedMonkeys",</div><div></div><div>&nbsp; &nbsp;jonColumns = {@JoinColumn(name = "trainer_id")},</div><div></div><div>&nbsp; &nbsp;inverseJoinColumns = @JoinColumn(name = "monkey_id")</div><div></div><div>&nbsp; &nbsp;)</div><div></div><div>public Set&lt;Monkey&gt; getTrainedMonkeys() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return trainedMonkeys;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>......</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>public class Monkey {</div><div></div><div>...//no bidir</div><div></div><div>}</div><div></div><div>上面这个例子中，Trainer通过TrainedMonkeys表和Monkey建立了单向关联，其中外键trainer_id关联到Trainer(joinColoumn),而外键monkey_id关联到Monkey(inversejionColoumns)</div><div></div><div>默认处理机制：</div><div></div><div>通过联接表来建立单向一对多关联不需要描述任何物理映像，表名由以下三个部分组成：主表(ownertable)表名+从表(the other side table)表名，指向主表的外键名：主表表名+下划线+主表主键列名，指向从表的外键名：主表所对应实体的属性名+下划线+从表主键列名，指向从表的外键定义为唯一约束，用来表示一对多的关联关系。</div><div></div><div>@Entity</div><div></div><div>public class Trainer{</div><div></div><div>&nbsp; &nbsp;@OneToMany</div><div></div><div>&nbsp; &nbsp;Public Set&lt;Tiger&gt; getTrainedTigers(){</div><div></div><div>... ...</div><div></div><div>}</div><div></div><div>@Entity</div><div></div><div>public class Tiger{</div><div></div><div>.. ..//no bidir</div><div></div><div>}</div><div></div><div>上面这个例子中，Trainer和Tiger通过联接表Trainer_Tiger建立单向关联关系，其中外键trainer_id关联到Trainer,而外键trainedTigers_id关联到Tiger</div><div></div><div>&nbsp;</div><div></div><div>多对多(Many-to-Many)</div><div></div><div>使用@ManyToMany批注可定义多对多关联，同时，你也许要通过批注@JoinTable描述关联表和关联条件。如果是双向关联，其中一段必须定义为Owner，另一端必须定义为inverse(在对关联表进行更新操作时这一端将被忽略)</div><div></div><div>@Entity()</div><div></div><div>public class Employer implements Serializable {</div><div></div><div>&nbsp; &nbsp;private Integer id;</div><div></div><div>&nbsp; &nbsp;private Collection employees;</div><div></div><div>&nbsp; &nbsp;@ManyToMany(</div><div></div><div>targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,</div><div></div><div>&nbsp; &nbsp; &nbsp; cascade = {CascadeType.PERSIST, CascadeType.MERGE}</div><div></div><div>&nbsp; &nbsp;)</div><div></div><div>&nbsp; &nbsp;@JoinTable(</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name = "EMPLOYER_EMPLOYEE",</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;joinColumns = {@JoinColumn(name = "EMPER_ID")},</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}</div><div></div><div>&nbsp; &nbsp;)</div><div></div><div>&nbsp; &nbsp;public Collection getEmployees() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return employees;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>...</div><div></div><div>}</div><div></div><div>@Entity()</div><div></div><div>public class Employee implements Serializable {</div><div></div><div>&nbsp; &nbsp;@ManyToMany(</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cascade = {CascadeType.PERSIST, CascadeType.MERGE},</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mappedBy = "employees"</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;targetEntity = Employer.class</div><div></div><div>&nbsp; &nbsp;)</div><div></div><div>public Collection&lt;Employer&gt; getEmployers() {</div><div></div><div>&nbsp; &nbsp; &nbsp; return employers;</div><div></div><div>&nbsp; &nbsp;}</div><div></div><div>.. ..</div><div></div><div>}</div><div></div><div>@JoinTable批注定义了联接表的表名，联接列数组，以及invers联接列数组，后者是关联表中关联到Employee主键的列(the &#8220;other side&#8221;)。</div><div></div><div>被关联端不必也不能描述物理映射：只需要一个简单的mappedBy参数，该参数包含了主体端的属性名，这样就绑定了双方的关系。</div><div></div><div>默认值：</div><div></div><div>和其它许多批注一样，在多对多关联中很多值是自动生成，党双向多对多关联中没有定义任何物理映射时，Hibernate根据以下规则生成相应的值，关联表名：主表表名+下划线+从表表名，关联到主表的外键名：主表名+下划线+主表中的主键列名，关联到从表的外键名：主表中用于关联的属性名+下划线+从表的主键列名，以上规则对于双向一对多关联同样一样。</div><div></div><div>&nbsp;</div><div></div><div>以上是整理的一点简单的几种映射，可参考EJB3.pdf中P111&#8212;&#8212;P131，hibernate_annotation.pdf 第二章</div><div></div><div>在这里没有具体的例子，有很多内容还需要仔细查看文档。</div></div><img src ="http://www.blogjava.net/algz/aggbug/366838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-20 14:10 <a href="http://www.blogjava.net/algz/articles/366838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 关于oracle with table as 创建临时表的用法示例</title><link>http://www.blogjava.net/algz/articles/365688.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 06 Dec 2011 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/365688.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/365688.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/365688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/365688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/365688.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #888888; font-family: Arial; line-height: normal; background-color: #ffffff; "><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">1、with table as 相当于建个临时表（用于一个语句中某些中间结果放在临时表空间的SQL语句），Oracle 9i 新增WITH语法，可以将查询中的子查询命名，放到SELECT语句的最前面。</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">语法就是</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with tempname as (select ....)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select ...</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">例子：</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with t as (select * from emp where depno=10)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from t where empno=xxx</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">wd as (select did,arg(salary) 平均工资 from work group by did),</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from wd,em where wd.did =em.did and wd.平均工资&gt;em.salary;</span><br style="line-height: normal; " /><br style="line-height: normal; " /><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">2、何时被清除</span><br style="line-height: normal; " /><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">临时表不都是会话结束就自动被PGA清除嘛! 但with as临时表是查询完成后就被清除了！</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">23:48:58 SCOTT@orcl&gt; with aa as(select * from dept)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">23:57:58&nbsp;&nbsp; 2&nbsp; select * from aa;</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp; DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOC</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">---------- -------------- -------------</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; NEW YORK</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DALLAS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHICAGO</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">已用时间:&nbsp; 00: 00: 00.12</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">23:58:06 SCOTT@orcl&gt; select * from aa;</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from aa</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">第 1 行出现错误:</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">ORA-00942: 表或视图不存在</span><br style="line-height: normal; " /><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">已用时间:&nbsp; 00: 00: 00.02</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">23:58:14 SCOTT@orcl&gt;</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">3、就这一功能来说，子查询就可以达到啊，为什么要用with呢？ 用with有什么好处？</span><br style="line-height: normal; " /><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">都能写，但执行计划不同的。当有多个相似子查询的时候，用with写公共部分，因为子查询结果在内存临时表中，执行效率当然就高啦~</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; background-color: #ffff00; color: #000000; font-size: 16px; ">4、问题：</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">有张表数据如下：</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">aaa 高</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">bbb 低</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">aaa 低</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">aaa 高</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">bbb 低</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">bbb 高</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">需要得到下列结果,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; 高 低</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">aaa 2 1</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">bbb 1 2</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">问 SQL 语句怎么写？？</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">答案：</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with tt as (</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'aaa' id, '高' value from dual union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'bbb' id, '低' value from dual union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'aaa' id, '低' value from dual union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'aaa' id, '高' value from dual union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'bbb' id, '低' value from dual union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select 'bbb' id, '高' value from dual)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SELECT id,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(decode(VALUE, '高', 1)) 高,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(decode(VALUE, '低', 1)) 低</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; FROM tt</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;GROUP BY id;</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">===================================================================</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">扩展：</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">Oracle9i新增WITH语法，可以将查询中的子查询命名，放到SELECT语句的最前面。</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">　　一个简单的例子:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SQL&gt; WITH</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">2 SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">3 OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">4 SELECT O.OBJECT_NAME, OBJECT_TYPE, NVL(S.K, 0) SIZE_K</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">5 FROM OBJ O, SEG S</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">6 WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">7 ;</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">OBJECT_NAME OBJECT_TYPE SIZE_K</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">------------------------------ ------------------- ----------</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">DAIJC_TEST TABLE 128</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">P_TEST PROCEDURE 0</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">IND_DAIJC_TEST_C1 INDEX 128</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">　　通过WITH语句定义了两个子查询SEG和OBJ，在随后的SELECT语句中可以直接对预定义的子查询进行查询。从上面的例子也可以看出，使用WITH语句，将一个包含聚集、外连接等操作SQL清晰的展现出来。</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">　　WITH定义的子查询不仅可以使查询语句更加简单、清晰，而且WITH定义的子查询还具有在SELECT语句的任意层均可见的特点。</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">　　即使是在WITH的定义层中，后定义的子查询都可以使用前面已经定义好的子查询:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SQL&gt; WITH</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">2 Q1 AS (SELECT 3 + 5 S FROM DUAL),</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">3 Q2 AS (SELECT 3 * 5 M FROM DUAL),</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">4 Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">5 SELECT * FROM Q3;</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">S M S+M S*M</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">---------- ---------- ---------- ----------</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">8 15 23 120</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">　　利用WITH定义查询中出现多次的子查询还能带来性能提示。Oracle会对WITH进行性能优化，当需要多次访问WITH定义的子查询时，Oracle会将子查询的结果放到一个临时表中，避免同样的子查询多次执行，从而有效的减少了查询的IO数量。</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">WITH能用在SELECT语句中，UPDATE和DELETE语句也是支持WITH语法的，只是需要版本支持:</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">http://www.oracle.com.cn/viewthread.php?tid=83530</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">=============================================================================</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">sql1 as (select to_char(a) s_name from test_tempa),</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from sql1</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from sql2</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">union all</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select 'no records' from dual</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where not exists (select s_name from sql1 where rownum=1)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and not exists (select s_name from sql2 where rownum=1);</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">再举个简单的例子</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">with a as (select * from test)</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">select * from a;</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">其实就是把一大堆重复用到的SQL语句放在with as 里面，取一个别名，后面的查询就可以用它</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">这样对于大批量的SQL语句起到一个优化的作用，而且清楚明了</span><br style="line-height: normal; " /><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">这是搜索到的英文文档资料(说得比较全,但是本人英文特菜,还没具体了解到,希望各高手具体谈谈这个with</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">as 的好处)</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">About Oracle WITH clause</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">Starting in Oracle9i release 2 we see an incorporation of the SQL-99 &#8220;WITH clause&#8221;, a tool for materializing subqueries to save Oracle from having to re-compute them multiple times.</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">The SQL &#8220;WITH clause&#8221; is very similar to the use of Global temporary tables (GTT), a technique that is often used to improve query speed for complex subqueries. Here are some important notes about the Oracle &#8220;WITH clause&#8221;:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; ? The SQL &#8220;WITH clause&#8221; only works on Oracle 9i release 2 and beyond.</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; ? Formally, the &#8220;WITH clause&#8221; is called subquery factoring</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; ? The SQL &#8220;WITH clause&#8221; is used when a subquery is executed multiple times</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; ? Also useful for recursive queries (SQL-99, but not Oracle SQL)</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">To keep it simple, the following example only references the aggregations once, where the SQL &#8220;WITH clause&#8221; is normally used when an aggregation is referenced multiple times in a query.</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">We can also use the SQL-99 &#8220;WITH clause&#8221; instead of temporary tables. The Oracle SQL &#8220;WITH clause&#8221; will compute the aggregation once, give it a name, and allow us to reference it (maybe multiple times), later in the query.</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">The SQL-99 &#8220;WITH clause&#8221; is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the &#8220;WITH clause&#8221; to start our SQL query, defining the aggregations, which can then be named in the main query as if they were &#8220;real&#8221; tables:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">WITH</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">subquery_name</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">AS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">(the aggregation SQL statement)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SELECT</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">(query naming subquery_name);</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">Retuning to our oversimplified example, let&#8217;s replace the temporary tables with the SQL &#8220;WITH&nbsp; clause&#8221;:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">WITH</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">sum_sales AS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select /*+ materialize */</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp; sum(quantity) all_sales from stores</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">number_stores AS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select /*+ materialize */</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp;&nbsp; count(*) nbr_stores from stores</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">sales_by_store AS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; select /*+ materialize */</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; store_name, sum(quantity) store_sales from</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp; store natural join sales</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SELECT</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; store_name</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">FROM</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; store,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; sum_sales,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; number_stores,</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; sales_by_store</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">where</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">&nbsp;&nbsp; store_sales &gt; (all_sales / nbr_stores)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">;</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">Note the use of the Oracle undocumented &#8220;materialize&#8221; hint in the &#8220;WITH clause&#8221;. The Oracle materialize hint is used to ensure that the Oracle cost-based optimizer materializes the temporary tables that are created inside the &#8220;WITH&#8221; clause. This is not necessary in Oracle10g, but it helps ensure that the tables are only created one time.</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">It should be noted that the &#8220;WITH clause&#8221; does not yet fully-functional within Oracle SQL and it does not yet support the use of &#8220;WITH clause&#8221; replacement for &#8220;CONNECT BY&#8221; when performing recursive queries.</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">To see how the &#8220;WITH clause&#8221; is used in ANSI SQL-99 syntax, here is an excerpt from Jonathan Gennick&#8217;s great work &#8220;Understanding the WITH Clause&#8221; showing the use of the SQL-99 &#8220;WITH clause&#8221; to traverse a recursive bill-of-materials hierarchy</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">The SQL-99 &#8220;WITH clause&#8221; is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the &#8220;WITH clause&#8221; to start our SQL query, defining the aggregations, which can then be named in the main query as if they were &#8220;real&#8221; tables:</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">WITH</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">subquery_name</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">AS</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">(the aggregation SQL statement)</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">SELECT</span><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">(query naming subquery_name);</span><br style="line-height: normal; " /><br style="line-height: normal; " /><span style="line-height: normal; color: #000000; font-size: 16px; ">Retuning to our oversimplified example, let&#8217;s replace the temporary tables with the SQL &#8220;WITH&#8221; clause&#8221;:</span></span><img src ="http://www.blogjava.net/algz/aggbug/365688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-06 16:47 <a href="http://www.blogjava.net/algz/articles/365688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 注解映射 设置默认值的异常及解决方法</title><link>http://www.blogjava.net/algz/articles/365534.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 05 Dec 2011 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/365534.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/365534.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/365534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/365534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/365534.html</trackback:ping><description><![CDATA[<div><div>Oracle 数据库:<br />Hibernate&nbsp;annotation :<br /><div><div><span style="white-space:pre">	</span>@Column(name="NUMBERS",columnDefinition="NUMBER(20,3) default 0 ")</div><div><span style="white-space:pre">	</span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre">		</span>return numbers;</div><div><span style="white-space:pre">	</span>}<br /><br />异常:</div></div>Caused by: org.hibernate.HibernateException: Wrong column type: NUMBERS, expected: NUMBER(20,3) default 0&nbsp;</div><div><span style="white-space:pre">	</span>at org.hibernate.mapping.Table.validateColumns(Table.java:261)</div><div><span style="white-space:pre">	</span>at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1083)</div><div><span style="white-space:pre">	</span>at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)</div><div><span style="white-space:pre">	</span>at org.hibernate.impl.SessionFactoryImpl.&lt;init&gt;(SessionFactoryImpl.java:317)</div><div><span style="white-space:pre">	</span>at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)</div><div><span style="white-space:pre">	</span>at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)</div><div><span style="white-space:pre">	</span>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:730)</div><div><span style="white-space:pre">	</span>... 122 more<br />解决方法:<br /><div><div><span style="white-space:pre">	</span>@Column(name="NUMBERS",columnDefinition="number(20,3) default 0 ")</div><div><span style="white-space:pre">	</span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre">		</span>return numbers;</div><div><span style="white-space:pre">	</span>}<br />原因:hibernate 在列定义选项中,数据库中的所有类型应为小写number. hibernate在此直接面对数据库,所以区分大小写.</div></div></div></div><img src ="http://www.blogjava.net/algz/aggbug/365534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-05 09:21 <a href="http://www.blogjava.net/algz/articles/365534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数</title><link>http://www.blogjava.net/algz/articles/365263.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Dec 2011 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/365263.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/365263.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/365263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/365263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/365263.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 14px; background-color: #ffffff; "><div>oracle的分析函数over 及开窗函数</div><div><font size="2">一：分析函数<strong style="color: black; background-color: #a0ffff; ">over</strong><br /><strong style="color: black; background-color: #ffff66; ">Oracle</strong>从8.1.6开始提供分析函数，分析函数用于计算基于组的某种聚合值，它和聚合函数的不同之处是<br />对于每个组返回多行，而聚合函数对于每个组只返回一行。&nbsp;<br />下面通过几个例子来说明其应用。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><div><font size="2">1：统计某商店的营业额。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></div><div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sale<br />&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15<br />&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14<br />&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18<br />&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />&nbsp;&nbsp;&nbsp; 规则：按天统计：每天都统计前面几天的总额<br />&nbsp;&nbsp;&nbsp; 得到的结果：<br />&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp; SALE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM<br />&nbsp;&nbsp;&nbsp; ----- -------- ------<br />&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1天&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1天＋2天&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1天＋2天＋3天&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 97&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />2:统计各班成绩第一名的同学信息</font></div><div><font size="2">&nbsp;&nbsp;&nbsp; NAME&nbsp;&nbsp; CLASS S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; ----- ----- ----------------------&nbsp;<br />&nbsp;&nbsp;&nbsp; fda&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; ffd&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; dss&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; cfe&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; gds&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; gf&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; ddd&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; adf&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; asdf&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 3dd&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 通过：&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; --<br />&nbsp;&nbsp;&nbsp; select * from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; select name,class,s,rank()<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by class order by s desc) mm from t2<br />&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; where mm=1&nbsp;<br />&nbsp;&nbsp;&nbsp; --<br />&nbsp;&nbsp;&nbsp; 得到结果：<br />&nbsp;&nbsp;&nbsp; NAME&nbsp;&nbsp; CLASS S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; ----- ----- ---------------------- ----------------------&nbsp;<br />&nbsp;&nbsp;&nbsp; dss&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; gds&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; gf&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; ddd&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 注意：<br />&nbsp;&nbsp;&nbsp; 1.在求第一名成绩的时候，不能用row_number()，因为如果同班有两个并列第一，row_number()只返回一个结果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 2.rank()和dense_rank()的区别是：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --rank()是跳跃排序，有两个第二名时接下来就是第四名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --dense_rank()l是连续排序，有两个第二名时仍然跟着第三名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />3.分类统计 (并显示信息)</font></div><div><font size="2">&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp; B&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; -- -- ----------------------&nbsp;<br />&nbsp;&nbsp;&nbsp; m&nbsp;&nbsp; a&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp; a&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; m&nbsp;&nbsp; a&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp; b&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp; b&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; h&nbsp;&nbsp; b&nbsp;&nbsp; 3</font></div><div><font size="2">&nbsp;&nbsp; select a,c,sum(c)<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by a) from t2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 得到结果：<br />&nbsp;&nbsp; A&nbsp;&nbsp; B&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM(C)<strong style="color: black; background-color: #a0ffff; ">OVER</strong>(PARTITIONBYA)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -- -- ------- ------------------------&nbsp;<br />&nbsp;&nbsp; h&nbsp;&nbsp; b&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; m&nbsp;&nbsp; a&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; m&nbsp;&nbsp; a&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; n&nbsp;&nbsp; a&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; n&nbsp;&nbsp; b&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; n&nbsp;&nbsp; b&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; x&nbsp;&nbsp; b&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; 如果用sum，group by 则只能得到<br />&nbsp;&nbsp; A&nbsp;&nbsp; SUM(C)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -- ----------------------&nbsp;<br />&nbsp;&nbsp; h&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; m&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; n&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; x&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 无法得到B列值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />＝＝＝＝＝</font></div><div><div><p><font face="verdana, arial, helvetica" size="2"><span class="javascript" id="text2200299" style="font-size: 12px; ">select * from test<br /><br />数据:<br />A B C&nbsp;<br />1 1 1&nbsp;<br />1 2 2&nbsp;<br />1 3 3&nbsp;<br />2 2 5&nbsp;<br />3 4 6&nbsp;<br /><br /><br />---将B栏位值相同的对应的C 栏位值加总<br />select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum<br />from test<br /><br />A B C C_SUM&nbsp;<br />1 1 1 1&nbsp;<br />1 2 2 7&nbsp;<br />2 2 5 7&nbsp;<br />1 3 3 3&nbsp;<br />3 4 6 6&nbsp;<br /><br /><br /><br />---如果不需要已某个栏位的值分割,那就要用 null<br /><br />eg: 就是将C的栏位值summary 放在每行后面<br /><br />select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum<br />from test<br /><br />A B C C_SUM&nbsp;<br />1 1 1 17&nbsp;<br />1 2 2 17&nbsp;<br />1 3 3 17&nbsp;<br />2 2 5 17&nbsp;<br />3 4 6 17</span></font></p><p><font face="verdana, arial, helvetica" size="2"></font>&nbsp;</p><p><font face="verdana, arial, helvetica" size="2"><span class="javascript" style="font-size: 12px; ">求个人工资占部门工资的百分比</span></font></p><font face="verdana, arial, helvetica" size="2"><p><font face="verdana, arial, helvetica" size="2"><span class="javascript" id="text3005546" style="font-size: 12px; ">SQL&gt; select * from salary;<br /><br />NAME DEPT SAL<br />---------- ---- -----<br />a 10 2000<br />b 10 3000<br />c 10 5000<br />d 20 4000<br /><br />SQL&gt; select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;<br /><br />NAME DEPT SAL PERCENT<br />---------- ---- ----- ----------<br />a 10 2000 20<br />b 10 3000 30<br />c 10 5000 50<br />d 20 4000 100</span></font></p></font></div></div><div><font size="2">二：开窗函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开窗函数指定了分析函数工作的数据窗口大小，这个数据窗口大小可能会随着行的变化而变化，举例如下：&nbsp;<br />1：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by salary） 按照salary排序进行累计，order by是个默认的开窗函数<br />&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（partition by deptno）按照部门分区<br />2：<br />&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by salary range between 5 preceding and 5 following）<br />&nbsp;&nbsp; 每行对应的数据窗口是之前行幅度值不超过5，之后行幅度值不超过5<br />&nbsp;&nbsp; 例如:对于以下列<br />&nbsp;&nbsp;&nbsp;&nbsp; aa<br />&nbsp;&nbsp;&nbsp;&nbsp; 1<br />&nbsp;&nbsp;&nbsp;&nbsp; 2<br />&nbsp;&nbsp;&nbsp;&nbsp; 2<br />&nbsp;&nbsp;&nbsp;&nbsp; 2<br />&nbsp;&nbsp;&nbsp;&nbsp; 3<br />&nbsp;&nbsp;&nbsp;&nbsp; 4<br />&nbsp;&nbsp;&nbsp;&nbsp; 5<br />&nbsp;&nbsp;&nbsp;&nbsp; 6<br />&nbsp;&nbsp;&nbsp;&nbsp; 7<br />&nbsp;&nbsp;&nbsp;&nbsp; 9<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; sum(aa)<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by aa range between 2 preceding and 2 following）<br />&nbsp;&nbsp; 得出的结果是<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---------------------- -------------------------------------------------------&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 就是说，对于aa=5的一行 ，sum为&nbsp;&nbsp; 5-1&lt;=aa&lt;=5+2 的和<br />&nbsp;&nbsp; 对于aa=2来说 ，sum=1+2+2+2+3+4=14&nbsp;&nbsp;&nbsp;&nbsp; ；<br />&nbsp;&nbsp; 又如 对于aa=9 ，9-1&lt;=aa&lt;=9+2 只有9一个数，所以sum=9&nbsp;&nbsp;&nbsp; ；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />3：其它：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by salary rows between 2 preceding and 4 following）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每行对应的数据窗口是之前2行，之后4行&nbsp;<br />4：下面三条语句等效：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by salary rows between unbounded preceding and unbounded following）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每行对应的数据窗口是从第一行到最后一行，等效：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>（order by salary range between unbounded preceding and unbounded following）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by null)</font></div></div></span><img src ="http://www.blogjava.net/algz/aggbug/365263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-01 10:00 <a href="http://www.blogjava.net/algz/articles/365263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql plus操作oracel(windows平台)基础之简易新手篇 </title><link>http://www.blogjava.net/algz/articles/356201.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Aug 2011 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/356201.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/356201.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/356201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/356201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/356201.html</trackback:ping><description><![CDATA[<div><p style="color: #85a246" align="center"></p><div style="text-align: left;"><span style="color: #000000; ">注:登入SQLPLUS时报错,如下:</span><br /><span style="color: #000000; ">请输入用户名: &nbsp;system</span></div><div><div style="text-align: left;"><span style="color: #000000; ">输入口令:</span></div><div style="text-align: left;"><span style="color: #000000; ">ERROR:</span></div><div style="text-align: left;"><span style="color: #000000; ">ORA-12560: TNS: 协议适配器错误<br /></span><span style="color: #000000; ">原因:<div style="display: inline-block; "></div></span><span style="color: #000000; ">是ORCAL实例没启动(net [start/stop] 服务名).与Linux相反,不在SQLPLUS中启动实例.</span></div></div><br />平台: windows server 2003 Enterprise Editon  , oracle 10g(10.02.00.01)<br /><p>&nbsp;</p> <ol> <li>运行"开始-&gt;程序\Oracle - OraDb10g_home1\配置和移植工具"中的"Database Configuration  Assistant"，创建一个数据库。  </li><li>创建成功后，运行"开始-&gt;程序\Oracle - OraDb10g_home1\应用程序开发"中的"SQL Plus".用户名：sys  密码：123456 as sysdba(密码后面要加空格as空格sysdba) 主机字符串：如果是本机可不填。  </li><li> <p style="line-height: 150%; margin-right: 5px; margin-left: 5px; ">从命令提示符下使用sql*plus<br />sqlplus/nolog  <br />conn 用户名/密码 as sysdba  出现&#8221;已连接&#8220;后就是成功了。<br /></p></li></ol>　　　　<br />　　接下来，我们在SQL*Plus中实战一下，为我们下面将要做的打好基础。<br />　　用system登陆到SQL*Plus后，我们做如下操作(这次没有截图，有详细的说明)<br />-----------如登陆成功此1-3步不必做，直接做第4步----------------<br /> <ol> <li>SQL&gt;create user maxuan identified by max; #创建口令为max的用户maxuan  </li><li>SQL&gt;grant connect,resource to maxuan; #为用户maxuan授权  </li><li>SQL&gt;conn maxuan/max; #以用户maxuan进行连接  </li><li>SQL&gt;create table test(a number); #建立一个名为test的表，只有字段名为A的一列，数据类型为数字  </li><li>SQL&gt;insert into test values(1); #插入一条记录  </li><li>SQL&gt;select * from test; #查询记录，此时A列的第一行为1  </li><li>SQL&gt;update test set a=2; #更改记录，此时A列的第一行已改为2  </li><li>SQL&gt;commit; #提交.在完成数据库的插入，删除和修改操作时，只有当事务提交到数据库才算完成。  </li><li>SQL&gt;delete from test; #删除test表中所有的记录，此时test表中没有记录  </li><li>SQL&gt;roll;  #回滚到提交前，此时再查询test表，A列第一行值又回复到2<br /></li></ol>　　<br />　　<strong>oracle的数据类型</strong><br />　　在数据库中创建数据表的时候，我们需要定义表中所有字段的类型，数据类型大致分为：character,numberic,date,lob和raw等，这些是最基本的数据类型。当然在oracle中也允许自定义数据类型！<br />　　<br />　　在oracle中提供的character数据类型:<br />　　char():固定长度字符串，最大长度为2000字节，如果不指定长充，缺省为1个字节长。<br />　　varchar2():可变长度的字符串，最大长度为4000字节，具体定义时指明最大长度，这咱类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。如果数据长度没有达到最大值，oracle会根据数据大小自动调节字段长度。是<br />　　<br />　　最长用的数据类型。<br />　　nchar():根据字符集而定的固定长度字符串，最大长度2000字节。<br />　　nvarchar2():根据字符集而定的可变长度字符串，最大长度4000字节。<br />　　long:可变长字符列，最大长度限制为2GB，用于不需要作字符串搜索的长串数据。此类型是一个遗留下来的而且将来不会被支持的数据类型，逐渐被BLOB，CLOB，NCLOB等大的数据类型所取代。<br />　　<br />　　numberic数据类型用来存储负的和正的整数，分数和浮点型数据，在oracle中提供的numberic数据类型：<br />　　number(,):可变长的数值列，允许0、正值及负值，m是所有的有效数字的位数，n是小数点以后的位数。<br />　　<br />　　在oracle中提供的date数据类型:<br />　　date:缺省格式是dd-mon-yy(日-月-年)<br />　　<br />　　在oracle中提供的lob数据类型:<br />　　blob、clob、nclob：三种大型对象(lob)，用来保存较大的图形文件或带格式的文本文件，如word文档，以及音频、视频等非文本文件，最大长充是4GB。晕些数据存储在数据库内部保存。<br />　　bfile:在数据库外部保存的大型二进制对象文件，最大长度是4GB，这种外部的LOB类型，通过数据库记录变化情况，但是数据的具体保存是在数据库外部进行的。<br />　　<br />　　在oracle中提供的raw数据类型:<br />　　raw():可变长二进制数据，具体定义字段时必须指明最大长度，这种格式用来保存较小的图形文件或带格式的文本文件，它也是一种较老的数据类型，将被lob数据类型所取代。<br />　　long  raw:可变长二进制数据，最大长度是2GB，可以用来保存较大的图形或带格式的文本文件，以及音频、视频等非文本文件，这也是一种较老的数据类型，将被lob数据类型所取代。<br />　　<br />　　其它的数据类型：<br />　　rowid:这是oracle数据表中的一个伪例，它是数据表中每行数据内在的唯一标识<br />　　integer:整数类型<br />　　<br />补充知识：<br />SQL(Structure  Query  Language)语言是结构化查询语言，是数据库的核心语言，是面向集合的描述性非过程化语言。SQL语言共分为四大类：数据查询语言DQL,数据操纵语言DML，数据定义语言DDL,数据库控制语言DCL。<br />　　<br />　　1.数据查询语言DQL的基本结构是由select子句，from子句，where子句组成的查询块：<br />　　select  &lt;字段名表&gt; from &lt;表或视图名&gt; where  &lt;查询条件&gt;<br />　　<br />　　2.数据操纵语言DML完成在数据库中确定、修改、添加、删除某一数据值的任务(以下是部分常用DML语句):<br />　　insert　　增加数据行到表<br />　　delete　　从表中删除数据行<br />　　Update　　更改表中数据<br />　　<br />　　3.数据定义语言DDL完成定义数据库的结构，包括数据库本身、数据表、目录、视图等数据库元素(以下是部分常用DDL语句)<br />　　create  table　　创建表<br />　　create index　　创建索引<br />　　create view　　创建视图<br />　　alter  table　　增加表列，重定义表列，更改存储分配<br />　　drop table　　删除表<br />　　drop  index　　删除索引<br />　　<br />　　4.数据库控制语言DCL用来授予或回收访问数据库的某种特权，并控制数据库操纵事务发生的时间及效果，对数据库实行监视等。如：<br />　　grant　　　　将权限或角色授予用户或其它角色<br />　　revoke　　　　回收用户权限<br />　　roll　　　　回滚，是当某个对话更改了数据库中的数据后，由于某种原因用户不想提交此更改时，oracle所采取的保护操作。这是一个把信息恢复到用户使update、insert、delete前最后提交的状态。<br />　　commit　　　　提交。在完成数据库的插入，删除和修改操作时，只有当事务提交到数据库才算完成，有提交前只有操作数据库的本人才能看到，别人只有在最后提交完成才可以看到。<br /><br />　　一个<strong>购物网站后台数据库</strong>实例：<br />　　现在我们回到用J2EE体系开发购物网站的主题，开始实战建购物网站的后台数据库。<br />　　为了实现购物网站的基本的功能，我们需要建立四个表：商品列表(products)、商品类型表(item)、订单列表(orders)和管理员列表(admin)。表结构如下所示：<br />　　<br />　　item表结构（商品类型表)<br />　　字段名称　　数据类型　　　　允许空　　主键/外键　　备注　　<br />　　type_id　　INTEGER(自动编号)　否　  主键　　 商品类别ID标记<br />　　type　　        varchar2(30)　　      否　　　     商品类别名称<br />　　<br />　　product表结构(商品列表)<br />　　字段名称　　  数据类型　　　允许空　　主键/外键　　备注<br />　　product_id　INTEGER(自动编号)　否　　        主键　　商品ID标记<br />　　title　　             varchar2(30)　　  否　　　　                 商品名称<br />　　type_id　　       INTEGER　　　 否　       　外键　　商品类别标记<br />　　info　　            varchar2(80)　　    是　　　　               商品简介<br />　　price　           　number(16,2)　　  否　　　                　商品价格<br />　　<br />　　orders表结构(订单列表)<br />　　字段名称　　数据类型　　　  允许空　　主键/外键　　备注<br />　　order_id　　INTEGER(自动编号)　否　　       主键　　订单ID标记<br />　　name　　       varchar2(20)　　     否　　　　               顾客姓名<br />　　address　　  varchar2(100)　　    是　　　　              发货地址<br />　　tel　　              number(16)　         是　　　　               联系电话<br />　　email　　        varchar2(30)　        否　　　              　联系email<br />　　btime　　             date　　　       是　　　　               订购日期<br />　　product_id　　INTEGER　　   否　　      外键　   商品标记<br />　　uword　　        varchar2(100)　是　　　　              顾客留言<br />　　<br />　　admin表结构(管理员列表)<br />　　字段名称　　数据类型　　　　允许空　　主键/外键　　备注<br />　　admin_id　　INTEGER(自动编号)　否　　        主键　　  管理员ID标记<br />　　adminname　　varchar2(20)　　        否　　　　                  管理员名称<br />　　password　　varchar2(20)　　          否　　　　                  管理员密码<br />　　<br />　　设计完表结构后，我们就要开始创建了。<br />　　创建表我想已经不是什么难事了，那么我们要注意的是product、item、orders这三个表之间的关联，还有自动编号。<br />　　<br />　　下面是完整的SQL语句，在后面我会给出详细的说明，你可以在SQL*Plus里对照着输入，也可以将它存为SQL脚本文件，在SQL*Plus或SQLPlus  Worksheet里执行。当然也可以把代码直接拷贝到SQL*Plus里执行！<br />　　<br />　　代码：<br />　　rem ///BY MAXUAN  开始///<br />　　create table item(<br />　　type_id integer not null,<br />　　type  varchar2(30),<br />　　constraint item_pk primary  key(type_id)<br />　　);<br />　　<br />　　create table product(<br />　　product_id integer  not null,<br />　　title varchar2(30) not null, <br />　　type_id integer not  null,<br />　　info varchar2(80),<br />　　price number(16,2) not null,<br />　　constraint  product_pk primary key (product_id),<br />　　constraint product_fk foreign  key(type_id) references item(type_id)<br />　　);<br />　　<br />　　create table  orders(<br />　　order_id integer not null,<br />　　name varchar2(20) not  null,<br />　　address varchar2(100),<br />　　tel number(16),<br />　　email varchar2(30)  not null,<br />　　btime date,<br />　　product_id integer not null,<br />　　uword  varchar2(100),<br />　　constraint orders_pk primary key(order_id),<br />　　constraint  orders_fk foreign key(product_id) references  product(product_id)<br />　　);<br />　　<br />　　create table admin(<br />　　admin_id integer  not null,<br />　　adminname varchar2(20) not null,<br />　　password varchar2(20) not  null,<br />　　constraint admin_pk primary key(admin_id)<br />　　);</div><img src ="http://www.blogjava.net/algz/aggbug/356201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-08-10 11:29 <a href="http://www.blogjava.net/algz/articles/356201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 什么情况下进行事务回滚(面试题)</title><link>http://www.blogjava.net/algz/articles/352796.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352796.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352796.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352796.html</trackback:ping><description><![CDATA[<span style="font-size: 12px;">spring事务回滚.默认情况,unchecked异常,即运行时异常runntimeException回滚事务;checked异常,即Exception可try{}捕获的不会回滚.当然也可配置spring参数让其回滚.</span><img src ="http://www.blogjava.net/algz/aggbug/352796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 11:53 <a href="http://www.blogjava.net/algz/articles/352796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 中 jdbcTemplate 快速数据库开发</title><link>http://www.blogjava.net/algz/articles/352789.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352789.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352789.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352789.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;execSQL(String&nbsp;fileName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;myFile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">myFile.exists())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Can't&nbsp;Find&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DriverManagerDataSource&nbsp;dataSource</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DriverManagerDataSource();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setDriverClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.hsqldb.jdbcDriver</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUrl(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">jdbc:hsqldb:hsql://localhost/algz</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUsername(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setPassword(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JdbcTemplate&nbsp;jt</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JdbcTemplate();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jt.setDataSource(dataSource);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileReader(myFile));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;((sql&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;in.readLine())&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jt.execute(sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.getStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><img src ="http://www.blogjava.net/algz/aggbug/352789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 10:16 <a href="http://www.blogjava.net/algz/articles/352789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 存储过程基本语法及问题</title><link>http://www.blogjava.net/algz/articles/352675.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 20 Jun 2011 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352675.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352675.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352675.html</trackback:ping><description><![CDATA[<div><div>存储过程</div><div>注 :&nbsp;</div><div>(1)在procedure中想用ddl，就必须用execute &nbsp; immediat 'create table text1(id int not null primary key)';</div><div>且必须显授权(grant create any table to 用户名),否则报'insufficient privileges',无权限.</div><div>(2)每条语句都需以';'结尾.</div><div></div><div>1.基本语法 : 创建一个存储过程,如果存在就覆盖. &nbsp;(注:as/is没区别,只是兼容别的SQL而已)</div><div>create or replace procedure &nbsp;过程名(参数1 in number ,参数2 in number) is</div><div>变量1 integer:=0;</div><div>变量2 date;</div><div>exp &nbsp; exception; &nbsp;--定义异常</div><div>begin</div><div>&nbsp; &nbsp; --存储过程中调用DDL,必须用动态SQL方法</div><div>&nbsp; &nbsp; execute &nbsp;immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';</div><div>&nbsp; &nbsp; execute &nbsp; immediate &nbsp; 'insert &nbsp; into &nbsp; testtable values(1,110) ';&nbsp;</div><div></div><div>&nbsp; &nbsp;raise &nbsp; exp; &nbsp; &nbsp;--抛出异常</div><div>exception &nbsp; &nbsp; &nbsp; &nbsp;--异常处理</div><div>&nbsp; &nbsp; when &nbsp; exp &nbsp; then&nbsp;</div><div>&nbsp; &nbsp; dbms_output.put_line( '执行成功1 '); &nbsp; &nbsp;--控制台打印</div><div>&nbsp; &nbsp; when &nbsp; others &nbsp; then&nbsp;</div><div>&nbsp; &nbsp; dbms_output.put_line( '执行失败0 ');&nbsp;</div><div></div><div>end;</div><div></div><div>2.基本语句:</div><div>(1)变量赋值</div><div>&lt;1&gt;变量初始化赋值:=值;</div><div>&lt;2&gt;变量赋值: select ....into... from ....; &nbsp; &nbsp; --select ... from ... 方法在存储过程中时的格式</div><div>select name1,name2 into var1,var2 from table1&nbsp;</div><div></div><div>(2)For 循环</div><div>For ... in ... LOOP</div><div>--执行语句</div><div>end LOOP;</div><div></div><div>&lt;1&gt;循环遍历游标</div><div>create or replace procedure test() as</div><div>&nbsp; &nbsp; Cursor cursor is select name from student; name varchar(20);</div><div>begin</div><div>&nbsp; &nbsp; for name in cursor LOOP</div><div>&nbsp; &nbsp; begin</div><div>&nbsp; &nbsp; &nbsp; &nbsp; dbms_output.putline(name);&nbsp;</div><div>&nbsp; &nbsp; end;</div><div>&nbsp; &nbsp; end LOOP;</div><div>end test;</div><div></div><div>&lt;2&gt;循环遍历数组</div><div>&nbsp;create or replace procedure test(varArray in myPackage.TestArray) as</div><div>--(输入参数varArray 是自定义的数组类型，定义方式见标题6)</div><div>i number;</div><div>begin</div><div>i := 1; &nbsp;--存储过程数组是起始位置是从1开始的，与java、C、C++等语言不同。因为在Oracle中本是没有数组</div><div></div><div>的概念的，数组其实就是一张</div><div>--表(Table),每个数组元素就是表中的一个记录，所以遍历数组时就相当于从表中的第一条记录开始遍历</div><div>for i in 1..varArray.count LOOP &nbsp; &nbsp;&nbsp;</div><div>dbms_output.putline(&amp;apos;The No.&amp;apos;|| i || &amp;apos;record in varArray is:&amp;apos;||varArray(i)); &nbsp;&nbsp;</div><div>&nbsp;end LOOP;</div><div>end test;</div><div></div><div>3.代码抛出异常用raise (异常名);</div><div></div><div>4.游标 :&nbsp;</div><div>(1)系统级游标:cursor SYS_REFCURSOR;只能通过open方法打开和赋值</div><div>OPEN cursor FOR select name1,name2 from table1 where a='1'; &nbsp;--sql语法</div><div>LOOP</div><div>&nbsp; &nbsp; FETCH cursor INTO name1,name2; &nbsp; &nbsp;--只能通过fetch into 打开和遍历</div><div>&nbsp; &nbsp; exit when cursor%NOTFOUND; &nbsp; &nbsp; &nbsp; &nbsp; --可用三个状态:%NOTFOUND(未找到记录);%FOUND(找到记</div><div></div><div>录);%ROWCOUNT(当前游标指向的行位置)</div><div></div><div>&nbsp; &nbsp; &nbsp;dbms_output.putline(name1||name2);</div><div>END LOOP;</div><div></div><div>5.连接运算符 : || ,即'ABC'||'123' : ABC123</div><div></div><div>6.单行注释: --;多行:/**/;</div></div><img src ="http://www.blogjava.net/algz/aggbug/352675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-20 17:12 <a href="http://www.blogjava.net/algz/articles/352675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 解决中文乱码</title><link>http://www.blogjava.net/algz/articles/351345.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 30 May 2011 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/351345.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/351345.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/351345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/351345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/351345.html</trackback:ping><description><![CDATA[jdbc:mysql://localhost:3306/test?characterEncoding=UTF8<br />一看就明了.与数据库的连接采用UTF-8.<img src ="http://www.blogjava.net/algz/aggbug/351345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-05-30 16:15 <a href="http://www.blogjava.net/algz/articles/351345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]sql的left join 命令详解</title><link>http://www.blogjava.net/algz/articles/228220.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/228220.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/228220.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/228220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/228220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/228220.html</trackback:ping><description><![CDATA[给个通俗的解释吧. <br />
例表a <br />
aid adate <br />
1 a1 <br />
2 a2 <br />
3 a3 <br />
表b <br />
bid bdate <br />
1 b1 <br />
2 b2 <br />
4 b4 <br />
两个表a,b相连接,要取出id相同的字段 <br />
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据. <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
那么left join 指: <br />
select * from a left join b on a.aid = b.bid <br />
首先取出a表中所有数据,然后再加上与a,b匹配的的数据 <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
3 a3 空字符 <br />
同样的也有right join <br />
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
4 空字符 b4<br />
<br />
LEFT JOIN 或 LEFT OUTER JOIN。 <br />
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------http://www.phpweblog.net/zwws/archive/2007/02/23/944.html<br />
<img src ="http://www.blogjava.net/algz/aggbug/228220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:58 <a href="http://www.blogjava.net/algz/articles/228220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]SQL中的left outer join,inner join,right outer join用法</title><link>http://www.blogjava.net/algz/articles/228219.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/228219.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/228219.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/228219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/228219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/228219.html</trackback:ping><description><![CDATA[使用关系代数合并数据<br />
1 关系代数<br />
合并数据集合的理论基础是关系代数，它是由E.F.Codd于1970年提出的。<br />
在关系代数的形式化语言中：<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用表、或者数据集合表示关系或者实体。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用行表示元组。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用列表示属性。<br />
关系代数包含以下8个关系运算符<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选取――返回满足指定条件的行。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投影――从数据集合中返回指定的列。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 笛卡尔积――是关系的乘法，它将分别来自两个数据集合中的行以所有可能的方式进行组合。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并――关系的加法和减法，它可以在行的方向上合并两个表中的数据，就像把一个表垒在另一个表之上一样。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 交――返回两个数据集合所共有的行。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 差――返回只属于一个数据集合的行。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连接――在水平方向上合并两个表，其方法是：将两个表中在共同数据项上相互匹配的那些行合并起来。<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除――返回两个数据集之间的精确匹配。<br />
此外，作为一种实现现代关系代数运算的方法，SQL还提供了：<br />
?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子查询――类似于连接，但更灵活；在外部查询中，方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。<br />
本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。<br />
2 使用连接<br />
2.1 连接类型<br />
在关系代数中，连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算，然后对生成的结果集合进行选取运算，确保
只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合（通常是表），并产生一个新的结果集合，其方
法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。<br />
SQL提供了多种类型的连接方式，它们之间的区别在于：从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。<br />
连接类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义<br />
内连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只连接匹配的行<br />
左外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含左边表的全部行（不管右边的表中是否存在与它们匹配的行），以及右边表中全部匹配的行<br />
右外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含右边表的全部行（不管左边的表中是否存在与它们匹配的行），以及左边表中全部匹配的行<br />
全外连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含左、右两个表的全部行，不管另外一边的表中是否存在与它们匹配的行。<br />
(H)(theta)连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用等值以外的条件来匹配左、右两个表中的行<br />
交叉连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成笛卡尔积－它不使用任何匹配或者选取条件，而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配<br />
在INFORMIX中连接表的查询<br />
如果FROM子句指定了多于一个表引用，则查询会连接来自多个表的行。连接条件指定各列之间（每个表至少一列）进行连接的关系。因为正在比较连接条件中的列，所以它们必须具有一致的数据类型。<br />
SELECT语句的FROM子句可以指定以下几种类型的连接<br />
FROM子句关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相应的结果集<br />
CROSS <strong style="color: black; background-color: #99ff99;">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 笛卡尔乘积（所有可能的行对）<br />
INNER <strong style="color: black; background-color: #99ff99;">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅对满足连接条件的CROSS中的列<br />
<strong style="color: black; background-color: #ffff66;">LEFT</strong> <strong style="color: black; background-color: #a0ffff;">OUTER</strong> <strong style="color: black; background-color: #99ff99;">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个表满足条件的行，和另一个表的所有行<br />
RIGHT <strong style="color: black; background-color: #a0ffff;">OUTER</strong> <strong style="color: black; background-color: #99ff99;">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与<strong style="color: black; background-color: #ffff66;">LEFT</strong>相同，但两个表的角色互换<br />
FULL <strong style="color: black; background-color: #a0ffff;">OUTER</strong> <strong style="color: black; background-color: #99ff99;">JOIN</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: black; background-color: #ffff66;">LEFT</strong> <strong style="color: black; background-color: #a0ffff;">OUTER</strong> 和 RIGHT <strong style="color: black; background-color: #a0ffff;">OUTER</strong>中所有行的超集<br />
<br />
2.2 内连接（Inner <strong style="color: black; background-color: #99ff99;">Join</strong>）<br />
内连接是最常见的一种连接，它页被称为普通连接，而E.FCodd最早称之为自然连接。<br />
下面是ANSI SQL－92标准<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
inner <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
where i.inst_no = "5801"<br />
其中inner可以省略。<br />
等价于早期的连接语法<br />
select * <br />
from t_institution i, t_teller t <br />
where i.inst_no = t.inst_no<br />
and i.inst_no = "5801"<br />
<br />
2.3 外连接<br />
2.3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 左外连接(<strong style="color: black; background-color: #ffff66;">Left</strong> <strong style="color: black; background-color: #a0ffff;">Outer</strong> Jion)<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: #ffff66;">left</strong> <strong style="color: black; background-color: #a0ffff;">outer</strong> <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
其中<strong style="color: black; background-color: #a0ffff;">outer</strong>可以省略。<br />
2.3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右外连接(Rigt <strong style="color: black; background-color: #a0ffff;">Outer</strong> Jion)<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
right <strong style="color: black; background-color: #a0ffff;">outer</strong> <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
2.3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全外连接(Full <strong style="color: black; background-color: #a0ffff;">Outer</strong>)<br />
全外连接返回参与连接的两个数据集合中的全部数据，无论它们是否具有与之相匹配的行。在功能上，它等价于对这两个数据集合分别进行左外连接和右外连接，然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。<br />
在现实生活中，参照完整性约束可以减少对于全外连接的使用，一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下，全外连接就变得非常有用了，你可以使用它来清理数据库中的数据。<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
full <strong style="color: black; background-color: #a0ffff;">outer</strong> <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
2.3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外连接与条件配合使用<br />
当在内连接查询中加入条件是，无论是将它加入到<strong style="color: black; background-color: #99ff99;">join</strong>子句，还是加入到where子句，其效果是完全一样的，但对于外连接情况就不同了。当把条件加入到<strong style="color: black; background-color: #99ff99;">join</strong>子
句时，SQL Server、Informix会返回外连接表的全部行，然后使用指定的条件返回第二个表的行。如果将条件放到where子句中，SQL
Server将会首先进行连接操作，然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响：<br />
条件在<strong style="color: black; background-color: #99ff99;">join</strong>子句<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: #ffff66;">left</strong> <strong style="color: black; background-color: #a0ffff;">outer</strong> <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
and i.inst_no = &#8220;5801&#8221;<br />
结果是：<br />
inst_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; teller_no&nbsp;&nbsp;&nbsp; teller_name<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tom<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; david<br />
5802&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越秀区<br />
5803&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 白云区<br />
条件在where子句<br />
select * <br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
<strong style="color: black; background-color: #ffff66;">left</strong> <strong style="color: black; background-color: #a0ffff;">outer</strong> <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t <br />
on i.inst_no = t.inst_no<br />
where i.inst_no = &#8220;5801&#8221;<br />
结果是：<br />
inst_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; teller_no&nbsp;&nbsp;&nbsp; teller_name<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tom<br />
5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; david<br />
<br />
2.4 自身连接<br />
自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系（也称作递归关系）中抽取数据。例如人力资源数据库中雇员与老板的关系。<br />
下面例子是在机构表中查找本机构和上级机构的信息。<br />
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name<br />
from t_institution i<br />
<strong style="color: black; background-color: #99ff99;">join</strong> t_institution s<br />
on i.superior_inst = s.inst_no<br />
<br />
结果是：<br />
superior_inst sup_inst_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst_name<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5801&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天河区<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5802&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越秀区<br />
800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 广州市&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5803&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 白云区<br />
<br />
2.5 交叉(无限制) 连接<br />
交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合，而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中
一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如，如果第一个数据源中有5个行，而第二个数据源中有4个行，那么在它们之间进行交叉连接
就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。<br />
大多数交叉连接都是由于错误操作而造成的；但是它们却非常适合向数据库中填充例子数据，或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。<br />
select *<br />
from&nbsp;&nbsp;&nbsp; t_institution i <br />
cross <strong style="color: black; background-color: #99ff99;">join</strong> t_teller t<br />
在交叉连接中没有on条件子句<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----http://hi.baidu.com/llscompazz/blog/item/dc5e23d9ce2b62eb39012fb4.html<br />
<img src ="http://www.blogjava.net/algz/aggbug/228219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:55 <a href="http://www.blogjava.net/algz/articles/228219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]SQL中的各种JOIN（inner join,full outer join,left join,right join,cross join ）</title><link>http://www.blogjava.net/algz/articles/228218.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/228218.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/228218.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/228218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/228218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/228218.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; color: #868374;">
<p style="margin: 0cm 0cm 0pt; line-height: 150%; text-align: left;" align="left"><font color="#000000"><strong><span style="font-size: 12pt; line-height: 150%;">SQL</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">中的各种JOIN</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">（<span>inner
join,full outer join,left join,right join,cross join
</span>）</span></strong></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><font color="#000000" size="3">SQL</font><font color="#000000" size="3">中的连接可以分为内连接，外连接，以及交叉连接 <span>(即是笛卡尔积</span></font><font size="3"><font color="#000000">) <br />
<br />
a. 交叉连接</font></font><font size="3"><font color="#000000"><span>CROSS
JOIN<br />
</span>如果不带WHERE条件子句，它将会返回被连接的两个表的笛卡尔积，返回结果的行数等于两个表行数的乘积；</font></font><br />
<br />
<font color="#000000" size="3">举例,下列A、B、<span>C
</span>执行结果相同，但是效率不一样：</font><span><br />
<font size="3"><font color="#000000">A:SELECT
* FROM table1 CROSS JOIN table2<br />
B:SELECT * FROM
table1,table2</font></font></span></p>
</span>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">C:<span>select * from table1 a inner join table2
b</span></font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><br />
<font color="#000000" size="3">A:select a.*,b.* from table1
a,table2 b where a.id=b.id<br />
B:select * from table1 a cross join table2 b where a.id=b.id
(</font></span><span><font size="3"><font color="#000000">注：<span>cross
join</span>后加条件只能用where,不能用on)</font></font></span><br />
<font color="#000000" size="3">C:</font><font size="3"><font color="#000000"><span>select * from table1
a inner join table2 b on a.id=b.id</span></font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><br />
<font color="#000000" size="3">一般不建议使用方法<span>A和B，因为如果有WHERE子句的话，往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。</span></font><font size="3"><font color="#000000"><span>
<br />
</span>因此，如果两个需要求交际的表太大，将会非常非常慢，不建议使用。</font></font><br />
<br />
<font color="#000000" size="3">b. </font><font color="#000000" size="3">内连接</font><font size="3"><font color="#000000"><span>INNER
JOIN<br />
</span>两边表同时符合条件的组合</font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">如果仅仅使用</font><span><br />
<font size="3"><font color="#000000">SELECT * FROM table1 INNER JOIN
table2</font></font></span></span></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">内连接如果没有指定连接条件的话，和笛卡尔积的交叉连接结果一样，但是不同于笛卡尔积的地方是，没有笛卡尔积那么复杂要先生成行数乘积的数据表，内连接的效率要高于笛卡尔积的交叉连接。</font><span><br />
<br />
<font size="3"><font color="#000000">但是通常情况下，使用<span>INNER
JOIN</span>需要指定连接条件。</font></font></span></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">***************关于等值连接和自然连接</font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">等值连接<span>(=号应用于连接条件<span>,
</span>不会去除重复的列)</span></font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">自然连接(会去除重复的列)</font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">数据库的连接运算都是自然连接，因为不允许有重复的行（元组）存在。</font><br />
<font size="3"><font color="#000000">例如：</font></font></p>
<p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">SELECT * FROM table1 AS a INNER JOIN table2 AS b on
a.column=b.column<br />
<br />
c. </font></span><span><font color="#000000" size="3">外连接</font><font size="3"><font color="#000000"><span>OUTER
JOIN<br />
</span>指定条件的内连接，仅仅返回符合连接条件的条目。</font></font><br />
<font color="#000000" size="3">外连接则不同，返回的结果不仅包含符合连接条件的行，而且包括左表(左外连接时<span>),
</span>右表(右连接时)或者两边连接(全外连接时)的所有数据行。</font><br />
<br />
<font color="#000000" size="3">1)</font><font color="#000000" size="3">左外连接</font><font size="3"><font color="#000000"><span>LEFT [OUTER] JOIN
<br />
</span>显示符合条件的数据行，同时显示左边数据表不符合条件的数据行，右边没有对应的条目显示</font></font><font size="3"><font color="#000000">NULL<br />
例如</font></font><span><br />
<font color="#000000" size="3">SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON
a.column=b.column<br />
2)</font></span><font color="#000000" size="3">右外连接</font><font size="3"><font color="#000000"><span>RIGHT [OUTER]
JOIN<br />
</span>显示符合条件的数据行，同时显示右边数据表不符合条件的数据行，左边没有对应的条目显示</font></font><font size="3"><font color="#000000">NULL<br />
例如</font></font><span><br />
<font color="#000000" size="3">SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON
a.column=b.column<br />
3)</font></span><font color="#000000" size="3">全外连接</font><font size="3"><font color="#000000"><span>full [outer]
join<br />
</span>显示符合条件的数据行，同时显示左右不符合条件的数据行，相应的左右两边显示NULL，即显示左连接、右连接和内连接的并集</font></font></span></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------http://hi.baidu.com/magickerr/blog/item/393c0a01aa13290b7aec2c63.html
<img src ="http://www.blogjava.net/algz/aggbug/228218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:53 <a href="http://www.blogjava.net/algz/articles/228218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 外键关联的问题解决方法</title><link>http://www.blogjava.net/algz/articles/197804.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 02 May 2008 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/197804.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/197804.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/197804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/197804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/197804.html</trackback:ping><description><![CDATA[一.具有外键的表格,&nbsp; HQL查询---"from A类"报错.<br />
解决方法:&nbsp; 不能模糊查询,需指定查询的属性.&nbsp; 如:&nbsp; "select 别名.属性 from A类 as 别名".<br />
(注:有时候问题就是那么的奇怪,如遇到上述问题,可以试试这个方法.MYSQL6.0好像没这问题;5.0好像有.)<br />
<br />
二.A表的外键定义B表的非主键,&nbsp; HQL查询返回结果为空值或报空指针错误或类型转换失败.<br />
解决方法:&nbsp; 因为Hibernate 默认外键的关联是主键,&nbsp; 所以需加上&lt;many-to-one&nbsp; property-ref="关联类的属性" ......&gt; <br />
关联类.HBM.XML---&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="as" inverse="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key property-ref="content"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;column name="bc" length="45" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="com.a.A" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt; 
<img src ="http://www.blogjava.net/algz/aggbug/197804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-05-02 22:55 <a href="http://www.blogjava.net/algz/articles/197804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主表的键是从表的外键,外键的级联.</title><link>http://www.blogjava.net/algz/articles/191218.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 07 Apr 2008 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/191218.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/191218.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/191218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/191218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/191218.html</trackback:ping><description><![CDATA[主表:&nbsp; 一方.<br />
从表:&nbsp; N方.<br />
主表的键删除,从表与之对应的外键也删除.<br />
从表的外键删除,主表无反应.<br />
ON DELETE/UPDATE CASCADE,在外键定义时加上. <br />
<br />
以下内容摘自:http://www.jianglb.com/2007/09/02/mysql-foreign-key.html<br />
<br />
<p>外键的作用：</p>
<p>保持数据一致性，完整性，主要目的是控制存储在外键表中的数据。 使两张表形成关联，外键只能引用外表中的列的值！<br />
例如：<br />
a b 两个表<br />
a表中存有 客户号，客户名称<br />
b表中存有 每个客户的订单<br />
有了外键后<br />
你只能在确信b 表中没有客户x的订单后，才可以在a表中删除客户x</p>
<p>建立外键的前提： 本表的列必须与外键类型相同(外键必须是外表主键)。 </p>
<p>指定主键关键字： foreign key(列名) </p>
<p>引用外键关键字： references &lt;外键表名&gt;(外键列名) </p>
<p>事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值）,set Default（设默认值）,[默认]no action </p>
<p>例如： </p>
<p>outTable表 主键 id 类型 int </p>
<p>创建含有外键的表：<br />
create table temp(<br />
id int,<br />
name char(20),<br />
foreign key(id) references outTable(id) on delete cascade on update cascade); </p>
<p>说明：把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。 </p>
<img src ="http://www.blogjava.net/algz/aggbug/191218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-04-07 12:05 <a href="http://www.blogjava.net/algz/articles/191218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]在MySQL中利用外键实现级联删除！</title><link>http://www.blogjava.net/algz/articles/191215.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 07 Apr 2008 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/191215.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/191215.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/191215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/191215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/191215.html</trackback:ping><description><![CDATA[首先，目前在产品环境可用的MySQL版本（指4.0.x和4.1.x）中，只有InnoDB引擎才允许使用外键，所以，我们的数据表必须使用InnoDB引擎。 <br />
<br />
下面，我们先创建以下测试用数据库表： <br />
<br />
<pre><br />
CREATE&nbsp;TABLE&nbsp;`roottb`&nbsp;(
<br />
&nbsp;&nbsp;`id`&nbsp;INT(11)&nbsp;UNSIGNED&nbsp;AUTO_INCREMENT&nbsp;NOT&nbsp;NULL,
<br />
&nbsp;&nbsp;`data`&nbsp;VARCHAR(100)&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;'',
<br />
&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(`id`)
<br />
)&nbsp;TYPE=InnoDB;
<br />
<br />
CREATE&nbsp;TABLE&nbsp;`subtb`&nbsp;(
<br />
&nbsp;&nbsp;`id`&nbsp;INT(11)&nbsp;UNSIGNED&nbsp;AUTO_INCREMENT&nbsp;NOT&nbsp;NULL,
<br />
&nbsp;&nbsp;`rootid`&nbsp;INT(11)&nbsp;UNSIGNED&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;'0',
<br />
&nbsp;&nbsp;`data`&nbsp;VARCHAR(100)&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;'',
<br />
&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;(`id`),
<br />
&nbsp;&nbsp;INDEX&nbsp;(`rootid`),
<br />
&nbsp;&nbsp;FOREIGN&nbsp;KEY&nbsp;(`rootid`)&nbsp;REFERENCES&nbsp;roottb(`id`)&nbsp;ON&nbsp;DELETE&nbsp;CASCADE
<br />
)&nbsp;TYPE=InnoDB;
<br />
</pre>
<br />
<br />
注意： <br />
1、必须使用InnoDB引擎； <br />
2、外键必须建立索引（INDEX）； <br />
3、外键绑定关系这里使用了&#8220;&nbsp;ON&nbsp;DELETE&nbsp;CASCADE&#8221;，意思是如果外键对应数据被删除，将关联数据完全删除，更多信息请参考MySQL手册中关于InnoDB的文档； <br />
<br />
好，接着我们再来插入测试数据： <br />
<br />
<pre><br />
INSERT&nbsp;INTO&nbsp;`roottb`&nbsp;(`id`,`data`)
<br />
&nbsp;&nbsp;VALUES&nbsp;('1',&nbsp;'test&nbsp;root&nbsp;line&nbsp;1'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('2',&nbsp;'test&nbsp;root&nbsp;line&nbsp;2'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('3',&nbsp;'test&nbsp;root&nbsp;line&nbsp;3');
<br />
<br />
INSERT&nbsp;INTO&nbsp;`subtb`&nbsp;(`id`,`rootid`,`data`)
<br />
&nbsp;&nbsp;VALUES&nbsp;('1',&nbsp;'1',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;1'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('2',&nbsp;'1',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;1'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('3',&nbsp;'1',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;1'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('4',&nbsp;'2',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;2'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('5',&nbsp;'2',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;2'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('6',&nbsp;'2',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;2'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('7',&nbsp;'3',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;3'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('8',&nbsp;'3',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;3'),
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;('9',&nbsp;'3',&nbsp;'test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;3');
<br />
</pre>
&nbsp;&nbsp; <br />
<br />
我们先看一下当前数据表的状态： <br />
<br />
<pre><br />
mysql&gt;;&nbsp;show&nbsp;tables;
<br />
+----------------+
<br />
|&nbsp;Tables_in_test&nbsp;|
<br />
+----------------+
<br />
|&nbsp;roottb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
|&nbsp;subtb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
+----------------+
<br />
2&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.00&nbsp;sec)
<br />
<br />
mysql&gt;;&nbsp;select&nbsp;*&nbsp;from&nbsp;`roottb`;
<br />
+----+------------------+
<br />
|&nbsp;id&nbsp;|&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
+----+------------------+
<br />
|&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;root&nbsp;line&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;2&nbsp;|&nbsp;test&nbsp;root&nbsp;line&nbsp;2&nbsp;|
<br />
|&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;root&nbsp;line&nbsp;3&nbsp;|
<br />
+----+------------------+
<br />
3&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.05&nbsp;sec)
<br />
<br />
mysql&gt;;&nbsp;select&nbsp;*&nbsp;from&nbsp;`subtb`;
<br />
+----+--------+----------------------------+
<br />
|&nbsp;id&nbsp;|&nbsp;rootid&nbsp;|&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
+----+--------+----------------------------+
<br />
|&nbsp;&nbsp;1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;3&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;2&nbsp;|
<br />
|&nbsp;&nbsp;5&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;2&nbsp;|
<br />
|&nbsp;&nbsp;6&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;2&nbsp;|
<br />
|&nbsp;&nbsp;7&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
|&nbsp;&nbsp;8&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
|&nbsp;&nbsp;9&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
+----+--------+----------------------------+
<br />
9&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.01&nbsp;sec)
<br />
</pre>
<br />
<br />
嗯，一切都正常，好，下面我们要试验我们的级联删除功能了。 <br />
<br />
我们将只删除roottb表中id为2的数据记录，看看subtb表中rootid为2的相关子纪录是否会自动删除： <br />
<br />
<pre><br />
mysql&gt;;&nbsp;delete&nbsp;from&nbsp;`roottb`&nbsp;where&nbsp;`id`='2';
<br />
Query&nbsp;OK,&nbsp;1&nbsp;row&nbsp;affected&nbsp;(0.03&nbsp;sec)
<br />
<br />
mysql&gt;;&nbsp;select&nbsp;*&nbsp;from&nbsp;`roottb`;
<br />
+----+------------------+
<br />
|&nbsp;id&nbsp;|&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
+----+------------------+
<br />
|&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;root&nbsp;line&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;root&nbsp;line&nbsp;3&nbsp;|
<br />
+----+------------------+
<br />
2&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.00&nbsp;sec)
<br />
<br />
mysql&gt;;&nbsp;select&nbsp;*&nbsp;from&nbsp;`subtb`;
<br />
+----+--------+----------------------------+
<br />
|&nbsp;id&nbsp;|&nbsp;rootid&nbsp;|&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<br />
+----+--------+----------------------------+
<br />
|&nbsp;&nbsp;1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;3&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;1&nbsp;|
<br />
|&nbsp;&nbsp;7&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;1&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
|&nbsp;&nbsp;8&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;2&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
|&nbsp;&nbsp;9&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;|&nbsp;test&nbsp;sub&nbsp;line&nbsp;3&nbsp;for&nbsp;root&nbsp;3&nbsp;|
<br />
+----+--------+----------------------------+
<br />
6&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.01&nbsp;sec)
<br />
</pre>
<br />
<br />
嗯，看subtb表中对应数据确实自动删除了，测试成功。 <br />
<br />
结论：在MySQL中利用外键实现级联删除成功！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------转帖:http://www.chinaunix.net/jh/17/462977.html
 <img src ="http://www.blogjava.net/algz/aggbug/191215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-04-07 12:00 <a href="http://www.blogjava.net/algz/articles/191215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>