《SQL必知必会》系列 04

国学大师王国维曾对学习三境界有过很好的描述:

第一境界:昨夜西风凋碧树,独上高楼,望尽天涯路。

第二境界:衣带渐宽终不悔,为伊消得人憔悴。

第三境界:众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

目前的自己仍旧处在第一境界的边边,危机感和努力程度还远达不到第二境界。明白了自己所处的位置,就用持续行动去提升自己吧。话不多说,开始今天的学习笔记。

今天分享《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代码,而不会影响实际的数据。

以上就是今天分享的内容。

感谢阅读,下次再见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值