目录
2、ORDER BY 排序列中存在 NULL 时,指定其出现在首行或者末行的方式
一、SELECT语句基础
1、从表中选取数据 SELECT
从表中获取所需数据,包含select和from两个子句
SELECT <列名> , <列名> FROM <表名>;
2、从表中选取符合条件的数据 WHERE
从表中获取指定条件的数据,例如价格为0.1等判断条件
SELECT <列名>, …… FROM <表名> WHERE <条件表达式>;
3、相关法则
- 获取全部列,可以用星号(*)。
- SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
- 列名设定汉语别名时需要使用双引号(")括起来。
- 在SELECT语句中使用DISTINCT可以删除重复行。
- 注释分为1行注释"-- "和多行注释两种"/* */"。
二、算数运算符和加减运算符
1、算数运算符
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
2、比较运算符
= | 等于 |
<> | 不等 |
>= | 大于等于 |
> | 大于 |
<= | 小于等于 |
< | 小于 |
3、常用法则
- SELECT子句中可以使用常数或者表达式。
- 使用比较运算符时一定要注意不等号和等号的位置。
- 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
- 希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
三、逻辑运算符
1、NOT运算符
表示“非”的另一种方法,使用更广泛,需要和其他条件结合起来使用
WHERE sale < 1000 等价于 WHERE NOT sale >= 1000
对于这种简单的查询,使用NOT可读性不高,所以要慎用
2、AND运算符、OR运算符
多条件查询时使用的运算符:AND表示“且”,OR表示“或”,AND运算符优先级高于OR运算符,因此同时出现时,如果想优先执行OR,需要添加“()”改变原有优先级
到此,“或OR”,“且AND”,“非NULL”三种均已清晰,三者组合关系符合“或且非”真值表
四、对表进行聚合查询
1、聚合函数
SQL中用于汇总的函数称为聚合函数,常见的有五种:
- COUNT 表中记录行数
- SUM 表中列的求和总数
- AVG 表中列的平均数
- MAX 表中列的最大数
- MIN 表中列的最小数
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 <表名>;
2、常用法则
- COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
- 聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL。
- MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列。
- 想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT。
- 在聚合函数的参数中使用DISTINCT,可以删除重复数据。
五、对表进行分组
1、GROUP BY
聚合函数处理的是整个表的数据,有时我们需要根据某个字段分组求和,此时可以使用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子句中使用聚合函数
六、为聚合结果指定条件
1、用HAVING得到特定分组
GROUP BY进行分组后,如果需要获取特定的分组,可以使用HAVING进行筛选,含义类似于WHERE
2、HAVING特点
HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名(聚合键)
SELECT <列名>, COUNT(*)
FROM <表名>
GROUP BY <聚合键(列名)>
HAVING COUNT(*) = 2;
七、对查询结果进行排序
1、ORDER BY
SQL查询获得的结果都是默认排序的,如果想指定排序可以使用ORDER BY,默认为升序ASC,倒序是DESC
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ……
2、ORDER BY 排序列中存在 NULL 时,指定其出现在首行或者末行的方式
在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、