Mysql(四)

一、复杂查询

1、子查询

SELECT *
FROM products
WHERE unit_price >(
    SELECT unit_price
    FROM products
    WHERE product_id = 3
)

2、IN运算符

SELECT * 
FROM products
WHERE product_id NOT IN(
    SELECT DISTINCT product_id
    FROM order_iteams
)

3、子查询 VS 连接

使用哪种写法,自己思考
一、
SELECT *
FROM clients
WHERE client_id NOT IN (
    SELECT DISTINCT client_id
    FROM invoices
)
二、
SELECT *
FROM clients
LEFT JGON invoices USING (client_id)
WHERE invoice_id IS NULL

4、ALL关键字

大于客户三所有发票额的发票
(ALL 的作用是先查询ALL后面的语句得到结果,
再进行比较<invoice_total 要大于所有ALL后面语句查询出来的结果>)

SELECT *
FROM invoices
WHERE invoice_total > ALl(
    SELECT invoice_total
    FROM invoices
    WHERE client_id = 3
)

SELECT *
FROM invoices
WHERE invoice_total >(
    SELECT MAX (invoice_total)
    FROM invoices
    WHERE client_id = 3
)

5、ANY、SOME 关键字

client_id 等于这段查询返回的值里的任何一个

=ANY 和 IN 是一个效果

eg: 获取至少有两张发票的用户

SELECT *
FROM clients 
WHERE client_id IN (
    SELECT client_id
    FROM invoices
    GROUP BY client_id
    HAVING COUNT(*) >= 2
)

SELECT *
FROM clients 
WHERE client_id = ANY (
    SELECT client_id
    FROM invoices
    GROUP BY client_id
    HAVING COUNT(*) >= 2
)

6、相关子查询

相关子查询相当于FOR循环(数据越多查询越费力,也更占储存)

eg:选择工资超过部门平均水平的员工

SELECT *
FROM employees e 
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE office_id = e.office_id
)

7、EXISTS运算符

查询有发票的客户

SELECT *
FROM clients
WHERE client_id IN(
    SELECT DISTINCT client_id
    FROM invoices
)


对于每一个clients  都会去查是否存在一条符合后面条件的记录
(数据多的时候使用EXISTS会更有效率)

SELECT *
FROM clients c 
WHERE EXISTS(
    SELECT client_id
    FROM invoices
    WHERE client_id = c.client_id
)

8、SELECT 子句中的子查询 

SELECT 
    invoice_id,
    invoice_total,
    ( SELECT AVG(invoice_total) FROM invoices ) AS invoice_average,
    invoice_toatl - (SELECT invoice_average) AS difference
FROM invoices


9、FROM 子句中的子查询 

FROM 里的子查询必须要加别名

SELECT *
FROM (
    SELECT 
    invoice_id,
    invoice_total,
    ( SELECT AVG(invoice_total) FROM invoices ) AS invoice_average,
    invoice_toatl - (SELECT invoice_average) AS difference
FROM invoices
) AS sales_summary
WHERE invoice_average Is NOT NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjc啥也不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值