zlqqqm

SQL查询示例

数据截取自《SQL基础教程(第2版)》

数据准备

-- 创建数据表
CREATE TABLE Product(
  product_id CHAR(4) NOT NULL,
  product_name VARCHAR(100) NOT NULL,
  product_type VARCHAR(32) NOT NULL,
  sale_price INTEGER ,
  purchase_price INTEGER ,
  regist_date DATE ,
  PRIMARY KEY (product_id)
);

-- 插入测试数据
INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服',1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品',500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服',4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具',3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具',6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具',500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具',880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品',100, NULL,'2009-11-11');

1. 基础查询

1.1 查询所有记录

sqlite> select * from Product; 
product_id  product_name  product_type  sale_price  purchase_price  regist_date
----------  ------------  ------------  ----------  --------------  -----------
0001        T恤衫           衣服            1000        500             2009-09-20
0002        打孔器           办公用品          500         320             2009-09-11
0003        运动T恤          衣服            4000        2800            NULL
0004        菜刀            厨房用具          3000        2800            2009-09-20
0005        高压锅           厨房用具          6800        5000            2009-01-15
0006        叉子            厨房用具          500         NULL            2009-09-20
0007        擦菜板           厨房用具          880         790             2008-04-28
0008        圆珠笔           办公用品          100         NULL            2009-11-11

1.2 查询某几列的记录

sqlite> select * from Product;
product_id  product_name  product_type  sale_price  purchase_price  regist_date
----------  ------------  ------------  ----------  --------------  -----------
0001        T恤衫           衣服            1000        500             2009-09-20
0002        打孔器           办公用品          500         320             2009-09-11
0003        运动T恤          衣服            4000        2800            NULL
0004        菜刀            厨房用具          3000        2800            2009-09-20
0005        高压锅           厨房用具          6800        5000            2009-01-15
0006        叉子            厨房用具          500         NULL            2009-09-20
0007        擦菜板           厨房用具          880         790             2008-04-28
0008        圆珠笔           办公用品          100         NULL            2009-11-11

1.3 设置别名

sqlite> select product_id, product_name as "产品名称", product_type as "产品类型" from Product;
product_id  产品名称        产品类型
----------  ----------  ----------
0001        T恤衫         衣服
0002        打孔器         办公用品
0003        运动T恤        衣服
0004        菜刀          厨房用具
0005        高压锅         厨房用具
0006        叉子          厨房用具
0007        擦菜板         厨房用具
0008        圆珠笔         办公用品

1.4 查询常数

sqlite> select product_name as "产品名称", "常数字段", "2022-08-18" as "查询日期" from Product;
产品名称        "常数字段"      查询日期
----------  ----------  ----------
T恤衫         常数字段        2022-08-18
打孔器         常数字段        2022-08-18
运动T恤        常数字段        2022-08-18
菜刀          常数字段        2022-08-18
高压锅         常数字段        2022-08-18
叉子          常数字段        2022-08-18
擦菜板         常数字段        2022-08-18
圆珠笔         常数字段        2022-08-18

1.5 从结果中删除重复数

sqlite> select distinct product_type from Product;
product_type
------------
衣服
办公用品
厨房用具
sqlite> select distinct product_type, sale_price from Product;
product_type  sale_price
------------  ----------
衣服            1000
办公用品          500
衣服            4000
厨房用具          3000
厨房用具          6800
厨房用具          500
厨房用具          880
办公用品          100

1.6 使用 Where 筛选数据

sqlite> select product_name, product_type from Product where product_type = "衣服";
product_name  product_type
------------  ------------
T恤衫           衣服
运动T恤          衣服

算术运算符和逻辑运算符

2.1 在查询结果中使用算术运算符

sqlite> SELECT product_name, sale_price, sale_price * 2 AS "sale_price_x2" FROM Product;
product_name  sale_price  sale_price_x2
------------  ----------  -------------
T恤衫           1000        2000
打孔器           500         1000
运动T恤          4000        8000
菜刀            3000        6000
高压锅           6800        13600
叉子            500         1000
擦菜板           880         1760
圆珠笔           100         200

2.2 在过滤条件中使用比较运算符

-- 查询价格等于500的记录
sqlite> select product_name, sale_price from Product where sale_price = 500;
product_name  sale_price
------------  ----------
打孔器           500
叉子            500

-- 查询价格不等于500的记录
sqlite> select product_name, sale_price from Product where sale_price != 500;
product_name  sale_price
------------  ----------
T恤衫           1000
运动T恤          4000
菜刀            3000
高压锅           6800
擦菜板           880
圆珠笔           100

-- 查询价格不等于500的记录
sqlite> select product_name, sale_price from Product where sale_price <> 500;
product_name  sale_price
------------  ----------
T恤衫           1000
运动T恤          4000
菜刀            3000
高压锅           6800
擦菜板           880
圆珠笔           100

-- 查询价格大于等于500的记录
sqlite> select product_name, sale_price from Product where sale_price >= 500;
product_name  sale_price
------------  ----------
T恤衫           1000
打孔器           500
运动T恤          4000
菜刀            3000
高压锅           6800
叉子            500
擦菜板           880

2.3 在查询条件中也可以使用算数运算符

sqlite> select product_name, sale_price, purchase_price from Product where (sale_price - purchase_price) = 500;
product_name  sale_price  purchase_price
------------  ----------  --------------
T恤衫           1000        500

2.4 逻辑运算符

-- NOT 表示否定
sqlite> select product_name, sale_price from Product where NOT sale_price >= 500;
product_name  sale_price
------------  ----------
圆珠笔           100

-- AND 表示且,需要满足所有条件
sqlite> select product_name, sale_price from Product where product_type = "衣服" AND sale_price = 1000;
product_name  sale_price
------------  ----------
T恤衫           1000

-- OR 表示或,满足一个条件即可
sqlite> select product_name, sale_price from Product where product_type = "衣服" OR sale_price = 1000;
product_name  sale_price
------------  ----------
T恤衫           1000
运动T恤          4000

3. 聚合和排序

3.1 获取所有记录的数量

sqlite> select count(*) from Product;
count(*)
----------
8

3.2 计算合计值

-- 计算销售价总和
sqlite> select sum(sale_price) from Product;
sum(sale_price)
---------------
16780

-- 分别计算销售价总和 + 进货价格总和
sqlite> select sum(sale_price) as "销售单价", sum(purchase_price) as "进货价格" from Product;
销售单价        进货价格
----------  ----------
16780       12210

3.3 计算平均值

-- 计算销售价格的平均价
sqlite> select avg(sale_price) from Product;
avg(sale_price)
---------------

-- 分别计算销售价平均值和进货价格平均值

2097.5

3.4 计算平均值

sqlite> select avg(sale_price) from Product;
avg(sale_price)
---------------
2097.5

sqlite> select avg(sale_price), avg(purchase_price) from Product;
avg(sale_price)  avg(purchase_price)
---------------  -------------------
2097.5           2035.0

3.5 计算最大值和最小值

-- 计算最高和最低的销售价格
sqlite> select max(sale_price), min(sale_price) from Product;
max(sale_price)  min(sale_price)
---------------  ---------------
6800             100

3.6 使用聚合函数删除重复值

-- 计算商品种类数量
sqlite> select COUNT(DISTINCT product_type) from Product;
COUNT(DISTINCT product_type)
----------------------------
3

-- 使用DISTINCT 可能会导致结果不符合预期
sqlite> SELECT SUM(sale_price), SUM(DISTINCT sale_price) from Product;
SUM(sale_price)  SUM(DISTINCT sale_price)
---------------  ------------------------
16780            16280

3.7 对查询结果进行分组

sqlite> select product_type, count(*) from Product group by product_type;
product_type  count(*)
------------  ----------
办公用品          2
厨房用具          4
衣服            2

3.8 为聚合结果指定查询条件

-- 查询总数大于2的商品种类
sqlite> select product_type, count(*) from Product group by product_type having count(*) > 2;
product_type  count(*)
------------  ----------
厨房用具          4

-- 查询平均价格大于1000的商品种类
sqlite> select product_type from Product group by product_type having avg(sale_price) > 1000;
product_type
------------
厨房用具
衣服

-- 有些条件可以写在where 或者 having 之后, 建议按照以下规则使用
-- where 用于过滤行
-- having 用于过滤列
sqlite> select product_type, count(*) from Product group by product_type having product_type = "衣服";
product_type  count(*)
------------  ----------
衣服            2
sqlite> select product_type, count(*) from Product where product_type = "衣服" group by product_type;
product_type  count(*)
------------  ----------
衣服            2

3.9 对结果进行排序

-- 按照sale_price 顺序对记录排序
sqlite> select product_id, sale_price from Product order by sale_price;
product_id  sale_price
----------  ----------
0008        100
0002        500
0006        500
0007        880
0001        1000
0004        3000
0003        4000
0005        6800

-- 按照sale_price 倒序对记录排序
sqlite> select product_id, sale_price from Product order by sale_price desc ;
product_id  sale_price
----------  ----------
0005        6800
0003        4000
0004        3000
0001        1000
0007        880
0002        500
0006        500
0008        100

SQL 语句执行顺序: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

子查询

4.1 查询价格大于平均价格的记录

-- WHERE 里不能用 avg 这种聚合函数
sqlite> select product_id, product_name, sale_price from Product where sale_price > avg(sale_price);
Error: misuse of aggregate function avg()

sqlite> select product_id, product_name, sale_price from Product where sale_price > (select avg(sale_price) from Product);
product_id  product_name  sale_price
----------  ------------  ----------
0003        运动T恤          4000
0004        菜刀            3000
0005        高压锅           6800

4.2 查询价格大于组内平均价格的商品记录

sqlite> select product_type, product_name, sale_price from Product as P1 where sale_price > (select avg(sale_price) from Product as P2 where P1.product_type = P2.product_type group by product_type);
product_type  product_name  sale_price
------------  ------------  ----------
办公用品          打孔器           500
衣服            运动T恤          4000
厨房用具          菜刀            3000
厨房用具          高压锅           6800

posted on 2022-07-19 00:09  zlllqm  阅读(133)  评论(0编辑  收藏  举报

导航