sql打卡记录二 基础查询与排序

目录

一、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语句基础

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>, ……;

 注意:

  1. 在聚合函数的SELECT子句中写了聚合键以外的列使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
  2. 在GROUP BY子句中使用列的别名SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
  3. 在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、

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值