Task02:基础查询与排序(一)
教程地址
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>