*以下内容来自本人对于《SQL必知必会(第四版)》的笔记与总结*
第十二课 联结表
SQL最强大的功能之一就是能在数据查询的操作中联结(join)表。
关系表的设计就是要把信息分解成多个表,一个数据一个表,各个表通过某些共同的值互相关联。
这样做的好处是,信息不重复,不会浪费时间和空间;
改动更方便;数据自然会一致。
因此,关系型数据库的伸缩性远比非关系型数据库要好。
举例:
SELECT vend_name, prod_name, pord_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id
在联结两个表时,实际要做的,是将一个表中的每一行和第二个表中的每一行配对。WHERE子句作为过滤条件。
没有联结条件的表关系返回的结果叫做笛卡尔积(cartiesian product)。
内联结(inner join)后面要接ON Vendors.vend_id = Products.vend_id
可以用AND语句联结多个表。
第十三课 创建高级联结
自联接(self join):使用表别名在一次查询中不止一次的引用相同的表。
举例:
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_constact = "Jim Jone";
许多DBMS处理联结远比处理子查询快得多
自然联结(natural join):排除多次出现,使每一列只返回一次
举例:
SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price
FROM Custmers AS C, Orders AS O, Orderitems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = "RGAN01";
外联接(outer join):外联接还包括没有关联行的行
SELECT Customers.cust_id, Oders.order_num
FROM Customers RIGHT OUTER JOIN Oders
ON Oders.cust_id = Customers.cust_id
右联结是指从OUTER JOIN 右边的表选择所有行,左联结是指从OUTER JOIN 左边的表选择所有行。
全外联接包含两个表的不关联的行。
第十四课 组合查询
UNION :组合两条SELECT语句,用UNION关键词分隔,并且将输出组合成一个查询结果集
有时候相当于WHERE 过滤语句中把条件用OR联结
UNION从查询结果集中自动去除了重复的行;也可以使用UNION ALL,将不会自动取消重复的行。
第十五课 插入数据
INSERT INTO Customers(cust_id,
cust_name)
VALUES (“100006”,
“Toy Land”);
如果某列没有值,应该用NULL代替。不管使用哪种INSERT语法,VALUES的数目必须正确。
INSERT SELECT可以插入多行。把另一张表上的内容合并到一张表里。
SELECT INTO可以把一张表的内容完全复制到另一张表。
区别在于INSERT SELECT是插入数据,SELECT INTO是导出数据。
第十六课 更新和删除数据
举例:
UPDATE Customers
SET cust_email = "kim@thetoystore.com"
WHERE cust_id = "1000000005";
注意:UPDATE语句一定要加WHERE条件,否则就是更新所有行
使用DELETE可以删除整行
举例:
DELETE FROM Customers
WHERE cust_id = "100000006";
保证每个表都要有主键。
第十七课 创建和操纵表
CREATE TABLE Products
(
prod_name CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
);
每个表列要么是NULL,要么是NOT NULL列。
NOT NULL列不允许接受没有列值的列。
更新表定义,可以使用ALTER TABLE 语句。
举例:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
或者
DROP COLUMN vend_phone;
可以使用DROP TABLE CustCopy语句删除一张表。
第十八课 使用视图