Mysql 你必须知道的查询语句

引言

在Mysql数据库的操作中有核心的两种语言,一种是DDL(Data Definition Language),翻译为数据定义语言,它主要是对数据库,表的创建,修改和删除。另外一种叫DML(Data Manipulation Language),翻译为数据操作语言,它主要是对表数据的插入,查询,修改和删除,也称之为CRUD(Create、Read、Update、Delete)操作。在本篇博文中,主要是介绍了在DML中的一些不太常用,但是很核心的命令,主要包括JOIN操作,子查询,DISTINCT操作,GROUP BY,IN和BERWEEN等等。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:blog.csdn.net/u012403290

技术点

所有DML的命令的演示,需要有数据库表,然而数据表之间的逻辑,我们用ER建模来描述表与表之间的关系。

1、Crow`s foot表示法
是一种ER建模的表现模式,实体标识为矩形框,关系标识为矩形框之间的线,线两端的形状表示关系的基数。空心圆表示零或多,单阴影线表示一或多,单阴影线和空性圆表示零或一,双阴影线表示有且仅唯一。在维基百科中有这么一张图片,我给它加了描述:
《Mysql 你必须知道的查询语句》

它所表达的就是,在Song实体一方存在空心圆,表示0,1或者更多。靠近Artist实体一方的双竖线表示1有且只为1。所以它整体所要表现的是一个艺术家可以表演0首,1首或者更多的歌曲。

一个例子

在测试每一个命令之前,我们需要定义一个数据模型。以下是它们之间的Crow`s foot 表示的ER图:
《Mysql 你必须知道的查询语句》
在上面的图中,描述了这么一种场景:
用户注册了应用之后,会在user表中增加一条用户数据,相应的会在token中增加一条属于该用户的token,它们之间的关系是一个用户只拥有一个tokne。在应用上购买产品,购买一次就会在order表中增加一条数据,它们之间的关系就是一个用户可以拥有0个、1个或者多个购买记录。interest表表示兴趣类型,user_interest表示用户关联兴趣,它们之间的关系就是用户可以有1个或者多个兴趣,一个兴趣被一个或者多个用户所关联。且各个表单内容如下:
user表:
《Mysql 你必须知道的查询语句》

token表:
《Mysql 你必须知道的查询语句》

order表:
《Mysql 你必须知道的查询语句》
注意图片中上面在select的时候并不成功,因为order是mysql的保存关键字。说明我这个例子并不是很完美,不过如果涉及到关键字,你可以用‘order’来包含它就可以正常使用。

interest表:
《Mysql 你必须知道的查询语句》

user_interest表:
《Mysql 你必须知道的查询语句》

匹配符

mysql有两个通配符,“_”匹配任意单个字符,“%”匹配任意多个字符
比如说我要在user表中查询开始为si,共有5个字符名字的用户,可以这么描述:
select * from user where name like ‘si___’;#注意这里有3个“_”。
《Mysql 你必须知道的查询语句》

再比如说我要在user表中查询已t开头为名字的用户,可以这么描述:
select * from user where name like ‘t%’;
《Mysql 你必须知道的查询语句》

范围操作符

mysql有两个范围操作符,“IN”和“BETWEEN”。
比如说我要在order表中查找价格为100和200的订单记录,可以这么描述:
select * from order where price in(100,200);
《Mysql 你必须知道的查询语句》

再比如说,我要在order表中查找,价格介于150到200区间的订单记录,可以这么描述:
select * from order where price between 150 and 200;
《Mysql 你必须知道的查询语句》

去除重复数据

mysql中我们用DISTINCT来获取不重复的唯一值。
比如说我们要在order表中查看哪些用户买过产品,也就是要去除单个用户多次购买的记录,那么我们可以这么描述:
select distinct user_id from order;
《Mysql 你必须知道的查询语句》
当然,这里还是不够彻底可以看出那些用户,在后面会继续说这个问题。

分组统计

mysql中用GROUP BY 来进行分组统计。
比如说我要查看order表,按照各个价位查看订单,那么我们可以这么描述:
select * from order group by price;#在这种情况下,订单列表会按照订单价格出现的次数进行降序排列,比如说在这个例子中price=100出现了两次,那么它就会在筛选的头部:
《Mysql 你必须知道的查询语句》

聚集函数

mysql中有很多函数,最常用的包括:COUNT,计算总量;MIN,寻找最小;MAX,寻找最大;AVG,平均值;SUM,求和;
比较简单,就不贴图了,比如说你要计算一共有多少用户,可以直接这样描述:
select count(*) from user;

比如你要计算订单总共有多少钱,那么你可以这么描述:
select sum(price) from order;

并集操作

mysql中主要用UNION和UNION ALL进行并集操作,他们的用途主要是把两个结果集合并为一个,但是UNION比UNION ALL 更快捷。UNION在做并集的时候,会去除重复的数据。同时要注意一点,如果要把两个结果集进行并操作,那么你必须保证他们的列数是相等的,如果不相等会提示:The used SELECT statements have a different number of columns 错误。还需要注意的一点是,它的列名会复用你前面一张表的列名,比如说在例子中,user_interest表与order表一样都是有3列,那么我们可以对他们进行并操作,描述如下:
select * from user_interest union select * from order;
《Mysql 你必须知道的查询语句》

JOIN链接

join链接操作链接的表越多,那么函数嵌套的层数也会越多,算法复杂度就会呈指数增长。同时,join操作分为三种:①等值链接,INNER JOIN,其中INNER可以省略;②左外连接,LEFT JOIN;③右外连接,RIGHT JOIN。

等值链接:
比如说我们要直观的查看哪些用户购买了产品,那么最好的显示就是用户信息+该用户所对应的消费信息,那么我们可以这么描述为:
select * from user u join order o on u.user_id = o.user_id;
在上面的描述中, user u的意思就是用u这个简单的字符来代替user这个复杂的描述,在后面的on条件中我们就可以直接用u.user_id来描述实体的属性。同理order表也是如此,用o来代替。上面的描述翻译过来就是:关联查询user表和order表,在user_id相等的情况下。
《Mysql 你必须知道的查询语句》

左外连接:
通俗的说就是,假如A,B两表进行左外连接,那么它会展示所有A表的数据,那么A表对应条目在B表是空的情况。
比如说上面的情况,我要查看所有用户,直观的看出哪些用户没有购买产品,那么我们可以这么描述:
select * from user u left join order o on u.user_id = o.user_id;
《Mysql 你必须知道的查询语句》
在上面的图中可以看出,user表所有的用户都会展现出来,即使这个linda完全没有购买产品也会展示出来。

右外连接:
和左外连接恰恰相反的,它会展示出所有的B表的数据,哪怕A表的数据是空。所以右外连接很少使用,因为它很容易就可以转换成左外连接。我们把上面的情况改变一下,换一种形式:
select * from order o right join user u on o.user_id = u.user_id;
那么结果是刚好相反的,NULL出现了在左边:
《Mysql 你必须知道的查询语句》

在这里,我想说明一下mysql中NULL值,在mysql中判断NULL值一般都是用IS NULL或者IS NOT NULL,不能用操作符 ==和!=来描述。因为NULL是一个特殊的值。

子查询

子查询也是属于一种嵌套查询,而且特别好理解。
比如说我要查询那些用户购买了200产品,那么我们用子查询就可以这么描述:
select * from user where user_id = (select user_id from order where price = 200);
《Mysql 你必须知道的查询语句》

这里我们要注意这个“=”号,在子查询的结果唯一的时候我们可以用“=”号来进行关联,但是如果子查询有很多的返回,那么就要用我们前面说到的IN的范围操作符了。比如说我要查询谁购买了价格为100的产品,在本例子中价格为100的有两条,如果用“=”号来链接就会抛出这个错误:Subquery returns more than 1 row。而用IN来描述就可以:
《Mysql 你必须知道的查询语句》

尾记

在日常的操作数据库的过程中,其实很少如上面的例子一样操作的。可以采用一些mysql工具,比如说:Sqlyog,Navicat,甚至是mysql workbench等等。博主比较喜欢Sqlyog,用起来方便实用。同时,很多工具都可以根据的设计的数据库,给你生成一个对应的ER图,下图是我用sqlyog自动生成的brickwork库的ER图:
《Mysql 你必须知道的查询语句》

希望对大家有所帮助。

    原文作者:SQL
    原文地址: https://juejin.im/entry/5902ddb244d9040069145fb2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞