Sql Server 创建联结
--联结(join) 也可以叫做(等值联结)(内联结) 联结机制 联结是SQL中最重要、最强大的特性。 (之一)
--关系表的设计就是把信息分解为多个表,一类数据一个表 各表通过某些共同的值相互关联(所以才叫关系型数据库)。
--关系型数据库的可伸缩型 要比 非关系型数据库的可伸缩型要好。 可伸缩:能够适应不断增加的工作量而不失败。 所以前期设计阶段非常重要。
/*使用联结的初衷
关系型数据库需要把信息分解为多个表,之后通过某些值进行互相关联。原因:如果不同类型的数据都放在同一个表 1.数据容易重复、冗余。 2.不便于修改。3. 精准度降低。
但是分解为多个表,如何用一个select语句就可以检索到数据呢。 使用联结。
*/
select * from Vendors; --供应商表
select * from Products; -- 产品信息表 vend_id (供应商ID 也是用于vendors和products进行关联的值)
create table vendors_1 (vend_id varchar(15),vend_name varchar(20),vend_state int)
create table products_1 (prod_id varchar(15),vend_id varchar(20),prod_name varchar(15),prod_price int ,prod_desc varchar(100))
select * from vendors_1
insert into vendors_1 (vend_id,vend_name,vend_state) values ('A1','sanZhang',1) ,('B1','siLi',1),('C1','wuWang',0);
insert into products_1 (prod_id,prod_name,prod_price,prod_desc) values('TA5','阿波罗Kt',3.499,'这是一款kkt所制造的kkt'),('TA2','望京府',9.499,'这是一款非常好用的望远镜'),('TA3','不枉',31.499,'这是一款由白金所打造的猪'),('TA4','K爱莎t',3.499,'这是一款爱莎朱乃')
update products_1 set vend_id= 'A1' WHERE prod_id='TA1'
update products_1 set vend_id= 'A1' WHERE prod_id='TA3'
update products_1 set vend_id= 'B1' WHERE prod_id='TA2'
update products_1 set vend_id= 'C1' WHERE prod_id='TA4'
select * from vendors_1
select * from products_1
select * from vendors_1,products_1;
select * from products_1,vendors_1;
-- 要保证所有的联结都有 where子句
select * from products_1 ,vendors_1 where products_1.vend_id=vendors_1.vend_id;
-- INNER JOIN ON inner join on 语法: 表名 INNER JOIN 表名 ON 表名的列=表名的列
select prod_id,prod_name,vendors_1.vend_id from products_1 inner join vendors_1 on products_1.vend_id=vendors_1.vend_id;
select * from products_1 inner join vendors_1 on products_1.vend_id=vendors_1.vend_id;
-- OR
select * from products_1,vendors_1 where products_1.vend_id=vendors_1.vend_id;
--如果我们 要将两个表 进行使用联结机制 可以使用 INNER JOIN ON 联结机制规范首选 INNER JOIN ON ON子句用于联结表特定的列
select * from products_1 inner join vendors_1 on products_1.vend_id=vendors_1.vend_id;
-- DBMS在运行时关联指定的每个表, 但是联结非常耗费资源,因此需要注意不要联结不需要的表。 联结的表越多,性能下降的就越厉害。
select * from OrderItems,products,vendors where OrderItems.prod_id=products.prod_id and products.vend_id=vendors.vend_id and order_num=20007;
select * from OrderItems inner join products inner join vendors on OrderItems.prod_id=products.prod_id on products.vend_id=vendors.vend_id
--使用子查询
select * from Customers where Customers.cust_id in
(select Orders.cust_id from orders where orders.order_num in
(select OrderItems.order_num from OrderItems where orderitems.prod_id='BR01'));
--使用联结 如果 不标明查询列 而使用 * 则联结是对多个表的数据进行查询所有数据, 子查询是对最外层的表进行查询所有数据
select * from Customers,Orders,OrderItems
where OrderItems.prod_id='BR01' and OrderItems.order_num=orders.order_num and orders.cust_id=Customers.cust_id;