ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品视频自拍,91短视频在线,久久婷婷久久一区二区三区http://www.aygfsteel.com/algz/articles/366838.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 20 Dec 2011 06:10:00 GMThttp://www.aygfsteel.com/algz/articles/366838.htmlhttp://www.aygfsteel.com/algz/comments/366838.htmlhttp://www.aygfsteel.com/algz/articles/366838.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/366838.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/366838.html
Hibernate Annotation几种兌™”映射
一对一(One-To-One)
使用@OneToOne注解建立实体Bean之间的一对一兌™”。一对一兌™”有三¿Uæƒ…况:(x¨¬)(1).å…Œ™”的实体都å…׃ín同样的主键,(2).其中一个实体通过外键兌™”到另一个实体的主键(注意要模拟一对一兌™”必须在外键列上添加唯一¾U¦æŸ)åQ?3).通过兌™”表来保存两个实体之间的连接关¾p?要模拟一对一兌™”必须在每一个外键上æ·ÕdР唝䏀¾U¦æŸ)ã€?/div>
 
1.å…׃ín主键的一对一兌™”映射åQ?/div>
@Entity
@Table(name="Test_Body")
public class Body {
   private Integer id;
   private Heart heart;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   @OneToOne
   @PrimaryKeyJoinColumn
   public Heart getHeart() {
      return heart;
   }
   public void setHeart(Heart heart) {
      this.heart = heart;
   }
}
@Entity
@Table(name="Test_Heart")
public class Heart {
   private Integer id;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
}
通过@PrimaryKeyJoinColumnæ‰ÒŽ(gu¨©)³¨å®šä¹‰äº?ji¨£n)一对一兌™”
 
2.使用外键˜q›è¡Œå®žä½“一对一兌™”åQ?/div>
@Entity
@Table(name="Test_Trousers")
public class Trousers {
   @Id
   public Integer id;
   @OneToOne
   @JoinColumn(name = "zip_id")
   public TrousersZip zip;
}
@Entity
@Table(name="Test_TrousersZip")
public class TrousersZip {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "zip")
   public Trousers trousers;
}
上面的例子是指Trousers通过Trousers的外键列zip_idå’ŒTrousersZipå…Œ™”åQŒ@JoinColumnæ‰ÒŽ(gu¨©)³¨å®šä¹‰äº?ji¨£n)联接列åQŒè¯¥æ‰ÒŽ(gu¨©)³¨å’Œ@Columnæ‰ÒŽ(gu¨©)³¨æœ‰ç‚¹¾cÖM¼¼åQŒä½†æ˜¯å¤šäº?ji¨£n)一个名为referencedColumnName的参数。该参数定义äº?ji¨£n)所兌™”目标实体中的联接列,注意åQŒå½“referencedColumnNameå…Œ™”到非主键列的时候,兌™”的目标类必须实现SerializableåQŒè¿˜è¦æ³¨æ„çš„æ˜¯æ‰€æ˜ åƒçš„属性对应单个列åQˆå¦åˆ™æ˜ ž®„无效)(j¨ª)
一对一兌™”可能是双向的åQŒåœ¨åŒå‘å…Œ™”中,有且仅有一端作ä¸ÞZ¸»ä½“(owneråQ‰ç«¯å­˜åœ¨åQšä¸»ä½“端负责¾l´æŠ¤è”接列(åÏx›´æ–ŽÍ¼‰(j¨ª)åQŒå¯¹äºŽä¸éœ€è¦ç»´æŠ¤è¿™¿Uå…³¾pȝš„从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌™”属性。例子中åQŒmappedByçš„å€égØ“(f¨´)zip。最后,不必也不能再在被兌™”端(ownedsideåQ‰å®šä¹‰è”接列äº?ji¨£n),因äØ?f¨´)已经在主体端声明äº?ji¨£n)ã€?/div>
如果在主体没有声明@JoinColumnåQŒç³»¾lŸè‡ªåŠ¨è¿›è¡Œå¤„ç†ï¼š(x¨¬)在主表(owner tableåQ‰ä¸­ž®†åˆ›å»ø™”接列åQŒåˆ—åäØ“(f¨´)åQšä¸»ä½“的兌™”属性名+下划¾U?被关联端的主键列名。上面的例子中是zip_id,因䨓(f¨´)Trousers中的兌™”属性名为zipåQŒTrousersZip的主键是idã€?/div>
 
3.通过兌™”表定义一对一兌™”
@Entity
@Table(name="Test_People")
public class People {
   @Id
   public Integer id;
   @OneToOne
   @JoinTable(name ="TestPeoplePassports",
      joinColumns =@JoinColumn(name="people_fk"),
      inverseJoinColumns =@JoinColumn(name="passport_fk")
   )
   public Passport passport;
}
@Entity
@Table(name="Test_Passport")
public class Passport {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "passport")
   public People people;
}
Peopleé€šè¿‡åäØ“(f¨´)TestPeoplePassports的关联表和Passportå…Œ™”。该兌™”表拥有名为passport_fk的外键列åQŒè¯¥å¤–键指向Passportè¡¨ï¼Œè¯¥ä¿¡æ¯å®šä¹‰äØ“(f¨´)inverseJoinColoumns的属性å€û|¼Œè€Œpeople_fk外键列指向Peopleè¡¨ï¼Œè¯¥ä¿¡æ¯å®šä¹‰äØ“(f¨´)joinColumns的属性倹{€?/div>
˜q™ç§å…Œ™”可能是双向的åQŒåœ¨åŒå‘å…Œ™”中,有且仅有一端作ä¸ÞZ¸»ä½“(owneråQ‰ç«¯å­˜åœ¨åQšä¸»ä½“端负责¾l´æŠ¤è”接列(åÏx›´æ–ŽÍ¼‰(j¨ª)åQŒå¯¹äºŽä¸éœ€è¦ç»´æŠ¤è¿™¿Uå…³¾pȝš„从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌™”属性。例子中åQŒmappedByçš„å€égØ“(f¨´)passport。最后,不必也不能再在被兌™”端(ownedsideåQ‰å®šä¹‰è”接列äº?ji¨£n),因äØ?f¨´)已经在主体端声明äº?ji¨£n)ã€?/div>
以上是一对一兌™”的三¿UåŞ式,下面介绍多对一兌™”ã€?/div>
 
 
 
多对一(Many-to-One)
使用@ManyToOneæ‰ÒŽ(gu¨©)³¨æ¥å®žçŽ°å¤šå¯¹ä¸€å…Œ™”ã€?/div>
@ManyToOneæ‰ÒŽ(gu¨©)³¨æœ‰ä¸€ä¸ªåä¸ºtargetEntity的参敎ͼŒè¯¥å‚数定义了(ji¨£n)目标实体名,通常不需要定义该参数åQŒå› ä¸ºåœ¨å¤§éƒ¨åˆ†æƒ…况下默认å€?表示兌™”关系的属性类åž?ž®±å¯ä»¥å¾ˆå¥½çš„æ»¡èƒö需求了(ji¨£n)。不˜q‡ä¸‹é¢è¿™¿Uæƒ…况下˜q™ä¸ªå‚æ•°ž®±æ˜¾å¾—有意义äº?ji¨£n)ï¼?x¨¬)ä½¿ç”¨æŽ¥å£ä½œäØ“(f¨´)˜q”å›žå€ÆD€Œä¸æ˜¯å¸¸è§çš„实体ã€?/div>
@ManyToOne(targetEntity=CompanyImpl.class)
@JoinColoumn(name=”COPM_ID”)
Public Company getCompany(){
   return company;
}
多对一的配¾|®æ–¹å¼æœ‰ä¸¤ç§åQ?1)通过@JoinColoumn映像(2)通过兌™”表的方式来映åƒ?/div>
 
(1)           通过@JoinColoumn映射
SRD Framework中Company,Category例子åQ?/div>
CompanyåQ?/div>
@ManyToOne
   @JoinColumn(name = "CATEGORY_OPTION_ID")
   private Category category = null;
   CategoryåQ?/div>
@DiscriminatorValue("Category")
public class Category extends Option {
}
(2)           通过兌™”表映ž®?/div>
通过@JoinTableæ‰ÒŽ(gu¨©)³¨å®šä¹‰å…Œ™”表,该关联表包含äº?ji¨£n)指回实体表的外é?通过@JoinTable.joinColoumns)以及(qi¨¢ng)指向目标实体表的外键(通过@JoinTable.inverseJoinColoumns)
@Entity
@Table(name="Test_TreeType")
public class TreeType {
   private Integer id;
   private String name;
   private ForestType forestType;
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinTable(name="Test_Tree_Forest",
      joinColumns = @JoinColumn(name="tree_id"),
      inverseJoinColumns = @JoinColumn(name="forest_id") )
public ForestType getForestType() {// forestTypeçš„getteråQŒsetteræ–ÒŽ(gu¨©)³•必须在这里,否则ä¼?x¨¬)出é?/div>
      return forestType;
   }
   public void setForestType(ForestType forestType) {
      this.forestType = forestType;
   }
   @Id
   @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
@Entity
@Table(name="Test_ForestType")
public class ForestType {
   private Integer id;
   private String name;
   private Set<TreeType> trees;
   @OneToMany(mappedBy="forestType")
public Set<TreeType> getTrees() {// treesçš„getteråQŒsetteræ–ÒŽ(gu¨©)³•必须在这里,否则ä¼?x¨¬)出é?/div>
      return trees;
   }
   public void setTrees(Set<TreeType> trees) {
      this.trees = trees;
   }
   @Id @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
 
一对多(One-to-Many)
使用@OneToManyæ‰ÒŽ(gu¨©)³¨å¯å®šä¹‰ä¸€å¯¹å¤šå…Œ™”åQŒä¸€å¯¹å¤šå…Œ™”可以是双向关联ã€?/div>
在EJB3规范中多对一˜q™ç«¯å‡ ä¹Žæ€ÀL˜¯åŒå‘å…Œ™”中的ä¸ÖM½“(owner)端,而一对多˜q™ç«¯å…Œ™”æ‰ÒŽ(gu¨©)³¨ä¸º@OneToMany(mappedBy...)
@Entity
Public class Troop{
   @OneToMany(mappedBy=”troop”)
Public Set<Soldier> getSoldiers(){
......
}
@Entity
Public class Soldier{
   @ManyToOne
   @JoinColumn(name=”troop_fk”)
Public Troop getTroop(){
......
}
Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义ä“Q何物理映ž®„ã€?/div>
对于一对多的双向映ž®„,如果要一对多˜q™ä¸€ç«¯ç»´æŠ¤å…³è”å…³¾p»ï¼Œä½ éœ€è¦åˆ é™¤mappedBy元素òq¶å°†å¤šå¯¹ä¸€˜q™ç«¯çš„@JoinColoumnçš„insertableå’Œupdatabel讄¡½®ä¸ºfalse。这¿Uæ–¹æ¡ˆä¸ä¼?x¨¬)å¾—åˆîC»€ä¹ˆæ˜Žæ˜„¡š„优化åQŒè€Œä¸”˜q˜ä¼š(x¨¬)增加一些附加的UPDATE语句ã€?/div>
 
单向åQ?/div>
通过在被拥有的实体端(owned entity)增加一个外键列来实çŽîC¸€å¯¹å¤šå•向兌™”是很ž®‘见的,也是不推荐的åQŒå¾è®®é€šè¿‡ä¸€ä¸ªè”接表来实现这¿Uå…³è?下面ä¼?x¨¬)讲å?ã€?/div>
@JoinColoumnæ‰ÒŽ(gu¨©)³¨æ¥æ˜q°è¿™¿Uå•向关联关¾p?/div>
@Entity
Public class Customer{
   @OneToMany
@JoinColoumn(name=”CUST_ID”)
Public Set<ticket> getTickets() {
......
}
@Entity
Public class Ticket{
   ...
}
Customer通过CUST_ID列和Ticket建立äº?ji¨£n)单向关联关¾p?/div>
通过兌™”表处理单向关联:(x¨¬)
通过联接表处理单向一对多兌™”是首选方式,˜q™ç§å…Œ™”通过@JoinTableæ‰ÒŽ(gu¨©)³¨˜q›è¡Œæè¿°
@Entity
Public class Trainer{
@OneToMany
@JoinTable(
   name = "TrainedMonkeys",
   jonColumns = {@JoinColumn(name = "trainer_id")},
   inverseJoinColumns = @JoinColumn(name = "monkey_id")
   )
public Set<Monkey> getTrainedMonkeys() {
      return trainedMonkeys;
   }
......
}
@Entity
public class Monkey {
...//no bidir
}
上面˜q™ä¸ªä¾‹å­ä¸­ï¼ŒTrainer通过TrainedMonkeys表和Monkey建立äº?ji¨£n)单向关联,其中外键trainer_idå…Œ™”到Trainer(joinColoumn),而外键monkey_idå…Œ™”到Monkey(inversejionColoumns)
默认处理机制åQ?/div>
通过联接表来建立单向一对多兌™”不需要描˜qîC“Q何物理映像,表名ç”׃»¥ä¸‹ä¸‰ä¸ªéƒ¨åˆ†ç»„成:(x¨¬)主表(ownertable)表名+从表(the other side table)表名åQŒæŒ‡å‘主表的外键名:(x¨¬)主表表名+下划¾U?主表主键列名åQŒæŒ‡å‘从表的外键名:(x¨¬)主表所对应实体的属性名+下划¾U?从表主键列名åQŒæŒ‡å‘从表的外键定义为唯一¾U¦æŸåQŒç”¨æ¥è¡¨½CÞZ¸€å¯¹å¤šçš„关联关¾p…R€?/div>
@Entity
public class Trainer{
   @OneToMany
   Public Set<Tiger> getTrainedTigers(){
... ...
}
@Entity
public class Tiger{
.. ..//no bidir
}
上面˜q™ä¸ªä¾‹å­ä¸­ï¼ŒTrainerå’ŒTiger通过联接表Trainer_Tiger建立单向兌™”关系åQŒå…¶ä¸­å¤–é”®trainer_idå…Œ™”到Trainer,而外键trainedTigers_idå…Œ™”到Tiger
 
多对�Many-to-Many)
使用@ManyToManyæ‰ÒŽ(gu¨©)³¨å¯å®šä¹‰å¤šå¯¹å¤šå…Œ™”åQŒåŒæ—Óž¼Œä½ ä¹Ÿè®¸è¦é€šè¿‡æ‰ÒŽ(gu¨©)³¨@JoinTable描述兌™”表和兌™”条äšg。如果是双向兌™”åQŒå…¶ä¸­ä¸€ŒDµå¿…™åÕd®šä¹‰äØ“(f¨´)OwneråQŒå¦ä¸€ç«¯å¿…™åÕd®šä¹‰äØ“(f¨´)inverse(在对兌™”表进行更新操作时˜q™ä¸€ç«¯å°†è¢«å¿½ç•?
@Entity()
public class Employer implements Serializable {
   private Integer id;
   private Collection employees;
   @ManyToMany(
targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
      cascade = {CascadeType.PERSIST, CascadeType.MERGE}
   )
   @JoinTable(
         name = "EMPLOYER_EMPLOYEE",
         joinColumns = {@JoinColumn(name = "EMPER_ID")},
         inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
   )
   public Collection getEmployees() {
      return employees;
   }
...
}
@Entity()
public class Employee implements Serializable {
   @ManyToMany(
         cascade = {CascadeType.PERSIST, CascadeType.MERGE},
         mappedBy = "employees"
         targetEntity = Employer.class
   )
public Collection<Employer> getEmployers() {
      return employers;
   }
.. ..
}
@JoinTableæ‰ÒŽ(gu¨©)³¨å®šä¹‰äº?ji¨£n)联接表的表名,联接列数¾l„,以及(qi¨¢ng)invers联接列数¾l„,后者是兌™”表中兌™”到Employee主键的列(the “other side”)ã€?/div>
被关联端不必也不能描˜q°ç‰©ç†æ˜ ž®„:(x¨¬)只需要一个简单的mappedBy参数åQŒè¯¥å‚数包含äº?ji¨£n)主体端的属性名åQŒè¿™æ ·å°±¾l‘定äº?ji¨£n)双方的关系ã€?/div>
默认å€û|¼š(x¨¬)
å’Œå…¶å®ƒè®¸å¤šæ‰¹æ³¨ä¸€æ øP¼Œåœ¨å¤šå¯¹å¤šå…Œ™”中很多值是自动生成åQŒå…šåŒå‘多对多关联中没有定义ä»ÖM½•物理映射æ—Óž¼ŒHibernateæ ÒŽ(gu¨©)®ä»¥ä¸‹è§„则生成相应的å€û|¼Œå…Œ™”表名åQšä¸»è¡¨è¡¨å?下划¾U?从表表名åQŒå…³è”到主表的外键名åQšä¸»è¡¨å+下划¾U?主表中的主键列名åQŒå…³è”到从表的外键名åQšä¸»è¡¨ä¸­ç”¨äºŽå…Œ™”的属性名+下划¾U?从表的主键列名,以上规则对于双向一对多兌™”同样一栗÷€?/div>
 
以上是整理的一点简单的几种映射åQŒå¯å‚考EJB3.pdf中P111——P131åQŒhibernate_annotation.pdf ½W¬äºŒç«?/div>
在这里没有具体的例子åQŒæœ‰å¾ˆå¤šå†…容˜q˜éœ€è¦ä»”¾l†æŸ¥çœ‹æ–‡æ¡£ã€?/div>


]]>[转] 关于oracle with table as 创徏临时表的用法½CÞZ¾‹http://www.aygfsteel.com/algz/articles/365688.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 06 Dec 2011 08:47:00 GMThttp://www.aygfsteel.com/algz/articles/365688.htmlhttp://www.aygfsteel.com/algz/comments/365688.htmlhttp://www.aygfsteel.com/algz/articles/365688.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/365688.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/365688.html1、with table as 相当于徏个äÍ(f¨´)时表åQˆç”¨äºŽä¸€ä¸ªè¯­å¥ä¸­æŸäº›ä¸­é—´¾l“果攑֜¨ä¸´æ—¶è¡¨ç©ºé—´çš„SQL语句åQ‰ï¼ŒOracle 9i 新增WITH语法åQŒå¯ä»¥å°†æŸ¥è¯¢ä¸­çš„子查询命名,攑ֈ°SELECT语句的最前面ã€?/span>

语法ž®±æ˜¯
with tempname as (select ....)
select ...

例子åQ?/span>
with t as (select * from emp where depno=10)
select * from t where empno=xxx

with
wd as (select did,arg(salary) òq›_‡å·¥èµ„ from work group by did),
em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)
select * from wd,em where wd.did =em.did and wd.òq›_‡å·¥èµ„>em.salary;



2、何时被清除
临时表不都是ä¼?x¨¬)话¾l“束ž®Þp‡ªåŠ¨è¢«PGA清除å˜? 但with as临时表是查询完成后就被清除了(ji¨£n)åQ?/span>
23:48:58 SCOTT@orcl> with aa as(select * from dept)
23:57:58   2  select * from aa;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

已用旉™—´:  00: 00: 00.12
23:58:06 SCOTT@orcl> select * from aa;
select * from aa
              *
½W?1 行出现错è¯?
ORA-00942: 表或视图不存�/span>


已用旉™—´:  00: 00: 00.02
23:58:14 SCOTT@orcl>

3、就˜q™ä¸€åŠŸèƒ½æ¥è¯´åQŒå­æŸ¥è¯¢ž®±å¯ä»¥è¾¾åˆ°å•ŠåQŒäØ“(f¨´)什么要用with呢? 用with有什么好处?
都能写,但执行计划不同的。当有多个相似子查询的时候,用withå†™å…¬å…±éƒ¨åˆ†ï¼Œå› äØ“(f¨´)子查询结果在内存临时表中åQŒæ‰§è¡Œæ•ˆçŽ‡å½“ç„¶å°±é«˜å•¦~

4、问题:(x¨¬)
有张表数据如下:(x¨¬)
aaa é«?/span>
bbb ä½?/span>
aaa ä½?/span>
aaa é«?/span>
bbb ä½?/span>
bbb é«?/span>
需要得åˆîC¸‹åˆ—结æž?
  é«?ä½?/span>
aaa 2 1
bbb 1 2
é—?SQL 语句怎么写?åQ?/span>

½{”案åQ?/span>
with tt as (
  select 'aaa' id, 'é«? value from dual union all
  select 'bbb' id, 'ä½? value from dual union all
  select 'aaa' id, 'ä½? value from dual union all
  select 'aaa' id, 'é«? value from dual union all
  select 'bbb' id, 'ä½? value from dual union all
  select 'bbb' id, 'é«? value from dual)
SELECT id,
       COUNT(decode(VALUE, 'é«?, 1)) é«?
       COUNT(decode(VALUE, 'ä½?, 1)) ä½?/span>
  FROM tt
 GROUP BY id;
===================================================================
扩展åQ?/span>
Oracle9i新增WITH语法åQŒå¯ä»¥å°†æŸ¥è¯¢ä¸­çš„子查询命名,攑ֈ°SELECT语句的最前面ã€?/span>

  一个简单的例子:

SQL> WITH
2 SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),
3 OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)
4 SELECT O.OBJECT_NAME, OBJECT_TYPE, NVL(S.K, 0) SIZE_K
5 FROM OBJ O, SEG S
6 WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+)
7 ;
OBJECT_NAME OBJECT_TYPE SIZE_K
------------------------------ ------------------- ----------
DAIJC_TEST TABLE 128
P_TEST PROCEDURE 0
IND_DAIJC_TEST_C1 INDEX 128

  通过WITH语句定义äº?ji¨£n)两个子查询SEGå’ŒOBJåQŒåœ¨éšåŽçš„SELECT语句中可以直接对预定义的子查询进行查询。从上面的例子也可以看出åQŒä‹É用WITH语句åQŒå°†ä¸€ä¸ªåŒ…含聚集、外˜qžæŽ¥½{‰æ“ä½œSQL清晰的展现出来ã€?/span>

  WITH定义的子查询不仅可以使查询语句更加简单、清晎ͼŒè€Œä¸”WITH定义的子查询˜q˜å…·æœ‰åœ¨SELECT语句的ä“Q意层均可见的特点ã€?/span>

  即ä‹É是在WITH的定义层中,后定义的子查询都可以使用前面已经定义好的子查è¯?

SQL> WITH
2 Q1 AS (SELECT 3 + 5 S FROM DUAL),
3 Q2 AS (SELECT 3 * 5 M FROM DUAL),
4 Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)
5 SELECT * FROM Q3;
S M S+M S*M
---------- ---------- ---------- ----------
8 15 23 120

  利用WITH定义查询中出现多‹Æ¡çš„子查询还能带来性能提示。Oracleä¼?x¨¬)对WITH˜q›è¡Œæ€§èƒ½ä¼˜åŒ–åQŒå½“需要多‹Æ¡è®¿é—®WITH定义的子查询æ—Óž¼ŒOracleä¼?x¨¬)将子查询的¾l“果攑ֈ°ä¸€ä¸ªäÍ(f¨´)时表中,避免同样的子查询多次执行åQŒä»Žè€Œæœ‰æ•ˆçš„减少äº?ji¨£n)查询的IO数量ã€?/span>

WITH能用在SELECT语句中,UPDATE和DELETE语句也是支持WITH语法的,只是需要版本支�
http://www.oracle.com.cn/viewthread.php?tid=83530

=============================================================================
with
sql1 as (select to_char(a) s_name from test_tempa),
sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))
select * from sql1
union all
select * from sql2
union all
select 'no records' from dual
       where not exists (select s_name from sql1 where rownum=1)
       and not exists (select s_name from sql2 where rownum=1);

再ä‹D个简单的例子

with a as (select * from test)

select * from a;

其实ž®±æ˜¯æŠŠä¸€å¤§å †é‡å¤ç”¨åˆ°çš„SQL语句攑֜¨with as 里面åQŒå–一个别名,后面的查询就可以用它

˜q™æ ·å¯¹äºŽå¤§æ‰¹é‡çš„SQL语句起到一个优化的作用åQŒè€Œä¸”清楚明了(ji¨£n)


˜q™æ˜¯æœçƒ¦(ch¨³)到的英文文档资料(说得比较å…?但是本äh英文特菜,˜q˜æ²¡å…·ä½“äº?ji¨£n)è§£å?希望各高手具体谈谈这个with
as 的好�

About Oracle WITH clause
Starting in Oracle9i release 2 we see an incorporation of the SQL-99 “WITH clause”, a tool for materializing subqueries to save Oracle from having to re-compute them multiple times.

The SQL “WITH clause” 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 “WITH clause”:

   ? The SQL “WITH clause” only works on Oracle 9i release 2 and beyond.
   ? Formally, the “WITH clause” is called subquery factoring
   ? The SQL “WITH clause” is used when a subquery is executed multiple times
   ? Also useful for recursive queries (SQL-99, but not Oracle SQL)

To keep it simple, the following example only references the aggregations once, where the SQL “WITH clause” is normally used when an aggregation is referenced multiple times in a query.
We can also use the SQL-99 “WITH clause” instead of temporary tables. The Oracle SQL “WITH clause” will compute the aggregation once, give it a name, and allow us to reference it (maybe multiple times), later in the query.

The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

WITH
subquery_name
AS
(the aggregation SQL statement)
SELECT
(query naming subquery_name);

Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH  clause”:

WITH
sum_sales AS
  select /*+ materialize */
    sum(quantity) all_sales from stores
number_stores AS
  select /*+ materialize */
    count(*) nbr_stores from stores
sales_by_store AS
  select /*+ materialize */
  store_name, sum(quantity) store_sales from
  store natural join sales
SELECT
   store_name
FROM
   store,
   sum_sales,
   number_stores,
   sales_by_store
where
   store_sales > (all_sales / nbr_stores)
;

Note the use of the Oracle undocumented “materialize” hint in the “WITH clause”. The Oracle materialize hint is used to ensure that the Oracle cost-based optimizer materializes the temporary tables that are created inside the “WITH” clause. This is not necessary in Oracle10g, but it helps ensure that the tables are only created one time.

It should be noted that the “WITH clause” does not yet fully-functional within Oracle SQL and it does not yet support the use of “WITH clause” replacement for “CONNECT BY” when performing recursive queries.

To see how the “WITH clause” is used in ANSI SQL-99 syntax, here is an excerpt from Jonathan Gennick’s great work “Understanding the WITH Clause” showing the use of the SQL-99 “WITH clause” to traverse a recursive bill-of-materials hierarchy

The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

WITH
subquery_name
AS
(the aggregation SQL statement)
SELECT
(query naming subquery_name);

Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH” clause”:


]]>
Hibernate 注解映射 讄¡½®é»˜è®¤å€¼çš„异常å?qi¨¢ng)è§£å†Ïx–¹æ³?/title><link>http://www.aygfsteel.com/algz/articles/365534.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 05 Dec 2011 01:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/365534.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/365534.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/365534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/365534.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/365534.html</trackback:ping><description><![CDATA[<div><div>Oracle 数据åº?<br />Hibernate 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 </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.<init>(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 />解决æ–ÒŽ(gu¨©)³•:<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.aygfsteel.com/algz/aggbug/365534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-05 09:21 <a href="http://www.aygfsteel.com/algz/articles/365534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Oracle 语法ä¹?OVER (PARTITION BY ..) å?qi¨¢ng)å¼€½H—函æ•?/title><link>http://www.aygfsteel.com/algz/articles/365263.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Dec 2011 02:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/365263.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/365263.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/365263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/365263.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/365263.html</trackback:ping><description><![CDATA[<span id="wmqeeuq" 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 å?qi¨¢ng)å¼€½H—函æ•?/div><div><font size="2">一åQšåˆ†æžå‡½æ•?strong style="color: black; background-color: #a0ffff; ">over</strong><br /><strong style="color: black; background-color: #ffff66; ">Oracle</strong>ä»?.1.6开始提供分析函敎ͼŒåˆ†æžå‡½æ•°ç”¨äºŽè®¡ç®—åŸÞZºŽ¾l„的某种聚合å€û|¼Œå®ƒå’Œèšåˆå‡½æ•°çš„不同之处是<br />对于每个¾l„返回多行,而聚合函数对于每个组只返回一行ã€?nbsp;<br />下面通过几个例子来说明其应用ã€?nbsp;                                      </font><div><font size="2">1åQšç»Ÿè®¡æŸå•†åº—的营业额ã€?nbsp;       </font></div><div><font size="2">     date       sale<br />     1           20<br />     2           15<br />     3           14<br />     4           18<br />     5           30<br />    规则åQšæŒ‰å¤©ç»Ÿè®¡ï¼š(x¨¬)每天都统计前面几天的总额<br />    得到的结果:(x¨¬)<br />    DATE   SALE       SUM<br />    ----- -------- ------<br />    1      20        20           --1å¤?nbsp;          <br />    2      15        35           --1天+2å¤?nbsp;          <br />    3      14        49           --1天+2天+3å¤?nbsp;          <br />    4      18        67            .          <br />    5      30        97            .<br />     <br />2:¾lŸè®¡å„班成ç‡W½W¬ä¸€åçš„同学信息</font></div><div><font size="2">    NAME   CLASS S                         <br />    ----- ----- ---------------------- <br />    fda    1      80                     <br />    ffd    1      78                     <br />    dss    1      95                     <br />    cfe    2      74                     <br />    gds    2      92                     <br />    gf     3      99                     <br />    ddd    3      99                     <br />    adf    3      45                     <br />    asdf   3      55                     <br />    3dd    3      78              <br />   <br />    通过åQ?nbsp;  <br />    --<br />    select * from                                                                       <br />    (                                                                            <br />    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 />    )                                                                            <br />    where mm=1 <br />    --<br />    得到¾l“æžœåQ?br />    NAME   CLASS S                       MM                                                                                        <br />    ----- ----- ---------------------- ---------------------- <br />    dss    1      95                      1                      <br />    gds    2      92                      1                      <br />    gf     3      99                      1                      <br />    ddd    3      99                      1          <br />   <br />    注意åQ?br />    1.在求½W¬ä¸€åæˆ¾l©çš„æ—¶å€™ï¼Œä¸èƒ½ç”¨row_number()åQŒå› ä¸ºå¦‚果同班有两个òq¶åˆ—½W¬ä¸€åQŒrow_number()只返回一个结æž?nbsp;         <br />    2.rank()å’Œdense_rank()的区别是åQ?br />      --rank()是蟩跃排序,有两个第二名时接下来ž®±æ˜¯½W¬å››å?br />      --dense_rank()l是连¾l­æŽ’序,有两个第二名时仍然跟着½W¬ä¸‰å?br />     <br />     <br />3.分类¾lŸè®¡ (òq¶æ˜¾½CÞZ¿¡æ?</font></div><div><font size="2">    A   B   C                      <br />    -- -- ---------------------- <br />    m   a   2                      <br />    n   a   3                      <br />    m   a   2                      <br />    n   b   2                      <br />    n   b   1                      <br />    x   b   3                      <br />    x   b   2                      <br />    x   b   4                      <br />    h   b   3</font></div><div><font size="2">   select a,c,sum(c)<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by a) from t2                <br />   得到¾l“æžœåQ?br />   A   B   C        SUM(C)<strong style="color: black; background-color: #a0ffff; ">OVER</strong>(PARTITIONBYA)      <br />   -- -- ------- ------------------------ <br />   h   b   3        3                        <br />   m   a   2        4                        <br />   m   a   2        4                        <br />   n   a   3        6                        <br />   n   b   2        6                        <br />   n   b   1        6                        <br />   x   b   3        9                        <br />   x   b   2        9                        <br />   x   b   4        9                        <br />  <br />   如果用sumåQŒgroup by 则只能得åˆ?br />   A   SUM(C)                            <br />   -- ---------------------- <br />   h   3                      <br />   m   4                      <br />   n   6                      <br />   x   9                      <br />   无法得到B列å€?nbsp;      <br />  <br />åQï¼åQï¼åQ?/font></div><div><div><p><font face="verdana, arial, helvetica" size="2"><span id="wmqeeuq" class="javascript" id="text2200299" style="font-size: 12px; ">select * from test<br /><br />数据:<br />A B C <br />1 1 1 <br />1 2 2 <br />1 3 3 <br />2 2 5 <br />3 4 6 <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 <br />1 1 1 1 <br />1 2 2 7 <br />2 2 5 7 <br />1 3 3 3 <br />3 4 6 6 <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 <br />1 1 1 17 <br />1 2 2 17 <br />1 3 3 17 <br />2 2 5 17 <br />3 4 6 17</span></font></p><p><font face="verdana, arial, helvetica" size="2"></font> </p><p><font face="verdana, arial, helvetica" size="2"><span id="wmqeeuq" 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 id="wmqeeuq" class="javascript" id="text3005546" style="font-size: 12px; ">SQL> 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> 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">二:(x¨¬)å¼€½H—函æ•?nbsp;          <br />      å¼€½H—函数指定了(ji¨£n)分析函数工作的数据窗口大ž®ï¼Œ˜q™ä¸ªæ•°æ®½H—口大小可能ä¼?x¨¬)随着行的变化而变化,举例如下åQ?nbsp;<br />1åQ?nbsp;    <br />   <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by salaryåQ?按照salary排序˜q›è¡Œç´¯è®¡åQŒorder by是个默认的开½H—函æ•?br />   <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆpartition by deptnoåQ‰æŒ‰ç…§éƒ¨é—¨åˆ†åŒ?br />2åQ?br />  <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by salary range between 5 preceding and 5 followingåQ?br />   每行对应的数据窗口是之前行幅度å€ég¸­‘…过5åQŒä¹‹åŽè¡Œòq…度å€ég¸­‘…过5<br />   例如:对于以下åˆ?br />     aa<br />     1<br />     2<br />     2<br />     2<br />     3<br />     4<br />     5<br />     6<br />     7<br />     9<br />   <br />   sum(aa)<strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by aa range between 2 preceding and 2 followingåQ?br />   得出的结果是<br />            AA                       SUM<br />            ---------------------- ------------------------------------------------------- <br />            1                       10                                                      <br />            2                       14                                                      <br />            2                       14                                                      <br />            2                       14                                                      <br />            3                       18                                                      <br />            4                       18                                                      <br />            5                       22                                                      <br />            6                       18                                                                <br />            7                       22                                                                <br />            9                       9                                                                 <br />             <br />   ž®±æ˜¯è¯ß_(d¨¢)¼Œå¯¹äºŽaa=5的一è¡?åQŒsumä¸?nbsp;  5-1<=aa<=5+2 的和<br />   对于aa=2来说 åQŒsum=1+2+2+2+3+4=14     åQ?br />   又如 对于aa=9 åQ?-1<=aa<=9+2 只有9一个数åQŒæ‰€ä»¥sum=9    åQ?br />              <br />3åQšå…¶å®ƒï¼š(x¨¬)<br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by salary rows between 2 preceding and 4 followingåQ?br />          每行对应的数据窗口是之前2行,之后4è¡?nbsp;<br />4åQšä¸‹é¢ä¸‰æ¡è¯­å¥ç­‰æ•ˆï¼š(x¨¬)           <br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by salary rows between unbounded preceding and unbounded followingåQ?br />          每行对应的数据窗口是从第一行到最后一行,½{‰æ•ˆåQ?br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>åQˆorder by salary range between unbounded preceding and unbounded followingåQ?br />           ½{‰æ•ˆ<br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by null)</font></div></div></span><img src ="http://www.aygfsteel.com/algz/aggbug/365263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-01 10:00 <a href="http://www.aygfsteel.com/algz/articles/365263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql plus操作oracel(windowsòq›_°)基础之简易新手篇 http://www.aygfsteel.com/algz/articles/356201.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Aug 2011 03:29:00 GMThttp://www.aygfsteel.com/algz/articles/356201.htmlhttp://www.aygfsteel.com/algz/comments/356201.htmlhttp://www.aygfsteel.com/algz/articles/356201.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/356201.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/356201.html

æ³?ç™Õd…¥SQLPLUS时报é”?如下:
误‚¾“入用户名:  system
输入口ä×o(h¨´):
ERROR:
ORA-12560: TNS: 协议适配器错�br />原因:
是ORCAL实例没启�net [start/stop] 服务�.与Linux相反,不在SQLPLUS中启动实�

òq›_°: windows server 2003 Enterprise Editon , oracle 10g(10.02.00.01)

 

  1. ˜qè¡Œ"å¼€å§?>½E‹åº\Oracle - OraDb10g_home1\配置和移植工å…?中的"Database Configuration Assistant"åQŒåˆ›å»ÞZ¸€ä¸ªæ•°æ®åº“ã€?
  2. 创徏成功后,˜qè¡Œ"å¼€å§?>½E‹åº\Oracle - OraDb10g_home1\应用½E‹åºå¼€å?中的"SQL Plus".用户名:(x¨¬)sys 密码åQ?23456 as sysdba(密码后面要加½Iºæ ¼as½Iºæ ¼sysdba) ä¸ÀLœºå­—符ä¸ÔŒ¼š(x¨¬)如果是本机可不填ã€?
  3. 从命令提½Cºç¬¦ä¸‹ä‹É用sql*plus
    sqlplus/nolog
    conn 用户å?密码 as sysdba 出现”已连æŽ?#8220;后就是成功了(ji¨£n)ã€?br />

    
  接下来,我们在SQL*Plus中实战一下,为我们下面将要做的打好基¼‹€ã€?br />  用system登陆到SQL*Plus后,我们做如下操ä½?˜q™æ¬¡æ²¡æœ‰æˆªå›¾åQŒæœ‰è¯¦ç»†çš„说æ˜?
-----------如登陆成功此1-3步不必做åQŒç›´æŽ¥åš½W?æ­?---------------
  1. SQL>create user maxuan identified by max; #创徏口ä×o(h¨´)为max的用户maxuan
  2. SQL>grant connect,resource to maxuan; #为用户maxuan授权
  3. SQL>conn maxuan/max; #以用户maxuan˜q›è¡Œ˜qžæŽ¥
  4. SQL>create table test(a number); #建立一个名为test的表åQŒåªæœ‰å­—ŒDµåä¸ºA的一列,数据¾cÕdž‹ä¸ºæ•°å­?
  5. SQL>insert into test values(1); #插入一条记�
  6. SQL>select * from test; #查询记录åQŒæ­¤æ—¶A列的½W¬ä¸€è¡ŒäØ“(f¨´)1
  7. SQL>update test set a=2; #更改记录åQŒæ­¤æ—¶A列的½W¬ä¸€è¡Œå·²æ”¹äØ“(f¨´)2
  8. SQL>commit; #提交.在完成数据库的插入,删除和修æ”ÒŽ(gu¨©)“ä½œæ—¶åQŒåªæœ‰å½“事务提交到数据库才算完成ã€?
  9. SQL>delete from test; #删除test表中所有的记录åQŒæ­¤æ—¶test表中没有记录
  10. SQL>roll; #回滚到提交前åQŒæ­¤æ—¶å†æŸ¥è¯¢test表,A列第一行值又回复åˆ?
  
  oracle的数据类�/strong>
  在数据库中创建数据表的时候,我们需要定义表中所有字ŒD늚„¾cÕdž‹åQŒæ•°æ®ç±»åž‹å¤§è‡´åˆ†ä¸ºï¼š(x¨¬)character,numberic,date,lobå’Œraw½{‰ï¼Œ˜q™äº›æ˜¯æœ€åŸºæœ¬çš„æ•°æ®ç±»åž‹ã€‚当然在oracle中也允许自定义数据类型!
  
  在oracle中提供的character数据¾cÕdž‹:
  char():固定长度字符ä¸ÔŒ¼Œæœ€å¤§é•¿åº¦äØ“(f¨´)2000字节åQŒå¦‚果不指定长充åQŒç¼ºçœäØ“(f¨´)1个字节长ã€?br />  varchar2():可变长度的字½W¦ä¸²åQŒæœ€å¤§é•¿åº¦äØ“(f¨´)4000字节åQŒå…·ä½“定义时指明最大长度,˜q™å’±¾cÕdž‹å¯ä»¥æ”¾æ•°å­—、字母以å?qi¨¢ng)ASCII码字½W¦é›†(或者EBCDIC½{‰æ•°æ®åº“¾pȝ»ŸæŽ¥å—的字½W¦é›†æ ‡å‡†)中的所有符受÷€‚如果数据长度没有达到最大å€û|¼Œoracleä¼?x¨¬)根据数据大ž®è‡ªåŠ¨è°ƒèŠ‚å­—ŒDµé•¿åº¦ã€‚是
  
  最长用的数据类型ã€?br />  nchar():æ ÒŽ(gu¨©)®å­—符集而定的固定长度字½W¦ä¸²åQŒæœ€å¤§é•¿åº?000字节ã€?br />  nvarchar2():æ ÒŽ(gu¨©)®å­—符集而定的可变长度字½W¦ä¸²åQŒæœ€å¤§é•¿åº?000字节ã€?br />  long:可变长字½W¦åˆ—åQŒæœ€å¤§é•¿åº¦é™åˆ¶äØ“(f¨´)2GBåQŒç”¨äºŽä¸éœ€è¦ä½œå­—符串搜索的长串数据。此¾cÕdž‹æ˜¯ä¸€ä¸ªé—留下来的而且ž®†æ¥ä¸ä¼š(x¨¬)被支持的数据¾cÕdž‹åQŒé€æ¸è¢«BLOBåQŒCLOBåQŒNCLOB½{‰å¤§çš„æ•°æ®ç±»åž‹æ‰€å–代ã€?br />  
  numberic数据¾cÕdž‹ç”¨æ¥å­˜å‚¨è´Ÿçš„和正的整敎ͼŒåˆ†æ•°å’ŒæÕQ点型数据åQŒåœ¨oracle中提供的numberic数据¾cÕdž‹åQ?br />  number(,):可变长的数值列åQŒå…è®?、正值及(qi¨¢ng)è´Ÿå€û|¼Œm是所有的有效数字的位敎ͼŒn是小数点以后的位数ã€?br />  
  在oracle中提供的date数据¾cÕdž‹:
  date:¾~ºçœæ ¼å¼æ˜¯dd-mon-yy(æ—?æœ?òq?
  
  在oracle中提供的lob数据¾cÕdž‹:
  blob、clob、nclobåQšä¸‰¿Uå¤§åž‹å¯¹è±?lob)åQŒç”¨æ¥ä¿å­˜è¾ƒå¤§çš„囑ÖÅžæ–‡äšg或带格式的文本文ä»Óž¼Œå¦‚word文档åQŒä»¥å?qi¨¢ng)音频、视频等非文本文ä»Óž¼Œæœ€å¤§é•¿å……是4GB。晕些数据存储在数据库内部保存ã€?br />  bfile:在数据库外部保存的大型二˜q›åˆ¶å¯¹è±¡æ–‡äšgåQŒæœ€å¤§é•¿åº¦æ˜¯4GBåQŒè¿™¿Uå¤–部的LOB¾cÕdž‹åQŒé€šè¿‡æ•°æ®åº“记录变化情况,但是数据的具体保存是在数据库外部˜q›è¡Œçš„ã€?br />  
  在oracle中提供的raw数据¾cÕdž‹:
  raw():可变长二˜q›åˆ¶æ•°æ®åQŒå…·ä½“定义字ŒD‰|—¶å¿…须指明最大长度,˜q™ç§æ ¼å¼ç”¨æ¥ä¿å­˜è¾ƒå°çš„图形文件或带格式的文本文äšgåQŒå®ƒä¹Ÿæ˜¯ä¸€¿Uè¾ƒè€çš„æ•°æ®¾cÕdž‹åQŒå°†è¢«lob数据¾cÕdž‹æ‰€å–代ã€?br />  long raw:可变长二˜q›åˆ¶æ•°æ®åQŒæœ€å¤§é•¿åº¦æ˜¯2GBåQŒå¯ä»¥ç”¨æ¥ä¿å­˜è¾ƒå¤§çš„囑ÖŞ或带格式的文本文ä»Óž¼Œä»¥åŠ(qi¨¢ng)音频、视频等非文本文ä»Óž¼Œ˜q™ä¹Ÿæ˜¯ä¸€¿Uè¾ƒè€çš„æ•°æ®¾cÕdž‹åQŒå°†è¢«lob数据¾cÕdž‹æ‰€å–代ã€?br />  
  其它的数据类型:(x¨¬)
  rowid:˜q™æ˜¯oracle数据表中的一个伪例,它是数据表中每行数据内在的唯一标识
  integer:æ•´æ•°¾cÕdž‹
  
补充知识åQ?br />SQL(Structure Query Language)语言是结构化查询语言åQŒæ˜¯æ•°æ®åº“的核心(j¨©)语言åQŒæ˜¯é¢å‘集合的描˜q°æ€§éž˜q‡ç¨‹åŒ–语­a€ã€‚SQL语言共分为四大类åQšæ•°æ®æŸ¥è¯¢è¯­­a€DQL,数据操纵语言DMLåQŒæ•°æ®å®šä¹‰è¯­­a€DDL,数据库控制语­a€DCLã€?br />  
  1.数据查询语言DQL的基本结构是由select子句åQŒfrom子句åQŒwhere子句¾l„成的查询块åQ?br />  select <字段名表> from <表或视图å?gt; where <查询条äšg>
  
  2.数据操纵语言DML完成在数据库中确定、修攏V€æ·»åŠ ã€åˆ é™¤æŸä¸€æ•°æ®å€¼çš„ä»ÕdŠ¡(以下是部分常用DML语句):
  insert  增加数据行到�br />  delete  从表中删除数据行
  Update  更改表中数据
  
  3.数据定义语言DDL完成定义数据库的¾l“æž„åQŒåŒ…括数据库本èín、数据表、目录、视囄¡­‰æ•°æ®åº“å…ƒç´?以下是部分常用DDL语句)
  create table  创徏�br />  create index  创徏索引
  create view  创徏视图
  alter table  增加表列åQŒé‡å®šä¹‰è¡¨åˆ—åQŒæ›´æ”¹å­˜å‚¨åˆ†é…?br />  drop table  删除è¡?br />  drop index  删除索引
  
  4.数据库控制语­a€DCL用来授予或回收访问数据库的某¿Uç‰¹æƒï¼Œòq¶æŽ§åˆ¶æ•°æ®åº“操纵事务发生的时间及(qi¨¢ng)效果åQŒå¯¹æ•°æ®åº“实行监视等。如åQ?br />  grant    ž®†æƒé™æˆ–角色授予用户或其它角è‰?br />  revoke    回收用户权限
  roll    回滚åQŒæ˜¯å½“某个对话更改了(ji¨£n)数据库中的数据后åQŒç”±äºŽæŸ¿UåŽŸå› ç”¨æˆ·ä¸æƒÏxäº¤æ­¤æ›´æ”¹æ—Óž¼Œoracle所采取的保护操作。这是一个把信息恢复到用户ä‹Éupdate、insert、delete前最后提交的状态ã€?br />  commit    提交。在完成数据库的插入åQŒåˆ é™¤å’Œä¿®æ”¹æ“ä½œæ—Óž¼Œåªæœ‰å½“事务提交到数据库才½Ž—完成,有提交前只有操作数据库的本äh才能看到åQŒåˆ«äººåªæœ‰åœ¨æœ€åŽæäº¤å®Œæˆæ‰å¯ä»¥çœ‹åˆ°ã€?br />
  一ä¸?strong>购物¾|‘站后台数据åº?/strong>实例åQ?br />  现在我们回到用J2EE体系开发购物网站的主题åQŒå¼€å§‹å®žæˆ˜å¾è´­ç‰©¾|‘站的后台数据库ã€?br />  ä¸ÞZº†(ji¨£n)实现购物¾|‘站的基本的功能åQŒæˆ‘们需要徏立四个表åQšå•†å“åˆ—è¡?products)、商品类型表(item)、订单列è¡?orders)和管理员列表(admin)。表¾l“构如下所½Cºï¼š(x¨¬)
  
  item表结构(商品¾cÕdž‹è¡?
  字段名称  数据¾cÕdž‹ã€€ã€€ã€€ã€€å…è®¸½Iºã€€ã€€ä¸»é”®/外键  备注  
  type_id  INTEGER(自动¾~–号) 否  主键   商品¾cÕdˆ«I(xi¨¤n)D标记
  type   varchar2(30)   否    商品¾cÕdˆ«åç§°
  
  product表结�商品列表)
  字段名称   数据¾cÕdž‹ã€€ã€€ã€€å…è®¸½Iºã€€ã€€ä¸»é”®/外键  备注
  product_id INTEGER(自动¾~–号) 否   主键  商品ID标记
  title   varchar2(30)   否     商品名称
  type_id   INTEGER    否   外键  商品¾cÕdˆ«æ ‡è®°
  info   varchar2(80)   是     商品½Ž€ä»?br />  price   number(16,2)   否     商品ä»äh ¼
  
  orders表结�订单列表)
  字段名称  数据¾cÕdž‹ã€€ã€€ã€€ 允许½Iºã€€ã€€ä¸»é”®/外键  备注
  order_id  INTEGER(自动¾~–号) 否   主键  订单ID标记
  name   varchar2(20)   否     ™å‘Ö®¢å§“名
  address   varchar2(100)   是     发货地址
  tel   number(16)  是     联系ç”?sh¨´)è¯?br />  email   varchar2(30)  否     联系email
  btime   date    是     订购日期
  product_id  INTEGER   否   外键  商品标记
  uword   varchar2(100) 是     ™å‘Ö®¢ç•™è¨€
  
  admin表结æž?½Ž¡ç†å‘˜åˆ—è¡?
  字段名称  数据¾cÕdž‹ã€€ã€€ã€€ã€€å…è®¸½Iºã€€ã€€ä¸»é”®/外键  备注
  admin_id  INTEGER(自动¾~–号) 否   主键   ½Ž¡ç†å‘˜I(y¨¨)D标记
  adminname  varchar2(20)   否     ½Ž¡ç†å‘˜å¿U?br />  password  varchar2(20)   否     ½Ž¡ç†å‘˜å¯†ç ?br />  
  设计完表¾l“构后,我们ž®Þp¦å¼€å§‹åˆ›å»ÞZº†(ji¨£n)ã€?br />  创徏表我惛_·²¾lä¸æ˜¯ä»€ä¹ˆéš¾äº‹äº†(ji¨£n)åQŒé‚£ä¹ˆæˆ‘们要注意的是product、item、orders˜q™ä¸‰ä¸ªè¡¨ä¹‹é—´çš„关联,˜q˜æœ‰è‡ªåЍ¾~–号ã€?br />  
  下面是完整的SQL语句åQŒåœ¨åŽé¢æˆ‘会(x¨¬)¾l™å‡ºè¯¦ç»†çš„说明,你可以在SQL*Plus里对照着输入åQŒä¹Ÿå¯ä»¥ž®†å®ƒå­˜äØ“(f¨´)SQL脚本文äšgåQŒåœ¨SQL*Plus或SQLPlus Worksheet里执行。当然也可以把代码直接拷贝到SQL*Plus里执行!
  
  代码åQ?br />  rem ///BY MAXUAN å¼€å§?//
  create table item(
  type_id integer not null,
  type varchar2(30),
  constraint item_pk primary key(type_id)
  );
  
  create table product(
  product_id integer not null,
  title varchar2(30) not null,
  type_id integer not null,
  info varchar2(80),
  price number(16,2) not null,
  constraint product_pk primary key (product_id),
  constraint product_fk foreign key(type_id) references item(type_id)
  );
  
  create table orders(
  order_id integer not null,
  name varchar2(20) not null,
  address varchar2(100),
  tel number(16),
  email varchar2(30) not null,
  btime date,
  product_id integer not null,
  uword varchar2(100),
  constraint orders_pk primary key(order_id),
  constraint orders_fk foreign key(product_id) references product(product_id)
  );
  
  create table admin(
  admin_id integer not null,
  adminname varchar2(20) not null,
  password varchar2(20) not null,
  constraint admin_pk primary key(admin_id)
  );


]]>spring 什么情况下˜q›è¡Œäº‹åŠ¡å›žæ»š(面试é¢?http://www.aygfsteel.com/algz/articles/352796.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 22 Jun 2011 03:53:00 GMThttp://www.aygfsteel.com/algz/articles/352796.htmlhttp://www.aygfsteel.com/algz/comments/352796.htmlhttp://www.aygfsteel.com/algz/articles/352796.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/352796.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/352796.htmlspring事务回滚.默认情况,unchecked异常,卌™¿è¡Œæ—¶å¼‚常runntimeException回滚事务;checked异常,即Exception可try{}捕获的不ä¼?x¨¬)回æ?当然也可配置spring参数让其回滚.

]]>
spring ä¸?jdbcTemplate 快速数据库开å?/title><link>http://www.aygfsteel.com/algz/articles/352789.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 02:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/352789.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/352789.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/352789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/352789.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> execSQL(String fileName) {<br />        <br />        File myFile </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> File(fileName);<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">myFile.exists()) {<br />            System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Can't Find </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> fileName);<br />            </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />        }<br />        </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br />            DriverManagerDataSource dataSource</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> DriverManagerDataSource();<br />            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 />            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 />            dataSource.setUsername(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            dataSource.setPassword(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">);<br />            JdbcTemplate jt</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> JdbcTemplate();<br />            jt.setDataSource(dataSource);<br />            <br />                    <br />            BufferedReader in </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> FileReader(myFile));<br />            String sql;<br />            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((sql </span><span style="color: #000000; ">=</span><span style="color: #000000; "> in.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br />                jt.execute(sql);<br />                System.out.print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            }<br />            <br />            in.close();<br />            System.out.println();<br />        } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br />            e.getStackTrace();<br />        }<br />    }</span></div><img src ="http://www.aygfsteel.com/algz/aggbug/352789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 10:16 <a href="http://www.aygfsteel.com/algz/articles/352789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 存储˜q‡ç¨‹åŸºæœ¬è¯­æ³•å?qi¨¢ng)é—®é?/title><link>http://www.aygfsteel.com/algz/articles/352675.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 20 Jun 2011 09:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/352675.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/352675.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/352675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/352675.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/352675.html</trackback:ping><description><![CDATA[<div><div>存储˜q‡ç¨‹</div><div>æ³?: </div><div>(1)在procedure中想用ddlåQŒå°±å¿…须用execute   immediat 'create table text1(id int not null primary key)';</div><div>且必™åÀL˜¾æŽˆæƒ(grant create any table to 用户å?,否则æŠ?insufficient privileges',无权é™?</div><div>(2)每条语句都需ä»?;'¾l“å°¾.</div><div></div><div>1.基本语法 : 创徏一个存储过½E?如果存在ž®Þp¦†ç›?  (æ³?as/is没区åˆ?只是兼容别的SQL而已)</div><div>create or replace procedure  ˜q‡ç¨‹å?参数1 in number ,参数2 in number) is</div><div>变量1 integer:=0;</div><div>变量2 date;</div><div>exp   exception;  --定义异常</div><div>begin</div><div>    --存储˜q‡ç¨‹ä¸­è°ƒç”¨DDL,必须用动态SQLæ–ÒŽ(gu¨©)³•</div><div>    execute  immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';</div><div>    execute   immediate   'insert   into   testtable values(1,110) '; </div><div></div><div>   raise   exp;    --抛出异常</div><div>exception        --异常处理</div><div>    when   exp   then </div><div>    dbms_output.put_line( '执行成功1 ');    --控制台打å?/div><div>    when   others   then </div><div>    dbms_output.put_line( '执行å¤ÞpÓ|0 '); </div><div></div><div>end;</div><div></div><div>2.基本语句:</div><div>(1)变量赋å€?/div><div><1>变量初始化赋å€?=å€?</div><div><2>变量赋å€? select ....into... from ....;     --select ... from ... æ–ÒŽ(gu¨©)³•在存储过½E‹ä¸­æ—¶çš„æ ¼å¼</div><div>select name1,name2 into var1,var2 from table1 </div><div></div><div>(2)For 循环</div><div>For ... in ... LOOP</div><div>--执行语句</div><div>end LOOP;</div><div></div><div><1>循环遍历游标</div><div>create or replace procedure test() as</div><div>    Cursor cursor is select name from student; name varchar(20);</div><div>begin</div><div>    for name in cursor LOOP</div><div>    begin</div><div>        dbms_output.putline(name); </div><div>    end;</div><div>    end LOOP;</div><div>end test;</div><div></div><div><2>循环遍历数组</div><div> create or replace procedure test(varArray in myPackage.TestArray) as</div><div>--(输入参数varArray 是自定义的数¾l„类型,定义方式见标é¢?)</div><div>i number;</div><div>begin</div><div>i := 1;  --存储˜q‡ç¨‹æ•°ç»„是è“v始位¾|®æ˜¯ä»?开始的åQŒä¸Žjava、C、C++½{‰è¯­­a€ä¸åŒã€‚因为在Oracle中本是没有数¾l?/div><div></div><div>的概å¿ëŠš„åQŒæ•°¾l„其实就是一å¼?/div><div>--è¡?Table),每个数组元素ž®±æ˜¯è¡¨ä¸­çš„一个记录,所以遍历数¾l„æ—¶ž®Þq›¸å½“于从表中的½W¬ä¸€æ¡è®°å½•开始遍åŽ?/div><div>for i in 1..varArray.count LOOP     </div><div>dbms_output.putline(&apos;The No.&apos;|| i || &apos;record in varArray is:&apos;||varArray(i));   </div><div> end LOOP;</div><div>end test;</div><div></div><div>3.代码抛出异常用raise (异常å?;</div><div></div><div>4.游标 : </div><div>(1)¾pȝ»Ÿ¾U§æ¸¸æ ?cursor SYS_REFCURSOR;只能通过openæ–ÒŽ(gu¨©)³•打开和赋å€?/div><div>OPEN cursor FOR select name1,name2 from table1 where a='1';  --sql语法</div><div>LOOP</div><div>    FETCH cursor INTO name1,name2;    --只能通过fetch into 打开和遍åŽ?/div><div>    exit when cursor%NOTFOUND;         --可用三个状æ€?%NOTFOUND(未找到记å½?;%FOUND(扑ֈ°è®?/div><div></div><div>å½?;%ROWCOUNT(当前游标指向的行位置)</div><div></div><div>     dbms_output.putline(name1||name2);</div><div>END LOOP;</div><div></div><div>5.˜qžæŽ¥˜qç®—½W?: || ,å?ABC'||'123' : ABC123</div><div></div><div>6.单行注释: --;多行:/**/;</div></div><img src ="http://www.aygfsteel.com/algz/aggbug/352675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-20 17:12 <a href="http://www.aygfsteel.com/algz/articles/352675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 解决中文ä¹Þq http://www.aygfsteel.com/algz/articles/351345.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 30 May 2011 08:15:00 GMThttp://www.aygfsteel.com/algz/articles/351345.htmlhttp://www.aygfsteel.com/algz/comments/351345.htmlhttp://www.aygfsteel.com/algz/articles/351345.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/351345.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/351345.html一看就明了(ji¨£n).与数据库的连接采用UTF-8.

]]>
[转]sqlçš„left join 命ä×o(h¨´)详解http://www.aygfsteel.com/algz/articles/228220.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:58:00 GMThttp://www.aygfsteel.com/algz/articles/228220.htmlhttp://www.aygfsteel.com/algz/comments/228220.htmlhttp://www.aygfsteel.com/algz/articles/228220.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228220.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228220.html 例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连æŽ?要取出id相同的字ŒD?
select * from a inner join b on a.aid = b.bid˜q™æ˜¯ä»…取出匹配的数据.
此时的取出的�
1 a1 b1
2 a2 b2
那么left join �
select * from a left join b on a.aid = b.bid
首先取出a表中所有数æ?然后再加上与a,b匚w…çš„的数据
此时的取出的�
1 a1 b1
2 a2 b2
3 a3 ½Iºå­—½W?
同样的也有right join
指的是首先取出b表中所有数æ?然后再加上与a,b匚w…çš„的数据
此时的取出的�
1 a1 b1
2 a2 b2
4 ½Iºå­—½W?b4

LEFT JOIN �LEFT OUTER JOIN�
左向外联接的¾l“果集包æ‹?LEFT OUTER 子句中指定的左表的所有行åQŒè€Œä¸ä»…仅是联接列所匚w…çš„行。如果左表的某行在右表中没有匚w…è¡Œï¼Œåˆ™åœ¨ç›¸å…³è”çš„¾l“果集行中右表的所有选择列表列均为空倹{€?br />
                   ------------http://www.phpweblog.net/zwws/archive/2007/02/23/944.html


]]>
[转]SQL中的left outer join,inner join,right outer join用法http://www.aygfsteel.com/algz/articles/228219.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:55:00 GMThttp://www.aygfsteel.com/algz/articles/228219.htmlhttp://www.aygfsteel.com/algz/comments/228219.htmlhttp://www.aygfsteel.com/algz/articles/228219.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228219.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228219.html 1 关系代数
åˆåÆˆæ•°æ®é›†åˆçš„ç†è®ºåŸº¼‹€æ˜¯å…³¾pÖM»£æ•ŽÍ¼Œå®ƒæ˜¯ç”±E.F.Coddäº?970òq´æå‡ºçš„ã€?br /> 在关¾pÖM»£æ•°çš„形式化语­a€ä¸­ï¼š(x¨¬)
?          用表、或者数据集合表½Cºå…³¾pÀLˆ–者实体ã€?br /> ?          用行表示元组ã€?br /> ?          用列表示属性ã€?br /> 关系代数包含以下8个关¾p»è¿½Ž—符
?          选取――返回满­‘ÏxŒ‡å®šæ¡ä»¶çš„行ã€?br /> ?          投媄(ji¨£ng)――从数据集合中返回指定的列ã€?br /> ?          ½W›å¡ž®?d¨¡ng)积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式˜q›è¡Œ¾l„合ã€?br /> ?          òq¶â€•―关¾pȝš„加法和减法,它可以在行的方向上合òq¶ä¸¤ä¸ªè¡¨ä¸­çš„æ•°æ®åQŒå°±åƒæŠŠä¸€ä¸ªè¡¨åž’在另一个表之上一栗÷€?br /> ?          交――返回两个数据集合所共有的行ã€?br /> ?          差――返回只属于一个数据集合的行ã€?br /> ?          ˜qžæŽ¥â€•―在水åã^方向上合òq¶ä¸¤ä¸ªè¡¨åQŒå…¶æ–ÒŽ(gu¨©)³•是:(x¨¬)ž®†ä¸¤ä¸ªè¡¨ä¸­åœ¨å…±åŒæ•°æ®™å¹ä¸Šç›æ€º’匚w…çš„é‚£äº›è¡ŒåˆåÆˆèµäh¥ã€?br /> ?          除――返回两个数据集之间的精¼‹®åŒ¹é…ã€?br /> 此外åQŒä½œä¸ÞZ¸€¿Uå®žçŽ°çŽ°ä»£å…³¾pÖM»£æ•°è¿½Ž—çš„æ–ÒŽ(gu¨©)³•åQŒSQL˜q˜æä¾›äº†(ji¨£n)åQ?br /> ?          子查询――类ä¼égºŽ˜qžæŽ¥åQŒä½†æ›´çµ‹z»ï¼›åœ¨å¤–部查询中åQŒæ–¹å¼å¯ä»¥ä‹É用表辑ּã€åˆ—表或者数据集合的地方都可以ä‹É用子查询的结果ã€?br /> 本章ž®†ä¸»è¦è®²˜q°å¤š¿Uç±»åž‹çš„˜qžæŽ¥ã€ç®€å•的和相关的子查询、几¿Uç±»åž‹çš„òq¶ã€å…³¾p»é™¤ä»¥åŠ(qi¨¢ng)其他的内宏V€?br /> 2 使用˜qžæŽ¥
2.1 ˜qžæŽ¥¾cÕdž‹
在关¾pÖM»£æ•îC¸­åQŒè¿žæŽ¥è¿½Ž—是ç”׃¸€ä¸ªç¬›å¡å°”¿U¯è¿½Ž—和一个选取˜qç®—构成的。首先用½W›å¡ž®?d¨¡ng)积完成对两个数据集合的乘运½Ž—,然后对生成的¾l“果集合˜q›è¡Œé€‰å–˜qç®—åQŒç¡®ä¿? 只把分别来自两个数据集合òq¶ä¸”å…ähœ‰é‡å éƒ¨åˆ†çš„è¡ŒåˆåÆˆåœ¨ä¸€èµ—÷€‚连接的全部意义在于在水òqÏx–¹å‘ä¸ŠåˆåÆˆä¸¤ä¸ªæ•°æ®é›†åˆåQˆé€šå¸¸æ˜¯è¡¨åQ‰ï¼Œòq¶äñ”生一个新的结果集合,其方 法是ž®†ä¸€ä¸ªæ•°æ®æºä¸­çš„行于另一个数据源中和它匹配的行组合成一个新元组ã€?br /> SQL提供äº?ji¨£n)多¿Uç±»åž‹çš„˜qžæŽ¥æ–¹å¼åQŒå®ƒä»¬ä¹‹é—´çš„区别在于åQšä»Žç›æ€º’交叠的不同数据集合中选择用于˜qžæŽ¥çš„行时所采用的方法不同ã€?br /> ˜qžæŽ¥¾cÕdž‹          定义
内连æŽ?nbsp;         只连接匹配的è¡?br /> 左外˜qžæŽ¥          包含左边表的全部行(不管双™¾¹çš„表中是否存在与它们匚w…çš„行åQ‰ï¼Œä»¥åŠ(qi¨¢ng)双™¾¹è¡¨ä¸­å…¨éƒ¨åŒšw…çš„行
叛_¤–˜qžæŽ¥          包含双™¾¹è¡¨çš„全部行(不管左边的表中是否存在与它们匚w…çš„行åQ‰ï¼Œä»¥åŠ(qi¨¢ng)左边表中全部匚w…çš„行
全外˜qžæŽ¥          包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行ã€?br /> (H)(theta)˜qžæŽ¥          使用½{‰å€ég»¥å¤–的条äšg来匹配左、右两个表中的行
交叉˜qžæŽ¥          生成½W›å¡ž®?d¨¡ng)积åQå®ƒä¸ä‹É用ä“Q何匹配或者选取条äšgåQŒè€Œæ˜¯ç›´æŽ¥ž®†ä¸€ä¸ªæ•°æ®æºä¸­çš„æ¯ä¸ªè¡Œä¸Žå¦ä¸€ä¸ªæ•°æ®æºçš„æ¯ä¸ªè¡Œéƒ½ä¸€ä¸€åŒšw…
在INFORMIX中连接表的查è¯?br /> 如果FROM子句指定äº?ji¨£n)多于一个表引用åQŒåˆ™æŸ¥è¯¢ä¼?x¨¬)连接来自多个表的行。连接条件指定各列之é—ß_(d¨¢)¼ˆæ¯ä¸ªè¡¨è‡³ž®‘一列)(j¨ª)˜q›è¡Œ˜qžæŽ¥çš„å…³¾p…R€‚因为正在比较连接条件中的列åQŒæ‰€ä»¥å®ƒä»¬å¿…™åÕd…·æœ‰ä¸€è‡´çš„æ•°æ®¾cÕdž‹ã€?br /> SELECT语句的FROM子句可以指定以下几种¾cÕdž‹çš„连æŽ?br /> FROM子句关键å­?nbsp;         相应的结果集
CROSS JOIN          ½W›å¡ž®?d¨¡ng)乘¿U¯ï¼ˆæ‰€æœ‰å¯èƒ½çš„行对åQ?br /> INNER JOIN          仅对满èƒö˜qžæŽ¥æ¡äšgçš„CROSS中的åˆ?br /> LEFT OUTER JOIN          一个表满èƒö条äšg的行åQŒå’Œå¦ä¸€ä¸ªè¡¨çš„æ‰€æœ‰è¡Œ
RIGHT OUTER JOIN          ä¸?strong style="color: black; background-color: #ffff66;">LEFT
相同åQŒä½†ä¸¤ä¸ªè¡¨çš„角色互换
FULL OUTER JOIN        LEFT OUTER å’?RIGHT OUTER中所有行的超é›?br />
2.2 内连接(Inner JoinåQ?br /> 内连接是最常见的一¿Uè¿žæŽ¥ï¼Œå®ƒé¡µè¢«ç§°ä¸ºæ™®é€šè¿žæŽ¥ï¼Œè€ŒE.FCoddæœ€æ—©ç§°ä¹‹äØ“(f¨´)自然˜qžæŽ¥ã€?br /> 下面是ANSI SQLåQ?2标准
select *
from    t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略ã€?br /> ½{‰ä­h(hu¨¢n)于早期的˜qžæŽ¥è¯­æ³•
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外连æŽ?br /> 2.3.1          左外˜qžæŽ¥(Left Outer Jion)
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略ã€?br /> 2.3.2          叛_¤–˜qžæŽ¥(Rigt Outer Jion)
select *
from    t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3          全外˜qžæŽ¥(Full Outer)
全外˜qžæŽ¥˜q”回参与˜qžæŽ¥çš„两个数据集合中的全部数据,无论它们是否å…ähœ‰ä¸Žä¹‹ç›¸åŒ¹é…çš„行。在功能上,它等价于对这两个数据集合分别˜q›è¡Œå·¦å¤–˜qžæŽ¥å’Œå³å¤–连接,然后再ä‹Éç”¨æ¶ˆåŽ»é‡å¤è¡Œçš„åÆˆæ“ä½œž®†ä¸Š˜qîC¸¤ä¸ªç»“æžœé›†åˆåÆˆä¸ÞZ¸€ä¸ªç»“果集ã€?br /> 在现实生‹zÖM¸­åQŒå‚照完整性约束可以减ž®‘对于全外连接的使用åQŒä¸€èˆ¬æƒ…况下左外˜qžæŽ¥ž®Þpƒö够了(ji¨£n)。在数据库中没有利用清晰、规范的¾U¦æŸæ¥é˜²èŒƒé”™è¯¯æ•°æ®æƒ…况下åQŒå…¨å¤–连接就变得非常有用äº?ji¨£n),你可以ä‹É用它来清理数据库中的数据ã€?br /> select *
from    t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4          外连接与条äšg配合使用
当在内连接查询中加入条äšg是,无论是将它加入到join子句åQŒè¿˜æ˜¯åŠ å…¥åˆ°where子句åQŒå…¶æ•ˆæžœæ˜¯å®Œå…¨ä¸€æ ïL(f¨¥ng)š„åQŒä½†å¯¹äºŽå¤–连接情况就不同äº?ji¨£n)。当把条件加入到joinå­? 句时åQŒSQL Server、Informixä¼?x¨¬)返回外˜qžæŽ¥è¡¨çš„全部行,然后使用指定的条件返回第二个表的行。如果将条äšg攑ֈ°where子句中,SQL Serverž®†ä¼š(x¨¬)首先˜q›è¡Œ˜qžæŽ¥æ“ä½œåQŒç„¶åŽä‹É用where子句对连接后的行˜q›è¡Œ½{›é€‰ã€‚下面的两个查询展示äº?ji¨£n)条件放¾|®ä½å­å¯¹æ‰§è¡Œ¾l“果的媄(ji¨£ng)响:(x¨¬)
条äšgåœ?strong style="color: black; background-color: #99ff99;">join子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
¾l“果是:(x¨¬)
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河åŒ?nbsp;                5801         0001         tom
5801         天河åŒ?nbsp;                5801         0002         david
5802         ­‘Šç§€åŒ?br /> 5803         白云åŒ?br /> 条äšg在where子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
¾l“果是:(x¨¬)
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河åŒ?nbsp;                5801         0001         tom
5801         天河åŒ?nbsp;                5801         0002         david

2.4 自èín˜qžæŽ¥
自èín˜qžæŽ¥æ˜¯æŒ‡åŒä¸€ä¸ªè¡¨è‡ªå·±ä¸Žè‡ªå·Þp¿›è¡Œè¿žæŽ¥ã€‚è¿™¿Uä¸€å…ƒè¿žæŽ¥é€šå¸¸ç”¨äºŽä»Žè‡ªåå…³¾p»ï¼ˆä¹Ÿç§°ä½œé€’归关系åQ‰ä¸­æŠ½å–数据。例如äh力资源数据库中雇员与老板的关¾p…R€?br /> 下面例子是在机构表中查找本机构和上çñ”机构的信息ã€?br /> select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

¾l“果是:(x¨¬)
superior_inst sup_inst_name          inst_no      inst_name
800             òq¿å·žå¸?nbsp;                5801         天河åŒ?br /> 800             òq¿å·žå¸?nbsp;                5802         ­‘Šç§€åŒ?br /> 800             òq¿å·žå¸?nbsp;                5803         白云åŒ?br />
2.5 交叉(无限åˆ? ˜qžæŽ¥
交叉˜qžæŽ¥ç”¨äºŽå¯¹ä¸¤ä¸ªæºè¡¨è¿›è¡Œçº¯å…³ç³»ä»£æ•°çš„乘˜qç®—。它不ä‹É用连接条件来限制¾l“果集合åQŒè€Œæ˜¯ž®†åˆ†åˆ«æ¥è‡ªä¸¤ä¸ªæ•°æ®æºä¸­çš„行以所有可能的方式˜q›è¡Œ¾l„合。数据集合中 一的每个行都要与数据集合二中的每一个行分别¾l„成一个新的行。例如,如果½W¬ä¸€ä¸ªæ•°æ®æºä¸­æœ‰5个行åQŒè€Œç¬¬äºŒä¸ªæ•°æ®æºä¸­æœ?个行åQŒé‚£ä¹ˆåœ¨å®ƒä»¬ä¹‹é—´˜q›è¡Œäº¤å‰˜qžæŽ¥ ž®×ƒ¼š(x¨¬)产生20个行。äh们将˜q™ç§¾cÕdž‹çš„结果集¿UîCØ“(f¨´)½W›å¡ž®?d¨¡ng)乘¿U¯ã€?br /> 大多æ•îCº¤å‰è¿žæŽ¥éƒ½æ˜¯ç”±äºŽé”™è¯¯æ“ä½œè€Œé€ æˆçš„;但是它们却非帔R€‚合向数据库中填充例子数据,或者预先创å»ÞZ¸€äº›ç©ºè¡Œä»¥ä¾¿äØ“(f¨´)½E‹åºæ‰§è¡ŒæœŸé—´æ‰€è¦å¡«å……的数据保留½Iºé—´ã€?br /> select *
from    t_institution i
cross join t_teller t
在交叉连接中没有on条äšg子句

       -----http://hi.baidu.com/llscompazz/blog/item/dc5e23d9ce2b62eb39012fb4.html


]]>[转]SQL中的各种JOINåQˆinner join,full outer join,left join,right join,cross join åQ?/title><link>http://www.aygfsteel.com/algz/articles/228218.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/228218.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/228218.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/228218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/228218.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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%;">åQ?span>inner join,full outer join,left join,right join,cross join </span>åQ?/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">中的˜qžæŽ¥å¯ä»¥åˆ†äØ“(f¨´)内连接,外连接,以及(qi¨¢ng)交叉˜qžæŽ¥ <span>(åÏx˜¯½W›å¡ž®?d¨¡ng)ç§?/span></font><font size="3"><font color="#000000">) <br /> <br /> a. 交叉˜qžæŽ¥</font></font><font size="3"><font color="#000000"><span>CROSS JOIN<br /> </span>如果不带WHERE条äšg子句åQŒå®ƒ?y¨­u)®†ä¼?x¨¬)˜q”回被连接的两个表的½W›å¡ž®?d¨¡ng)积åQŒè¿”回结果的行数½{‰äºŽä¸¤ä¸ªè¡¨è¡Œæ•°çš„乘积åQ?/font></font><br /> <br /> <font color="#000000" size="3">举例,下列A、Bã€?span>C </span>执行¾l“果相同åQŒä½†æ˜¯æ•ˆçŽ‡ä¸ä¸€æ øP¼š(x¨¬)</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">注:(x¨¬)<span>cross join</span>后加条äšg只能用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">ä¸€èˆ¬ä¸å»ø™®®ä½¿ç”¨æ–ÒŽ(gu¨©)³•<span>Aå’ŒBåQŒå› ä¸ºå¦‚果有WHERE子句的话åQŒå¾€å¾€ä¼?x¨¬)先生成两个表行æ•îC¹˜¿U¯çš„行的数据表然后才æ ÒŽ(gu¨©)®WHERE条äšg从中选择ã€?/span></font><font size="3"><font color="#000000"><span> <br /> </span>å› æ­¤åQŒå¦‚果两个需要求交际的表太大åQŒå°†ä¼?x¨¬)非帔Ržå¸¸æ…¢åQŒä¸å»ø™®®ä½¿ç”¨ã€?/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>两边表同时符合条件的¾l„合</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">内连接如果没有指定连接条件的话,和笛卡尔¿U¯çš„交叉˜qžæŽ¥¾l“æžœä¸€æ øP¼Œä½†æ˜¯ä¸åŒäºŽç¬›å¡å°”¿U¯çš„地方是,没有½W›å¡ž®?d¨¡ng)积那么复杂要先生成行数乘积的数据表åQŒå†…˜qžæŽ¥çš„æ•ˆçŽ‡è¦é«˜äºŽ½W›å¡ž®?d¨¡ng)积的交叉连接ã€?/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">***************关于½{‰å€ÆD¿žæŽ¥å’Œè‡ªç„¶˜qžæŽ¥</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">½{‰å€ÆD¿žæŽ?span>(=号应用于˜qžæŽ¥æ¡äšg<span>, </span>不会(x¨¬)去除重复的列)</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">自然˜qžæŽ¥(ä¼?x¨¬)去除重复的å?</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">数据库的˜qžæŽ¥˜qç®—都是自然˜qžæŽ¥åQŒå› ä¸ÞZ¸å…è®¸æœ‰é‡å¤çš„行(元组åQ‰å­˜åœ¨ã€?/font><br /> <font size="3"><font color="#000000">例如åQ?/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>指定条äšg的内˜qžæŽ¥åQŒä»…仅返回符合连接条件的条目ã€?/font></font><br /> <font color="#000000" size="3">外连接则不同åQŒè¿”回的¾l“果不仅包含½W¦åˆ˜qžæŽ¥æ¡äšg的行åQŒè€Œä¸”包括左表(左外˜qžæŽ¥æ—?span>), </span>双™¡¨(双™¿žæŽ¥æ—¶)或者两边连æŽ?全外˜qžæŽ¥æ—?的所有数据行ã€?/font><br /> <br /> <font color="#000000" size="3">1)</font><font color="#000000" size="3">左外˜qžæŽ¥</font><font size="3"><font color="#000000"><span>LEFT [OUTER] JOIN <br /> </span>昄¡¤º½W¦åˆæ¡äšg的数据行åQŒåŒæ—¶æ˜¾½Cºå·¦è¾ÒŽ(gu¨©)•°æ®è¡¨ä¸ç¬¦åˆæ¡ä»¶çš„æ•°æ®è¡Œï¼ŒåŒ™¾¹æ²¡æœ‰å¯¹åº”的条目显½C?/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">叛_¤–˜qžæŽ¥</font><font size="3"><font color="#000000"><span>RIGHT [OUTER] JOIN<br /> </span>昄¡¤º½W¦åˆæ¡äšg的数据行åQŒåŒæ—¶æ˜¾½Cºå³è¾ÒŽ(gu¨©)•°æ®è¡¨ä¸ç¬¦åˆæ¡ä»¶çš„æ•°æ®è¡Œï¼Œå·¦è¾¹æ²¡æœ‰å¯¹åº”的条目显½C?/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">全外˜qžæŽ¥</font><font size="3"><font color="#000000"><span>full [outer] join<br /> </span>昄¡¤º½W¦åˆæ¡äšg的数据行åQŒåŒæ—¶æ˜¾½Cºå·¦å³ä¸½W¦åˆæ¡äšg的数据行åQŒç›¸åº”的左右两边昄¡¤ºNULLåQŒå³æ˜„¡¤ºå·¦è¿žæŽ¥ã€å³˜qžæŽ¥å’Œå†…˜qžæŽ¥çš„åÆˆé›?/font></font></span></p>                            ------http://hi.baidu.com/magickerr/blog/item/393c0a01aa13290b7aec2c63.html <img src ="http://www.aygfsteel.com/algz/aggbug/228218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:53 <a href="http://www.aygfsteel.com/algz/articles/228218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 外键兌™”的问题解å†Ïx–¹æ³?/title><link>http://www.aygfsteel.com/algz/articles/197804.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 02 May 2008 14:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/197804.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/197804.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/197804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/197804.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/197804.html</trackback:ping><description><![CDATA[一.å…ähœ‰å¤–键的表æ ?  HQL查询---"from A¾c?报错.<br /> 解决æ–ÒŽ(gu¨©)³•:  不能模糊查询,需指定查询的属æ€?  å¦?  "select 别名.属æ€?from A¾c?as 别名".<br /> (æ³?有时候问题就是那么的奇æ€?如遇åˆîC¸Š˜q°é—®é¢?可以试试˜q™ä¸ªæ–ÒŽ(gu¨©)³•.MYSQL6.0好像没这问题;5.0好像æœ?)<br /> <br /> äº?A表的外键定义B表的非主é”?  HQL查询˜q”回¾l“果为空值或报空指针错误或类型è{换失è´?<br /> 解决æ–ÒŽ(gu¨©)³•:  因䨓(f¨´)Hibernate 默认外键的关联是主键,  所以需加上<many-to-one  property-ref="å…Œ™”¾cȝš„属æ€? ......> <br /> å…Œ™”¾c?HBM.XML---        <br />        <set name="as" inverse="true"><br />             <key property-ref="content"><br />              <column name="bc" length="45" not-null="true" /><br />             </key><br />             <one-to-many class="com.a.A" /><br />         </set> <img src ="http://www.aygfsteel.com/algz/aggbug/197804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-05-02 22:55 <a href="http://www.aygfsteel.com/algz/articles/197804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主表的键是从表的外键,外键的çñ”è?http://www.aygfsteel.com/algz/articles/191218.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 07 Apr 2008 04:05:00 GMThttp://www.aygfsteel.com/algz/articles/191218.htmlhttp://www.aygfsteel.com/algz/comments/191218.htmlhttp://www.aygfsteel.com/algz/articles/191218.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/191218.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/191218.html 从表:  Næ–?
主表的键删除,从表与之对应的外键也删除.
从表的外键删�主表无反�
ON DELETE/UPDATE CASCADE,在外键定义时加上.

以下内容摘自:http://www.jianglb.com/2007/09/02/mysql-foreign-key.html

外键的作用:(x¨¬)

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据ã€?使两张表形成兌™”åQŒå¤–键只能引用外表中的列的å€û|¼
例如åQ?br /> a b 两个è¡?br /> a表中存有 å®¢æˆ·åøP¼Œå®¢æˆ·åç§°
b表中存有 每个客户的订å?br /> 有了(ji¨£n)外键å?br /> 你只能在¼‹®ä¿¡b 表中没有客户x的订单后åQŒæ‰å¯ä»¥åœ¨a表中删除客户x

建立外键的前提:(x¨¬) 本表的列必须与外键类型相å?外键必须是外表主é”?ã€?

指定主键关键字:(x¨¬) foreign key(列名)

引用外键关键字:(x¨¬) references <外键表名>(外键列名)

事äšg触发限制: on deleteå’Œon update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(讄¡©ºå€û|¼‰(j¨ª),set DefaultåQˆè®¾é»˜è®¤å€û|¼‰(j¨ª),[默认]no action

例如åQ?

outTableè¡?主键 id ¾cÕdž‹ int

创徏含有外键的表åQ?br /> create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);

说明åQšæŠŠidåˆ?è®¾äØ“(f¨´)外键 参照外表outTableçš„idåˆ?当外键的值删é™?本表中对应的列筛é™?当外键的值改å?本表中对应的列值改变ã€?



]]>
[转]在MySQL中利用外键实现çñ”联删除!http://www.aygfsteel.com/algz/articles/191215.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 07 Apr 2008 04:00:00 GMThttp://www.aygfsteel.com/algz/articles/191215.htmlhttp://www.aygfsteel.com/algz/comments/191215.htmlhttp://www.aygfsteel.com/algz/articles/191215.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/191215.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/191215.html
下面åQŒæˆ‘们先创徏以下‹¹‹è¯•用数据库表:(x¨¬)


CREATE TABLE `roottb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `data` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) TYPE=InnoDB;

CREATE TABLE `subtb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  `data` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  INDEX (`rootid`),
  FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
) TYPE=InnoDB;


注意åQ?
1、必™åÖM‹É用InnoDB引擎åQ?
2、外键必™åÕd¾ç«‹çƒ¦(ch¨³)引(INDEXåQ‰ï¼›
3、外键绑定关¾p»è¿™é‡Œä‹É用了(ji¨£n)“ ON DELETE CASCADE”åQŒæ„æ€æ˜¯å¦‚果外键对应数据被删除,ž®†å…³è”数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档;

好,接着我们再来插入‹¹‹è¯•数据åQ?


INSERT INTO `roottb` (`id`,`data`)
  VALUES ('1', 'test root line 1'),
         ('2', 'test root line 2'),
         ('3', 'test root line 3');

INSERT INTO `subtb` (`id`,`rootid`,`data`)
  VALUES ('1', '1', 'test sub line 1 for root 1'),
         ('2', '1', 'test sub line 2 for root 1'),
         ('3', '1', 'test sub line 3 for root 1'),
         ('4', '2', 'test sub line 1 for root 2'),
         ('5', '2', 'test sub line 2 for root 2'),
         ('6', '2', 'test sub line 3 for root 2'),
         ('7', '3', 'test sub line 1 for root 3'),
         ('8', '3', 'test sub line 2 for root 3'),
         ('9', '3', 'test sub line 3 for root 3');
  

我们先看一下当前数据表的状态:(x¨¬)


mysql>; show tables;
+----------------+
| Tables_in_test |
+----------------+
| roottb         |
| subtb          |
+----------------+
2 rows in set (0.00 sec)

mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  2 | test root line 2 |
|  3 | test root line 3 |
+----+------------------+
3 rows in set (0.05 sec)

mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  4 |      2 | test sub line 1 for root 2 |
|  5 |      2 | test sub line 2 for root 2 |
|  6 |      2 | test sub line 3 for root 2 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
9 rows in set (0.01 sec)


嗯,一切都正常åQŒå¥½åQŒä¸‹é¢æˆ‘们要试验我们的çñ”联删除功能了(ji¨£n)ã€?

我们ž®†åªåˆ é™¤roottb表中idä¸?的数据记录,看看subtb表中rootidä¸?的相兛_­¾Uªå½•是否ä¼?x¨¬)自动删除ï¼?x¨¬)


mysql>; delete from `roottb` where `id`='2';
Query OK, 1 row affected (0.03 sec)

mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  3 | test root line 3 |
+----+------------------+
2 rows in set (0.00 sec)

mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
6 rows in set (0.01 sec)


嗯,看subtb表中对应数据¼‹®å®žè‡ªåŠ¨åˆ é™¤äº?ji¨£n),‹¹‹è¯•成功ã€?

¾l“论åQšåœ¨MySQL中利用外键实现çñ”联删除成功!

                                                                    -----------转帖:http://www.chinaunix.net/jh/17/462977.html

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º °¢À­ÉÆ×óÆì| ¸Ê×ÎÏØ| ³Ê¹±ÏØ| ÜÆ½­| ÓÒÓñÏØ| Ìì×£| ·ï³ÇÊÐ| ᯹®ÏØ| ÐÂÓªÊÐ| ÎÚÉóÆì| ½­Ô´ÏØ| »´ÑôÏØ| ̨ɽÊÐ| ÓÀÊ¤ÏØ| ÇàÁú| ¶àÂ×ÏØ| °¢ÍßÌáÏØ| ³¤º£ÏØ| ÇåË®ºÓÏØ| ʯ¼ÒׯÊÐ| ͬÐÄÏØ| ¶«·½ÊÐ| ÎÌÅ£ÌØÆì| IJ¶¨ÏØ| ÙñÖÝÊÐ| °Ý³ÇÏØ| Ò¦°²ÏØ| Ì©À´ÏØ| ÇØ°²ÏØ| ÀäË®½­ÊÐ| ÄϺÍÏØ| ¶«¸ÛÊÐ| ³¤É³ÏØ| ÔªÀÊÇø| ̨°²ÏØ| º¼½õºóÆì| ÂåÑôÊÐ| ¡°²ÏØ| ¹®ÁôÏØ| ¾¸ÖÝ| ÎäÍþÊÐ|