SELECT* FROM clients WHERE client_id =ANY( SELECT client_id FROM invoices GROUPBY client_id HAVINGCOUNT(*) >=2 )
WHERE 语句
作为增删查改等操作时的条件语句,用于过滤数据
下述以查询语句为例:
1 2 3
SELECT* FROM [表名] WHERE [条件];
运算符
比较
大于
大于等于
小于
小于等于
等于
不等于
不大于
不小于
其他
>
>=
<
<=
=
!= 或 <>
!>
!<
NOT+上述运算符
逻辑运算
AND
用于判定多个条件同时成立的情况
OR
用于判定多个条件其中一个正确的情况
NOT
用于判定与某条件相反的情况
AND 和 OR 只能用于连接表示 true or false 的逻辑语句,不能连接语句和字符串
1 2 3
SELECT* FROM customers WHERE state ='VA'OR'GA'OR'FL'--这种条件语句无法成立
确定集合
IN
用于查询属性值在该集合内的元组
NOT IN
用于查询属性值不在该集合内的元组
EXISTS
用于查询符合条件的元组
NOT EXISTS
用于查询不符合条件的元组
1 2 3 4 5 6 7 8
SELECT* FROM products p WHERENOTEXISTS( SELECT* FROM order_items oi WHERE p.product_id = oi.product_id ); -- EXISTS 只返回True或False,不返回具体的值
外层小表,内层大表(或者将sql从左到右来看:左面小表,右边大表): exists 比 in 的效率高
外层大表,内层小表(或者将sql从左到右来看:左面大表,右边小表): in 比 exists 的效率高
确定范围
BETWEEN AND
查找属性值在指定范围内的元组
NOT BETWEEN AND
查找属性值不在指定范围内的元组
字符匹配
LIKE
查找指定属性列值与匹配串相匹配的元组
NOT LIKE
查定指定属性列值不与匹配串匹配的元组
1 2 3 4 5
SELECT* FROM customers WHERE address LIKE ‘%trial%’ -- 格式: [NOT] LIKE '匹配串' -- 通配符:(1)% 用于代表任意长度的字符串;(2)_ 用于代表单个字符
空值查询
IS NULL
查询某属性值为空的元组
IS NOT NULL
查询某属性值非空的元组
ORDER BY 语句
用于查询时按某列进行排序,DESC 是降序的缩写
1 2 3 4 5
SELECT* FROM order_items WHERE order_id =2 ORDERBY quantity * unit_price DESC; -- 按照数量乘以单价后的总价进行降序排序 -- 格式:ORDER BY [列名称]
LIMIT 语句
用于限制查询记录输出
1 2 3 4
SELECT* FROM customers ORDERBY points DESC LIMIT 3; -- 表示只输出前三条记录
OFFSET 关键词表示偏移量
1 2 3 4
SELECT* FROM customers LIMIT 6,3-- 表示以3条记录为一页,跨过前6条记录并展示 LIMIT 3OFFSET6-- 与上一条LIMIT语句表达意思相同
子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询
不相关子查询:子查询的查询条件不依赖于父查询,称为不相关子查询。
1 2 3 4 5 6 7
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN( SELECT Sdept FROM Student WHERE Sname='刘晨' );
相关子查询:如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询。
1 2 3 4 5 6 7
SELECT* FROM invoices A WHERE invoice_total >( SELECTAVG(invoice_total) FROM invoices WHERE client_id = A.client_id );
SELECT子句中的子查询
1 2 3 4 5 6 7 8 9
SELECT c.client_id, name, (SELECTSUM(invoice_total) FROM invoices WHERE client_id = c.client_id) AS total_sales, (SELECTAVG(invoice_total) FROM invoices) AS average, (SELECT total_sales - average) AS difference FROM clients c LEFTJOIN invoices i USING (client_id) GROUPby c.client_id,name,difference;
SELECT* FROM( SELECT c.client_id, name, (SELECTSUM(invoice_total) FROM invoices WHERE client_id = c.client_id) total_sales, (SELECTAVG(invoice_total) FROM invoices) average, (SELECT total_sales - average) difference FROM clients c LEFTJOIN invoices i USING (client_id) GROUPBY c.client_id,name ) AS sales_summary WHERE total_sales ISNOT NULL