SELECT 语句

  1. 用于选择数据库中的某些列,* 表示全部列。
1
2
SELECT * FROM [表名]; -- 表示选中某表的全部列
SELECT [列名]/[列名1],[列名2],... FROM [表名]; -- 表示选中某表的某列/某些列
  • DISTINCT 关键字 用于去重查询
1
2
SELECT DISTINCT user_id
FROM solution;

关键字

  1. AS
    用于接列的别名(可省略)
1
2
3
4
5
6
7
SELECT
name,
unit_price,
unit_price * 1.1 AS new_price / unit_price * 1.1 new_price
-- 在显示查询结果时,unit_price * 1.1 这一列名会被别名new_price替代
-- 第三行左右两种写法表示同一种意思
FROM [表名];
  1. ALL
    ALL 可以与(=、>、>=、<、<=、<>)结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
    ALL 关键字用在比较操作符(=、>、>=、<、<=、<>…)的后面,表示查询结果的多个数据中的所有都满足该比较操作符才算满足。
1
2
3
4
5
6
7
8
SELECT *
FROM invoices
WHERE invoice_total > ALL(
SELECT invoice_total
FROM invoices
WHERE invoice_id = 3
)
-- ALL返回()里面所有的值,和invoice_total 逐一比较
  1. ANY/SOME
    ANY/SOME 可以与(=、>、>=、<、<=、<>)结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。
    ANY/SOME 关键字用在比较操作符(=、>、>=、<、<=、<>…)的后面,表示查询结果的多个数据中的任一个满足该比较操作符就算满足。
1
2
3
4
5
6
7
8
SELECT *
FROM clients
WHERE client_id = ANY(
SELECT client_id
FROM invoices
GROUP BY client_id
HAVING COUNT(*) >= 2
)

WHERE 语句

  1. 作为增删查改等操作时的条件语句,用于过滤数据
    下述以查询语句为例:
1
2
3
SELECT *
FROM [表名]
WHERE [条件];

运算符

比较

大于 大于等于 小于 小于等于 等于 不等于 不大于 不小于 其他
> >= < <= = != 或 <> !> !< NOT+上述运算符

逻辑运算

AND 用于判定多个条件同时成立的情况
OR 用于判定多个条件其中一个正确的情况
NOT 用于判定与某条件相反的情况

ANDANDOROR 只能用于连接表示 truetrue or falsefalse 的逻辑语句,不能连接语句和字符串

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
WHERE NOT EXISTS(
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 语句

  1. 用于查询时按某列进行排序,DESCDESC 是降序的缩写
1
2
3
4
5
SELECT *
FROM order_items
WHERE order_id = 2
ORDER BY quantity * unit_price DESC; -- 按照数量乘以单价后的总价进行降序排序
-- 格式:ORDER BY [列名称]

LIMIT 语句

  1. 用于限制查询记录输出
1
2
3
4
SELECT *
FROM customers
ORDER BY points DESC
LIMIT 3; -- 表示只输出前三条记录
  • OFFSET 关键词表示偏移量
1
2
3
4
SELECT *
FROM customers
LIMIT 6,3 -- 表示以3条记录为一页,跨过前6条记录并展示
LIMIT 3 OFFSET 6 -- 与上一条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 >(
SELECT AVG(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,
(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 difference
FROM clients c
LEFT JOIN invoices i USING (client_id)
GROUP by c.client_id,name,difference;
  • FROM子句中的子查询
    FROM子句中的子查询可以调用我们经过复杂查询后产生的虚拟表格进行简单的查询。但这种子查询会增加的代码复杂度,在后面我们可以用视图保存复杂查询后的表格——>【视图】
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM(
SELECT
c.client_id,
name,
(SELECT SUM(invoice_total) FROM invoices WHERE client_id = c.client_id) total_sales,
(SELECT AVG(invoice_total) FROM invoices) average,
(SELECT total_sales - average) difference
FROM clients c
LEFT JOIN invoices i USING (client_id)
GROUP BY c.client_id,name
) AS sales_summary
WHERE total_sales IS NOT NULL