select 列名 as xx
from 表名
where 条件表达式
注意:
在 SELECT 语句中使用 DISTINCT 可以删除重复行
设定别名为中文时要用 “ ”
算数运算符:=, <>, >=, >, <=, <, 对null 要用 is null 或 is not null
逻辑运算符:not, and, or, (and优先级比or高,必要时对or用括号
select 聚合函数(列名)
常用:count, sum, avg, max, min
-- COUNT(*) 会得到包含 NULL 的数据行数,而 COUNT(<列名>) 会得到不包含 NULL 的数据行数。
select count(*) from product;
select count(purchase_price) from product;
-- MAX/MIN 函数几乎适用于所有数据类型的列。SUM/AVG 函数只适用于数值类型的列。
select sum(sale_price),sum(purchase_price) from product;
select avg(sale_price),avg(purchase_price) from product;
select max(regist_date),min(regist_date) from product;
-- distinct 用于去重。
select count(distinct product_type)from product;
select sum(sale_price), sum(distinct sale_price) from product;# 后者只对不同的价格相加,所以少了500
select 列名
from 表名
where 条件表达式
group by 列名
/*group by 将现有的数据按照某列来汇总统计*/
-- 按照商品种类统计数据行数
select product_type,count(*)
from product
group by product_type;
/*product_type|count(*)|
------------+--------+
衣服 | 2|
办公用品 | 2|
厨房用具 | 4|*/
select product_type,count(*)
from product;
/*product_type|count(*)|
------------+--------+
衣服 | 8|*/
-- GROUP BY 子句中指定的列称为 聚合键 或者 分组列。null也可以作为聚合键。
-- GROUP BY 书写位置 1. SELECT 2. FROM 3. WHERE 4. GROUP BY
select purchase_price
from product
where product_type='厨房用具'
group by purchase_price ;
-- WHERE 子句只能指定记录(行)的条件,having 可以实现组的过滤。如 group by 分了3组,用 having 取出其中两组。
select product_type,count(*),sum(sale_price)
from product
group by product_type;
/*product_type|count(*)|sum(sale_price)|
------------+--------+---------------+
衣服 | 2| 5000|
办公用品 | 2| 600|
厨房用具 | 4| 11180|*/
select product_type,count(*),sum(sale_price)
from product
group by product_type
having count(*)=2;
/*product_type|count(*)|sum(sale_price)|
------------+--------+---------------+
衣服 | 2| 5000|
办公用品 | 2| 600|*/
注意:
可以设置多个排序键。排序列名有 NULL 时, NULL 会在开头或末尾进行汇总。 group by 不能使用 select 定义的别名,
order by 可以使用。
-- order by 对查询结果进行排序 .默认为升序排列,降序排列为 DESC
select * from product order by sale_price;
/*product_id|product_name|product_type|sale_price|purchase_price|regist_date|
----------+------------+------------+----------+--------------+-----------+
0008 |圆珠笔 |办公用品 | 100| | 2009-11-11|
0002 |打孔器 |办公用品 | 500| 320| 2009-09-11|
0006 |叉子 |厨房用具 | 500| | 2009-09-20|
0007 |擦菜板 |厨房用具 | 880| 790| 2008-04-28|
0001 |T恤 |衣服 | 1000| 500| 2009-09-20|
0004 |菜刀 |厨房用具 | 3000| 2800| 2009-09-20|
0003 |运动T恤 |衣服 | 4000| 2800| |
0005 |高压锅 |厨房用具 | 6800| 5000| 2009-01-15|*/
select * from product order by sale_price desc;
/*product_id|product_name|product_type|sale_price|purchase_price|regist_date|
----------+------------+------------+----------+--------------+-----------+
0005 |高压锅 |厨房用具 | 6800| 5000| 2009-01-15|
0003 |运动T恤 |衣服 | 4000| 2800| |
0004 |菜刀 |厨房用具 | 3000| 2800| 2009-09-20|
0001 |T恤 |衣服 | 1000| 500| 2009-09-20|
0007 |擦菜板 |厨房用具 | 880| 790| 2008-04-28|
0002 |打孔器 |办公用品 | 500| 320| 2009-09-11|
0006 |叉子 |厨房用具 | 500| | 2009-09-20|
0008 |圆珠笔 |办公用品 | 100| | 2009-11-11|*/
select product_name,regist_date
from product
where regist_date > '2009-04-28';
select *
from product
where purchase_price = NULL; # 无
select *
from product
where purchase_price <> NULL; # 无
select *
from product
where purchase_price is NULL; # 正确语法应为 is null
select *
from product
where product_name > NULL; # 无
select product_name, sale_price,purchase_price
from product
where sale_price -purchase_price >= 500;
select product_name,product_type,sale_price*0.9-purchase_price as profit
from product
where sale_price *0.9-purchase_price >=100
and (product_type='办公用品' or product_type ='厨房用具');
错误:
1.where在group by前面
2.不能对varchar进行sum,但是这里没报错,log里说
Truncated incorrect DOUBLE value: ‘打孔器’
Truncated incorrect DOUBLE value: ‘菜刀’
Truncated incorrect DOUBLE value: ‘叉子’
Truncated incorrect DOUBLE value: ‘圆珠笔’
应该使用 select sum(cast(列名as 你想要的数据类型)) 。
参考 mysql - varchar类型与数字的比较和转换
PS:除了语法错误,对product_name 进行sum本就没有意义(狗头
select product_id, sum(product_name)
from product
where regist_date >'2009-09-01'
group by product_type;
/*product_id|sum(product_name)|
----------+-----------------+
0001 | 0.0|
0002 | 0.0|
0004 | 0.0|*/
select product_type,sum(sale_price) as 'sum',sum(purchase_price) as 'sum'
from product
group by product_type
having sum(sale_price) > sum(purchase_price)*1.5;
/*product_type|sum |sum |
------------+----+----+
衣服 |5000|3300|
办公用品 | 600| 320|*/
select *
from product
order by regist_date is not null,regist_date desc,sale_price;
/*product_id|product_name|product_type|sale_price|purchase_price|regist_date|
----------+------------+------------+----------+--------------+-----------+
0003 |运动T恤 |衣服 | 4000| 2800| |
0008 |圆珠笔 |办公用品 | 100| | 2009-11-11|
0006 |叉子 |厨房用具 | 500| | 2009-09-20|
0001 |T恤 |衣服 | 1000| 500| 2009-09-20|
0004 |菜刀 |厨房用具 | 3000| 2800| 2009-09-20|
0002 |打孔器 |办公用品 | 500| 320| 2009-09-11|
0005 |高压锅 |厨房用具 | 6800| 5000| 2009-01-15|
0007 |擦菜板 |厨房用具 | 880| 790| 2008-04-28|*/