MySQL数据库添加主键、外键的操作以及数据库原理中的笛卡儿积、内连接,外连接相关知识


 

 

alter table foods add constraint fk_Foods_Category  foreign key(CategoryId)  references Category(id);

####-----增加外键的方法------#####

#######alter table 需加外键的表 add constraint 外键名 foreign key(需加外键表的字段名) referencnes 关联表名(关联字段名);#####

alter table news add constraint fk_News_Users foreign key(UserId) references user(id);

删除外键的代码

//先删除外键约束

alter table foods drop foreign key fk_Foods_Category;

alter table news drop foreign key fk_News_Users;

//删除主键的方法

alter table 表名 drop primary key; --删除主键

alter table 表名 add primary key(字段名,...);  --增加主键

//利用primary key(Sno,Cno)创建符合联合主键

create table test 

   name varchar(19), 
   id number, 
   value varchar(10), 
   primary key (name , id) 

 

数据库中的笛卡儿积、左外连接、内链接、右外连接、全连接的概念以及具体实现在数据库中的实现过程:

笛卡儿积:

     简单意思是两个集合的相乘,例如

集合A={a,b }  集合B= { 0 , 1 , 2}

则集合A x B就是A与B的笛卡尔积,其结果为:

{(a,0),(a,1),(a,2),(b,0),(b,1),(吧,2)}

例如关系R

A1

A2

A3

a

b

c

b

a

c

c

a

c

 

关系S

B1

B2

B3

b

a

c

a

b

c

c

a

b

 

 则R x S 的笛卡尔积如下:

A1

A2

A3

B1

B2

B3

a

b

c

b

a

c

a

b

C

a

b

c

a

b

c

c

a

b

b

a

C

b

a

c

b

a

C

a

b

c

b

a

C

c

a

b

c

a

b

b

a

c

c

a

b

a

b

c

c

a

b

c

a

b

 

用SQL语句执行笛卡儿积的操作:(用交叉连接实现

select * from R cross join S

内连接运算:按我的理解就是两个表的内部操作,以两张表为主观方向去理解,通俗地说就是两方都存在的数据,不以单方向为主出现另外一张表为空的状态。所以查询后的结果也验证了这一点:

关系R和关系S内链接操作:

例如关系R

A1

A2

A3

a

b

c

b

a

c

c

a

c

关系S

B1

B2

B3

e

r

c

a

b

c

c

a

b

 

关系R和S内连接结果如下:

A1

A2

A3

B1

B2

B3

a

b

c

a

b

c

c

a

b

c

a

b


  1. 内连接
    (以表主键进行连接)

在每个表中找出符合条件的共有记录。[x inner join y on...]

第一种写法:用where

select t.teacher_name, s.student_name from teacher t,student s where t.id = s.teacher_id;

第二种写法:(join .. on.. )
select t.teacher_name, s.student_name from teacher t join student s on t.id = s.teacher_id;

第三种写法:(inner join .. on.. )
select t.teacher_name, s.student_name from teacher t inner join student s on t.id = s.teacher_id;

外连接:分为左外连接、右外连接、全连接三种

左外连接(简称为左连接):

左连接可以通俗的理解为,以左边这张表为主导,左边数据不变,按查询条件显示右边部分满足的数据

A1

A2

A3

a

b

c

b

a

c

c

a

c

 

关系S

B1

B2

B3

b

a

c

q

b

r

c

a

b

 

左外连接的结果如下:

A1

A2

A3

B1

B2

B3

a

b

c

null

null

null

b

a

c

b

a

C

c

a

c

c

a

b

 

SQL操作结果显示:(以表主键进行连接

具体举例

数据中的连接join分为内连接、自然连接、外连接,外连接又分为左外连接、右外连接、全外连接。
  当然,这些分类都是在连接的基础上,是从两个表中记录的笛卡尔积中选取满足连接的记录。笛卡尔积简单的说就是一个表里的记录要分别和另外一个表的记录匹配为一条记录,即如果表A有3条记录,表B也有三条记录,经过笛卡尔运算之后就应该有3*3即9条记录。如下表:

自然连接(natural join)
  自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。
  sql语句:Select …… from 表1 natural join 表2
  结果:

   内连接(inner  join)
  内连接基本与自然连接相同,不同之处在于自然连接奥球是同名属性列的比较,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。
  sql语句:Select …… from 表1 inner join 表 2 on 表1.A=表2.E
  结果:

A

B

C

C

D

E

1

2

3

3

4

5

当内链接不带on查询条件时查询结果为笛卡尔积
  自然连接时某些属性值不同则会导致这些元组会被舍弃,那如何保存这些会被丢失的信息呢,外连接就解决了相应的问题。外连接分为左外连接、右外连接、全外连接。外连接必须用using或on指定连接条件。
 左外连接(left outer join)
  左外连接是在两表进行自然连接,只把左表要舍弃的保留在结果集中,右表对应的列上填null。
  sql语句:Select …… from 表1 left outer join 表2 on 表1.C=表2.C
结果:


  右外连接(rignt outer join)
  右外连接是在两表进行自然连接,只把右表要舍弃的保留在结果集中,左表对应的列上填null。
 Select …… from 表1 rignt outer join 表2 on 表1.C=表2.C
  结果:

 

  全外连接(full join)
  全外连接是在两表进行自然连接,只把左表和右表要舍弃的都保留在结果集中,相对应的列上填null。
 Select …… from 表1 full join 表2 on 表1.C=表2.C
  结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM