SQL中的外键约束及多表查询

SQL中的外键约束及多表查询

外键约束

foreign key

实体:数据库中的表,就可以看作一个实体,实体和实体之间有一些关系

比如说做一个网上商城的项目,里面有用户表,商品表,订单表

一对多的关系:用户和订单

用户和订单,用户表属于单表一方,订单表属于多表,意思是一个用户可以有多张订单

--创建用户表
create table user(
	id int primary key auto_increment,
    username varchar(10)
);
--创建订单表
create table orders(
	id int primary key auto_increment,
    totalprice double,
    user_id int
);

--我们要添加外键约束,让两张表之间产生制衡,我们就在多表一方添加外键约束,去关联主表一方的主键

--修改表来添加主键约束
alter table orders add foreign key(user_id) references user(id)

--添加了外键约束,主表一方不能删除多表还在引用的数据,多表一方不能添加主表没有描述的数据

--开发中处理一对多:在多表中添加一个外键,名称一般为主表的名称id,字段类型一般和主表的主键类型保持一致,为了保证数据的有效性和完整性,在多表的外键上添加外键约束即可。

多对多的关系:商品和订单

每个商品可以属于不同的订单

--创建商品表
create table product(
	id int primary key auto_increment,
    name varchar(20),
    price double
);
--创建中间表
create table orderitem(
	oid int,
    pid int
);
--添加外键约束
订单和中间表
alter table orderitem add foreign key(oid) references orders(id);
商品和中间表
alter table orderitem add foreign key(pid) references product(id);

--开发中处理多对多:引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就将多对多的关系拆分为两个一对多了,为了保证数据的有效性和完整性,需要在中间表上添加两个外键约束即可。

多表查询

多张表的无条件的联合查询,没有任何意义

select a.*,b.* from a,b;

(1)内连接:

格式一:显式的内连接

select a.*,b.* from a [inner] join b on ab的连接条件

格式二:隐式的内连接

select a.*,b.* from a,b where ab的连接条件

(2)外连接

左外连接:

select a.*,b.* from a left [outer] join b on 连接条件;    --outer可以不写
意思:先展示join左边的(a)表的所有数据,根据条件关联查询join右边的表(b),符合条件则展示出来,不符合以null值展示。

右外连接:

select a.*,b.* from b right [outer] join a on 连接条件;  --outer可以不写
意思:先展示join右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示。

(3)查看用户名确定的订单

查看用户为张三的订单详情

1.先查询张三的id
select id from User where username = '张三';
2.select * from orders where user_id = ?;
--判断条件,当id相同时的订单的内容
两个合二为一  注意:后面的条件 把括号带上
select * from orders where user_id = (select id from User where username = '张三'); 

(4)查询出订单价格>300的用户的所有信息

1.先查询出订单价格>300的用户的id
select user_id from orders where price >300;//(3,3,5,null)
2.select * from user where id =?;
		
两个合二为一:
select * from user where id =(select user_id from orders where price >300);

(5)查询订单价格大于300的订单信息及相关用户信息

方式一:内连接
select orders.*,user.* from orders,user where user.id=orders.user_id  and orders.price>300 ;

方式二:子查询    是将一张表的查询结果作为一张临时表
--先查出 订单大于三百的 订单  然后可以作为一个临时表    select * from orders where price>300
--合二为一条  注意给临时表 起个别名 注意给表起别名 名字不要带引号
其实用的就是内链接 查两张表 注意把临时表用户括号括起来
select user.*,tmp.* from user,(select * from orders where price>300) as tmp where user.id=tmp.user_id;

你可能感兴趣的:(SQL中的外键约束及多表查询)