sql笔记2——简单sql

本文介绍了SQL中的基本SELECT语句及其常用子句,包括选择特定列、使用WHERE过滤数据、使用DISTINCT去除重复、运用算术和逻辑运算符、以及聚合函数如COUNT、SUM、AVG等。还详细讲解了GROUPBY和HAVING子句在分组和条件筛选中的应用,以及ORDERBY子句对查询结果排序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select

基本select语句包含两个子句:

SELECT <列名>, 
  FROM <表名>;

当不需要列的全部数据。。:where

SELECT <列名>, ……
  FROM <表名>
 WHERE <条件表达式>;
  • * 全部
  • distinct
SELECT DISTINCT column1, column2, ...
FROM table_name;
  • 示例
-- SQL语句可以使用AS关键字为列设定别名(用中文时需要双引号(“”))。
SELECT product_id     As id,
       product_name   As name,
       purchase_price AS "进货单价"
  FROM product;
-- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
  FROM product;

运算符:算数、比较、逻辑

  • + - * /

  • = <>(不等于)

  • >= > <= <

  • 希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。

  • 示例

-- SQL语句中也可以使用运算表达式
SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
  FROM product;
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
  FROM product
 WHERE sale_price - purchase_price >= 500;
/* 对字符串使用不等号
首先创建chars并插入数据
选取出大于‘2’的SELECT语句*/
-- DDL:创建表
CREATE TABLE chars
(chr CHAR3NOT NULL, 
PRIMARY KEY(chr));
-- 选取出大于'2'的数据的SELECT语句('2'为字符串)
SELECT chr
  FROM chars
 WHERE chr > '2';
-- 选取NULL的记录
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price IS NULL;
-- 选取不为NULL的记录
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price IS NOT NULL;
  • NOT:不能单独使用,要和其他查询条件组合; NOT sale_price >= 1000sale_price < 1000 是等价的
  • AND、OR

真值表

真值就是值为真(TRUE)或假 (FALSE)其中之一的值。

例如,对于 sale_price >= 3000 这个查询条件来说,由于 product_name 列为 ‘运动 T 恤’ 的记录的 sale_price 列的值是 2800,因此会返回假(FALSE),而 product_name 列为 ‘高压锅’ 的记录的sale_price 列的值是 5000,所以返回真(TRUE)。

请添加图片描述

NULL真值是除真假之外的第三种值——不确定(UNKNOWN)
请添加图片描述

我的理解是,假<不确定<真,AND总取下界,OR总取上界

练习题

  1. 编写一条SQL语句,从 product(商品) 表中选取出“登记日期(regist_date)在2009年4月28日之后”的商品,查询结果要包含 product nameregist_date 两列。

请添加图片描述
2. 请说出对product 表执行如下3条SELECT语句时的返回结果。

SELECT *
  FROM product
 WHERE purchase_price = NULL;
 
 0006	叉子	厨房用具	500		2009-09-20
 0008	圆珠笔	办公用品	100		2009-11-11
SELECT *
  FROM product
 WHERE purchase_price <> NULL;
 
0001	T恤	衣服	1000	500	2009-09-20
0002	打孔器	办公用品	500	320	2009-09-11
0003	运动T恤	衣服	4000	2800	
0004	菜刀	厨房用具	3000	2800	2009-09-20
0005	高压锅	厨房用具	6800	5000	2009-01-15
0007	擦菜板	厨房用具	880	790	2008-04-28
SELECT *
  FROM product
 WHERE product_name > NULL;
 
 -- 同上
  1. 2.2.3 章节中的SELECT语句能够从 product 表中取出“销售单价(sale_price)比进货单价(purchase_price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示:
product_name | sale_price | purchase_price 
-------------+------------+------------
T恤衫        |   1000    | 500
运动T恤      |    4000    | 2800
高压锅       |    6800    | 5000
select product_name, sale_price, purchase_price
from product
where sale_price >= purchase_price + 500;

select product_name, sale_price, purchase_price
from product
where not sale_price < purchase_price + 500;
  1. 请写出一条SELECT语句,从 product 表中选取出满足“销售单价打九折之后利润高于 100 日元的办公用品和厨房用具”条件的记录。查询结果要包括 product_name列、product_type 列以及销售单价打九折之后的利润(别名设定为 profit)。

请添加图片描述

聚合查询

  • 聚合函数:用于汇总的函数。SUM,AVG, MAX,MIN,COUN
-- 计算销售单价和进货单价的合计值
SELECT SUM(sale_price), SUM(purchase_price) 
  FROM product;
-- 计算销售单价和进货单价的平均值
SELECT AVG(sale_price), AVG(purchase_price)
  FROM product;
-- 计算销售单价的最大值和最小值
SELECT MAX(sale_price), MIN(sale_price)
  FROM product;
-- MAX和MIN也可用于非数值型数据
SELECT MAX(regist_date), MIN(regist_date)
  FROM product;
-- 计算全部数据的行数(包含 NULL 所在行)
SELECT COUNT(*)
  FROM product;
-- 计算 NULL 以外数据的行数
SELECT COUNT(purchase_price)
  FROM product;
  • 去重
SELECT COUNT(DISTINCT product_type)
  FROM product;
  • count。聚合函数不处理包含 NULL 值的行,但是 COUNT(*) 除外。

group by

按某列汇总。

在 GROUP BY 子句中指定的列称为聚合键或者分组列

请添加图片描述

聚合键包含null,将null作为一组特殊数据,进行聚合运算。

子句顺序

​ 按照以下顺序:

在这里插入图片描述

避免错误:

  1. 错误示范

    select product_name, product_type
    from product
    where sale_price > 500
    group by product_type ;
    
  2. 错误示范

    SELECT product_type, COUNT(*)
     FROM product;
    
  3. 使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。

  4. 先执行group by,再执行select。所以select可以用as指定别名,但是group by不能使用别名。

  5. 聚合函数是用于计算整个结果集或分组后的聚合值(如 COUNT、SUM、AVG 等)。由于聚合函数在计算结果时需要已经确定的数据集,所以不能在 WHERE 子句中直接使用聚合函数,否则会引发错误。如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。

having
  • 得到特定分组。
  • HAVING 子句必须与 GROUP BY 子句配合使用,且限定的是分组聚合结果,WHERE 子句是限定数据行(包括分组列),二者各司其职,不要混淆。
-- 常数
SELECT product_type, COUNT(*)
  FROM product
 GROUP BY product_type
HAVING COUNT(*) = 2;

-- 错误形式(因为product_name不包含在GROUP BY聚合键中)
SELECT product_type, COUNT(*)
  FROM product
 GROUP BY product_type 
HAVING product_name = '圆珠笔';

order by

SELECT <列名1>, <列名2>, <列名3>, ……
  FROM <表名>
 ORDER BY <排序基准列1> [ASC, DESC], <排序基准列2> [ASC, DESC], ……
  • FROM → WHERE → GROUP BY → SELECT → HAVING → ORDER BY

    其中 SELECT 的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。

    当在 ORDER BY 子句中使用别名时,已经知道了 SELECT 子句设置的别名,但是在 GROUP BY 子句执行时还不知道别名的存在,所以在 ORDER BY 子句中可以使用别名,但是在GROUP BY中不能使用别名。

练习题

  1. 请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
  FROM product 
 GROUP BY product_type 
 WHERE regist_date > '2009-09-01';

where 应在group by 之前;product_name不能求和;没有在聚合键中包含product_id

  1. 请编写一条SELECT语句,求出销售单价( sale_price 列)合计值大于进货单价( purchase_price 列)合计值1.5倍的商品种类。执行结果如下所示。
product_type | sum  | sum 
-------------+------+------
衣服         | 5000 | 3300
办公用品      |  600 | 320
select product_type,sum(sale_price),sum(purchase_price)
from product
group by product_type 
having sum(sale_price)>sum(purchase_price)*1.5;
  1. 此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。
select *
from product
order by -regist_date asc, sale_price asc;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__心似大海__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值