DW学习--MySQL02(基础查询与排序)
作者:互联网
目录
1 SELECT语句
1.1 从表中选取数据
- 列的查询:从表中选取数据使用
SELECT 语句;
,基本语法如下:SELECT <列名1>,<列名2>,... ... FROM <表名>;
SELECT 语句;
包含两个子句,SELECT子句
列举了要查询的列的名称,查询多列时用,
隔开,FROM子句
指定了数据选取的表的名称。
【例子】SELECT product_id,product_name,purchase_price FROM Product;
注意:查询结果中列的顺序和SELECT子句中的顺序相同。
- 查询所有列:使用代表所有列的
*
,基本语法:SELECT * FROM <表名>;
注意:使用
*
无法设定列的显示顺序,会按照CREATE TABLE语句
的定义对列进行排序。
- 为列设置别名:使用
AS
关键字为列设置别名,基本语法:
【例子】SELECT <列名1> AS <别名1>, <列名2> AS <别名2>, ... ... FROM <表名>;
SELECT product_id AS id, product_name AS "名字", purchase_price AS price FROM Product;
注意:
1.别名可以使用中文,但是中文要用"
括起来,注意不是单引号’。
2.设置别名并不改变原有的数据列名。
-
常数的查询:
SELECT子句
后也可以书写常数。
【例子】SELECT '商品' AS string,38 AS number,'2009-02-24' AS date, product_id,product_name FROM Product;
-
结果中删除重复行:在
SELECT子句
中使用DISTINCT
来实现,基本语句:SELECT DISTINCT <列名1>,<列名2>,... ... FROM <表名>; # 将该列中的所有重复数据删除(重复数据合并成一个),结果中显示的是独一无二的数据
【例子】
SELECT DISTINCT product_type FROM Product;
注意:
1.DIETINCT
关键字只能用在第一个列名之前。
2.在使用DISTINCT
时,NULL也被视为一类数据,即NULL存在多行时,也会被合并为一条MULL数据。
- 注释:单行注释
#
,多行注释\* *\
。 - 换行:SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
1.2 选取符合条件的数据
- WHERE子句:
SELECT语句
使用WHERE
子句来指定查询数据的条件,基本语句:
【例子】SELECT <列名>,... FROM <表名> WHERE <条件表达式>;
-- 用来选取product type列为衣服’的记录的SELECT语句 SELECT product_name,product_type FROM product WHERE product_type = '衣服';
# 也可以选取出不是查询条件的列(条件列与输出列不同) SELECT product_name FROM Product WHERE product_type = '衣服';
注意:
1.首先通过WHERE子句
查询出表中所有符合指定条件的记录,然后再选取出SELECT
语句指定的列。
2.WHERE
子句必须跟在FROM
子句之后。
2 算术运算符和比较运算符
- 可以使用的四则运算的主要运算符:
含义 | 运算符 |
---|---|
加法 | + |
减法 | - |
乘法 | * |
除法 | / |
【例子】:把各个商品单价的 2 倍(sale_price 的 2 倍)以 “sale_price_x2” 列的形式读取出来。
SELECT product_name,sale_price,
sale_price*2 As sale_price_x2
FROM Product;
注意:
1.运算是这样以行为单位执行的
2.所有包含NULL
的算术运算,结果肯定是NULL
- 比较运算符:
比较运算符 | 含义 |
---|---|
= | 相等 |
<> | 不相等 |
>= | 大于等于 |
> | 大于 |
<= | 小于等于 |
< | 小于 |
【例子】:选出销售单价比进货单价高500日元的商品
SELECT product_name,sale_price,purchase_price
FROM Product
WHERE sale_price-purchase_price>=500;
注意:
1.字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
2.如果希望选取NULL
记录时,不能使用比较运算符,必须用专门判断是否为NULL
的运算符IS NULL
或IS NOT NULL
,前者是希望选取是NULL的记录,后者是希望不选取NULL记录。
3 逻辑运算符
- NOT运算符:表示否定,但是不能单独使用,要和其他查询条件组合起来。
【例子】选取出销售单价小于 1000 日元的商品SELECT product_name,product_type,sale_price FROM Product WHERE NOT sale_price>=1000;
- AND和OR运算符:
AND
相当于“并且”,类似数学里的交集;OR
相当于“或者”,类似数学里的并集。
【例子】:选取“商品种类为办公用品”并且“登记日期是 2009 年 9 月 11 日或者 2009 年 9 月 20 日”的商品SELECT product_name,product_type,regist_date FROM Product WHERE product_type='办公用品' AND regist_date='2009-09-11' OR regist_date='2009-09-20'; #错误,AND的优先级高于OR,所以是前两个的交集, #然后再并上所有符合最后一个条件的商品。
SELECT product_name,product_type,regist_date FROM Product WHERE product_type='办公用品' AND (regist_date='2009-09-11' OR regist_date='2009-09-20');
注意:想要优先使用哪种运算,可以用括号来更改。
- 真值表:逻辑运算其实即使对真值进行操作的意思,其值为
真(TRUE)
或假(FALSE)
。对AND
而言,一假即假,全真为真;对OR
而言,一真即真,全假为假。 - 含有NULL的真值:含有
NULL
的真值是除真假之外的第三种值-不确定(UNKNOWN)
。通常的逻辑运算被称为二值运算
,只有SQL中的逻辑运算被称为三值运算
。对NULL
的AND
和OR
运算,如下图:
4 聚合查询
-
聚合函数:SQL中用于汇总的函数.所谓聚合,也就是将多行汇总为一行,以下是常见的5个:
- COUNT:计算表中的记录数(行数)
- SUM:计算表中数值列中数据的合计值
- AVG:计算表中数值列中数据的平均值
- MAX:求出表中任意列中数据的最大值
- MIN:求出表中任意列中数据的最小值
【例子】
#计算全部数据的行数(包含NULL) SELECT COUNT(*) # ① FROM product; #结果:8 ② # 计算NULL以外数据的行数 SELECT COUNT(purchase_price) FROM product; # 计算销售单价和进货单价的合计值 SELECT SUM(sale_price), SUM(purchase_price) FROM product; # 计算销售单价和进货单价的平均值 SELECT AVG(sale_price), AVG(purchase_price) FROM product; # MAX和MIN也可用于非数值型数据 SELECT MAX(regist_date), MIN(regist_date) FROM product; /* maxx | minn -----------+----------- 2009-11-11 | 2008-04-28 */
注意:
1.①被称为参数
或者parameter,②被称为返回值
2.对于SUM函数
,即使包含NULL
,也可以计算合计值,但是为什么之前在算术运算符中说包含NULL
的结果一定是NULL
呢?这是因为,聚合函数,如果以列名为参数,在计算之前就把NULL
排除在外了,而不是把NULL
看成0来计算。
3.对于AVG函数
,如果列中有NULL
,也会和SUM函数
一样,排除掉,特别注意的是,分母也要减去有NULL的数据的个数
。
4.MAX/MIN函数
几乎适用于所有数据类型的列。SUM/AVG函数
只适用于数值类型的列。
【例子】计算NULL之外的行数
执行代码和结果:
注意:
1.COUNT函数的结果根据参数的不同而不同。COUNT(*)
得到包含NULL的数据行数,而COUNT(<列名>)
会得到NULL之外的数据行数。
2.聚合函数会把NULL
排除在外,但是COUNT(*)
例外,不会排除NULL
。
- 使用聚合函数删除重复值:结合
DISTINCT关键字
【例子】计算去除重复数据后的数据行数SELECT COUNT(DISTINCT product_type) FROM Product; /* count ------- 3 */
注意:
1.DISTINCT
必须写在括号中,因为必须在计算行数前,删点重复是的数据。如果写在括号外,就会先计算行数,再删除重复数,上面的结果就为8
2.所有的聚合函数都可以使用DISTINCT
。
5 分组
-
GROUP BY语句:之前使用聚合函数都是会整个表的数据进行处理,当想将进行分组汇总时(即:将现有的数据按照某列来汇总统计),语法结构如下:
SELECT <列名1>,<列名2>... FROM <表名> GROUP BY <列名1>,<列名2>...
GROUP BY
子句中指定的列称为聚合键或者分组列
。GROUP BY
一定要写在FROM
语句之后(如果有 WHERE 子句的话需要写在 WHERE 子句之后)【例子】按照商品种类来统计一下数据行数(= 商品数量)
SELECT product_type,COUNT(*) FROM Product GROUP BY product_type;
1 不使用
GROUP BY
子句时,是将表中的所有数据作为一组来对待的。而使用GROUP BY
子句时,会将表中的数据分为多个组进行处理。
2.聚合键中包含NULL
时,会将NULL 作为一组特定的数据,在结果中会以“不确定”行(空行)的形式表现出来。
-
WHERE子句中使用GROUP BY:先根据
WHERE
子句指定的条件进行过滤,然后再进行汇总处理。
GROUP BY
和WHERE
并用时SELECT
语句的执行顺序:
FROM → WHERE → GROUP BY → SELECT
SELECT purchase_price,COUNT(*) FROM Product WHERE product_type="衣服" AND product_name="T恤衫" GROUP BY purchase_price;
-
聚合函数使用常见错误:
- ①在SELECT子句中书写了多余的列 :
使用聚合函数时,SELECT
子句中只能存在以下三种元素 :常数(数字123或字符串'')、聚合函数、GROUP BY子句中指定的列名(聚合键)
。把聚合键之外的列名书写在SELECT
子句之中,就是常犯的错误。使用GROUP BY
子句时,SELECT
子句中不能出现聚合键之外的列名。 - ②在GROUP BY子句中写了列的别名:
SELECT
子句中的项目可以通过AS
关键字来指定别名。但是,在GROUP BY
子句中是不能使用别名的。(和执行的顺序有关) - ③ 在WHERE子句中使用聚合函数
只有SELECT
子句和HAVING
子句(以及ORDER BY
子句)中能够使用COUNT
等聚合函数。WHERE
子句只能指定记录(行)的条件,而不能用来指定组的条件
- ①在SELECT子句中书写了多余的列 :
注意:
DISTINCT
和GROUP BY
都可以删除重复数据,在“想要删除选择结果中的重复记录”时使用DISTINCT
,在“想要计算汇总结果”时使用GROUP BY
。
6 为聚合结果指定条件
- HAVING 语句:用于对分组进行过滤,可以使用
常数、聚合函数和GROUP BY中指定的列名(聚合键)
。
使用HAVING
子句时SELECT
语句的顺序:
SELECT → FROM → WHERE → GROUP BY → HAVING
【例子】针对按照商品种类进行分组后的结果,指定“包含的数据行数为 2 行”SELECT product_type, COUNT(*) FROM product GROUP BY product_type HAVING COUNT(*) = 2; /* product_type | count --------------+------ 衣服 | 2 办公用品 | 2 */
- HAVING与WHERE中的条件:
聚合键
所对应的条件还是应该书写在WHERE
子句之中。
WHERE
子句 = 指定行
所对应的条件
HAVING
子句 = 指定组
所对应的条件
7 查询结果排序
- ORDER语句:SQL中的执行结果是随机排列的,当需要按照特定顺序排序时,可以使用ORDER BY子句,基本语法:
【例子】SELECT <列名1>, <列名2>, <列名3>, …… FROM <表名> ORDER BY <排序基准列1>, <排序基准列2>, ……;
# 降序排列 SELECT product_id, product_name, sale_price, purchase_price FROM product ORDER BY sale_price DESC; # 多个排序键 SELECT product_id, product_name, sale_price, purchase_price FROM product ORDER BY sale_price, product_id;
注意:
1.不论何种情况,ORDER BY
子句都需要写在SELECT
语句的末尾
。
2.默认是升序排列,如果想指定升序或降序,要在列名后使用关键字:DESC
关键字(降序)和ASC
关键字(升序)【 ascendent、descendent】。
3.多个排序键时,规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键。
4.使用含有NULL
的列作为排序键时,NULL
会在结果的开头或末尾汇总显示
- ORDER BY中列名可使用别名:在执行
GROUP BY
子句时,SELECT
语句中定义的别名无法被识别。
使用HAVING
子句时SELECT
执行的顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- ORDER BY子句中可以使用的列:在
ORDER BY
子句中可以使用SELECT
子句中未使用的列和聚合函数。
8 练习题
8.1第一部分
-
1.编写一条SQL语句,从product(商品)表中选取出“登记日期(regist在2009年4月28日之后”的商品,查询结果要包含product name和regist_date两列。
答案:SELECT product_name,regist_date FROM product WHERE regist_date>'2009-04-28';
-
2.请说出对product 表执行如下3条SELECT语句时的返回结果.
SELECT * FROM product WHERE purchase_price = NULL;
SELECT * FROM product WHERE purchase_price <> NULL;:
SELECT * FROM product WHERE product_name > NULL;
答案:以上三段代码都无法取出任何一条记录,因为希望选取
NULL
记录时,不能使用比较运算符,必须用专门判断是否为NULL
的运算符IS NULL
或IS NOT NULL
。 -
3 代码清单2-22(2-2节)中的SELECT语句能够从product表中取出“销售单价(saleprice)比进货单价(purchase price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示。
答案:#代码1 SELECT product_name,sale_price,purchase_price FROM Product WHERE sale_price-purchase_price>500; #代码2 SELECT product_name,sale_price,purchase_price FROM Product WHERE NOT sale_price-purchase_price<=500;
-
4 请写出一条SELECT语句,从product表中选取出满足“销售单价打九折之后利润高于100日元的办公用品和厨房用具”条件的记录。查询结果要包括product_name列、product_type列以及销售单价打九折之后的利润(别名设定为profit)。
提示:销售单价打九折,可以通过saleprice列的值乘以0.9获得,利润可以通过该值减去purchase_price列的值获得。答案:
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='厨房用具');
8.2 第二部分
- 1请指出下述SELECT语句中所有的语法错误。
SELECT product_id,SUM(product_name)
--本SELECT语句中存在错误。
FROM Product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
答案:
SELECT product_id,SUM(product_name)
# SUM函数只能使用数值型的列作为参数
# SELECT子句中有GROUP BY子句中没有的列product_id
FROM Product
GROUP BY product_type
# GROUP BY子句要写在WHERE子句的后面
WHERE regist_date > '2009-09-01';
- 2 请编写一条SELECT语句,求出销售单价(sale_price列)合计值是进货单价(purchase_price列)合计值1.5倍的商品种类。执行结果如下所示。
答案:
SELECT product_type,
SUM(sale_price),SUM(purcahse_price)
FROM Product
GROUP BY product_type
HAVING SUM(sale_price)>SUM(purchase_price)*1.5;
- 3 此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了ORDERBY子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考ORDERBY子句的内容。
答案:
SELECT *
FROM Product
ORDER BY regist_date DESC,sale_price ASC;
标签:product,MySQL02,--,price,子句,DW,NULL,WHERE,SELECT 来源: https://blog.csdn.net/OohMuYi/article/details/111226865