Mysql 基础(六) SELECT 语句基础
要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒。——培根
学习重点
- 使用 SELECT 语句从表中选取数据 
- 为列设定显示用的别名 
- SELECT 语句中可以使用常数或者表达式 
- 通过指定 DISTINCT 可以删除重复的行 
- SQL 语句种可以使用注释 
- 可以通过 WHERE 语句从表中选出符合查询条件的数据 
列的查询
从表中选取数据时需要使用 SELECT 语句,也就是只从表中选出 SELECT 必要数据的意思.通过 SELECT 语句查询并选出必要数据的过程称为匹配查询或查询(query)
- 通勤语句
SELECT <列名>,...
FROM <表名>;
SELECT 语句包含了 SELECT 和 FROM 两个子句.子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语
SELECT 子句列举了希望从表中查询出的列的名称,而 FROM 子句则指定了选取出数据的表的名称
- 举例
我们从上一单元输出 3 列分别是 product_id,product_name,sale_price
SELECT product_id,product_name,sale_price FROM Product;
结果输出就是
| product_id | product_name | sale_price | 
|---|---|---|
| 001 | T 恤衫 | 1000 | 
| 002 | 打孔器 | 500 | 
| 003 | 运动 T 恤衫 | 4000 | 
| 004 | 菜刀 | 3000 | 
| 005 | 高压锅 | 6800 | 
| 006 | 叉子 | 500 | 
| 007 | 擦菜板 | 880 | 
| 008 | 圆珠笔 | 100 | 
查询列表中所有的列
- 要想查出全部列,可以使用代表所有列的型号(*)
SELECT *  FROM <表名>
- 用在上单元的例子
SELECT * FROM Product;
等价于
SELECT product_id,product_name,product_type,sale_price,purchase_price,regist_date FROM Product;
最后的结果
| product_id | product_name | sale_price | product_type | purchase_price | regist_date | 
|---|---|---|---|---|---|
| 001 | T 恤衫 | 1000 | 衣服 | 500 | 2009-09-20 | 
| 002 | 打孔器 | 500 | 办公用品 | 320 | 2009-09-11 | 
| 003 | 运动 T 恤衫 | 4000 | 衣服 | 2800 | NULL | 
| 004 | 菜刀 | 3000 | 厨房用具 | 2800 | 2009-09-20 | 
| 005 | 高压锅 | 6800 | 厨房用具 | 5000 | 2009-01-15 | 
| 006 | 叉子 | 500 | 厨房用具 | NULL | 2009-09-20 | 
| 007 | 擦菜板 | 880 | 厨房用具 | 790 | 2008-04-28 | 
| 008 | 圆珠笔 | 100 | 办公用品 | NULL | 2009-11-11 | 
为列设置别名
- SQL 语句可以使用 AS 关键字为列设定别名
SELECT product_id AS id,product_name AS name,sale_price AS price FROM Product;
最后的结果
| id | name | price | 
|---|---|---|
| 001 | T 恤衫 | 1000 | 
| 002 | 打孔器 | 500 | 
| 003 | 运动 T 恤衫 | 4000 | 
| 004 | 菜刀 | 3000 | 
| 005 | 高压锅 | 6800 | 
| 006 | 叉子 | 500 | 
| 007 | 擦菜板 | 880 | 
| 008 | 圆珠笔 | 100 | 
- 设置成中文名称也可以,但是必须要加引号
SELECT product_id AS '商品编号', product_name AS '商品名称', sale_price  AS '进货单价' FROM Product;
最后的结果
| 商品编号 | 商品名称 | 进货单价 | 
|---|---|---|
| 001 | T 恤衫 | 1000 | 
| 002 | 打孔器 | 500 | 
| 003 | 运动 T 恤衫 | 4000 | 
| 004 | 菜刀 | 3000 | 
| 005 | 高压锅 | 6800 | 
| 006 | 叉子 | 500 | 
| 007 | 擦菜板 | 880 | 
| 008 | 圆珠笔 | 100 | 
常数的查询
- 有的时候为了方便阅读,我们会在查询后的结果中显示我们自定义的列,这个列只是显示用,不影响表的结构
SELECT '商品名称' AS string,28 AS number,product_id AS id,product_name AS '商品名称',
sale_price  AS '进货单价' FROM Product;
最后的结果
| string | number | id | 商品名称 | 进货单价 | 
|---|---|---|---|---|
| 商品名称 | 28 | 001 | T 恤衫 | 1000 | 
| 商品名称 | 28 | 002 | 打孔器 | 500 | 
| 商品名称 | 28 | 003 | 运动 T 恤衫 | 4000 | 
| 商品名称 | 28 | 004 | 菜刀 | 3000 | 
| 商品名称 | 28 | 005 | 高压锅 | 6800 | 
| 商品名称 | 28 | 006 | 叉子 | 500 | 
| 商品名称 | 28 | 007 | 擦菜板 | 880 | 
| 商品名称 | 28 | 008 | 圆珠笔 | 100 | 
从结果中筛选掉重复的数据
- 可以通过 DISTINCT 筛选掉重复的数据
SELECT DISTINCT <列名> FROM <表名>;
- 上面单元的例子
SELECT DISTINCT product_type FROM Product;
最后的结果
| product_type | 
|---|
| 衣服 | 
| 办公用品 | 
| 厨房用具 | 
- 在使用 DISTINCT 时候 NULL 也被视为同一类数据,NULL 存在于多行时候,也会被合并为一条 NULL 数据
比如上面单元的例子
SELECT DISTINCT purchase_price FROM Product;
最后的结果
| purchase_price | 
|---|
| 500 | 
| 320 | 
| 2800 | 
| 5000 | 
| NULL | 
| 790 | 
- 多列使用 DISTINCT
SELECT DISTINCT product_type,regist_date FROM Product;
最后结果,这样就过滤了一条数据
| product_type | regist_date | 
|---|---|
| 衣服 | 2009-09-20 | 
| 办公用品 | 2009-09-11 | 
| 衣服 | NULL | 
| 厨房用具 | 2009-09-20 | 
| 厨房用具 | 2009-01-15 | 
| 厨房用具 | 2008-04-28 | 
| 办公用品 | 2009-11-11 | 
依据 WHERE 语句来选择记录
SELECT 语句通过 WHERE 子句来指定查询条件,在 WHERE 子句中可以指定”某一列的值和这个字符串相等”或者”某一列的值大于这个数字”等条件
- 通勤代码
SELECT <列名>,
...
FROM <表名>
WHERE<条件表达式>;
- 拿上个单元 查询出 product_name,product_type,并且 product_type 是衣服的
SELECT product_name AS '商品名称', product_type AS '商品类型' FROM Product WHERE product_type='衣服'最后结果
| 商品名称 | 商品类型 | 
|---|---|
| T 恤衫 | 衣服 | 
| 运动 T 恤衫 | 衣服 | 
他执行顺序是首先通过 WHERE 子查询查询出符合条件的记录,然后在取出 SELECT 语句指定的列,也就受从后往前的顺序
特别注意
SQL 中子句的书写顺序是固定的,不能随意更改,WHERE 子句必须紧跟在 FROM 的子句后面
注释的书写方法
- 单行注释
书写在’–’之后,只能写在同一行
-- 本SELECT语句会从结果中删除重复行
SELECT DISTINCT product_type,regist_date FROM Product;
- 多行注释
书写在”/“和”/“之间,可以跨行
/*
 这就是测试是否跨行
 测试跨行没有
 结束跨行
*/
SELECT DISTINCT product_type,regist_date FROM Product;
 
                        
                        