目录
一、SELECT语句基础
1、从表中选取数据 SELECT
2、从表中选取符合条件的数据 WHERE
3、相关法则
二、算数运算符和加减运算符
1、算数运算符
2、比较运算符
3、常用法则
三、逻辑运算符
1、NOT运算符
2、AND运算符、OR运算符
四、对表进行聚合查询
1、聚合函数
2、常用法则
五、对表进行分组
1、GROUP BY
六、为聚合结果指定条件
1、用HAVING得到特定分组
2、HAVING特点
七、对查询结果进行排序
1、ORDER BY
2、ORDER BY 排序列中存在 NULL 时,指定其出现在首行或者末行的方式
从表中获取所需数据,包含select和from两个子句
SELECT <列名> , <列名> FROM <表名>;
从表中获取指定条件的数据,例如价格为0.1等判断条件
SELECT <列名>, …… FROM <表名> WHERE <条件表达式>;
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
= | 等于 |
<> | 不等 |
>= | 大于等于 |
> | 大于 |
<= | 小于等于 |
< | 小于 |
表示“非”的另一种方法,使用更广泛,需要和其他条件结合起来使用
WHERE sale < 1000 等价于 WHERE NOT sale >= 1000
对于这种简单的查询,使用NOT可读性不高,所以要慎用
多条件查询时使用的运算符:AND表示“且”,OR表示“或”,AND运算符优先级高于OR运算符,因此同时出现时,如果想优先执行OR,需要添加“()”改变原有优先级
到此,“或OR”,“且AND”,“非NULL”三种均已清晰,三者组合关系符合“或且非”真值表
SQL中用于汇总的函数称为聚合函数,常见的有五种:
SELECT COUNT(*) FROM <表名>;
SELECT COUNT(<列名>) FROM <表名>;
SELECT SUM(<列名>) FROM <表名>;
SELECT AVG(<列名>) FROM <表名>;
--以下两个可以用于非数值
SELECT MAX(<列名>) FROM <表名>;
SELECT MIN(<列名>) FROM <表名>;
对于重复数据,也有方法进行删除后使用聚合函数
-- 计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT <列名>)
FROM <表名>;
-- 是否使用DISTINCT时的动作差异(SUM函数)
SELECT SUM(DISTINCT <列名>)
FROM <表名>;
聚合函数处理的是整个表的数据,有时我们需要根据某个字段分组求和,此时可以使用GROUP BY将表数据进行分组
SELECT <列名1>,<列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;
注意:
- 在聚合函数的SELECT子句中写了聚合键以外的列使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
- 在GROUP BY子句中使用列的别名SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
- 在WHERE中使用聚合函数原因是聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误。 如果想指定条件,可以在SELECT,HAVING以及ORDER BY子句中使用聚合函数
GROUP BY进行分组后,如果需要获取特定的分组,可以使用HAVING进行筛选,含义类似于WHERE
HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名(聚合键)
SELECT <列名>, COUNT(*)
FROM <表名>
GROUP BY <聚合键(列名)>
HAVING COUNT(*) = 2;
SQL查询获得的结果都是默认排序的,如果想指定排序可以使用ORDER BY,默认为升序ASC,倒序是DESC
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ……
在MySQL中,NULL
值被认为比任何 非NULL
值低,因此,当顺序为 ASC(升序)时,NULL
值出现在第一位,而当顺序为 DESC(降序)时,则排序在最后。
练习题:
1、编写一条SQL语句,从 product
(商品) 表中选取出“登记日期(regist_date
)在2009年4月28日之后”的商品,查询结果要包含 product name
和 regist_date
两列。
SELECT product_name, regist_date
FROM product
WHERE regist_date > '2009-04-28'
2、
(1)获取购入价格为空的数据
(2)获取购入价格不为空的数据
(3)获取购入价格>0的数据
3、
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price >= 1000 and sale_price <> 3000;
SELECT product_name, sale_price, purchase_price
FROM product
WHERE product_type = '衣服' or sale_price > 6000;
4、请写出一条SELECT语句,从 product
表中选取出满足“销售单价打九折之后利润高于 100
日元的办公用品和厨房用具”条件的记录。查询结果要包括 product_name
列、product_type
列以及销售单价打九折之后的利润(别名设定为 profit
)。
提示:销售单价打九折,可以通过 sale_price
列的值乘以0.9获得,利润可以通过该值减去 purchase_price
列的值获得。
SELECT
product_name,
product_type,
( sale_price * 0.9 - purchase_price ) AS profit
FROM
product
WHERE
( product_type = '办公用品' OR product_type = '厨房用具' )
AND ( sale_price * 0.9 - purchase_price > 100 );
5、
(1)括号使用了中文格式
(2)group by需要在where下面
6、
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;
7、