一、常见语句
(1)查询指定列:直接使用SELECT 列名 FROM 表
(2)查询所有列:使用SELECT * FROM 表
(3)另设列的名字:使用AS 或者不使用AS也可以
SELECT shohin_id AS Id, shohin_mei AS Name, shiire_tanka Price
FROM Shohin; -- 不用 AS 关键字也可以
(4)删除重复行:DISTINCT
SELECT DISTINCT shohin_bunrui FROM dbo.Shohin;
(5)筛选:WHERE
PS: SQL 子句的书写格式是固定的,不能随意更改。如 WHERE 子句必须紧跟在 FROM 子句后
SELECT shohin_id, shohin_mei, shohin_bunrui
FROM dbo.Shohin
WHERE shohin_bunrui = '衣服'; -- shohin_bunrui = '衣服':为条件表达式
(6)如何注释
-- 单行注释
/*
多行注释
*/
(7)不能对 NULL 使用比较运算符
FROM dbo.Shohin
WHERE shiire_tanka = NULL; --错误的 SELECT 语句
--示例2
SELECT shohin_mei, shiire_tanka
FROM dbo.Shohin
WHERE shiire_tanka IS NULL; --选取 NULL 的记录
--示例3
SELECT shohin_mei, shiire_tanka
FROM dbo.Shohin
WHERE shiire_tanka IS NOT NULL; --选取不为 NULL 的记录
二、逻辑运算
(1)NOT: 取反
--示例:
SELECT *
FROM dbo.Shohin
WHERE NOT hanbai_tanka >= 1000; --等价于 hanbai_tanka < 1000
(2)AND / OR: AND优先级大于OR
PS:如果想让 OR运算先,则需要加上 ()括号
--示例
SELECT shohin_mei, shiire_tanka
FROM dbo.Shohin
WHERE shohin_bunrui = '厨房用具'
AND hanbai_tanka >= 3000;
三、聚合查询
(1)5个常用的聚合函数:
- COUNT: 计算表的行数
- SUM: 计算列的数据总和
- AVG: 计算列的数据平均值
- MAX: 计算列的数据的最大值
- MIN: 计算列的数据的最小值
比如计算一个表数据总行:
--示例
SELECT COUNT(*) -- *:参数,这里代表全部列,为8行
FROM dbo.Shohin;
将 COUNT(*) 的参数改成指定对象的列,就可以得到该列的非 NULL 行数
SELECT COUNT(shiire_tanka) --这里为6行 有两行是null
FROM dbo.Shohin;
使用所有的聚合函数
SELECT SUM(hanbai_tanka) AS sum_hanbai_tanka, --总和
AVG(hanbai_tanka) AS avg_hanbai_tanka, --平均
MAX(hanbai_tanka) AS max_hanbai_tanka, --最大
MIN(hanbai_tanka) AS min_hanbai_tanka --最小
FROM dbo.Shohin;
四、对表分组
(1)GROUP BY 子句
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;
--示例
SELECT shohin_bunrui AS '商品种类',
COUNT(*) AS '数量' --能计算分组后,每组的行数
FROM dbo.Shohin
GROUP BY shohin_bunrui;
PS: 【子句的书写顺序】SELECT --> FROM --> WHERE --> GROUP BY
SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shiire_tanka
这里先根据WHERE子句指定的条件进行过滤,然后在GROUP BY聚合
PS:【执行顺序】FROM --> WHERE --> GROUP BY --> SELECT。这里是执行顺序,跟之前的书写顺序是不一样的
(2)易错:在 WHERE 子句中使用聚合函数。
只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能够使用聚合函数。
所以说,GROUP BY经常和HAVING一起组合–考点
(3)HAVING: 分组结果后对应的条件
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分组结果对应的条件>
SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2
PS:【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING
(4) HAVING VS WHERE
有些条件可以写在 HAVING 子句中,又可以写在 WHERE 子句中。这些条件就是聚合键所对应的条件
【建议】虽然结果一样,聚合键对应的条件应该写在 WHERE 子句中,不是 HAVING 子句中。
【理由】
①WHERE 子句的执行速度比 HAVING 快。
②意义:WHERE 子句 = 指定行所对应的条件,HAVING 子句 = 指定组所对应的条件
(5)ORDER BY:
对指定列进行排序,默认从小到大,即为升序(ASC)。需要升序的话,则加DESC
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基准列1>, <排序基准列2>, ...
【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY
SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka, shohin_id; --先对hanbai_tanka排序,等hanbai_tanka相同的时候,再按照id排序
ORDER BY可以用SELECT字句中的别名
SELECT shohin_id AS id, shohin_mei, hanbai_tanka AS ht
FROM dbo.Shohin
ORDER BY ht, id;
【执行顺序】FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY
所以,总结的说, ORDER BY 子句可以使用 SELECT 子句中定义的别名,GROUP BY 子句不能使用别名