子查询
在SELECT语句中使用
use sql_invoicing;selectclient_id,name,(SELECT sum(invoice_total) FROM invoices where client_id = c.client_id) AS total_sales,(select avg(invoice_total) from invoices) AS average,(select total_sales - average) AS differenceFROM clients c
在FROM语句中使用
use sql_invoicing;select *FROM(selectclient_id,name,(SELECT sum(invoice_total) FROM invoices where client_id = c.client_id) AS total_sales,(select avg(invoice_total) from invoices) AS average,(select total_sales - average) AS differenceFROM clients c) AS table_a
为了简洁美观,最好先创建一个视图,再引用
在WHERE语句中使用
用一个查询返回的值去代替上一个查询的值
eg:找到比胡萝卜更贵的商品(胡萝卜的ID为3)SELECT *FROM productsWHERE unit_price > (SELEECT unit_priceFROM productsWHERE product_id = 3)
子查询的返回值可以是一个值,一列值,也可以是一张表
in 关键字
返回值为一列值时使用WHERE 某一属性值 in(SELECTFROMWHERE)
为了代码的简洁和执行效率,需要合理运用子查询和JIONS
ALL\ANY\SOME关键字
当子查询返回值时一列值时,在括号前加上ALL\ANY\SOME
eg:salary >**ALL **(
ALL类似于MAXSELECT salaryFROM employeeWHERE locate ='Beijin')```<br />即薪水比所有位于北京的工作者的都要高<br />换成ANY\SOME后,代表比子查询中的任意一个要高即可<br />当表达式为等于时,类似于IN,但注意语法不同,IN不用加等号<br />EXISTS关键字<br />类似于子查询的IN和JON语句<br />不同点在于:子查询IN返回的是一列值,但EXISTS返回的是一条指令,当IN返回值较多时,查询性能就会受影响,但EXISTS不同,它先执行子查询中的WHERE语句,并返回TRUE或者FALSE。<br />eg:<br />SELECT *<br />FROM products p<br />WHERE EXIST(<br />SELECT product_id<br />FROM order_items oi<br />WHERE p.product_id = oi.product_id<br />)`
