Task02:基础查询与排序(一)

这篇教程介绍了SQL的基础查询操作,包括从表中选取数据、使用WHERE子句设置条件、运用算术和比较运算符,以及逻辑运算符。通过实例展示了如何选取特定条件的数据,如选取销售价格高于某个值的商品,以及如何使用NOT、AND和OR运算符进行复杂条件筛选。同时,讲解了别名设定、去除重复行和使用LIMIT限制输出行数的方法。

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

教程地址

https://github.com/datawhalechina/wonderful-sql
https://gitee.com/datawhalechina/wonderful-sql

1. SELECT语句基础

1.1 从表中选取数据

语法:

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

实践:

mysql> select database();
+------------+
| database() |
+------------+
| shop       |
+------------+
1 row in set (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_shop   |
+------------------+
| chars            |
| empskills        |
| inventoryproduct |
| product          |
| product2         |
| productcopy      |
| productins       |
| producttype      |
| samplelike       |
| samplemath       |
| samplestr        |
| shopproduct      |
| skills           |
| view_product     |
+------------------+
14 rows in set (0.00 sec)

mysql> select * from product limit 5;
+------------+--------------+--------------+------------+----------------+-------------+
| 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  |
+------------+--------------+--------------+------------+----------------+-------------+
5 rows in set (0.00 sec)

mysql> 

先查看当前所处的数据库,然后选出一些数据用于展示,limit 的作用是限定数量。

1.2 限定条件选取数据

语法:

SELECT <列名>, ……
  FROM <表名>
 WHERE <条件表达式>;

实践:

mysql> -- 用来选取product type列为衣服的记录的SELECT语句
mysql> SELECT product_name, product_type
    ->   FROM product
    ->  WHERE product_type = '衣服';
+--------------+--------------+
| product_name | product_type |
+--------------+--------------+
| T恤          | 衣服         |
| 运动T恤      | 衣服         |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> -- 也可以选取出不是查询条件的列(条件列与输出列不同)
mysql> SELECT product_name
    ->   FROM product
    ->  WHERE product_type = '衣服';
+--------------+
| product_name |
+--------------+
| T恤          |
| 运动T恤      |
+--------------+
2 rows in set (0.01 sec)

mysql> -- 也可以选取出不是查询条件的列(条件列与输出列不同)
mysql> SELECT count(*)
    ->   FROM product
    ->  WHERE product_type = '衣服';
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql> 

select 后面跟的东西,应该就是我们最后要展示的,而 where 后面跟的东西,是我们筛选的条件。

1.3 相关规则

星号()代表全部列的意思。
SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
设定汉语别名时需要使用双引号(“)括起来。
在SELECT语句中使用DISTINCT可以删除重复行。
注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释”-- “和多行注释两种”/
*/"。

实践

mysql> -- SQL语句可以使用AS关键字为列设定别名(用中文时需要双引号(“”))。
mysql> SELECT product_id     As id,
    ->        product_name   As name,
    ->        purchase_price AS "进货单价"
    ->   FROM product;
+------+------------+--------------+
| id   | name       | 进货单价     |
+------+------------+--------------+
| 0001 | T恤        |          500 |
| 0002 | 打孔器     |          320 |
| 0003 | 运动T恤    |         2800 |
| 0004 | 菜刀       |         2800 |
| 0005 | 高压锅     |         5000 |
| 0006 | 叉子       |         NULL |
| 0007 | 擦菜板     |          790 |
| 0008 | 圆珠笔     |         NULL |
+------+------------+--------------+
8 rows in set (0.00 sec)

mysql> -- 使用DISTINCT删除product_type列中重复的数据
mysql> SELECT DISTINCT product_type
    ->   FROM product;
+--------------+
| product_type |
+--------------+
| 衣服         |
| 办公用品     |
| 厨房用具     |
+--------------+
3 rows in set (0.00 sec)

mysql> SELECT product_type
    ->   FROM product
    ->   LIMIT 5;
+--------------+
| product_type |
+--------------+
| 衣服         |
| 办公用品     |
| 衣服         |
| 厨房用具     |
| 厨房用具     |
+--------------+
5 rows in set (0.00 sec)

mysql> 

2. 算术运算符和比较运算符

2.1 算术运算符

含义运算符
加法+
减法-
乘法*
除法/

2.2 比较运算符

运算符含义
=和~相等
<>和~不相等
>=大于等于~
>大于~
<=小于等于~
<小于~
mysql> -- 选取出sale_price列为500的记录
mysql> SELECT product_name, product_type
    ->   FROM product
    ->  WHERE sale_price = 500;
+--------------+--------------+
| product_name | product_type |
+--------------+--------------+
| 打孔器       | 办公用品     |
| 叉子         | 厨房用具     |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> 

2.3 相关规则

SELECT子句中可以使用常数或者表达式。
使用比较运算符时一定要注意不等号和等号的位置。
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。

mysql> -- SQL语句中也可以使用运算表达式
mysql> 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 |
+--------------+------------+---------------+
8 rows in set (0.00 sec)

mysql> -- WHERE子句的条件表达式中也可以使用计算表达式
mysql> SELECT product_name, sale_price, purchase_price
    ->   FROM product
    ->  WHERE sale_price - purchase_price >= 500;
+--------------+------------+----------------+
| product_name | sale_price | purchase_price |
+--------------+------------+----------------+
| T恤          |       1000 |            500 |
| 运动T恤      |       4000 |           2800 |
| 高压锅       |       6800 |           5000 |
+--------------+------------+----------------+
3 rows in set (0.00 sec)

mysql> -- 选取出大于'2'的数据的SELECT语句('2'为字符串)
mysql> SELECT chr
    ->   FROM chars
    ->  WHERE chr > '2';
+-----+
| chr |
+-----+
| 222 |
| 3   |
+-----+
2 rows in set (0.00 sec)

mysql> -- 选取NULL的记录
mysql> SELECT product_name, purchase_price
    ->   FROM product
    ->  WHERE purchase_price IS NULL;
+--------------+----------------+
| product_name | purchase_price |
+--------------+----------------+
| 叉子         |           NULL |
| 圆珠笔       |           NULL |
+--------------+----------------+
2 rows in set (0.01 sec)

mysql> -- 选取不为NULL的记录
mysql> SELECT product_name, purchase_price
    ->   FROM product
    ->  WHERE purchase_price IS NOT NULL;
+--------------+----------------+
| product_name | purchase_price |
+--------------+----------------+
| T恤          |            500 |
| 打孔器       |            320 |
| 运动T恤      |           2800 |
| 菜刀         |           2800 |
| 高压锅       |           5000 |
| 擦菜板       |            790 |
+--------------+----------------+
6 rows in set (0.00 sec)

mysql> 

3. 逻辑运算符

3.1 NOT运算符

mysql> SELECT product_name, product_type, sale_price
    ->   FROM product
    ->  WHERE NOT sale_price >= 1000;
+--------------+--------------+------------+
| product_name | product_type | sale_price |
+--------------+--------------+------------+
| 打孔器       | 办公用品     |        500 |
| 叉子         | 厨房用具     |        500 |
| 擦菜板       | 厨房用具     |        880 |
| 圆珠笔       | 办公用品     |        100 |
+--------------+--------------+------------+
4 rows in set (0.00 sec)

mysql> SELECT product_name, product_type, sale_price
    ->   FROM product
    ->  WHERE sale_price < 1000;
+--------------+--------------+------------+
| product_name | product_type | sale_price |
+--------------+--------------+------------+
| 打孔器       | 办公用品     |        500 |
| 叉子         | 厨房用具     |        500 |
| 擦菜板       | 厨房用具     |        880 |
| 圆珠笔       | 办公用品     |        100 |
+--------------+--------------+------------+
4 rows in set (0.00 sec)

mysql> -- 优先显示价格为1000的,接着显示其他的
mysql> SELECT product_name, product_type, sale_price
    ->   FROM product
    ->  WHERE sale_price = 1000
    -> 
    -> UNION
    -> 
    -> SELECT product_name, product_type, sale_price
    ->   FROM product
    ->  WHERE NOT sale_price = 1000;
+--------------+--------------+------------+
| product_name | product_type | sale_price |
+--------------+--------------+------------+
| T恤          | 衣服         |       1000 |
| 打孔器       | 办公用品     |        500 |
| 运动T恤      | 衣服         |       4000 |
| 菜刀         | 厨房用具     |       3000 |
| 高压锅       | 厨房用具     |       6800 |
| 叉子         | 厨房用具     |        500 |
| 擦菜板       | 厨房用具     |        880 |
| 圆珠笔       | 办公用品     |        100 |
+--------------+--------------+------------+
8 rows in set (0.00 sec)

mysql> 


3.2 AND运算符和OR运算符

mysql> -- 通过使用括号让OR运算符先于AND运算符执行
mysql> SELECT product_name, product_type, regist_date
    ->   FROM product
    ->  WHERE product_type = '办公用品'
    ->    AND ( regist_date = '2009-09-11'
    ->         OR regist_date = '2009-09-20');
+--------------+--------------+-------------+
| product_name | product_type | regist_date |
+--------------+--------------+-------------+
| 打孔器       | 办公用品     | 2009-09-11  |
+--------------+--------------+-------------+
1 row in set (0.00 sec)

mysql> 

此时需要注意的是一定要记得加括号,这样才能保证 and 包含 or 的结果,也就是先运两个 regist_date 的 or,再运行其结果与 product_type 的 and 。

3.3 真值表

对于复杂的逻辑运算,可以借助真值表来理解

A. 练习题

A.1

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

mysql> SELECT product_name, regist_date
    ->   FROM product
    ->  WHERE regist_date > '2009-04-28';
+--------------+-------------+
| product_name | regist_date |
+--------------+-------------+
| T恤          | 2009-09-20  |
| 打孔器       | 2009-09-11  |
| 菜刀         | 2009-09-20  |
| 叉子         | 2009-09-20  |
| 圆珠笔       | 2009-11-11  |
+--------------+-------------+
5 rows in set (0.01 sec)

mysql> 

A.2

请说出对product 表执行如下3条SELECT语句时的返回结果。

SELECT *
  FROM product
 WHERE purchase_price = NULL;

应该是返回 product 表当中进价为 NULL 的记录的所有字段

mysql> SELECT *
    ->   FROM product
    ->  WHERE purchase_price = NULL;
Empty set (0.00 sec)

mysql> 

SELECT *
  FROM product
 WHERE purchase_price <> NULL;

应该是返回 product 表当中进价为 NULL 的记录的所有字段

mysql> SELECT *
    ->   FROM product
    ->  WHERE purchase_price <> NULL;
Empty set (0.00 sec)

SELECT *
  FROM product
 WHERE product_name > NULL;

应该是大于 NULL 的数据

mysql> SELECT *
    ->   FROM product
    ->  WHERE product_name > NULL;
Empty set (0.00 sec)

如果要判断字段为空,应该是 is null 或者 is not null

上面的这三个例子,更像是把 null 当作是一个具体的值,然后来比较

A.3

2.3 章节中的SELECT语句能够从 product 表中取出“销售单价(sale_price)比进货单价(purchase_price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示:

product_name | sale_price | purchase_price 
-------------+------------+------------
T恤衫        |   1000    | 500
运动T恤      |    4000    | 2800
高压锅       |    6800    | 5000

对不等式进行变换,在适当的时候加上 not

mysql> SELECT product_name, sale_price, purchase_price
    ->   FROM product
    ->  WHERE sale_price - 500 >= purchase_price;
+--------------+------------+----------------+
| product_name | sale_price | purchase_price |
+--------------+------------+----------------+
| T恤          |       1000 |            500 |
| 运动T恤      |       4000 |           2800 |
| 高压锅       |       6800 |           5000 |
+--------------+------------+----------------+
3 rows in set (0.00 sec)

mysql> SELECT product_name, sale_price, purchase_price
    ->   FROM product
    ->  WHERE NOT sale_price - 500 < purchase_price;
+--------------+------------+----------------+
| product_name | sale_price | purchase_price |
+--------------+------------+----------------+
| T恤          |       1000 |            500 |
| 运动T恤      |       4000 |           2800 |
| 高压锅       |       6800 |           5000 |
+--------------+------------+----------------+
3 rows in set (0.00 sec)

mysql> 

A.4

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

mysql> SELECT product_name, product_type , sale_price*0.9 - purchase_price AS profit
    ->   FROM product
    ->  WHERE sale_price*0.9 - purchase_price > 100
    ->   AND (product_type="办公用品" OR product_type="厨房用具")
    -> ;
+--------------+--------------+--------+
| product_name | product_type | profit |
+--------------+--------------+--------+
| 打孔器       | 办公用品     |  130.0 |
| 高压锅       | 厨房用具     | 1120.0 |
+--------------+--------------+--------+
2 rows in set (0.00 sec)

mysql> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值