posts - 110,  comments - 152,  trackbacks - 0

第12章 联结表

联结表多个表直接通过关系形成的。数据库设计里面我们努力的把信息分解到多个表里面,表直接通过关系来联系。
看例子,这里不给表关系了,想想应该能看个大概:

1.

SELECT vend_name,prod_name,prod_price 
FROM Vendors INNER JOIN Products 
WHERE Vendors.vend_id = Products.vend_id;

注意:Where语句是关键,没有这个约束得到的只能是个笛卡尔积。

2.

SELECT cust_name,cust_contact 
FROM Customers,Orders,OrderItems 
WHERE Customers.cust_id = Orders.cust_id 
AND OrderItems.order_num =Orders.order_num 
AND prod_id ='RGA01';

这个等价于下面这条SQL

SELECT cust_name,cust_contact 
FROM Customers 
WHERE cust_id  IN ( SELECT cust_id 
                    FROM Orders
                    WHERE order_num IN (SELECT order_num 
                                        FROM OrderItems 
                                        WHERE prod_id='RGAO1' ));

注意:关联可以发生在多个表直接,表的数量没有限制。但是,联结表越多性能下降越快。
大家可以是试试,联结性能远高于嵌套查询。

 

第13章 创建高级联结

 

自联结:

SELECT c1.cust_id , c1.cust_name,c1.cust_contact  
FROM  Customers AS c1,Customers AS c2 
WHERE c1.cust_name = c2.cust_name 
AND c2.cust_contact ='Jim Jones';

外部链接:左外部链接(左链接,left outer join ... on ,*=  ) 和 右外部链接(右链接,right out join ... on , =*); 这个应该N熟悉了。

 

第14章 组合查询

1.组合查询一般用在两个地方:
在单个查询中,从不同的表类似的返回结构数据。
对单个表执行多个查询,按照单个查询返回数据。

2.其实where组合可以视为一种组合查询。

3.Union关键字,用于关联两个select查询。但是每个查询必须包含完全相同的列,表达式或聚集函数(不过各列的次序是不要求相同的)

4.Union会从查询结果中去除重复的结果,这个where组合的效果是一样的。如果不愿意这样,可以使用Union All 来关联查询。一般而言,Union都可以通过where来替代,但是Union All 有点特色,where替代不了。

5.某些DBMS还提供了其他的类似Union的关键字,如Except(Minus):检索第一个表中存在,而第二个表中不存在的行;Intersect:检索两个表中都存在的行,可用联结来取代。

 

第15章 插入数据

日常开发中用的比较多,而且一般用的比较简单。

1.最基本的插入:Insert Into ... Values...

2.插入检索出来的数据:

INSERT INTO Customers(cust_id,cust_contact,cust_email,cust_name)
 SELECT cust_id,cust_contact,cust_email,cust_name 
FROM CustNew;

注意:对应列的列名不要求一样,但是类型至少是兼容的。
SELECT子句可以使用Where加以修饰。

3.从一个表复制到另一个表

SELECT * INTO CustCopy FROM Customers;

而Mysql写法:

CREATE TABLE CustCopy AS 
SELECT * FROM Customers;

这样适合更合适表达这样的意思。

 

第16章 更新和删除数据

几个好习惯:

1.更新和删除操作一定要记得设置合适的Where子句;

2.实际操作前只好通过Select验证Where子句是否正确。

因为Sql里面是没有undo操作的。

 

第17章 创建和操作表

1.创建表: CREATE TABLE tablename;
   删除表: DROP TABLE tablename;
   更新表: ALERT TABLE tablename;
具体的需要查询手册。

2.重命名表:
DB2, Mysql,Oracle和PostgreSQL可以使用RENAME语句;而SQL Server 和Sybase可以使用sp_rename存储过程。

3.复杂的更新表操作一般过程如下

a.安装新的列规范重建立新表,复制旧表数据到新表,并检查新表所包含的数据
b.重明白旧表,用旧表名字重命名新表,更加需要重新创建触发器,存储过程,索引和外键。



平凡而简单的人一个,无权无势也无牵无挂。一路厮杀,只进不退,死而后已,岂不爽哉!
收起对“车”日行千里的羡慕;收起对“马”左右逢缘的感叹;目标记在心里面,向前进。一次一步,一步一脚印,跬步千里。
这个角色很适合现在的


posted on 2007-11-28 14:36 过河卒 阅读(896) 评论(0)  编辑  收藏 所属分类: DataBase/Sql

只有注册用户登录后才能发表评论。


网站导航:
 
文章来自: http://www.blogjava.com/ponzmd/ (彭俊-过河卒) 转贴请声明!
访问统计: