国学大师王国维曾对学习三境界有过很好的描述:
第一境界:昨夜西风凋碧树,独上高楼,望尽天涯路。
第二境界:衣带渐宽终不悔,为伊消得人憔悴。
第三境界:众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
目前的自己仍旧处在第一境界的边边,危机感和努力程度还远达不到第二境界。明白了自己所处的位置,就用持续行动去提升自己吧。话不多说,开始今天的学习笔记。
今天分享《SQL必知必会》第13章~第15章。
第13章 创建高级联结
核心概念:表别名,自连接,自然联结,外联结,左外联结,右外联结,全外联结,联结中使用聚集函数
表别名:即给数据表另起名字,这么做的好处有两个,一是缩短SQL语句,二是可以在一条查询语句中多次使用同一张表。常用的关键字为AS, 也可以省略,需要注意的是Oracle中并不支持AS关键字。
请看代码:
SELECT RTRIM (vend_name)+’(’ +RTRIM(vend_country)+’)’ AS vend_title FROM Vendors ORDER BY vend_name;
自连接:Self-join ,即在一条查询语句中多次引用相同的表,自己连接自己。比如有一个需求是:要给Jim Jones同一公司的所有顾客发送一封邮件,那么就需要先查询出Jim Jones所在的公司,再查询出这个公司的所有顾客,代码如下:
SELECT c1.cust_id , c1_cust_name , c1.cust_contact FROM Customers AS c1,Customers c2 WHERE c1.cust_name=c2.cust_name and c2.contact=‘Jim Jones’;
外联结:许多联结都是一个表中的一行同其它表中的行进行连接,但有时候需要查询并没有和当前行有连接的行。比如下面这个需求:对每个顾客下过的订单进行查询,包括那些从没有下过订单的顾客,这个时候就需要用到外联结了。外联结用到的关键字是 OUTER JOIN。
针对上面的需求,请看实现代码:
SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
外联结和内联结的区别在于,外联结可以查询出没有关联的行。
全外联结:前面提到的外联结在查询时会自动把相同的行省略,而全外联结则会把重复的行一同显示在查询结果中。关键字为FULL OUTER JOIN.
SELECT Customers.cust_id, Orders.order_num FROM Orders FULL OUTER JOIN Customers ON Orders.cust_id = Customers.cust_id;
联结中使用聚集函数:可以在联结语句中使用OCUNT() 和 GROUP BY 等关键字进行查询。比如:
SELECT Customers.cust_id, COUNT (Orders.order_num) AS num_ord FROM Orders INNER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
第14 章 组合查询
核心概念:UNION 复合查询, 使用规则, UNION ALL, 其它类型UNION
对组合查询最直接的理解就是把两条SELECT查询语句放到一起,用UNION关键字进行连接。常见的使用场景有:
在一个查询中从不同的表返回结构数据
对一个表执行多个查询,按一个查询返回结果
比如有个需求:需要BeiJing, TianJin, XiaMen 这个三个城市的所有顾客的报表,还想包括不管在哪个城市的所有7Eleven,用where可以查询出来,但是用UNION 也可以。
SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_city in (‘Bei’,‘Tian’,‘Xia’)
UNION
SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = ‘7Eleven’;
需要注意的是:使用UNION虽然没有个数限制,但是使用过多,也会对性能造成影响,所以在实际开发中,根据实际情况选用UNION。
使用UNION的规则:
UNION必须由两条或者以上的SELECT语句构成,两个SELECT语句 用一个UNION, 四条用三个UNION关键字
UNION中每个查询必须包含相同的列,表达式或聚集函数(但不强制各个列以相同的次序列出)
列数据类型必须兼容:类型不必完全相同,但必须是数据库可以隐含转换的类型。
UNION ALL: UNION在连接两个查询语句时,会自动去重,如果希望保留所有的查询结果,那么可以使用UNION ALL 关键字。
其它类型的UNION: 使用并不多,EXCEPT(有时称为MINUS)可用来检索第一个表中存在而第二个表中不存在的行;INTERSECT可用来检索两个表中都存在的行。
第15章 插入数据
核心概念: 数据插入,INSERT INTO 插入完整的行,插入部分行,插入检索出的数据,INSERT SELECT, 一个表复制到另一个表,SELECT INTO
数据插入:指向数据表中插入新的数据,语法为INSERT INTO , 一般支持插入完整的行,也支持插入部分的行,语法稍有不同。
请看代码:
INSERT INTO Customers VALUES (‘10006’,‘Toy’,‘123’,‘New York’,‘NY’,‘1111’,‘USA’,NULL,NULL) //插入完整的行
INSERT INTO Customers (cust_id, cust_contact,cust_name) VALUES(‘10000’,‘4655’,‘Joeee’); //插入部分的行
插入检索出的数据:即利用SELECT 语句的结果插入表中,关键字为INSERT SELECT,由一个INSERT 语句和一个SELECT语句构成。
需求:把另一个表中的客户信息合并到Customers表中,就可以使用INSERT SELECT;
INSERT INTO Customers(cust_id, cust_name,cust_contact) SELECT cust_id, cust_name,cust_contact FROM CustNew;
从一个表复制到另一个表:关键字SELECT INTO; 它和INSERT SELECT的区别是 SELECT INTO 是导入数据,而 INSERT SELECT 是导出数据。
SELECT * INTO CustCopy FROM Customers;
它的最大作用在于:SELECT INTO 是试验新SQL语句前进行表复制的很好工具,先进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。
以上就是今天分享的内容。
感谢阅读,下次再见。