关于Subqueries复合句,很多时候可以和JOIN形式互相替换,这时就要注意performance和readability,MOSH老师让观看者先注意readability,给出的练习为找出买了product_id = 3 的顾客,解法如下:
![9ad29e828d1a99db663a2fe6429fb307.png](https://i-blog.csdnimg.cn/blog_migrate/2d50f0c9f75fe2883edc4c2b205f1521.png)
上图为使用JOIN的解法,可以看到逻辑较为清晰,意图明确。
![34d6d76efcc9cdc3a4409f44776adde8.png](https://i-blog.csdnimg.cn/blog_migrate/350b3e82202cf28dd3d693e6ea1b6ef2.png)
上图为使用了Subqueries的解法,可以看到在复合里又有JOIN指令,有些复杂,所以在这个例子中,使用单纯的JOIN将会更好。
ALL 关键字
ALL关键字通常用在比较中,和MAX()、MIN()互换,它是指列表中的所有数,示例如图:
![71849b79a99de7a9500ce9723a654cf6.png](https://i-blog.csdnimg.cn/blog_migrate/69655c811a7312ebae909086443b2ae4.png)
用ALL就可以让MySQL比较括号里能找到的所有数据进行比较,也就是说,最后选中的数据要比括号里所有的数据还要大才行。
ANY关键字
ANY关键字可以与IN关键字替换,这时要用= ANY()的形式,通常加条件时,他表示某一条件符合括号中任一一个值,与IN差不多,此处不赘述。
关联子句
有时候会遇到需要和指定条件的人的平均值进行比较,即不是和所有人进行比较,这是需要在复合句中加入限定条件。如下例:
![e7b6bc90aa7f32a868121283800e5ab5.png](https://i-blog.csdnimg.cn/blog_migrate/283e45793f99898d2395f11d7e4128b7.jpeg)
在本例中,要查询的是每一位顾客中大于自己支票平均值的支票信息,由于不是和所有人的支票平均值进行比较,所以在复合中加入了条件,限定client_id相同。
EXISTS 指令
若在复合前用IN指令时我们知道,复合语句先选出一系列值给主句来挑选。这里有一个弊端,如果复合语句返回的是一个数据量庞大的列表,系统逐一比对将会耗费很多时间,所以这里用EXISTS指令比较好,如图:
![12468fcb7bb41bf8cc1b68c4e3f47afc.png](https://i-blog.csdnimg.cn/blog_migrate/60692c9fdc88fe61ff5e2701b539c016.png)
此处想要查询没有被订购过的商品。用EXISTS指令返回的是一个indication,用TRUE和NOT的形式告诉MySQL哪一行是符合条件的,直接掉出结果,逻辑上更加简便直接。
SELECT指令后的复合句
之前的复合句都写在WHERE后加条件,如果要直接选中一些带条件的列,则要在SELECT指令后加复合句,这里学到一个小技巧,在SELECT中加的别称虽然不能直接在之后使用,但是可以用(SELECT +别称)来直接使用,如图:
![718a8d42fc7cca7f5c0d89c51036e5a2.png](https://i-blog.csdnimg.cn/blog_migrate/ebb90146fa4c38876ec07e9e9b887cb1.jpeg)
本例中用到了SELECT后的复合句,关联子句和上述技巧,全方位展现了SELECT后复合句用法。
FROM指令后的复合句
现在来看FROM指令后的复合句,其实就是把上面所得的结果当成一个新的数据表来使用,这里要注意,一定要给这个表一个别称或新名字。