mysql必知必会(下)

分组数据

是什么

分组数据是可以将数据分为多个逻辑组,以便对每个组进行汇聚计算的语句

为什么用这个

前面提到的知识都是割裂开的,单独的知识点,遇到一点稍微复杂一点的逻辑就不能胜任了,例如,有多个供应商提供多种商品,现在想针对每个供应商都统计出他们具体提供了多少种商品,这个时候用分组就比较方便

怎么用

基本使用

使用GROUP BY子句

在分组中过滤

使用HAVING子句代替WHERE子句,因为WHERE所筛选的是行,而HAVING筛选的是分组

排序

依然可以使用ORDER BY子句

子查询

是什么

可以将多个单独的查询做为一条整体的语句进行查询

为什么

举个书上的例子,现有三张表,存放订单物品id等详细信息的orderitems、存放用户id等信息的订单orders以及存放用户信息的customers。现在需求是要把订购了某种商品的用户找出来。那么如果用简单的SQL语句要查找三次,但是使用子查询,可以在查询中嵌套语句,用于将一条语句的查询结果当做另一条语句的查找条件

怎么用

使用IN操作符,把子查询语句加在后面即可。就上面的例子来说,子查询是类似这样的语法:

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='TNT2'));

联结

是什么

联结可以将多张表中的列合在一起进行查询的一种手段

为什么

由于数据表设计的时候需要将不同的信息分别存在不同的表中,所以想单单一张表中取出信息在大多情况下不太现实,所以需要一次性查多张表。除了子查询,联结也可以进行多张表的查询

怎么用

基本上,联结的语法是这样的SELECT what_columns FROM tableA JOIN_TYPE tableB JOIN_CLAUSE;

例如内联结:

SELECT c.cust_id, o.order_num 
FROM customers AS c INNER JOIN orders AS o 
ON o.cust_id = c.cust_id; 

外联结:

SELECT c.cust_id, o.order_num 
FROM customers AS c LEFT OUTER JOIN orders AS o 
ON o.cust_id = c.cust_id;

内联结与外联结

内联结可以把同时存在于被联结的表中相关列的数据查找出来;而外联结则可以将联结的表中的所有数据的相关列都查找出来

外联结名称的由来也跟 NULL 有关,即“结果中包含原表
中不存在(在原表之外)的信息”。相反,只包含表内信息的联结也就被
称为内联结了。

—《SQL基础教程》

外联结的主表

在上面不难发现,在使用外联结的时候需要在联结关键字前加上LEFT字样,具体原因就是在外联结时需要选择一张表作为主表,而选择的依据就是在OUTER JOIN前的字。那么上面的LEFT说明SQL语句中写在左侧的是主表。左右外联结的区别在于选择谁做主表,就会将主表中所有的数据返回和其他表对应列做比较,如果其他表中没有对应的数据就用NULL补齐相关列。

所以,在《SQL基础教程》中,语句7-11返回15条数据,其中有两条数据中相关列为空;而语句7-12则返回13条数据,没有空数据。

组合查询-UNION

是什么

可以将多张表进行并集运算的功能

为什么

可以将多张表中的数据取去重后的并集并返回

怎么用

SELECT 语句1
UNION
SELECT 语句2

可以自动去重,而 UNION ALL则可以返回全部的数据,不去重

由于并集查询相当于将多条SELECT语句当成一条,所以在语句的最末尾只能使用一次ORDER BY语句

视图

是什么

用来保存SQL查询语句的一种功能

为什么

当一些SQL语句过于冗长时,可以将这些语句保存成视图,从而把视图当做一张虚拟的表来用;另外由于视图中不存储实际的数据,所以可以省存储空间,而且视图中的数据可以随着实际数据的变化而变化。

怎么用

CREATE VIEW  视图名称 (< 视图列名 1>, < 视图列名 2>,  …… )
AS
<SELECT 语句 >

事务

是什么

事务是需要在同一个处理单元中执行的一系列更新处理的集合

为什么

以转账为例,如果不用事务,SQL语句是立即生效的。那么当转账出去后假如数据库崩了,那么不但收款方收不到转出去的欠款,打款一方的钱白白的被扣除掉了。事务就是为了防止这种尴尬的局面出现的一个解决方案

怎么用

START TRANSACTION;
	CURD语句
COMMIT; 
-- ROLLBACK;

COMMIT 是确认提交事务,而ROLLBACK则是回滚,取消刚才的操作对数据库的修改

posted @ 2018-11-12 23:40  学学代码记记笔记  阅读(206)  评论(0)    收藏  举报