SELECT语句查询
select语句
SELECT <列名>,FROM <表名>;
从表中选取符合条件的数据——where语句
当选出满足某些条件的数据时,使用WHERE语句,SELECT语句通过WHERE子句来指定查询数据的条件,在WHERE子句中可以指定“某一列的值和这个字符串相等”或“某一列的值大于这个数字”等条件。
eg.SELECT ,
FROM
WHERE
SELECT product_name, product_type
FROM product
WHERE product_type = ‘衣服’
1
2
3
4
5
用来选取product type 列为衣服的SELECT语句,其中product_name不是查询的列
SELECT product_name
FROM product
WHERE product_type = ‘衣服’;
1
2
3
4
5
也可以选取出不是WHERE查询条件的列
相关
星号"*"代表全部列
SQL语句中可以随意使用换行符,不影响语句执行(但不可插入空行)
设置汉语别名时需要使用双引号("")括起来,类似于字符串
DISTINCT 关键字可以删除重复行
注释是SQL语句中用来标识说明或注意事项的部分,分为1行注释“–”和多行注释两种"/* */".
eg. --查询所有数据,使用星号"*"
SELECT *
FROM
;
– SQL语句可以使用"AS"关键字为列名设定别名(用中文时需要双引号("")).
SELECT product_id AS id,
product_name AS name,
purchase_price AS “进货单价”
FROM product;
– 使用 DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
FROM product;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
算术运算符和比较运算符
算术运算符:
+,-,*,/
比较运算符:
– 选取sale_price列为500的记录
SELECT product——namep, roduct_type
FROM product
WHERE sale_price = 500;
1
2
3
4
常见比较运算符:=,<>(和~不相等),>=,>,<,<=;
常用法则
SELECT子句中可以使用常数或者表达式
使用比较运算符时一定要注意不等号的位置和等号的位置 不等号总是在等号("=")前面
选取NULL记录时,需要在条件表达式中使用IS NULL运算符。 希望选取不是NULL记录时,需要在条件表达式中使用IS NOT NULL运算符
– SQL语句中也可以使用运算表达式
SELECT product_name, sale_price, sale_price * 2 AS “sale_price x2”
FROM product;
– WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price - purchase_price >=500;
/* 对字符串使用不等号首先创建chars并插入数据选取出大于’2’的SELECT语句 */
– DDL:创建表
CREATE TRABLE chars(
chr CHAR(3) NOT NULL,
PRIMARY KEY(chr);
)
– 选取出大于’2’的数据SELECT语句('2’为字符串)
SELECT chr
FROM chars
WHERE chr > ‘2’;
– 选取NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NULL;
– 选取不为NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NOT NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
逻辑运算符
NOT运算符
想要表示"不是…"时,除了前文的<>运算符外,还存在另外一个表示否定、使用范围更广的运算符:NOT
NOT不能单独使用, 如下
eg.
– 选取出销售单价大于等于1000日元的记录
SELECT product_name, product_type, sale_price FROM product
WHERE sale_price >= 1000;
– 添加NOT运算符
SELECT product_name, product_type, sale_price
FROM producct
WHERE NOT sale_price >= 1000;
1
2
3
4
5
6
7
AND运算符和OR运算符
当希望同时使用多个查询条件时,可以使用AND或者OR运算符.
AND相当于"并且",类似于数学中的取交集;
OR相当于"或者", 类似数学中的取并集。
通过括号优先处理
– 通过使用括号让OR运算符优先于AND运算符执行
SELECT product_name, product_type, regist_date
FROM product
WHERE product_type = ‘办公用品’
AND (regist_DAte = ‘2009-09-11’
or regist_date = ‘2009-09-20’);
1
2
3
4
5
6
这里需要注意因为AND运算符优先级高于or往往不注意使用括号将or运算括起来
含有NULL时的真值
NULL的真值结果既不为真,也不为假,因为并不知道这样一个值
这时真值是除真假之外的第三种值——不确定。一般的逻辑运算并不存在这第三种值。SQL之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有SQL中的逻辑运算被称为三值逻辑。
三值逻辑下的AND和OR真值表为(不确定指NULL):
img
聚合查询
聚合函数
SQL中用于 汇总的函数叫做 聚合函数,常用如下
COUNT:计算表中的记录数(行数)
SUM:计算表中数值列中数据的合计值
AVG:计算表中数值列中数据的平均值
MAX:求出表中任意列中数据的最大值
MIN:求出表中任意列中数据的最小值
常用法则
COUNT函数的结果根据参数的不同而不同。COUNT()会得到包含NULL的数据行数,而COUNT(COL NAME)会得到NULL之外的数据行数
聚合函数会将NULL排除在外,但COUNT()例外,并不会排除NULL
MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数值适用于数值类型的列
计算值的种类时,可以在COUNT函数的参数中使用DISTINCT
在聚合函数的参数中使用DISTINCT,可以删除重复数据,如SUM(DISTINCT COLNAME)
对表进行分组
GROUP BY语句:
将现有数据按照某列来汇总统计,使用GROUP BY
SELECT ,…,
FROM
GROUP BY, ,…,;
1
2
3
使用GROUP BY 与不使用的差异
– 按照商品种类统计数据行数
SELECT product_type,COUNT( )
FROM product;
GROUP BY product_type;
– 不含GROUP BY
SELECT produc_type, COUNT()
FROM product;
1
2
3
4
5
6
7
聚合函数与GROUP BY的使用必须针对某一列,若出现歧义则会报错,如上述第二段SQL缺少GROUP BY只含有COUNT(*)故报错。
按商品种类对表进行切分
img
GROUP BY子句就像切蛋糕那样将表进行了分组,GROUP BY子句中指定的列称为聚合建或者分组列
聚合键中包含NULL时
将进货单价(purchas_price)作为聚合键举例:
SELECT purchase_price, COUNT()
FROM product
GROUP BY purchase_price;
1
2
3
COUNT(COL)具体到列名时筛选结果不包含NULL,COUNT()筛选时结果包含NULL,此时NULL作为一组特殊数据处理。
GROUP BY书写位置
GROUP BY的子句书写顺序有严格要求,不按照顺序SQL会报错。
**顺序:**SELECT --FROM–WHERE–GROUP BY
前三项用于筛选数据,GROUP BY对筛选出的数据进行处理
WHERE子句中使用GROUP BY
SELECT purchase_price, COUNT(*)
FROM product
WHERE product_type = ‘衣服’
GROUP BY purchjase_pricel;
1
2
3
4
常见错误
在使用聚合函数及GROUP BY子句时,经常出现的错误:
聚合函数的SELECT子句中书写了聚合键以外的列:使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名,即聚合键
**GROUP BY子句中使用列的别名:**SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名,因为 在DBMS中,SELECT子句在GROUP BY子句后执行】
在WHERE中使用聚合函数:聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误,如果想指定条件,可以在SELECT, HAVING以及ORDER BY子句中使用聚合函数。
为聚合结果指定条件
使用HAVING得到特定分组
将表使用GROUP BY分组后,如何取出其中两组?
img
此时WHERE不可行,因为WHERE子句中只能指定记录(行)的条件,而不能用来指定组的条件(eg.“数据行数为2行"或者"平均值为500”)。
可在GROUP BY后使用HAVING子句,HAVING的用法类似WHERE
HAVING特点
HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名
– 数字
SELECT product_type, COUNT()
FROM product
GROUP BY product_type
HAVING COUNT() = 2;
– 错误形式(因为product_name不包含在GROUP BY聚合键中)
SELECT product_type, COUNT()
FROM product
GROUP BY product_type
HAVING product_name = ‘圆珠笔’
1
2
3
4
5
6
7
8
9
10
HAVING语句可以过滤出特定筛选的聚合对象,如有两行数据的COUNT()=2
对查询结果进行排序
ORDER BY
SQL中执行结果为随机排列,当需要按特定顺序,可以使用ORDER BY 子句
SELECT ,…,
FROM
ORDER BY <排列基准>,…;
1
2
3
默认为升序排列,降序排列为DESC
– 降序排列
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;
– 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY purchase_price;
1
2
3
4
5
6
7
8
9
10
11
12
ORDER BY中列名可以使用别名
GROUP BY子句中不能使用SELECT子句中定义的别名,但在ORDER BY 子句中却可以使用别名,为什么呢?因为SQL在使用SELECT语句的执行顺序为:
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
其中SELECT 的执行顺序在GROUP BY子句之后,ORDER BY子句之前,也就是说当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,故在 ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名
SQL语句书写顺序: SELECT–FROM–WHERE–GROUP BY–HAVING–ORDER BY