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则是回滚,取消刚才的操作对数据库的修改

浙公网安备 33010602011771号